在 Linux 系统上部署基于 NVIDIA T4 GPU 的推理服务,通常涉及以下关键步骤。以下以常见的 TensorRT + PyTorch 或 ONNX Runtime 方案为例(适用于深度学习模型推理),并假设你已拥有可用的 T4 GPU 实例(如云主机或本地服务器)。
✅ 前置条件
-
硬件要求
- NVIDIA T4 GPU(至少 16GB 显存)
- 兼容的 Linux 发行版(Ubuntu 20.04/22.04 推荐)
- 足够的磁盘空间(≥50GB)
-
驱动与 CUDA 环境
# 检查 GPU 状态 nvidia-smi若未安装驱动:
sudo apt update sudo apt install ubuntu-drivers-common sudo ubuntu-drivers autoinstall sudo reboot -
安装 CUDA Toolkit(建议版本 11.8 或 12.x)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update sudo apt install cuda-toolkit-12-2添加环境变量到
~/.bashrc:export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH source ~/.bashrc -
安装 cuDNN & TensorRT(如使用 TensorRT)
- 从 NVIDIA NGC 下载对应版本的 cuDNN 和 TensorRT
.deb包 - 或使用 Docker 镜像(推荐见下文)
- 从 NVIDIA NGC 下载对应版本的 cuDNN 和 TensorRT
🐳 推荐方案:使用官方 Docker 镜像(最简、可复现)
NVIDIA 提供预配置好的容器镜像,避免依赖冲突:
# 拉取包含 T4 支持的 PyTorch + TensorRT 镜像
docker pull nvcr.io/nvidia/pytorch:24.01-py3
# 启动容器并挂载 GPU
docker run --gpus all -it --rm
-v $(pwd)/models:/workspace/models
-p 8000:8000
nvcr.io/nvidia/pytorch:24.01-py3 bash
💡 提示:若需自定义镜像(如集成 ONNX Runtime),可基于此构建。
🔧 典型推理服务部署流程(以 PyTorch + Flask/Triton 为例)
方案 A:轻量级 — Flask/FastAPI + PyTorch(适合小流量)
-
安装依赖:
pip install torch torchvision flask uvicorn -
编写推理服务 (
app.py):from flask import Flask, request, jsonify import torch import torchvision.models as models import numpy as np from PIL import Image from io import BytesIO app = Flask(__name__) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 加载模型(示例:ResNet) model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V1) model.to(device) model.eval() transform = models.ResNet50_Weights.IMAGENET1K_V1.transforms() @app.post("/predict") def predict(): image_data = request.files["image"] img = Image.open(BytesIO(image_data.read())).convert("RGB") input_tensor = transform(img).unsqueeze(0).to(device) with torch.no_grad(): output = model(input_tensor) _, predicted = torch.max(output, 1) return jsonify({"class_id": int(predicted.item()), "confidence": float(torch.nn.functional.softmax(output, dim=1)[0][predicted])}) if __name__ == "__main__": app.run(host="0.0.0.0", port=8000) -
启动服务:
python app.py -
测试请求:
curl -X POST http://localhost:8000/predict -F "image=@test.jpg"
方案 B:高性能生产级 — NVIDIA Triton Inference Server(推荐)
Triton 支持多框架(PyTorch, TensorFlow, ONNX)、动态批处理、并发优化,是工业界首选。
步骤:
-
准备模型目录结构(例如
model_repo/resnet/model/1/model.onnx)mkdir -p model_repo/resnet/1 cp your_model.onnx model_repo/resnet/1/ cat > model_repo/resnet/config.pbtxt <<EOF name: "resnet" platform: "onnxruntime_onnx" max_batch_size: 64 input [ { name: "input" data_type: TYPE_FP32 dims: [ 3 224 224 ] } ] output [ { name: "output" data_type: TYPE_FP32 dims: [ 1000 ] } ] instance_group [ { count: 1 gpus: [ 0 ] } ] EOF -
使用 Triton 官方镜像运行:
docker run --gpus all -d --name triton -p 8000:8000 -p 8001:8001 -p 8002:8002 -v $(pwd)/model_repo:/models nvcr.io/nvidia/tritonserver:24.01-py3 tritonserver --model-repository=/models --strict-model-config=false -
通过 HTTP/gRPC 调用:
# 使用 Python client python3 -c " import grpc from tritonclient.utils import * from tritonclient.http import InferenceServerClient client = InferenceServerClient(url='localhost:8000') inputs = [InferInput('input', [1,3,224,224], 'FP32')] outputs = [InferRequestedOutput('output')] client.infer('resnet', inputs, outputs) "
✅ Triton 优势:自动负载均衡、GPU 内存管理、量化支持(INT8/FP16)、监控指标(Prometheus)。
⚙️ 性能优化建议(T4 特性利用)
| 技术 | 说明 |
|---|---|
| TensorRT 提速 | 将 PyTorch/ONNX 模型转换为 TRT engine(.plan),提升吞吐 2–4× |
| FP16 / INT8 量化 | T4 支持 FP16 原生提速;INT8 需校准数据(calibration.dat) |
| 动态批处理 | Triton 中设置 max_batch_size 和 dynamic_batching |
| 多实例共享 GPU | 使用 --allow-gpu-memory-growth=true 或切片显存(MIG 不适用于 T4) |
| 异步推理 | 结合 asyncio 或 Triton 的 concurrent_request_limit |
示例:TensorRT 转换(Python):
import tensorrt as trt
from torch2trt import torch2trt
def convert_to_trt(model, dummy_input):
model_trt = torch2trt(model, [dummy_input], fp16_mode=True)
trt_engine_path = "model.trt"
with open(trt_engine_path, "wb") as f:
f.write(model_trt.engine.serialize())
return model_trt
📊 验证与监控
- GPU 使用率:
nvidia-smi dmon -s u - 延迟/吞吐:用
wrk或locust压测 - 日志:Triton 默认输出至 stdout,可接入 Loki/Grafana
- 健康检查:
curl http://localhost:8002/v2/health/live
❓常见问题排查
| 问题 | 解决方案 |
|---|---|
CUDA error: no kernel image is available for execution on the device |
确保 PyTorch/CUDA 版本匹配;重新编译或换镜像 |
| OOM(显存溢出) | 减小 batch size;启用 --allow-gpu-memory-growth;量化模型 |
| 模型加载失败 | 检查输入维度是否匹配 config.pbtxt;确认平台类型正确 |
| 网络不通 | 检查防火墙 sudo ufw allow 8000/tcp;Docker 端口映射 |
需要我为你生成一个完整的 Dockerfile + Triton 部署脚本模板,或针对特定模型(如 YOLOv8、BERT、LLaMA)定制优化方案吗?
PHPWP博客