附註:

在 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 選擇第二種方法。確定機器上已安裝 fuse3 和 jq。在 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=admin 和 password=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.zip 的 dashboard-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 。