附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 憑證、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特有的值。
在 OKE 上部署 NVIDIA NIM,以推論儲存在 OCI 物件儲存上的模型儲存庫
簡介
本教學課程示範如何使用 NVIDIA TensorRT-LLM 後端和 NVIDIA Triton 推論伺服器在 Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) 上部署 NVIDIA NIM ,以在 Kubernetes 架構中提供大型語言模型 (LLM)。使用的模型是 GPU A10 上的 Llama2-7B-chat
。為了擴展性,我們正在 OCI 物件儲存的儲存桶上代管模型儲存區域。
注意:本教學課程的所有測試皆已發行,並附帶
nemollm-inference-ms:24.02.rc4
的 NVIDIA NIM 早期存取版本。
目標
- 實現 LLM 推論伺服器的可擴展部署。
必要條件
-
存取 Oracle Cloud Infrastructure (OCI) 租用戶。
-
使用 NVIDIA GPU 存取資源配置,例如 A10 GPU (即
VM.GPU.A10.1
)。如需增加限制之要求的詳細資訊,請參閱服務限制。 -
您的執行處理能夠透過執行處理主體進行認證。如需詳細資訊,請參閱從執行處理呼叫服務。
-
存取 NVIDIA AI Enterprise 以提取 NVIDIA NIM 容器。如需詳細資訊,請參閱 NVIDIA AI Enterprise 。
-
具有存取權杖的 HuggingFace 帳戶已設定為下載
llama2-7B-chat
。 -
Kubernetes 與 Helm 基本術語的知識。
作業 1:在 OCI Compute 中建立 GPU 執行處理
-
登入 OCI 主控台,瀏覽至 OCI 功能表、運算、執行處理,然後按一下建立執行處理。
-
選取具備 Oracle Cloud Marketplace 映像檔 NVIDIA GPU Cloud 機器映像檔的
VM.GPU.A10.1
,開機磁碟區為 250GB。如需詳細資訊,請參閱將 NVIDIA GPU Cloud 與 Oracle Cloud Infrastructure 搭配使用。 -
機器啟動之後,請使用您的私密金鑰和機器公用 IP 連線。
ssh -i <private_key> ubuntu@<public_ip>
-
確定開機磁碟區已增加空間。
df -h # check the initial space on disk sudo growpart /dev/sda 1 sudo resize2fs /dev/sda1 df -h # check the space after the commands execution
工作 2:更新 NVIDIA 驅動程式 ( 選擇性 )
建議您根據 NVIDIA 提供的指南,將驅動程式更新為最新版本,並搭配驅動程式與 CUDA 版本之間的相容性矩陣。如需詳細資訊,請參閱 CUDA 相容性與 CUDA Toolkit 12.4 Update 1 Downloads 。
sudo apt purge nvidia* libnvidia*
sudo apt-get install -y cuda-drivers-545
sudo apt-get install -y nvidia-kernel-open-545
sudo apt-get -y install cuda-toolkit-12-3
sudo reboot
確定您有 nvidia-container-toolkit
。
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
執行下列命令來檢查新版本。
nvidia-smi
/usr/local/cuda/bin/nvcc --version
工作 3:準備模型登錄
您可以使用預先建置的模型。不過,我們選擇在 A10 GPU 上執行 Llama2-7B-chat
。寫入時無法使用此選項,因此必須自行建立模型儲存區域。
-
在 OCI 物件儲存中建立名稱為
NIM
的儲存桶。如需詳細資訊,請參閱建立物件儲存的儲存桶。 -
移至終端機視窗,使用您的使用者名稱和密碼登入 NVIDIA 容器登錄並提取容器。執行下列命令。
docker login nvcr.io docker pull nvcr.io/ohlfw0olaadg/ea-participants/nemollm-inference-ms:24.02.rc4
-
複製 HuggingFace 模型。
# Install git-lfs curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs # clone the model from HF git clone https://huggingface.co/meta-llama/Llama-2-7b-chat-hf
-
建立模型組態。
複製
model_config.yaml
檔案並建立目錄以代管模型存放區。這是模型儲存區域產生器命令將儲存輸出的位置。mkdir model-store chmod -R 777 model-store
-
執行模型儲存區域產生器命令。
docker run --rm -it --gpus all -v $(pwd)/model-store:/model-store -v $(pwd)/model_config.yaml:/model_config.yaml -v $(pwd)/Llama-2-7b-chat-hf:/engine_dir nvcr.io/ohlfw0olaadg/ea-participants/nemollm-inference-ms:24.02.rc4 bash -c "model_repo_generator llm --verbose --yaml_config_file=/model_config.yaml"
-
將模型儲存區域匯出至 OCI 物件儲存的儲存桶。
模型儲存庫位於
model-store
目錄中。您可以使用 Oracle Cloud Infrastructure 命令行介面 (OCI CLI) 大量上傳到區域中的其中一個儲存桶。在此教學課程中,儲存桶是NIM
,我們希望在NIM/llama2-7b-hf
中上傳模型存放區 (如果我們上傳不同的模型組態至相同的儲存桶)。cd model-store oci os object bulk-upload -bn NIM --src-dir . --prefix llama2-7b-hf/ --auth instance_principal
工作 4:送出要求至虛擬機器 (IaaS 執行)
現在,模型儲存區域會上傳到一個 OCI Object Storage 貯體。
注意:選項參數
--model-repository
目前以硬式編碼方式編碼在容器中,我們無法在啟動儲存桶時直接指向該儲存桶。其中一個選項是改編容器內的 Python 命令檔,但我們需要 sudo 權限。另一個則是將儲存桶直接掛載為機器上的檔案系統。在本教學課程中,我們將使用 rclone 選擇第二種方法。確定機器上已安裝fuse3
和jq
。在 Ubuntu 上,您可以執行sudo apt install fuse3 jq
。
-
從 OCI 主控台擷取您的命名空間、區間 OCID 和區域,或從您的運算執行處理執行下列命令。
#NAMESPACE: echo namespace is : `oci os ns get --auth instance_principal | jq .data` #COMPARTMENT_OCID: echo compartment ocid is: `curl -H "Authorization: Bearer Oracle" -L http://169.254.169.254/opc/v2/instance/ | jq .compartmentId` #REGION: echo region is: `curl -H "Authorization: Bearer Oracle" -L http://169.254.169.254/opc/v2/instance/ | jq .region`
-
下載並安裝 rclone。
curl https://rclone.org/install.sh | sudo bash
-
準備 rclone 組態檔。請務必使用您的值更新
##NAMESPACE##
##COMPARTMENT_OCID##
##REGION##
。mkdir -p ~/rclone mkdir -p ~/test_directory/model_bucket_oci cat << EOF > ~/rclone/rclone.conf [model_bucket_oci] type = oracleobjectstorage provider = instance_principal_auth namespace = ##NAMESPACE## compartment = ##COMPARTMENT_OCID## region = ##REGION## EOF
-
使用 rclone 掛載儲存桶。
sudo /usr/bin/rclone mount --config=$HOME/rclone/rclone.conf --tpslimit 50 --vfs-cache-mode writes --allow-non-empty --transfers 10 --allow-other model_bucket_oci:NIM/llama2-7b-hf $HOME/test_directory/model_bucket_oci
-
在另一個終端機視窗中,您可以檢查
ls $HOME/test_directory/model_bucket_oci
是否傳回儲存桶的內容。 -
在另一個終端機視窗中,啟動將路徑傳送至
model-store
作為引數的容器。docker run --gpus all -p9999:9999 -p9998:9998 -v $HOME/test_directory/model_bucket_oci:/model-store nvcr.io/ohlfw0olaadg/ea-participants/nemollm-inference-ms:24.02.rc4 nemollm_inference_ms --model llama2-7b-chat --openai_port="9999" --nemo_port="9998" --num_gpus 1
-
在 3 分鐘後,推論伺服器應該就緒可以提供服務。在另一個終端機視窗中,您可以執行下列要求。
注意:若要從本機機器執行,必須在機器和子網路層次使用公用 IP 並開啟連接埠
9999
。curl -X "POST" 'http://localhost:9999/v1/completions' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{ "model": "llama2-7b-chat", "prompt": "Can you briefly describe Oracle Cloud?", "max_tokens": 100, "temperature": 0.7, "n": 1, "stream": false, "stop": "string", "frequency_penalty": 0.0 }' | jq ".choices[0].text"
工作 5:更新 cloud-init
命令檔
注意:理想情況下,在 Kubernetes 中使用 rclone 的方式是在啟動推論伺服器之前,先使用 rclone container 作為 sidecar。此功能在本機使用 Docker 正常運作,但由於
--device
選項需要使用fuse
,因此由於缺少此功能的支援 ( FUSE 磁碟區,2015 年的功能要求在 2024 年 3 月仍然非常作用中),因此與 Kubernetes 搭配使用變得複雜。在本教學課程中,我們選擇的解決方法是在主機上設定 rclone 作為服務,然後在啟動時掛載儲存桶。
在 cloud-init 程序檔中,將 ##NAMESPACE##
、##COMPARTMENT_OCID##
和 ##REGION##
第 17 行、18 和 19 行的值取代為 Task 4.1 中擷取的值。您也可以更新第 57 行的儲存桶值。依照預設,它稱為 NIM
,並具有名為 llama2-7b-hf
的目錄。
此 cloud-init
命令檔將上傳至您 OKE 叢集中的 GPU 節點。第一部分包括將開機磁碟區增加到值集。接著下載 rclone,建立正確的目錄並建立組態檔,就像在 GPU VM 上執行的一樣。最後,它會以服務身分啟動 rclone,並將儲存桶掛載至 /opt/mnt/model_bucket_oci
。
作業 6:在 OKE 上部署
部署結束時的目標架構如下圖所示。
現在,將一切都放在 OKE 中。
建立稍微調適的 OKE 叢集。如需詳細資訊,請參閱使用主控台以「快速建立」工作流程中的「預設設定值」建立叢集。
-
首先,建立 1 個稱為
monitoring
的節點集區,此節點集區將僅供 1 個節點 (亦即,VM.Standard.E4.Flex
具有 5 個 OCPU 和 80GB RAM) 使用預設映像檔進行監督。 -
您的叢集啟動之後,請使用 GPU 驅動程式 (即
Oracle-Linux-8.X-Gen2-GPU-XXXX.XX.XX
) 的預設映像檔,建立另一個節點集區,其中含有 1 個 GPU 節點 (即VM.GPU.A10.1
) 的NIM
。注意:請務必增加開機磁碟區 (350GB),並在顯示進階選項和初始化命令檔中新增先前修改過的 cloud-init 命令檔。
工作 7:在 OCI Cloud Shell 中使用 Helm 部署
若要存取 OCI Cloud Shell,請參閱透過主控台存取 Cloud Shell 。
-
您可以在
oke.zip
存檔中找到 Helm 組態,您必須在此更新values.yaml
。將存檔上傳至您的 OCI Cloud Shell 並將其解壓縮。如需詳細資訊,請參閱使用功能表將檔案上傳至 Cloud Shell 。unzip oke.zip cd oke
-
複查您在
values.yaml
中提取映像檔之加密密碼的證明資料。如需詳細資訊,請參閱建立影像拉引式加密密碼。registry: nvcr.io username: $oauthtoken password: <YOUR_KEY_FROM_NVIDIA> email: someone@host.com
作業 8:部署監督
監控包括 Grafana 和 Prometheus Pod。組態來自 kube-prometheus-stack 。
我們會在這裡新增公用負載平衡器,以便從網際網路連線到 Grafana 儀表板。使用 username=admin
和 password=xxxxxxxxx
登入。需要 serviceMonitorSelectorNilUsesHelmValues
旗標,如此 Prometheus 才能在部署的範例版本中找到推論伺服器指標。
-
部署監控 Pod。
helm install example-metrics --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false --set grafana.service.type=LoadBalancer prometheus-community/kube-prometheus-stack --debug
注意:預設負載平衡器是以固定資源配置和 100Mbps 頻寬建立的負載平衡器。如果頻寬是瓶頸,您可以根據 OCI 限制切換至彈性資源配置並調整頻寬。如需詳細資訊,請參閱為 LoadBalancer 類型的 Kubernetes 服務佈建 OCI 負載平衡器。
-
例如 Grafana 儀表板位於
oke.zip
的dashboard-review.json
。使用 Grafana 中的匯入功能來匯入與檢視此儀表板。 -
您可以執行下列命令來查看 Grafana 儀表板的公用 IP。
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 2m33s example-metrics-grafana LoadBalancer 10.96.82.33 141.145.220.114 80:31005/TCP 2m38s
作業 9:部署推論伺服器
-
執行下列命令,以使用預設組態來部署推論伺服器。
cd <directory containing Chart.yaml> helm install example . -f values.yaml --debug
-
使用
kubectl
來查看狀態,並等待推論伺服器 Pod 執行。第一個提取可能需要幾分鐘的時間。建立容器之後,載入模型也需要幾分鐘的時間。您可以使用下列指令監視 Pod。kubectl describe pods <POD_NAME> kubectl logs <POD_NAME>
-
設定完成後,您的容器就應該在執行中。
$ kubectl get pods NAME READY STATUS RESTARTS AGE example-triton-inference-server-5f74b55885-n6lt7 1/1 Running 0 2m21s
工作 10:在您的 NVIDIA NIM 容器上使用 Triton Inference Server
推論伺服器正在執行中,您可以傳送 HTTP 或 Google 遠端程序呼叫 (gRPC) 要求,以執行推論。依照預設,推斷服務會顯示 LoadBalancer 服務類型。使用以下方法尋找推論伺服器的外部 IP。本教學課程為 34.83.9.133
。
-
取得服務以取得推論伺服器的公用 IP。
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... example-triton-inference-server LoadBalancer 10.18.13.28 34.83.9.133 8000:30249/TCP,8001:30068/TCP,8002:32723/TCP 47m
-
推論伺服器會在連接埠
8000
上顯示 HTTP 端點,以及連接埠8001
上的 gRPC 端點,以及連接埠8002
上的 Prometheus 測量結果端點。您可以使用 curl 從 HTTP 端點取得推論伺服器的中繼資料。$ curl 34.83.9.133:8000/v2
-
您可以從從屬端機器,將要求傳送至連接埠
9999
上的公用 IP。curl -X "POST" 'http://34.83.9.133:9999/v1/completions' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{ "model": "llama2-7b-chat", "prompt": "Can you briefly describe Oracle Cloud?", "max_tokens": 100, "temperature": 0.7, "n": 1, "stream": false, "stop": "string", "frequency_penalty": 0.0 }' | jq ".choices[0].text"
執行結果應該看起來像是:
"\n\nOracle Cloud is a comprehensive cloud computing platform offered by Oracle Corporation. It provides a wide range of cloud services, including Infrastructure as a Service (IaaS), Platform as a Service (PaaS), and Software as a Service (SaaS). Oracle Cloud offers a variety of benefits, including:\n\n1. Scalability: Oracle Cloud allows customers to scale their resources up or down as needed, providing the flexibility to handle changes in business demand."
作業 11:清除部署
-
在您完成使用推論伺服器之後,應該使用 helm 來刪除部署。
$ helm list NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE example 1 Wed Feb 27 22:16:55 2019 DEPLOYED triton-inference-server-1.0.0 1.0 default example-metrics 1 Tue Jan 21 12:24:07 2020 DEPLOYED prometheus-operator-6.18.0 0.32.0 default $ helm uninstall example --debug $ helm uninstall example-metrics
-
對於 Prometheus 和 Grafana 服務,您應該明確刪除 CRD。如需詳細資訊,請參閱解除安裝 Helm Chart 。
$ kubectl delete crd alertmanagerconfigs.monitoring.coreos.com alertmanagers.monitoring.coreos.com podmonitors.monitoring.coreos.com probes.monitoring.coreos.com prometheuses.monitoring.coreos.com prometheusrules.monitoring.coreos.com servicemonitors.monitoring.coreos.com thanosrulers.monitoring.coreos.com
-
您也可以刪除為保留模型儲存區域建立的 OCI 物件儲存的儲存桶。
$ oci os bucket delete --bucket-name NIM --empty
相關連結
認可
- 作者 - Bruno Garbaccio (AI Infra/GPU 專家,EMEA)
其他學習資源
瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Deploy NVIDIA NIM on OKE for Inference with the Model Repository Stored on OCI Object Storage
F96579-01
April 2024