讓 AI 應用程式為雲端原生做好準備

作者 NVIDIA

註冊 Edge AI News以掌握最新趨勢、客戶使用案例和技術解說。

雲端原生(Cloud Native)是與邊緣 AI 有關的最重要概念之一。因為雲端原生提供了大規模的應用程式部署,它同時提供了效能、韌性和易管理性等邊緣 AI 的關鍵能力。雲端原生運算與邊緣 AI 息息相關,因此我們認為邊緣 AI 的未來是雲端原生。 

本文概述雲端原生元件以及讓應用程式為雲端原生做好準備的步驟。 NVIDIA Fleet Command 雲端服務是用於部署和管理以雲端原生原則建構的邊緣應用程式,我將會說明如何透過此服務,練習使用這些概念。 

如果遵循所有的步驟,則可以輕鬆地將雲端原生應用程式部署在 Fleet Command 及其他雲端原生部署和管理平台上。 

何謂雲端原生? 

雲端原生是一種開發和運作應用程式的方法,包含雲端運算交付模型的靈活性、擴充性和韌性。雲端原生方法可以使組織建構具有韌性及可管理的應用程式,使應用程式部署變得更敏捷。 

雲端原生開發的主要原則:

  • 微服務
  • 容器
  • Helm 圖表
  • CI/CD
  • DevOps

何謂微服務? 

微服務是一種軟體開發形式,可以將應用程式分成較小及互相通訊的獨立服務。這些都是獨立的服務,表示每一個服務都可以自行更新、部署和擴充,不會影響應用程式中的其他服務。 

微服務使開發應用程式變得更快速,並使更新、部署和擴充這些更新的過程變得更容易。 

何謂容器?

容器是一種軟體封裝,包含在任何運算環境中可靠地執行應用程式需要的所有資訊和相依性。容器可輕易地部署在不同的作業系統上,並提供可移植性和應用程式隔離。  

可以將整個應用程式容器化,也可以將應用程式的各部分容器化。例如,容器與將應用程式分成小型獨立元件之微服務搭配的效果非常好。每一個微服務都可以在容器中封裝、部署和管理。此外,可以在叢集中部署和管理多個容器。 

容器適用於邊緣部署,因為它們可以一次將應用程式、相依性和環境變數都安裝至容器映像中,而無須在執行應用程式的每一個系統上反覆操作,使管理多個部署變得更輕鬆。

這對於邊緣運算而言很重要,因為組織可能必須從遠距離安裝和管理數百或數千個不同的部署,所以必須盡可能將部署流程自動化。 

何謂 Helm 圖表?

在複雜的容器部署 (例如跨具有多個系統的多個站點部署多個應用程式) 方面,許多組織都是使用 Helm 圖表。Helm 是在 Kubernetes (稍後討論) 上執行的應用程式封裝管理器。缺少它,就必須為每一個工作負載手動建立個別的 YAML 檔案,以指定部署需要的所有資訊,從 pod 配置到負載平衡。

Helm 圖表省略了此冗長的過程,允許組織定義可重複使用的部署範本,此外還有其他優點,例如版本控制以及在部署過程中自訂應用程式的能力。

何謂 CI/CD

持續整合 (CI) 能以協作方式迭代和測試新程式碼,通常是將其整合至共用儲存庫。

持續交付 (CD) 是從 CI 階段取得新組建,並將它們載入至儲存庫,以部署至生產的自動化流程。

適當的 CI/CD 流程可以在將新程式碼整合至現有解決方案時,避免服務中斷。 

何謂 DevOps

DevOps 一詞是指將開發人員與維運團隊合併,以簡化開發應用程式以及將應用程式交付給客戶的過程。

DevOps 對於雲端原生技術而言很重要,因為這兩個概念都是以持續、輕鬆地為客戶提供解決方案,並建立端對端開發管道,以加快更新和迭代為理念。 

何謂雲端原生管理?

既然已經解釋雲端原生的核心原則,後續的重點即是探討如何在生產中管理雲端原生應用程式。 

協調容器的主要平台是 Kubernetes。Kubernetes 是開放原始碼,讓組織可以部署、管理和擴充容器化應用程式。

某些組織已在 Kubernetes 上建立企業就緒解決方案,以提供獨特的優勢和功能:

基本上,應用程式為任何 Kubernetes 平台做好準備的過程都相同,無論是 Kubernetes 本身或在 Kubernetes 上建立的解決方案。每一個解決方案都需要特定的配置步驟,確保組織的雲端原生應用程式可以有效運作,不會發生問題。

使用 NVIDIA Fleet Command 部署雲端原生應用程式

本節以 NVIDIA Fleet Command 為例,介紹配置流程,並註明需要的特定配置。 

步驟 0瞭解 Fleet Command

Fleet Command 是一種可以跨不同之邊緣位置管理應用程式的雲端服務。它是以 Kubernetes 為基礎建構及部署雲端原生應用程式,所以將應用程式放至 Fleet Command 上的步驟與將應用程式放至其他雲端原生管理平台上的步驟相同。

假設已建構應用程式,則將該應用程式放至 Fleet Command 上僅需要四個步驟:

  • 將應用程式容器化
  • 確定應用程式要求
  • 建立 Helm 圖表
  • 在 Fleet Command 上部署

步驟 1:將應用程式容器化

Fleet Command 將應用程式部署為容器。您可以使用容器,在同一個系統上部署多個應用程式,同時可以跨多個系統和位置輕鬆地擴充應用程式。此外,所有相依性都封裝在容器內,確保應用程式在數千個系統上的效能相同。 

為應用程式建構容器是很簡單的事。若需要更多資訊,請參閱 Docker 容器指南。 

以下是使用 NVIDIA CUDA 基礎映像建構之自訂深度學習容器的 Dockerfile 範例:

FROM nvcr.io/nvidia/cuda:11.3.0-base-ubuntu18.04
CMD nvidia-smi

#set up environment
RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y curl
RUN apt-get install unzip
RUN apt-get -y install python3
RUN apt-get -y install python3-pip

#copies the application from local path to container path
COPY app/ /app/
WORKDIR /app

#Install the dependencies
RUN pip3 install -r /app/requirements.txt

ENV MODEL_TYPE='EfficientDet'
ENV DATASET_LINK='HIDDEN'
ENV TRAIN_TIME_SEC=100

CMD ["python3", "train.py"]

在此範例中,/app/ 包含所有的原始碼。在為容器建立 Dockerfile 之後,可以使用該檔案建構容器,然後上傳至雲端私有登錄,即能輕鬆地將容器部署在任何位置。

步驟 2:確定應用程式要求

在完成容器之後,必須確定應用程式要求才能正常運作。通常需要考量安全性、網路和儲存要求。

Fleet Command 是一個安全的軟體堆疊,可以控制部署在系統上的應用程式存取哪些硬體和軟體。因此,應依據安全性最佳實務設計應用程式:

  • 避免特權容器
  • 將管理員和應用程式流量與儲存流量分開
  • 最小化系統裝置存取
  • 其他

請依據這些安全性要求設計應用程式部署,在之後配置網路和儲存時必須記住。

下一步是確定需要哪些網路存取要求以及如何從容器公開網路。

通常,應用程式需要不同的連接埠和路由,以存取任何邊緣感測器和裝置、管理員流量、儲存流量,以及應用程式 (雲端) 流量。可以使用 NodePorts 或更先進的 Kubernetes 網路配置 (例如輸入控制器),從 Fleet Command 公開這些連接埠。

最後,應用程式可能需要存取近端或遠端儲存空間,以儲存持續性資料。Fleet Command 支援 hostPath 磁碟區裝載功能。同時可以使用其他 Kubernetes 功能,例如持續性磁碟區和持續性磁碟區宣告。

如果有需要,可以將近端路徑或 NFS 布建程式個別部署在 Fleet Command 系統上,以配置近端或遠端儲存。如果應用程式支援此功能,則可以配置應用程式,以連線至雲端儲存空間。

若需要更多資訊,請參閱 Fleet Command 應用程式開發指南。 

步驟 3:建立 Helm 圖表

現在已經確定應用程序要求,可以開始建立 Helm 圖表。 

如同容器,Fleet Command 上的 Helm 圖表也有一些特定要求。應用程式開發指南的 Helm 圖表要求一節說明了此類要求。可以參考以下 NVIDIA DeepStream Helm 圖表範例,以協助您建立部署在 Fleet Command 中的 Helm 圖表。 

在想要從零開始自行建立 Helm 圖表時,請先執行以下命令,建立範例 Helm 圖表。此命令是使用 NGINX Docker 容器產生範例 Helm 圖表,之後可以針對任何應用程式進行自訂。

$ helm create deepstream

在建立 Helm 圖表後,圖表的目錄結構如下所示:

deepstream
|-- Chart.yaml          
|-- charts              
|-- templates            
                         
|   |-- NOTES.txt        
|   |-- _helpers.tpl     
|   |-- deployment.yaml
|   |-- ingress.yaml
|   `-- service.yaml
`-- values.yaml   

其次,使用以下具有醒目提示的值修改 values.yaml 檔案,以針對 DeepStream 容器和網路配置範例 Helm 圖表。

image:
 
   repository: nvcr.io/nvidia/deepstream
 
   pullPolicy: IfNotPresent
    # Overrides the image tag whose default is the chart appVersion.
 
   tag: 5.1-21.02-samples
 

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
    # Specifies whether a service account should be created
 
   create: false
 
   # Annotations to add to the service account
    annotations: {}
    # The name of the service account to use.
    # If not set and create is true, a name is generated using the fullname template
    name: ""

podAnnotations: {}

podSecurityContext: {}
    # fsGroup: 2000

securityContext: {}
    # capabilities:
    #   drop:
    #   - ALL
    # readOnlyRootFilesystem: true
    # runAsNonRoot: true
    # runAsUser: 1000

service:
 
   type: NodePort
 
   port: 8554
 
   nodeport: 31113

在建立自訂 Helm 圖表之後,可以將其與容器一併上傳至私有登錄。

步驟 4 Fleet Command 上部署

將應用程式容器化,並建立 Helm 圖表之後,將應用程式載入至 Fleet Command 上。在應用程式載入至 GPU 加速應用程式、模型和容器中心 NGC 上之後,即可部署在 Fleet Command 上。應用程式可以公開,也可以託管在僅限組織存取的私有登錄中。

Fleet Command 使用指南會逐步說明整個流程,也會在Fleet Command 示範影片中呈現。 

額外步驟:加入我們的合作夥伴生態系統

NVIDIA 最近宣布擴展 NVIDIA Metropolis 合作夥伴計畫,現在已納入 Fleet Command。將應用程式設為部署在 Fleet Command 上的 Metropolis 合作夥伴,可免費存取解決方案,為客戶操作 POC。使用 Fleet Command的合作夥伴,無須在客戶環境中建立訂製解決方案進行評估。他們可以使用 Fleet Command ,並在短短數分鐘內將應用程式部署在客戶站點。 

開始採用雲端原生

本文介紹雲端原生技術的核心原則,以及如何使用 Fleet Command 讓應用程序為雲端原生做好準備。

下一步是取得在雲端原生環境中部署和管理應用程式的實作經驗。 NVIDIA LaunchPad 計畫可以提供協助。

LaunchPad 是一個實作實驗室計畫,它提供可以立即短期存取 Fleet Command 執行個體,在真實伺服器上輕鬆部署和監控真實應用程式。實作實驗室將引導您完成整體流程,從基礎架構布建和最佳化,到適用於使用案例脈絡的應用程式部署,例如在網路邊緣部署視覺 AI 應用程式。 

立即申請,透過 LaunchPad 免費開始雲端原生開發。