超越基础设置:用Lumerical脚本高效管理FDTD仿真中的多个监视器(Monitor)
2026/5/16 20:36:20
模型部署实战指南:FastAPI + ONNX Runtime/TensorRT 应用解析
摘要:随着人工智能应用的普及,高效、稳定、低延迟的模型部署成为行业的核心需求。本文深入探讨基于FastAPI服务框架,结合ONNX Runtime和TensorRT加速引擎的部署方案,分析其优劣势、行业痛点,并提供实际应用案例和解决方案。
ONNX,提供统一的推理接口。支持多种硬件后端(CPU, GPU, NPU)和执行提供器(如 CUDA, TensorRT, OpenVINO)。ONNX),多处部署(支持多种语言绑定:Python, C++, C#, Java 等)。.engine)。ONNX模型。FastAPI构建服务:from fastapi import FastAPI import numpy as np import onnxruntime as ort app = FastAPI() sess = ort.InferenceSession("resnet50.onnx", providers=['CUDAExecutionProvider']) # 指定 GPU @app.post("/recognize") async def recognize(image: np.ndarray): # 假设 image 预处理后传入 inputs = {"input": image} outputs = sess.run(None, inputs) class_id = np.argmax(outputs[0]) return {"class_id": int(class_id)}ONNX-> 使用trtexec或 TensorRT API 生成.engine(FP16)。FastAPI服务 (注意:TensorRT 通常用 pybind 或更底层的 C++ API,Python 可用pycuda或tensorrt库):import tensorrt as trt import pycuda.driver as cuda import pycuda.autoinit # ... 加载 engine, 创建 context, 分配 stream/buffers ... @app.post("/detect") async def detect(frame_data: bytes): # 预处理 frame_data 到 GPU buffer cuda.memcpy_htod_async(input_buffer, preprocessed_data, stream) context.execute_async_v2(bindings, stream.handle) cuda.memcpy_dtoh_async(output_data, output_buffer, stream) stream.synchronize() # 后处理 output_data return {"objects": detected_objects}ONNX模型。FastAPI服务中,通过 ORT 调用 TensorRT EP:sess_options = ort.SessionOptions() sess = ort.InferenceSession("defect_detection.onnx", sess_options, providers=['TensorrtExecutionProvider']) # 优先使用 TRT EPload_model端点),实现动态更新。pip install fastapi uvicorn onnxruntime-gpu pillow numpyimport torch import torchvision model = torchvision.models.resnet50(pretrained=True) model.eval() dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, "resnet50.onnx", opset_version=13)main.py)from fastapi import FastAPI, UploadFile, File from PIL import Image import numpy as np import onnxruntime as ort import io app = FastAPI() # 加载 ONNX 模型,优先使用 GPU sess = ort.InferenceSession("resnet50.onnx", providers=['CUDAExecutionProvider']) # 预处理函数 def preprocess(image_bytes): img = Image.open(io.BytesIO(image_bytes)).convert('RGB').resize((224, 224)) img = np.array(img).transpose(2, 0, 1).astype(np.float32) # HWC to CHW img = (img / 255.0 - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225] # Normalize return np.expand_dims(img, axis=0) # Add batch dim @app.post("/classify") async def classify(file: UploadFile = File(...)): image_data = await file.read() input_tensor = preprocess(image_data) # ONNX Runtime 推理 input_name = sess.get_inputs()[0].name outputs = sess.run(None, {input_name: input_tensor}) probs = np.squeeze(outputs[0]) predicted_class = np.argmax(probs) return {"class_id": int(predicted_class), "confidence": float(probs[predicted_class])}uvicorn main:app --reload --port 8000 # 开发模式 # 生产建议: uvicorn main:app --workers 4 --port 8000使用curl或 Postman 发送图片请求。
TensorRTExecutionProvider可在 NVIDIA GPU 上获得接近 TensorRT 的性能,同时保留跨平台能力。通过理解不同技术路线的优劣势,结合具体业务场景的痛点和需求,选择FastAPI + ONNX Runtime或FastAPI + TensorRT,能够有效构建高性能、可扩展的模型部署服务。