本文詳細介紹如何在阿里雲Container ServiceKubernetes版(ACK)中使用TensorRT-LLM和Triton推理伺服器部署Qwen2大語言模型推理服務。通過Fluid資料編排和緩衝技術最佳化模型載入效能,實現高效的AI推理服務部署。
背景資訊
Qwen2大語言模型
Qwen2-1.5B-Instruct是阿里巴巴通義實驗室研發的基於Transformer架構的大語言模型,擁有15億參數規模。該模型在海量多樣化預訓練資料上進行訓練,涵蓋網路文本、專業書籍、代碼等多種資料類型,具備強大的自然語言理解和產生能力。
Qwen2系列模型具有以下特點:
-
支援多種推理任務,包括問答、文本產生、代碼理解等
-
經過指令微調,更適合實際應用情境
-
模型體積適中,適合在GPU上部署推理服務
更多模型資訊和技術細節,請參見Qwen2官方GitHub倉庫。
Triton推理伺服器
Triton Inference Server是由NVIDIA開發的開源推理服務架構,專為生產環境設計。Triton支援多種機器學習架構作為後端,包括TensorRT、TensorFlow、PyTorch、ONNX Runtime等,能夠統一管理不同架構的模型部署。
Triton的核心優勢:
-
統一的推理介面,簡化模型部署和管理
-
支援動態批處理,提高GPU利用率
-
最佳化的並發處理能力,支援高輸送量推理
-
完善的監控和指標收集功能
深入瞭解Triton推理伺服器,請訪問Triton Inference Server官方GitHub倉庫。
TensorRT-LLM最佳化引擎
TensorRT-LLM是NVIDIA專為大語言模型最佳化的推理引擎,能夠將LLM模型編譯為高度最佳化的TensorRT執行引擎,在NVIDIA GPU上實現卓越的推理效能。
主要特性包括:
-
模型量化和最佳化,顯著提升推理速度
-
支援張量並行(Tensor Parallelism)和流水線並行(Pipeline Parallelism)
-
與Triton深度整合,通過TensorRT-LLM Backend提供原生支援
-
支援多種精度模式(FP16、INT8等)以平衡效能和精度
擷取更多技術細節,請查閱TensorRT-LLM官方GitHub倉庫。
前提條件
在開始部署之前,請確保滿足以下環境要求:
-
GPU環境準備:已建立包含NVIDIA A10 GPU的ACK Pro版叢集,叢集Kubernetes版本需為1.22或更高版本。
驅動版本建議:推薦使用NVIDIA驅動525版本。可通過為GPU節點池添加標籤
ack.aliyun.com/nvidia-driver-version:525.105.17來指定驅動版本。詳細操作請參考GPU驅動升級文檔。 -
Fluid組件安裝:已在叢集中安裝Fluid資料編排和緩衝系統。如未安裝,請參考Fluid安裝指南完成部署。
-
Arena工具配置:已安裝並配置Arena CLI工具,用於模型服務的部署和管理。安裝方法請參考Arena安裝文檔。
-
OSS儲存準備:已開通阿里雲Object Storage Service服務(OSS),並建立用於儲存模型檔案的儲存空間(Bucket)。具體操作請參考OSS快速入門和建立儲存空間。
-
許可權配置:確保您的阿里雲帳號具有OSS讀寫權限和ACK叢集系統管理權限。
步驟一:配置Fluid資料集和緩衝
本步驟將建立Fluid Dataset和JindoRuntime,用於管理模型資料並提供高效能緩衝加速。Dataset負責資料群組織,JindoRuntime提供分布式緩衝能力,顯著提升模型載入和推理效能。
效能提示:通過記憶體緩衝策略,可將模型載入時間從分鐘級縮短到秒級。
-
建立OSS訪問憑證
首先建立Kubernetes Secret來儲存訪問OSS所需的認證資訊。
kubectl apply -f-<<EOF apiVersion: v1 kind: Secret metadata: name: fluid-oss-secret stringData: fs.oss.accessKeyId: <YourAccessKey ID> fs.oss.accessKeySecret: <YourAccessKey Secret> EOF安全提醒:請將
<YourAccessKey ID>和<YourAccessKey Secret>替換為您實際的阿里雲存取金鑰。關於如何擷取AK/SK,請參考存取金鑰管理文檔。執行成功後應看到以下輸出:
secret/fluid-oss-secret created -
配置Dataset和JindoRuntime
建立dataset.yaml設定檔,定義Dataset和JindoRuntime資源。Dataset用於描述資料來源,JindoRuntime提供分布式快取服務。
關於Dataset和JindoRuntime的詳細配置說明,請參考Fluid配置文檔。
# 建立Dataset資源,配置OSS資料來源 apiVersion: data.fluid.io/v1alpha1 kind: Dataset metadata: name: qwen2-oss spec: mounts: - mountPoint: oss://<oss_bucket>/qwen2-1.5b # 替換為您的實際OSS bucket名稱 name: qwen2 path: / options: fs.oss.endpoint: <oss_endpoint> # 替換為您的OSS endpoint encryptOptions: - name: fs.oss.accessKeyId valueFrom: secretKeyRef: name: fluid-oss-secret key: fs.oss.accessKeyId - name: fs.oss.accessKeySecret valueFrom: secretKeyRef: name: fluid-oss-secret key: fs.oss.accessKeySecret accessModes: - ReadWriteMany --- # 建立JindoRuntime資源,配置緩衝策略 apiVersion: data.fluid.io/v1alpha1 kind: JindoRuntime metadata: name: qwen2-oss spec: replicas: 2 tieredstore: levels: - mediumtype: MEM volumeType: emptyDir path: /dev/shm quota: 20Gi high: "0.95" low: "0.7" fuse: properties: fs.oss.read.buffer.size: "8388608" # 8MB讀取緩衝區 fs.oss.download.thread.concurrency: "200" # 並發下載線程數 fs.oss.read.readahead.max.buffer.count: "200" # 預讀緩衝區數量 fs.oss.read.sequence.ambiguity.range: "2147483647" # 序列讀取範圍 args: - -oauto_cache - -oattr_timeout=1 - -oentry_timeout=1 - -onegative_timeout=1配置說明:
-
mountPoint:指向OSS中儲存模型檔案的路徑 -
quota: 20Gi:分配20GB記憶體用於緩衝 -
replicas: 2:部署2個緩衝執行個體以提高可用性
-
-
部署資源配置
應用設定檔建立Dataset和JindoRuntime資源:
kubectl apply -f dataset.yaml成功執行後應看到:
dataset.data.fluid.io/qwen2-oss created jindoruntime.data.fluid.io/qwen2-oss created這表明Dataset和JindoRuntime資源已成功建立並開始運行。
-
驗證部署狀態
檢查Dataset的部署狀態和緩衝情況:
kubectl get dataset qwen2-oss預期輸出類似:
NAME UFS TOTAL SIZE CACHED CACHE CAPACITY CACHED PERCENTAGE PHASE AGE qwen2-oss 0.00B 0.00B 20.00GiB 0.0% Bound 57s狀態說明:
PHASE: Bound表示Dataset已成功綁定,CACHE CAPACITY: 20.00GiB顯示已指派20GB記憶體緩衝空間。
步驟二:構建模型推理環境
本步驟使用Fluid Dataflow自動化完成模型部署的關鍵環節:從ModelScope下載Qwen2模型、轉換為TensorRT-LLM格式、構建推理引擎,並更新快取資料。整個流程通過聲明式配置實現,確保部署的一致性和可重複性。
Dataflow將複雜的多步驟操作封裝為自動化流程,減少人工幹預,提高部署效率。
-
建立Dataflow設定檔
建立dataflow.yaml檔案,定義包含三個關鍵步驟的自動化流程:
-
從ModelScope下載Qwen2-1.5B-Instruct基本模型
-
使用TensorRT-LLM工具鏈轉換模型格式並構建推理引擎
-
通過Dataload預先載入最佳化後的模型資料到緩衝
# 步驟1:從ModelScope下載Qwen2模型 apiVersion: data.fluid.io/v1alpha1 kind: DataProcess metadata: name: step1-download-model spec: dataset: name: qwen2-oss namespace: default mountPath: /mnt/models/ processor: script: image: ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/base:ubuntu22.04 imagePullPolicy: IfNotPresent restartPolicy: OnFailure command: - bash source: | #!/bin/bash echo "開始下載模型..." if [ -d "${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct" ]; then echo "模型目錄已存在,跳過下載" else echo "安裝Git LFS並下載模型..." apt update && apt install -y git git-lfs git clone https://www.modelscope.cn/qwen/Qwen2-1.5B-Instruct.git Qwen2-1.5B-Instruct mv Qwen2-1.5B-Instruct ${MODEL_MOUNT_PATH} echo "模型下載完成" fi env: - name: MODEL_MOUNT_PATH value: "/mnt/models" --- # 步驟2:轉換模型並構建TensorRT-LLM引擎 apiVersion: data.fluid.io/v1alpha1 kind: DataProcess metadata: name: step2-trtllm-convert spec: runAfter: kind: DataProcess name: step1-download-model namespace: default dataset: name: qwen2-oss namespace: default mountPath: /mnt/models/ processor: script: image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tritonserver-build:24.07-trtllm-python-py3 imagePullPolicy: IfNotPresent restartPolicy: OnFailure command: - bash source: | #!/bin/bash set -ex echo "開始模型轉換流程..." cd /tensorrtllm_backend/tensorrt_llm/examples/qwen # 轉換檢查點 if [ -d "${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-ckpt" ]; then echo "檢查點已存在,跳過轉換" else echo "轉換模型檢查點..." python3 convert_checkpoint.py \ --model_dir ${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct \ --output_dir /root/Qwen2-1.5B-Instruct-ckpt \ --dtype float16 mv /root/Qwen2-1.5B-Instruct-ckpt ${MODEL_MOUNT_PATH} echo "檢查點轉換完成" fi sleep 2 # 構建TensorRT引擎 if [ -d "${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-engine" ]; then echo "引擎已存在,跳過構建" else echo "構建TensorRT-LLM引擎..." trtllm-build \ --checkpoint_dir ${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-ckpt \ --gemm_plugin float16 \ --paged_kv_cache enable \ --output_dir /root/Qwen2-1.5B-Instruct-engine mv /root/Qwen2-1.5B-Instruct-engine ${MODEL_MOUNT_PATH} echo "引擎構建完成" fi # 配置Triton模型 if [ -d "${MODEL_MOUNT_PATH}/tensorrtllm_backend" ]; then echo "配置已存在,跳過配置" else echo "配置Triton模型..." cd /tensorrtllm_backend cp all_models/inflight_batcher_llm/ qwen2_ifb -r export QWEN2_MODEL=${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct export ENGINE_PATH=${MODEL_MOUNT_PATH}/Qwen2-1.5B-Instruct-engine # 產生各組件配置 python3 tools/fill_template.py -i qwen2_ifb/preprocessing/config.pbtxt \ tokenizer_dir:${QWEN2_MODEL},triton_max_batch_size:8,preprocessing_instance_count:1 python3 tools/fill_template.py -i qwen2_ifb/postprocessing/config.pbtxt \ tokenizer_dir:${QWEN2_MODEL},triton_max_batch_size:8,postprocessing_instance_count:1 python3 tools/fill_template.py -i qwen2_ifb/tensorrt_llm_bls/config.pbtxt \ triton_max_batch_size:8,decoupled_mode:False,bls_instance_count:1,accumulate_tokens:False python3 tools/fill_template.py -i qwen2_ifb/ensemble/config.pbtxt \ triton_max_batch_size:8 python3 tools/fill_template.py -i qwen2_ifb/tensorrt_llm/config.pbtxt \ triton_backend:tensorrtllm,triton_max_batch_size:8,decoupled_mode:False,\ max_beam_width:1,engine_dir:${ENGINE_PATH},max_tokens_in_paged_kv_cache:1280,\ max_attention_window_size:1280,kv_cache_free_gpu_mem_fraction:0.5,\ exclude_input_in_output:True,enable_kv_cache_reuse:False,\ batching_strategy:inflight_fused_batching,max_queue_delay_microseconds:0 mkdir -p ${MODEL_MOUNT_PATH}/tensorrtllm_backend mv /tensorrtllm_backend/qwen2_ifb ${MODEL_MOUNT_PATH}/tensorrtllm_backend echo "Triton配置完成" fi env: - name: MODEL_MOUNT_PATH value: "/mnt/models" resources: requests: cpu: 2 memory: 10Gi nvidia.com/gpu: 1 limits: cpu: 12 memory: 30Gi nvidia.com/gpu: 1 --- # 步驟3:預先載入快取資料 apiVersion: data.fluid.io/v1alpha1 kind: DataLoad metadata: name: step3-warmup-cache spec: runAfter: kind: DataProcess name: step2-trtllm-convert namespace: default dataset: name: qwen2-oss namespace: default loadMetadata: true target: - path: /Qwen2-1.5B-Instruct-engine - path: /tensorrtllm_backend這個Dataflow配置實現了端到端的自動化模型部署流程,從原始模型擷取到生產就緒的推理服務配置。
-
-
部署Dataflow流程
應用Dataflow設定檔建立自動化處理流程:
kubectl create -f dataflow.yaml成功執行後應看到:
dataprocess.data.fluid.io/step1-download-model created dataprocess.data.fluid.io/step2-trtllm-convert created dataload.data.fluid.io/step3-warmup-cache created這表明三個處理步驟的自訂資源已成功建立。
-
監控執行進度
跟蹤Dataflow執行狀態,等待所有步驟完成:
kubectl get dataprocess執行過程中的狀態變化:
NAME DATASET PHASE AGE DURATION step1-download-model qwen2-oss Running 2m - step2-trtllm-convert qwen2-oss Pending 0s -全部完成後顯示:
NAME DATASET PHASE AGE DURATION step1-download-model qwen2-oss Complete 23m 3m2s step2-trtllm-convert qwen2-oss Complete 20m 19m58s狀態說明:
Running表示正在執行,Complete表示成功完成,Pending表示等待前置任務完成。
整個模型準備流程通常需要20-30分鐘完成,具體時間取決於網路狀況和GPU效能。
步驟三:部署Triton推理服務
使用Arena工具部署基於TensorRT-LLM最佳化的Qwen2推理服務,通過Triton Server提供RESTful和gRPC介面。
-
使用Arena部署服務
執行以下命令部署Custom類型的推理服務:
關鍵配置說明:
-
服務名稱:
qwen2-chat,版本:v1 -
資源配置:1個GPU,1個副本
-
連接埠配置:HTTP 8000,gRPC 8001,Metrics 8002
-
資料掛載:通過
--data參數將Fluid PVC掛載到/mnt/models
arena serve custom \ --name=qwen2-chat \ --version=v1 \ --gpus=1 \ --replicas=1 \ --restful-port=8000 \ --readiness-probe-action="tcpSocket" \ --readiness-probe-action-option="port: 8000" \ --readiness-probe-option="initialDelaySeconds: 30" \ --readiness-probe-option="periodSeconds: 30" \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/tritonserver:24.07-trtllm-python-py3 \ --data=qwen2-oss:/mnt/models \ "tritonserver \ --model-repository=/mnt/models/tensorrtllm_backend/qwen2_ifb \ --http-port=8000 \ --grpc-port=8001 \ --metrics-port=8002 \ --disable-auto-complete-config \ --backend-config=python,shm-region-prefix-name=prefix0_"成功部署後應看到:
service/qwen2-chat-v1 created deployment.apps/qwen2-chat-v1-custom-serving created INFO[0003] The Job qwen2-chat has been submitted successfully INFO[0003] You can run `arena serve get qwen2-chat --type custom-serving -n default` to check the job status這表明推理服務已成功提交到Kubernetes叢集。
-
-
驗證服務狀態
檢查推理服務的詳細資料和運行狀態:
arena serve get qwen2-chat服務正常運行時顯示:
Name: qwen2-chat Namespace: default Type: Custom Version: v1 Desired: 1 Available: 1 Age: 2m Address: 192.168.10.15 Port: RESTFUL:8000 GPU: 1 Instances: NAME STATUS AGE READY RESTARTS GPU NODE ---- ------ --- ----- -------- --- ---- qwen2-chat-v1-custom-serving-657869c698-hl665 Running 2m 1/1 0 1 cn-hangzhou.192.168.10.15就緒標誌:
Available: 1和READY: 1/1表示服務已完全就緒,可以接收推理請求。
服務啟動通常需要1-2分鐘完成初始化,期間Available欄位會從0變為1。
步驟四:測試推理服務
通過本地連接埠轉寄和API調用來驗證推理服務的功能和效能。
-
建立連接埠轉寄
建立本地到服務的連接埠轉寄通道以便測試:
連接埠轉寄會在當前終端會話中持續運行,如需停止可按Ctrl+C。
kubectl port-forward svc/qwen2-chat-v1 8000:8000成功建立轉寄後顯示:
Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000現在可以通過
localhost:8000訪問推理服務。 -
發送推理請求
使用curl命令向模型發送推理請求:
curl -X POST localhost:8000/v2/models/ensemble/generate \ -H "Content-Type: application/json" \ -d '{ "text_input": "什麼是機器學習?", "max_tokens": 50, "bad_words": "", "stop_words": "", "pad_id": 2, "end_id": 2 }'期望收到類似以下的響應:
{ "context_logits": 0.0, "cum_log_probs": 0.0, "generation_logits": 0.0, "model_name": "ensemble", "model_version": "1", "output_log_probs": [0.0, 0.0, 0.0, 0.0], "sequence_end": false, "sequence_id": 0, "sequence_start": false, "text_output": " 機器學習是一種人工智慧技術,它使電腦系統能夠從資料中學習模式和規律,而無需被明確編程。通過演算法分析大量資料,機器學習模型可以識別複雜的關係並做出預測或決策。" }驗證成功:返回的
text_output欄位包含模型產生的相關回答,表明推理服務正常工作。
測試建議:
-
嘗試不同類型的問題以測試模型的泛化能力
-
調整
max_tokens參數控制輸出長度 -
觀察回應時間和產生品質
(可選)步驟五:環境清理
當不再需要推理服務時,按以下步驟清理相關資源:
重要提醒:清理操作將刪除所有相關資源,包括模型資料和服務配置,請確保已備份重要訊息。
-
刪除推理服務
使用Arena命令刪除已部署的服務:
arena serve delete qwen2-chat確認刪除成功:
INFO[0001] Deleting service: qwen2-chat INFO[0002] Service qwen2-chat deleted successfully -
清理Fluid資源
刪除Dataset和JindoRuntime相關資源:
kubectl delete dataset qwen2-oss kubectl delete jindoruntime qwen2-oss -
刪除訪問憑證
清理OSS存取金鑰:
kubectl delete secret fluid-oss-secret
清理完成後,可通過以下命令驗證資源是否已完全刪除:kubectl get all -l app=qwen2-chat