小模型在昇腾NPU上的推理部署:【Triton-NPU初了解与使用】
作者昇腾实战派知识地图https://blog.csdn.net/Lumos_Lovegood/article/details/161601003摘要模型服务化是将训练好的模型包装成一个可以通过网络访问的标准化服务的过程。将模型部署在一个专门的服务中而其他的程序不需要关心模型所有的细节只需要通过网络协议HTTP/gRPC) 发送数据并且接收预测结果即可。Triton Inference Server 是一个开源的高性能推理服务框架支持 TensorFlow、PyTorch、ONNX 等多种模型并可在 GPU、CPU 和 NPU 等异构硬件上高效运行。它通过动态批处理、多实例并发和统一接口实现高吞吐与低延迟适合在大规模生产环境中部署和管理模型。Triton 服务化框架使用说明准备一个基于Triton格式的model repositoryTriton NPU基于Triton的Python Backend进行适配triton21.09版本之后自带Python Backend镜像标签中以-py3结束。可以参考Triton官方样例了解相关特性。Triton规定了model_repository实现时的目录结构以下是一个model repository目录结构的样例model_repository/ ├── model1 │ ├── 1 │ │ └── model.py │ └── config.pbtxt └── model2 ├── 1 │ └── model.py └── config.pbtxt model_repository/Triton 的模型仓库根目录可以包含多个模型。model/*每个子文件夹表示一个模型文件夹名即为模型名称MODEL_REPO部署时用这个名字来调用。version 子目录如1/,2/表示模型的版本号必须是整数。Triton 可以同时管理多个版本例如线上推理用 v1灰度测试用 v2。model.py或model.onnx等文件都放在对应的版本目录下。config.pbtxt每个模型必须有的配置文件用来告诉 Triton 输入输出张量类型、形状、batching 方式等。启动 Triton server/opt/tritonserver/bin/tritonserver --model-repository${MODEL_REPO} 关于model.py、config.pbtxt文件实现说明在Python backend中model.py是模型的推理逻辑实现文件必须定义以下类和方法importtriton_python_backend_utilsaspb_utilsclassTritonPythonModel:definitialize(self,args): 模型初始化逻辑类似构造函数 - args: dict包含 model_repository 路径、model 名称、version 等信息 - 这里可以加载模型权重、初始化依赖库等 passdefexecute(self,requests): 推理核心函数 - requests: list包含多个 inference request可能是 batch - 必须返回 list of pb_utils.InferenceResponse - 调用后端的模型进行推理后端模型可以使用.om计算图文件也可以使用torchair的适配等等只要是能正常在NPU上推理的模型均可 responses[]forrequestinrequests:# 获取输入张量in_tensorpb_utils.get_input_tensor_by_name(request,INPUT_NAME)in_numpyin_tensor.as_numpy()# 模型计算逻辑这里可以调用 PyTorch、TensorFlow、NumPyout_numpyin_numpy1# 示例逻辑# 构造输出out_tensorpb_utils.Tensor(OUTPUT_NAME,out_numpy)responses.append(pb_utils.InferenceResponse(output_tensors[out_tensor]))returnresponsesdeffinalize(self): 资源清理逻辑类似析构函数 - 在模型卸载时调用 - 可以释放 GPU/CPU 资源关闭文件句柄 pass必须实现TritonPythonModel类并包含initialize、execute、finalize方法。输入输出的名字和类型必须和config.pbtxt中保持一致。执行逻辑完全由使用者控制可以调用深度学习框架或自定义算法。config.pbtxt是一个 protobuf 格式的配置文件主要定义基本结构name: model1 # 模型名称必须与文件夹名一致 backend: python # 后端类型Python 模型用 python max_batch_size: 8 # 最大 batch 大小0 表示不支持 batching input [ { name: INPUT_NAME data_type: TYPE_FP32 # 输入数据类型 (FP32, INT64 等) dims: [ 224, 224, 3 ] # 输入维度实际triton会自动增加batch维度即 [ batchsize, 224, 224, 3 ] } ] output [ { name: OUTPUT_NAME data_type: TYPE_FP32 dims: [ 1000 ] # 输出维度同上实际维度为[ batchsize, 1000 ] } ] dynamic_batching { preferred_batch_size: [4,8] max_queue_delay_microseconds: 1000 } instance_group [ { kind: KIND_CPU # 运行设备 (KIND_GPU / KIND_CPU) count: 1 # 实例数可以部署多个副本以提升并发 } ] 关键字段说明name: 模型名称必须与文件夹名一致。backend: 使用的后端Python backend 就写python。max_batch_size: 最大 batch 大小。设为 0 时 Triton 可以自动合并请求提高吞吐量。input/output:定义输入输出张量的名字、类型、维度。这里的name必须和model.py中的输入输出一致。instance_group: 定义运行的设备类型GPU/CPU/NPU和实例数。我们目前只能通过Python backend 在 Triton中调用昇腾CANN所以在此处要写作KIND_CPU, Triton负责在CPU进程中调用NPU APIdynamic_batching: Triton 会把多个到达的请求在服务端合并拼凑成一个大batch通过设定的max_batch_size与preferred_batch_size确定)提高吞吐量。独特特性动态批处理服务端合并请求为batch送给后端模型一次性处理| 特性 | 模型自身 batch | Triton 组 batch || :--------------------------- | --------------------------------- | ------------------------------------------------------ || 谁负责收集样本 | 你在代码里自己准备好 | Triton 在服务端自动合并多个 request || 客户端需不需要关心 batch | 需要你要自己准备 batch 输入 | 不需要随便发单条请求Triton 会拼 batch || 提升性能方式 | 单个 request 内部的并行 | 多个 request 融合成更大的 batch提高 GPU/CPU 利用率 || 灵活性 | 受限于调用方必须一次性收集好 | 面向多用户 / 高并发场景自动调度更好 |triton的组batch相当于把收集batch数据这个过程交给了服务方更加适用于多客户端并发场景。并发模型 | 多实例可以为同一个后端模型启动多个实例提高并行度并自动实现更加灵活的负载分配对于NPU也就是可以通过Python backend并发调用NPU提高利用率模型组合可以将多个模型|预处理、中间模型、后处理串联组合由Triton统一调用并且进行内部的数据流转控制简化复杂的流水线部署tokenizer - encoder - decoder序列批处理可以保证请求按顺序被处理即使在batching中可以保证多个请求的对话不混乱。Triton服务接收请求的时候会自动维护一个RequestContext建立数据与客户端的关系并且按照请求的先后维护好这个顺序。在triton服务推理过程中也会保护顺序。最后拆分结果并且按照RequestContext中的对应关系发送回客户端。性能调优与验证perf_analyzer是Triton自带的一个压测与性能分析工具可以模拟不同配置下的客户端请求并且统计模型的性能表现。支持HTTP/gRPC协议启动方式perf_analyzer -m model1 \ # 指定模型名称与config.pbtxt中的name一致 --concurrency-range 1:16 \ # 并发请求数量的范围1:16表示并发从1到16逐步测试 --input-data zero \ # 输入数据为全零张量常用除此之外还有random和file真实数据 --shape INPUT_NAME:1,224,224,3 # 需要与config.pbtxt中定义的维度一致 --protocol HTTP # 默认HTTP可以选择gRPC 整体工作流程客户端请求发送到 Triton。Triton 根据config.pbtxt知道模型输入输出规格解析请求。请求进入对应模型的model.py的execute()。model.py处理输入张量生成输出张量。Triton 将结果打包成响应返回给客户端。特别说明Triton-npu服务化时NVML以及CUDA等报错信息可以安全忽略本服务采用纯 Python backend 实现不依赖 NVIDIA 生态组件报错源于底层驱动对 GPU 相关库的兼容性检查不影响 NPU 的实际计算功能核心推理流程通过昇腾 CANN 框架执行与报错模块无实际关联