全部產品
Search
文件中心

Container Service for Kubernetes:使用TensorRT-LLM部署Qwen2模型推理服務

更新時間:Feb 28, 2026

本文詳細介紹如何在阿里雲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提供分布式緩衝能力,顯著提升模型載入和推理效能。

效能提示:通過記憶體緩衝策略,可將模型載入時間從分鐘級縮短到秒級。

  1. 建立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
  2. 配置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個緩衝執行個體以提高可用性

  3. 部署資源配置

    應用設定檔建立Dataset和JindoRuntime資源:

    kubectl apply -f dataset.yaml

    成功執行後應看到:

    dataset.data.fluid.io/qwen2-oss created
    jindoruntime.data.fluid.io/qwen2-oss created

    這表明Dataset和JindoRuntime資源已成功建立並開始運行。

  4. 驗證部署狀態

    檢查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將複雜的多步驟操作封裝為自動化流程,減少人工幹預,提高部署效率。

  1. 建立Dataflow設定檔

    建立dataflow.yaml檔案,定義包含三個關鍵步驟的自動化流程:

    1. 從ModelScope下載Qwen2-1.5B-Instruct基本模型

    2. 使用TensorRT-LLM工具鏈轉換模型格式並構建推理引擎

    3. 通過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配置實現了端到端的自動化模型部署流程,從原始模型擷取到生產就緒的推理服務配置。

  2. 部署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

    這表明三個處理步驟的自訂資源已成功建立。

  3. 監控執行進度

    跟蹤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介面。

  1. 使用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叢集。

  2. 驗證服務狀態

    檢查推理服務的詳細資料和運行狀態:

    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: 1READY: 1/1表示服務已完全就緒,可以接收推理請求。

服務啟動通常需要1-2分鐘完成初始化,期間Available欄位會從0變為1。

步驟四:測試推理服務

通過本地連接埠轉寄和API調用來驗證推理服務的功能和效能。

  1. 建立連接埠轉寄

    建立本地到服務的連接埠轉寄通道以便測試:

    連接埠轉寄會在當前終端會話中持續運行,如需停止可按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訪問推理服務。

  2. 發送推理請求

    使用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參數控制輸出長度

  • 觀察回應時間和產生品質

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

當不再需要推理服務時,按以下步驟清理相關資源:

重要提醒:清理操作將刪除所有相關資源,包括模型資料和服務配置,請確保已備份重要訊息。

  1. 刪除推理服務

    使用Arena命令刪除已部署的服務:

    arena serve delete qwen2-chat

    確認刪除成功:

    INFO[0001] Deleting service: qwen2-chat
    INFO[0002] Service qwen2-chat deleted successfully
  2. 清理Fluid資源

    刪除Dataset和JindoRuntime相關資源:

    kubectl delete dataset qwen2-oss
    kubectl delete jindoruntime qwen2-oss
  3. 刪除訪問憑證

    清理OSS存取金鑰:

    kubectl delete secret fluid-oss-secret

清理完成後,可通過以下命令驗證資源是否已完全刪除:kubectl get all -l app=qwen2-chat