本文详细介绍如何在阿里云容器服务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提供分布式缓存能力,显著提升模型加载和推理性能。
性能提示:通过内存缓存策略,可将模型加载时间从分钟级缩短到秒级。
-
创建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