当前位置: 首页 > news >正文

AI 模型部署从入门到生产 —— ONNX 转换、TensorRT 加速、推理服务搭建

前言

模型训练出来只是第一步,让它稳定高效地服务线上请求才是真正的 challenge。这篇文章覆盖模型部署的完整流程——从模型导出到生产级推理服务。

Step 1:模型导出与格式转换

PyTorch → ONNX

ONNX(Open Neural Network Exchange)是模型部署的中间格式,几乎所有的推理框架和硬件都支持它。

importtorchimporttorch.onnx model=YourModel()model.eval()dummy_input=torch.randn(1,3,224,224)torch.onnx.export(model,dummy_input,"model.onnx",input_names=["input"],output_names=["output"],dynamic_axes={"input":{0:"batch_size"},"output":{0:"batch_size"},},opset_version=17,)

关键参数:

  • dynamic_axes:声明哪些维度是可变的,比如 batch_size 和序列长度
  • opset_version:越高支持的算子越多,但硬件兼容性可能下降。推荐 17-19

ONNX 优化

导出的 ONNX 模型可以用onnxruntime做优化:

python-monnxruntime.tools.convert_onnx_models_to_ort model.onnx

或者在代码中优化:

importonnxruntimeasortimportonnxfromonnxruntime.transformersimportoptimizer opt=optimizer.optimize_model("model.onnx",model_type="bert",# 根据模型类型选择num_heads=12,hidden_size=768,opt_level=99,# 最大优化)opt.save_model_to_file("model_optimized.onnx")

优化效果:一般能提升 1.5x-3x 的推理速度。

检查 ONNX 模型的正确性

# 验证输出一致性withtorch.no_grad():torch_output=model(dummy_input).numpy()ort_session=ort.InferenceSession("model.onnx")ort_input={ort_session.get_inputs()[0].name:dummy_input.numpy()}ort_output=ort_session.run(None,ort_input)# 检查误差diff=np.abs(torch_output-ort_output[0]).max()print(f"Max diff:{diff}")# 对于 FP32,diff < 1e-5 是正常的# 对于 FP16/INT8,diff < 1e-2 是可接受的

Step 2:推理加速 —— TensorRT

TensorRT 是 NVIDIA 的推理优化引擎,可以在 GPU 上达到极致性能。

ONNX → TensorRT

importtensorrtastrt logger=trt.Logger(trt.Logger.WARNING)builder=trt.Builder(logger)network=builder.create_network(1<<int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))parser=trt.OnnxParser(network,logger)withopen("model.onnx","rb")asf:parser.parse(f.read())config=builder.create_builder_config()config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE,1<<30)# 1GB# FP16 精度(精度几乎无损,速度提升 2x)ifbuilder.platform_has_fast_fp16:config.set_flag(trt.BuilderFlag.FP16)# INT8 量化(需要校准数据集,速度再提升 2x)# config.set_flag(trt.BuilderFlag.INT8)engine=builder.build_serialized_network(network,config)withopen("model.trt","wb")asf:f.write(engine)

精度与速度权衡

精度推理速度模型大小质量影响适用场景
FP321x100%基准、调试
FP161.5-2x50%几乎无生产推荐
INT83-4x25%轻微对延迟极度敏感
INT45-6x12.5%明显边缘设备

通用建议:FP16 是性价比最高的选择。INT8 需要校准数据集,且对某些模型有精度风险。

TensorRT 推理

importtensorrtastrtimportpycuda.driverascudaclassTRTInference:def__init__(self,engine_path):logger=trt.Logger(trt.Logger.WARNING)withopen(engine_path,"rb")asf:self.engine=trt.Runtime(logger).deserialize_cuda_engine(f.read())self.context=self.engine.create_execution_context()# 分配 GPU 内存self.inputs=[]self.outputs=[]foriinrange(self.engine.num_io_tensors):name=self.engine.get_tensor_name(i)shape=self.engine.get_tensor_shape(name)size=trt.volume(shape)dtype=trt.nptype(self.engine.get_tensor_dtype(name))# 分配内存...# 完整代码见注definfer(self,input_numpy):self.inputs[0].host=input_numpy.astype(np.float32)[cuda.memcpy_htod(inp.device,inp.host)forinpinself.inputs]self.context.execute_v2([inp.deviceforinpinself.inputs+self.outputs])[cuda.memcpy_dtoh(out.host,out.device)foroutinself.outputs]returnself.outputs[0].host

Step 3:推理服务框架

三种主流方案对比

框架适用场景特点
Triton Inference Server多模型混合、A/B 测试NVIDIA 官方,支持多种硬件和框架
vLLMLLM 推理(7B-70B)PagedAttention,连续批处理
SGLangLLM 推理(结构化输出)RadixAttention,JSON Mode

用 vLLM 部署 LLM

fromvllmimportLLM,SamplingParams llm=LLM(model="meta-llama/Llama-3.2-3B",tensor_parallel_size=1,# 单卡部署gpu_memory_utilization=0.9,# GPU 显存利用率max_num_seqs=256,# 最大并发序列数enable_prefix_caching=True,# 前缀缓存加速)sampling_params=SamplingParams(temperature=0.7,top_p=0.9,max_tokens=1024,)outputs=llm.generate(["请解释什么是 Transformer"],sampling_params)print(outputs[0].outputs[0].text)

生产部署用 OpenAI 兼容 API:

python-mvllm.entrypoints.openai.api_server--modelmeta-llama/Llama-3.2-3B--port8000--gpu-memory-utilization0.9

然后直接当 OpenAI API 用:

fromopenaiimportOpenAI client=OpenAI(base_url="http://localhost:8000/v1",api_key="sk-xxx",# vLLM 不验证 key,随便填)response=client.chat.completions.create(model="meta-llama/Llama-3.2-3B",messages=[{"role":"user","content":"Hello"}],)

vLLM 关键配置

LLM(model="...",# 显存配置gpu_memory_utilization=0.85-0.95,# 留一些给 CUDA kernelmax_model_len=8192,# 最大上下文长度# 性能配置num_scheduler_steps=8,# 调度步数,越大吞吐越高enable_chunked_prefill=True,# 分块 prefill,降低 TTFT# 量化quantization="awq",# AWQ 量化(需要先量化模型)# 分布式tensor_parallel_size=1,# >1 时需多卡)

Step 4:性能压测与监控

关键指标

指标英文含义好值
首 Token 延迟TTFT从请求到第一个 Token 的时间< 500ms
Token 生成速度TPOT每个 Token 的生成时间< 50ms
吞吐量Throughput每秒生成的 Token 数> 1000 tokens/s
并发数Concurrency同时处理的请求数视场景而定

压测工具

# 用 vllm 自带的 benchmarkpython-mvllm.benchmarks.benchmark_throughput--modelmeta-llama/Llama-3.2-3B--datasetShareGPT_V3_unfiltered_cleaned_split.json --num-prompts1000# 用 locust 做 HTTP 压测pipinstalllocust locust--hosthttp://localhost:8000

生产级部署架构

┌─────────────┐ │ Load │ │ Balancer │ └──────┬──────┘ │ ┌───────────────┼───────────────┐ │ │ │ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │ Worker 1 │ │ Worker 2 │ │ Worker 3 │ │ vLLM/Triton│ │ vLLM/Triton│ │ vLLM/Triton│ └───────────┘ └───────────┘ └───────────┘ │ │ │ ┌─────▼───────────────▼───────────────▼─────┐ │ 共享显存 / 模型分片 │ └───────────────────────────────────────────┘
  • 水平扩展:多个 Worker 加 Load Balancer
  • 动态缩扩容:根据队列长度自动调整 Worker 数量
  • 缓存层:Redis 缓存常见问题的回答(适合 LLM 场景,回答可以复用)

总结

模型部署的核心链路:

PyTorch → ONNX → TensorRT → Triton/vLLM → Load Balancer → API ① ② ③ ④ ⑤
  1. PyTorch 导出 ONNX(设置 dynamic_axes)
  2. ONNX 优化(onnxruntime transformers)
  3. TensorRT 转换(FP16 是最优性价比)
  4. 推理框架部署(LLM 用 vLLM,多模态用 Triton)
  5. 负载均衡与缓存

每个环节都有优化空间,但先跑通全链路,再逐步压测优化是最务实的方式。



觉得有用?点赞 + 收藏 + 关注

http://www.jsqmd.com/news/1128951/

相关文章:

  • iOS降级革命:downr1n工具如何让你重获设备控制权
  • 解放双手:用Python为Windows微信注入自动化能力
  • Gemini 复制到 word 格式问题频繁出现?AI 导出鸭一站式修复排版错乱难题
  • From Local to Global: Revisiting Structured Pruning Paradigms for Large Language Models
  • 2026 AI 开发者生存指南(7):10 个 AI 开发者必备的开源项目导航
  • Anthropic 宣布 7 月 8 日起 Claude 用户需人脸实名认证,AI 匿名时代终结
  • Codex怎么删除会话?Codex怎么删除历史聊天?解决Codex启动卡顿问题教程
  • 终极免费Switch模拟器指南:如何在PC上完美运行任天堂游戏
  • cmake知识
  • Python之strudelpy包语法、参数和实际应用案例
  • 浏览器用户画像大屏搭建:从静态布局到交互联动(附完整代码)
  • Linux中Mamba的有效安装
  • GetQzonehistory:一键导出QQ空间历史说说的智能工具
  • 锂离子电池过压保护与BQ2920设计要点解析
  • Pot Desktop:跨平台划词翻译软件完整使用指南 - 5分钟实现高效多语言工作流
  • Audacity终极指南:免费开源音频编辑软件的专业解决方案
  • 终极指南:如何在5分钟内安装Deforum扩展并创建Stable Diffusion动画
  • C语言 冒泡排序
  • STM32F439ZG与MC6470 IMU的运动控制开发指南
  • cursor半价邀请链接
  • Slint GridLayout 详解:从基础到实战的网格布局指南
  • Python之anydo-api包语法、参数和实际应用案例
  • 20万以内的领克07GT是否值得购买呢咋们来聊聊领克07GT这台车
  • 第四届链博会首次设立 AI 专区,676 家企业参展——AI 不再只是前沿科技了
  • Codex App 26.616 新功能教程:Record Replay 录制与回放使用指南
  • 千问文档怎么导出?AI 导出鸭一站式搞定多格式导出难题
  • 题解:洛谷 AT_abc463_a [ABC463A] 16:9
  • (论文速读)REF-DDPM:一种新的基于DDPM的不平衡滚动轴承故障诊断数据增强方法
  • 【研发类-前端开发Skills】angular-ui-patterns 技能
  • 西安军工拉力机优质品牌怎么选?力学测试合规不能马虎