作者昇腾实战派小模型在NPU上的推理部署【知识地图】引言Triton Inference Server 是 NVIDIA 开源的高性能推理服务框架支持多种后端和模型格式广泛应用于生产环境。本文将详细介绍如何在昇腾AscendAI处理器上使用 Triton Server 部署 YOLOv11 目标检测模型同样适用于 YOLOv5、YOLOv8 系列。我们将以 YOLOv11 为例通过 Python 后端调用昇腾推理引擎ais_bench加载离线模型.om并提供服务。文章涵盖模型仓库组织、配置文件编写、服务端代码实现、客户端调用以及服务启动命令帮助开发者快速上手昇腾设备上的 Triton 部署。环境准备硬件昇腾 AI 处理器如 Atlas 300 系列软件驱动与固件根据昇腾社区指引安装对应版本镜像推荐使用昇腾社区提供的 Triton Server 镜像模型仓库目录结构Triton Server 要求模型按指定目录结构组织。以下是一个 YOLOv11 模型的典型布局models/ └── yolo11 # 模型名称与 config.pbtxt 中的 name 一致 ├── 1 # 模型版本号必须为数字 │ └── model.py # Python 后端核心代码 ├── client_yolo11.py # 客户端测试脚本非必需 ├── config.pbtxt # 模型配置文件 ├── yolo11s_bs8.om # 昇腾离线模型batch8 └── yolov8s_bs8.om # 可存放多个模型文件1/目录表示版本号内部必须包含model.pyPython 后端的入口文件。config.pbtxt描述了模型的输入输出、后端类型、参数等。.om文件是经过昇腾 ATC 工具转换后的离线模型可在不同 batch size 下使用。配置文件config.pbtxt详解# 模型名称通常与存放此配置文件的目录名保持一致 name: yolo11 # 指定模型运行的平台/后端这里是 ONNX Runtime backend: python # 模型支持的最大批处理大小根据模型和显存调整 max_batch_size: 8 # 输入节点配置 input [ { name: images # 输入张量的名称必须与ONNX模型中的名称一致 data_type: TYPE_FP32 # 数据类型通常是 FP32根据模型实际输入信息填写 dims: [ 3, 640, 640 ] # 输入维度: [通道数, 高度, 宽度]注意这里不包含批次维度(N) 根据模型实际输入信息填写 } ] # 输出节点配置 output [ { name: output0 data_type: TYPE_FP32 # 数据类型通常是 FP32根据模型实际输出信息填写 dims: [ 84, 8400 ] # 输出维度: [预测信息(坐标置信度类别), 检测框数量] } ] # 实例组配置 (可选定义使用多少个GPU实例并行) instance_group [ { count: 1 # 实例数量 } ] parameters: [ { key: batch_size, value: { string_value: 1 } }, { key: model_path, value: { string_value: /home/users/models/yolo11/yolo11s_bs8.om } }, { key: device_id, value: { string_value: 0 } } ]说明输入输出维度必须与转换后的 OM 模型严格匹配。parameters部分可以传递任意自定义参数在 Python 后端的initialize方法中通过model_config.get(parameters, {})读取。max_batch_size应与 OM 模型支持的 batch 一致例如yolo11s_bs8.om支持 batch 8。服务端代码Python 后端文件路径models/yolo11/1/model.pyimportjsonimportnumpyasnpimporttorchimporttriton_python_backend_utilsaspb_utilsfromais_bench.infer.interfaceimportInferSessionclassTritonPythonModel:Triton Python 后端模型类defload_model(self,model_path,device_id):Load OM model using ais_bench InferSession.returnInferSession(int(device_id),model_path)definitialize(self,args):模型初始化只调用一次model_configjson.loads(args[model_config])self.input_configmodel_config[input][0]self.output_configmodel_config[output][0]print(fModel initialized with input:{self.input_config}, output:{self.output_config})self.input_dtypepb_utils.triton_string_to_numpy(self.input_config[data_type])self.output_dtypepb_utils.triton_string_to_numpy(self.output_config[data_type])paramsmodel_config.get(parameters,{})self.batch_sizeint(params[batch_size][string_value])self.model_pathparams[model_path][string_value]self.device_idint(params[device_id][string_value])self.modelself.load_model(self.model_path,self.device_id)inputs_shapeself.model.get_inputs()[0].shapeprint(fmodel inputs_shape:{inputs_shape})self.input_namemodel_config[input][0][name]self.output_namemodel_config[output][0][name]defexecute(self,requests):responses[]forrequestinrequests:input_tensorpb_utils.get_input_tensor_by_name(request,self.input_name)input_datainput_tensor.as_numpy()outputsself.model.infer([input_data])[0]output_tensorpb_utils.Tensor(self.output_name,outputs.astype(self.output_dtype))responsepb_utils.InferenceResponse(output_tensors[output_tensor])responses.append(response)returnresponsesdeffinalize(self):清理资源可选print(Cleaning up resources...)关键点​必须实现 Triton Python 后端标准接口​在model.py中需要定义TritonPythonModel类并实现initialize、execute和finalize三个方法。这是 Triton Server 调用 Python 后端的约定确保模型能被正确加载和执行。​模型加载与初始化​在initialize方法中通过ais_bench.infer.interface.InferSession加载昇腾 OM 模型并读取配置文件config.pbtxt中parameters传递的自定义参数如模型路径、设备 ID 等。同时获取输入输出的名称和数据类型供后续推理使用。​核心推理逻辑​execute方法处理每个推理请求。它遍历请求列表从每个请求中提取输入张量转换为 NumPy 数组调用model.infer执行昇腾模型推理然后将输出结果封装为pb_utils.Tensor最后构造pb_utils.InferenceResponse返回。​注意输出格式​model.infer返回的是一个列表因为 OM 模型可能有多个输出。本例中取第一个输出[0]实际使用时需根据模型输出数量调整索引。同时输出数据需转换为配置文件中声明的数据类型self.output_dtype。​资源清理​finalize方法在模型卸载时调用可用于释放模型句柄或其他资源虽然不是必须的但建议实现以避免资源泄漏。客户端代码示例文件路径models/yolo11/client_yolo11.pyimportnumpyasnpimporttritonclient.httpashttpclient# 创建随机输入数据模拟 batch8 的图像input_datanp.random.randn(8,3,640,640).astype(np.float32)# 创建 HTTP 客户端Triton 默认端口 8000此处使用 9000clienthttpclient.InferenceServerClient(urllocalhost:9000)# 定义输入输出inputs[httpclient.InferInput(images,input_data.shape,FP32)]inputs[0].set_data_from_numpy(input_data)outputs[httpclient.InferRequestedOutput(output0)]# 发送推理请求responseclient.infer(yolo11,inputsinputs,outputsoutputs)resultresponse.as_numpy(output0)print(f推理成功输出形状:{result.shape})# 提示前后处理需自行实现defpreprocess():passdefpostprocess():pass说明客户端使用 HTTP 协议端口需与 Triton 启动时指定的--http-port一致。输入数据是模拟的随机数组实际使用时需替换为真实图像的预处理结果。输出result的形状应与 OM 模型输出一致例如(8, 84, 8400)。启动 Triton Server在昇腾镜像上启动 Triton Server 服务执行以下命令/opt/tritonserver/bin/tritonserver\--model-repository/path/to/your/models\--http-port9000\--grpc-port9002--model-repository指定模型仓库的根目录绝对路径例如/home/user/models。--http-portHTTP 服务端口客户端通过该端口发送 HTTP 请求默认 8000此处改为 9000。--grpc-portgRPC 服务端口默认 8001此处改为 9002。启动后Triton Server 会加载models/下所有有效模型并打印日志。您可以通过curl或客户端验证服务是否正常。总结与后续工作本文提供了一个在昇腾设备上使用 Triton Server 部署 YOLOv11 模型的完整示例包括模型仓库的目录结构配置文件config.pbtxt的详细解释Python 后端服务端代码基于ais_bench推理接口客户端调用示例Triton Server 启动命令注意本文仅聚焦于模型的服务化部署未包含预处理如图像缩放、归一化和后处理如 NMS、结果解析逻辑。开发者需根据实际业务需求自行实现这些部分。前后处理的实现可参考昇腾官方仓库示例 Ascend/modelzoo-GPL - Yolov8 for PyTorch 前后处理参考