全部產品
Search
文件中心

Container Service for Kubernetes:基於ACK使用Triton部署Qwen模型推理服務

更新時間:Jul 27, 2024

本文以Qwen1.5-4B-Chat模型、GPU類型為T4和A10卡為例,示範如何在ACK中使用Triton和vLLM(Versatile Large Language Model)推理架構部署通義千問(Qwen)模型推理服務。

背景資訊

Qwen1.5-4B-Chat

Qwen1.5-4B-Chat是阿里雲基於Transformer大語言模型研發的40億參數模型,模型在超大規模的預訓練資料(預訓練資料類型多樣且覆蓋廣泛,包括大量網路文本、專業書籍、代碼等)上進行訓練得到。更多模型資訊,請參見Qwen GitHub程式碼程式庫

Triton(Triton Inference Server)

Triton(Triton Inference Server)是NVIDIA開源的一個推理服務架構,可以協助您快速搭建AI推理應用。Triton支援多種不同的機器學習架構作為它的運行時後端,包括TensorRT、TensorFlow、PyTorch、ONNX、vLLM等。Triton面向即時推理、批量推理以及音視頻流式推理情境進行了許多最佳化,在推理時能獲得更好的效能。Triton的核心功能包括:

  • 支援多種機器學習和深度學習運行時架構

  • 支援並行存取模型執行

  • 動態Batching

  • 支援暴露GPU利用率、請求延時、請求輸送量等核心推理服務指標

更多關於Triton推理服務架構的資訊,請參考Triton Inference Server GitHub程式碼程式庫

vLLM

vLLM是一個高效易用的大語言模型推理服務架構,vLLM支援包括通義千問在內的多種常見大語言模型。vLLM通過PagedAttention最佳化、動態批量推理(Continuous Batching)、模型量化等最佳化技術,可以取得較好的大語言模型推理效率。更多關於vLLM架構的資訊,請參見vLLM GitHub程式碼程式庫

前提條件

  • 已建立包含GPU節點的ACK叢集Pro版,且叢集版本為1.22及以上,GPU節點顯存需為16GB及以上。具體操作,請參見建立ACK託管叢集

    建議GPU節點使用525版本驅動,您可以通過為GPU節點池添加標籤ack.aliyun.com/nvidia-driver-version:525.105.17指定驅動版本為525.105.17。具體操作,請參見通過指定版本號碼自訂節點GPU驅動版本

  • 已安裝最新版Arena用戶端。具體操作,請參見配置Arena用戶端

步驟一:準備模型資料

本文以Qwen1.5-4B-Chat模型為例,示範如何下載模型、上傳模型至OSS,以及在ACK叢集中建立對應的儲存卷PV和儲存卷聲明PVC。

如需使用其他模型,請參見vLLM支援的模型列表;如需上傳模型至NAS,請參見使用NAS靜態儲存卷

  1. 下載模型檔案。

    1. 執行以下命令,安裝Git。

      # 可執行yum install git或apt install git安裝。
      yum install git
    2. 執行以下命令,安裝Git LFS(Large File Support)外掛程式。

      # 可執行yum install git-lfs或apt install git-lfs安裝。
      yum install git-lfs
    3. 執行以下命令,將ModelScope上的Qwen1.5-4B-Chat倉庫複製到本地。

      GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.git
    4. 執行以下命令,進入Qwen1.5-4B-Chat目錄,下載LFS管理的大檔案。

      cd Qwen1.5-4B-Chat
      git lfs pull
  2. 將下載的Qwen1.5-4B-Chat檔案上傳至OSS。

    1. 登入OSS控制台,查看並記錄已建立的Bucket名稱。

      如何建立Bucket,請參見建立儲存空間

    2. 安裝和配置ossutil,用於管理OSS資源。具體操作,請參見安裝ossutil

    3. 執行以下命令,在OSS建立名為Qwen1.5-4B-Chat的目錄。

      ossutil mkdir oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat
    4. 執行以下命令,上傳模型檔案至OSS。

      ossutil cp -r ./Qwen1.5-4B-Chat oss://<Your-Bucket-Name>/Qwen1.5-4B-Chat
  3. 為目的地組群配置儲存卷PV和儲存聲明PVC。具體操作,請參見使用OSS靜態儲存卷

    • 以下為樣本PV的配置資訊:

      配置項

      說明

      儲存卷類型

      OSS

      名稱

      llm-model

      訪問認證

      配置用於訪問OSS的AccessKey ID和AccessKey Secret。

      Bucket ID

      選擇已建立的OSS Bucket。

      OSS Path

      選擇模型所在的路徑,如/models/Qwen1.5-4B-Chat。

    • 以下為樣本PVC的配置資訊:

      配置項

      說明

      儲存宣告類型

      OSS

      名稱

      llm-model

      分配模式

      選擇已有儲存卷

      已有儲存卷

      單擊選擇已有儲存卷連結,選擇已建立的儲存卷PV。

步驟二:配置Triton推理服務架構

以下是建立Triton推理服務架構所需的vLLM設定檔config.pbtxt和Triton設定檔model.json

  1. 執行以下命令,建立工作目錄。

    mkdir triton-vllm
  2. 執行以下命令,建立vLLM設定檔config.pbtxt

    cat << EOF > triton-vllm/config.pbtxt
    backend: "vllm"
    
    # The usage of device is deferred to the vLLM engine
    instance_group [
      {
        count: 1
        kind: KIND_MODEL
      }
    ]
    
    version_policy: { all { }}
    EOF
  3. 執行以下命令,建立Triton設定檔model.json

    大模型對顯存資源需求較高,因此在生產環境中,推薦您採用效能卓越的A10機型以確保最佳運行效果。若是出於測試目的,可以使用具備較高普及度和成本效益的T4機型,但T4的效能表現可能與A10存在較大差距。

    單卡A10環境

    cat << EOF > triton-vllm/model.json
    {
        "model":"/model/Qwen1.5-4B-Chat",
        "disable_log_requests": "true",
        "gpu_memory_utilization": 0.95,
        "trust_remote_code": "true",
        "max_model_len": 16384
    }
    EOF

    在以上設定檔中,通過max_model_len參數可配置模型最大可處理的Token長度,增大該參數可獲得更好的模型對話效果,但是可能會佔用更多GPU顯存資源。使用vLLM + Triton推理服務架構的完整配置,請參見GitHub官方範例文件

    單卡T4環境

    cat << EOF > triton-vllm/model.json
    {
        "model":"/model/Qwen1.5-4B-Chat",
        "disable_log_requests": "true",
        "gpu_memory_utilization": 0.95,
        "trust_remote_code": "true",
        "dtype": "half",
        "max_model_len": 8192
    }
    EOF

    在以上設定檔中,使用max_model_len參數可以設定模型最大可處理的Token長度,增大該參數可以獲得更好的模型對話效果,但是可能會佔用更多GPU顯存資源。通過dtype參數可以設定模型載入時使用的浮點數精度,由於T4 GPU暫不支援bfloat16(bf16)精度,因此在上述配置中將dtype設定為半精度浮點數(half)。使用vLLM + Triton推理服務架構的完整配置,請參考GitHub官方範例文件

步驟三:部署推理服務

以下使用Arena部署Qwen1.5-4B-Chat模型的推理服務。該推理服務使用Triton作為推理服務架構,使用vLLM作為模型推理架構。

  1. 執行以下命令,將環境變數triton_config_filemodel_config_file分別指向步驟二中建立的Triton設定檔和vLLM設定檔,便於在不同環境下靈活配置和部署模型推理服務,而無需寫入程式碼檔案路徑到每個命令或指令碼中。

    export triton_config_file="triton-vllm/config.pbtxt"
    export model_config_file="triton-vllm/model.json"
  2. 執行以下命令,部署推理服務。

    arena serve triton \
        --name=triton-vllm \
        --version=v1 \
        --image=ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/tritonserver:24.04-vllm-python-py3-ubuntu22.04 \
        --gpus=1 \
        --cpu=6 \
        --memory=30Gi \
        --data="llm-model:/model/Qwen1.5-4B-Chat" \
        --model-repository /triton-config \
        --config-file="$model_config_file:/triton-config/qwen-4b/1/model.json" \
        --config-file="$triton_config_file:/triton-config/qwen-4b/config.pbtxt" \
        --http-port=8000 \
        --grpc-port=9000 \
        --allow-metrics=true

    參數說明如下所示:

    參數

    說明

    --name

    指定推理服務名稱。

    --version

    指定推理服務版本。

    --image

    指定推理服務的鏡像地址。

    --gpus

    指定單個推理服務副本需要使用的GPU卡數。

    --cpu

    指定單個推理服務副本需要使用的CPU數量。

    --memory

    指定單個推理服務副本需要使用的記憶體。

    --data

    掛載共用儲存卷PVC到運行環境中。它由兩部分組成,通過英文冒號(:)分割。冒號左側是您已經準備好的PVC名稱。您可以通過命令arena data list查看當前叢集可用的PVC列表;冒號右側是您想將PVC的掛載到運行環境中的路徑,也是您訓練代碼要讀取資料的本地路徑。這樣通過掛載的方式,您的代碼就可以訪問PVC的資料。

    --config-file

    掛載本地的設定檔到運行環境中。它由兩部分組成,通過英文冒號(:)分割。冒號左側是您已經準備好的本地檔案;冒號右側是本地檔案掛載到運行環境中的路徑。

    --model-repository

    Triton的模型倉庫目錄,模型倉庫目錄下可以包含多個子目錄,每個子目錄代表一個待載入到Triton推理服務架構中的一個模型,每個子目錄下應當包含對應模型的設定檔。更多詳細資料,請參見Triton官方文檔

    --http-port

    Triton推理服務暴露的HTTP連接埠。

    --grpc-port

    Triton推理服務暴露的gRPC連接埠。

    --allow-metrics

    是否暴露Triton推理服務的監控指標。

    預期輸出:

    configmap/triton-vllm-v1-4bd5884e6b5b6a3 created
    configmap/triton-vllm-v1-7815124a8204002 created
    service/triton-vllm-v1-tritoninferenceserver created
    deployment.apps/triton-vllm-v1-tritoninferenceserver created
    INFO[0007] The Job triton-vllm has been submitted successfully
    INFO[0007] You can run `arena serve get triton-vllm --type triton-serving -n default` to check the job status

    輸出結果表明推理服務已成功部署。

  3. 執行下列命令,查看推理服務的詳細資料,等待服務就緒。

    arena serve get triton-vllm

    預期輸出:

    Name:       triton-vllm
    Namespace:  default
    Type:       Triton
    Version:    v1
    Desired:    1
    Available:  1
    Age:        3m
    Address:    172.16.XX.XX
    Port:       RESTFUL:8000,GRPC:9000
    GPU:        1
    
    Instances:
      NAME                                                  STATUS   AGE  READY  RESTARTS  GPU  NODE
      ----                                                  ------   ---  -----  --------  ---  ----
      triton-vllm-v1-tritoninferenceserver-b69cb7759-gkwz6  Running  3m   1/1    0         1    cn-beijing.172.16.XX.XX

    輸出結果表明該推理服務的一個Pod(triton-vllm-v1-tritoninferenceserver-b69cb7759-gkwz6)正在穩定運行,且已準備好提供服務。

步驟四:驗證推理服務

  1. 執行以下命令,建立推理服務與本地環境之間的連接埠轉寄。

    重要

    請注意kubectl port-forward建立的連接埠轉寄不具備生產層級的可靠性、安全性和擴充性,因此僅適用於開發和調試目的,不適合在生產環境使用。更多關於Kubernetes叢集內生產可用的網路方案的資訊,請參見Ingress概述

    kubectl port-forward svc/triton-vllm-v1-tritoninferenceserver 8000:8000

    預期輸出:

    Forwarding from 127.0.0.1:8000 -> 8000
    Forwarding from [::1]:8000 -> 8000
  2. 執行以下命令,向Triton模型推理服務發送一條模型推理請求。

    curl -X POST localhost:8000/v2/models/qwen-4b/generate -d '{"text_input": "什麼是人工智慧?人工智慧是", "parameters": {"stream": false, "temperature": 0}}'

    請將上述命令中URL路徑的qwen-4b替換為實際推理服務配置的模型名。

    預期輸出:

    {"model_name":"qwen-4b","model_version":"1","text_output":"什麼是人工智慧?人工智慧是電腦科學的一個分支,它研究如何使電腦具有智能行為。人工智慧的目標"}

    輸出結果表明模型可以根據提問自動產生關於人工智慧的定義。

(可選)步驟五:清理環境

如果不再使用已建立的資源,請及時清理。

  • 執行以下命令,清理已部署的模型推理服務。

    arena serve del triton-vllm
  • 執行以下命令,清理已建立的PV和PVC。

    kubectl delete pvc llm-model
    kubectl delete pv llm-model