本文基于之前博客中的 YOLOv8 Docker 训练环境,完整讲解:
模型训练
↓
ONNX导出
↓
TensorRT加速
↓
Python推理
↓
Docker部署
↓
API服务化
适合人群:
- 想学习 AI 模型部署
- 想做 YOLOv8 推理优化
- 想学习 TensorRT
- 想学习 ONNX Runtime
- 想做工业 AI 部署
本文环境:
| 项目 | 版本 |
|---|---|
| Ubuntu | 22.04 |
| GPU | GTX1660S |
| Docker | 最新版 |
| CUDA | 容器内置 |
| PyTorch | NVIDIA NGC |
| YOLOv8 | ultralytics |
一、什么是模型部署?
模型部署:
让训练好的模型真正运行起来
例如:
- 摄像头检测
- 视频分析
- Web API
- 工业检测
- 边缘AI
训练:
只是开始
真正上线:
部署才是重点
二、YOLOv8 为什么适合部署?
YOLO 系列最大的优势:
实时检测
特点:
| 特性 | 说明 |
|---|---|
| 推理快 | FPS高 |
| 精度高 | mAP优秀 |
| 模型小 | 易部署 |
| 导出方便 | ONNX/TensorRT |
YOLOv8 采用 Anchor-Free 与解耦检测头设计,更适合现代部署优化。
三、工业界主流部署流程
现在最常见:
PyTorch
↓
ONNX
↓
TensorRT
↓
Docker
↓
服务化API
原因:
| 技术 | 作用 |
|---|---|
| ONNX | 通用模型格式 |
| TensorRT | NVIDIA推理加速 |
| Docker | 环境隔离 |
| FastAPI | API服务 |
四、本文部署方案
本文采用:
YOLOv8n
+ ONNX
+ TensorRT FP16
+ FastAPI
+ Docker
因为:
GTX1660S:
- 显存只有6GB
- 更适合轻量模型
- FP16收益明显
五、Docker 环境准备
1. 拉取 NVIDIA PyTorch 镜像
docker pull nvcr.io/nvidia/pytorch:24.12-py3
NVIDIA 官方 NGC PyTorch 镜像:
NVIDIA NGC PyTorch Container
六、启动容器
docker run -it --gpus all \
--shm-size=16g \
--name yolov8-deploy \
-v /home/workspace:/workspace \
nvcr.io/nvidia/pytorch:24.12-py3
参数说明:
| 参数 | 作用 |
|---|---|
| --gpus all | 使用GPU |
| --shm-size | 增加共享内存 |
| -v | 挂载目录 |
七、安装 YOLOv8
1. 克隆项目
cd /workspace
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics
官方项目:
Ultralytics YOLO Github
2. 安装依赖
pip install -e .
八、准备模型
这里直接使用官方模型:
yolov8n.pt
下载:
wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n.pt
九、为什么部署前要转 ONNX?
PyTorch:
更适合训练
但:
不一定适合生产部署
ONNX:
- 跨平台
- 更容易优化
- 支持 TensorRT
- 支持 ONNX Runtime
Ultralytics 官方也推荐先导出 ONNX 再进行生产部署。
十、导出 ONNX
1. 最简单导出
yolo export \
model=yolov8n.pt \
format=onnx
生成:
yolov8n.onnx
十一、推荐生产导出参数
yolo export \
model=yolov8n.pt \
format=onnx \
imgsz=640 \
half=True \
dynamic=True \
simplify=True
参数说明:
| 参数 | 作用 |
|---|---|
| half=True | FP16 |
| dynamic=True | 动态batch |
| simplify=True | ONNX简化 |
十二、为什么推荐 FP16?
GTX1660S:
支持FP16
FP16:
- 显存减半
- 推理更快
- 精度损失很小
Ultralytics 部署文档中也推荐 NVIDIA GPU 使用 TensorRT FP16。
十三、ONNX Runtime 推理
1. 安装 ONNX Runtime
pip install onnxruntime-gpu
2. 推理代码
创建:
touch infer_onnx.py
十四、ONNX Runtime 推理脚本
import cv2
import numpy as np
import onnxruntime as ort
session = ort.InferenceSession(
"yolov8n.onnx",
providers=["CUDAExecutionProvider"]
)
input_name = session.get_inputs()[0].name
img = cv2.imread("test.jpg")
img = cv2.resize(img, (640, 640))
img = img.transpose(2, 0, 1)
img = np.expand_dims(img, axis=0)
img = img.astype(np.float32) / 255.0
outputs = session.run(
None,
{input_name: img}
)
print(outputs[0].shape)
十五、TensorRT 部署
TensorRT:
NVIDIA官方推理加速框架
特点:
- GPU优化极强
- FP16/INT8支持
- 延迟低
- 吞吐高
TensorRT 可比原始 PyTorch 推理快数倍。
十六、直接导出 TensorRT Engine
YOLOv8 已支持:
yolo export \
model=yolov8n.pt \
format=engine \
half=True
生成:
yolov8n.engine
十七、TensorRT 推理代码
from ultralytics import YOLO
model = YOLO("yolov8n.engine")
results = model("test.jpg")
results[0].show()
十八、部署速度对比
典型情况:
| 部署方式 | 速度 |
|---|---|
| PyTorch | 普通 |
| ONNX Runtime | 更快 |
| TensorRT FP16 | 非常快 |
Ultralytics 官方测试中,TensorRT 往往比原始 PyTorch 更快。
十九、为什么工业界喜欢 TensorRT?
因为:
GPU利用率高
TensorRT 会:
- 图优化
- Kernel融合
- 自动FP16
- 内存优化
二十、FastAPI 服务化部署
实际生产中:
模型
≠ 真正服务
通常需要:
HTTP API
二十一、安装 FastAPI
pip install fastapi uvicorn python-multipart
二十二、创建 API 服务
创建:
touch app.py
二十三、完整 FastAPI 部署代码
from fastapi import FastAPI, UploadFile
from ultralytics import YOLO
import shutil
app = FastAPI()
model = YOLO("yolov8n.engine")
@app.post("/predict")
async def predict(file: UploadFile):
path = file.filename
with open(path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
results = model(path)
result = results[0].boxes.xyxy.tolist()
return {
"result": result
}
二十四、启动服务
uvicorn app:app \
--host 0.0.0.0 \
--port 8000
浏览器访问:
http://IP:8000/docs
即可看到 Swagger API。
二十五、测试 API
curl 测试
curl -X POST \
-F "file=@test.jpg" \
http://127.0.0.1:8000/predict
二十六、Docker 化部署
真正生产:
必须Docker化
原因:
- 易迁移
- 易扩容
- 易运维
- 环境一致
二十七、创建 Dockerfile
FROM nvcr.io/nvidia/pytorch:24.12-py3
WORKDIR /app
COPY . .
RUN pip install -e .
RUN pip install fastapi uvicorn python-multipart
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
二十八、构建镜像
docker build -t yolov8-api .
二十九、运行部署容器
docker run -it --gpus all \
-p 8000:8000 \
yolov8-api
三十、真实工业部署架构
很多公司:
摄像头
↓
RTSP
↓
YOLO推理
↓
FastAPI
↓
前端展示
或者:
Triton Server
三十一、Triton Inference Server
NVIDIA 官方:
Triton推理服务器
支持:
- TensorRT
- ONNX
- PyTorch
- 多模型
- 动态Batch
Ultralytics 官方已提供 Triton 集成方案。
三十二、为什么 Triton 很强?
特点:
| 功能 | 说明 |
|---|---|
| 多模型管理 | 支持多个模型 |
| 自动Batch | 提高吞吐 |
| GPU调度 | 自动优化 |
| HTTP/gRPC | 高性能接口 |
三十三、GTX1660S 部署建议
1660S:
- 6GB显存
- 更适合轻量模型
推荐:
| 项目 | 推荐 |
|---|---|
| 模型 | yolov8n/s |
| batch | 1 |
| FP16 | 开启 |
| imgsz | 640 |
三十四、部署中的常见问题
1. CUDA 不可见
检查:
nvidia-smi
2. Docker GPU 无法使用
检查:
docker run --gpus all
3. ONNX Runtime GPU 不生效
检查:
print(ort.get_available_providers())
应包含:
CUDAExecutionProvider
4. TensorRT 导出失败
升级:
pip install -U ultralytics
三十五、完整 AI 部署路线
推荐学习路线:
YOLOv8训练
↓
ONNX
↓
TensorRT
↓
FastAPI
↓
Docker
↓
Triton
这是目前 NVIDIA GPU 非常主流的部署路线。
三十六、总结
本文基于:
- Ubuntu22.04
- Docker
- GTX1660S
- YOLOv8
实现了:
- ONNX部署
- TensorRT部署
- FastAPI服务化
- Docker部署
- GPU推理优化
核心思想:
训练只是开始
部署才是真正落地
后续进阶方向
后面推荐继续学习:
INT8量化
↓
DeepStream
↓
Triton
↓
Jetson部署
这是目前工业视觉 AI 的主流方向。