附註:

在 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 早期存取版本。

目標

必要條件

作業 1:在 OCI Compute 中建立 GPU 執行處理

  1. 登入 OCI 主控台,瀏覽至 OCI 功能表運算執行處理,然後按一下建立執行處理

  2. 選取具備 Oracle Cloud Marketplace 映像檔 NVIDIA GPU Cloud 機器映像檔的 VM.GPU.A10.1,開機磁碟區為 250GB。如需詳細資訊,請參閱將 NVIDIA GPU Cloud 與 Oracle Cloud Infrastructure 搭配使用

  3. 機器啟動之後,請使用您的私密金鑰和機器公用 IP 連線。

    ssh -i <private_key> ubuntu@<public_ip>
    
  4. 確定開機磁碟區已增加空間。

    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。寫入時無法使用此選項,因此必須自行建立模型儲存區域

  1. 在 OCI 物件儲存中建立名稱為 NIM 的儲存桶。如需詳細資訊,請參閱建立物件儲存的儲存桶

  2. 移至終端機視窗,使用您的使用者名稱和密碼登入 NVIDIA 容器登錄並提取容器。執行下列命令。

    docker login nvcr.io
    docker pull nvcr.io/ohlfw0olaadg/ea-participants/nemollm-inference-ms:24.02.rc4
    
  3. 複製 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
    
  4. 建立模型組態。

    複製 model_config.yaml 檔案並建立目錄以代管模型存放區。這是模型儲存區域產生器命令將儲存輸出的位置。

    mkdir model-store
    chmod -R 777 model-store
    
  5. 執行模型儲存區域產生器命令。

    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"
    
  6. 將模型儲存區域匯出至 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 選擇第二種方法。確定機器上已安裝 fuse3jq。在 Ubuntu 上,您可以執行 sudo apt install fuse3 jq

  1. 從 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`
    
  2. 下載並安裝 rclone。

    curl https://rclone.org/install.sh | sudo bash
    
  3. 準備 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
    
  4. 使用 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
    
  5. 在另一個終端機視窗中,您可以檢查 ls $HOME/test_directory/model_bucket_oci 是否傳回儲存桶的內容。

  6. 在另一個終端機視窗中,啟動將路徑傳送至 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
    
  7. 在 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 叢集。如需詳細資訊,請參閱使用主控台以「快速建立」工作流程中的「預設設定值」建立叢集

工作 7:在 OCI Cloud Shell 中使用 Helm 部署

若要存取 OCI Cloud Shell,請參閱透過主控台存取 Cloud Shell

  1. 您可以在 oke.zip 存檔中找到 Helm 組態,您必須在此更新 values.yaml。將存檔上傳至您的 OCI Cloud Shell 並將其解壓縮。如需詳細資訊,請參閱使用功能表將檔案上傳至 Cloud Shell

    unzip oke.zip
    cd oke
    
  2. 複查您在 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=adminpassword=xxxxxxxxx 登入。需要 serviceMonitorSelectorNilUsesHelmValues 旗標,如此 Prometheus 才能在部署的範例版本中找到推論伺服器指標。

  1. 部署監控 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 負載平衡器

  1. 例如 Grafana 儀表板位於 oke.zipdashboard-review.json。使用 Grafana 中的匯入功能來匯入與檢視此儀表板。

  2. 您可以執行下列命令來查看 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:部署推論伺服器

  1. 執行下列命令,以使用預設組態來部署推論伺服器。

    cd <directory containing Chart.yaml>
    helm install example . -f values.yaml --debug
    
  2. 使用 kubectl 來查看狀態,並等待推論伺服器 Pod 執行。第一個提取可能需要幾分鐘的時間。建立容器之後,載入模型也需要幾分鐘的時間。您可以使用下列指令監視 Pod。

    kubectl describe pods <POD_NAME>
    kubectl logs <POD_NAME>
    
  3. 設定完成後,您的容器就應該在執行中。

    $ 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

  1. 取得服務以取得推論伺服器的公用 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
    
  2. 推論伺服器會在連接埠 8000 上顯示 HTTP 端點,以及連接埠 8001 上的 gRPC 端點,以及連接埠 8002 上的 Prometheus 測量結果端點。您可以使用 curl 從 HTTP 端點取得推論伺服器的中繼資料。

    $ curl 34.83.9.133:8000/v2
    
  3. 您可以從從屬端機器,將要求傳送至連接埠 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:清除部署

  1. 在您完成使用推論伺服器之後,應該使用 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
    
  2. 對於 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
    
  3. 您也可以刪除為保留模型儲存區域建立的 OCI 物件儲存的儲存桶。

    $ oci os bucket delete --bucket-name NIM --empty
    

認可

其他學習資源

瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center