全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:使用TensorRT-LLM部署Qwen2模型推理服务

更新时间:Feb 27, 2026

本文详细介绍如何在阿里云容器服务Kubernetes版(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存储准备:已开通阿里云对象存储服务(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