用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/MIUAV/vibe-coding-ros2 --skill tensorrt命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | tensorrt |
| description | OpenCV4 TensorRT 加速技能 - GPU 加速推理、INT8 量化、Engine 优化、YOLO 部署 |
| user-invocable | true |
| argument-hint | tensorrt OR trt OR int8 OR fp16 OR gpu加速 OR cuda |
TensorRT 加速 OpenCV 推理完整指南
当需要以下帮助时使用此技能:
# 下载 TensorRT tar 包(需登录 NVIDIA)
wget https://developer.nvidia.com/tensorrt/download
# 或使用 pip
pip install tensorrt
# 安装 CUDA 依赖
sudo apt install cuda-12-2 # 根据 CUDA 版本
# 验证安装
python -c "import tensorrt; print(tensorrt.__version__)"
import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
# 创建 builder
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
config = builder.create_builder_config()
# 设置 FP16/INT8
config.set_flag(trt.BuilderFlag.FP16)
config.set_flag(trt.BuilderFlag.INT8)
config.int8_calibrator = calibrator # INT8 需要校准器
# 解析 ONNX
parser = trt.OnnxParser(network, logger)
with open('model.onnx', 'rb') as f:
parser.parse(f.read())
# 构建 engine
engine = builder.build_serialized_network(network, config)
# 保存
with open('model.engine', 'wb') as f:
f.write(engine)
# 加载 engine
runtime = trt.Runtime(logger)
engine = runtime.deserialize_cuda_engine(engine)
import cv2
import numpy as np
# 加载 TensorRT Engine
net = cv2.dnn.readNet('model.engine')
# 设置后端和目标
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
# 推理
blob = cv2.dnn.blobFromImage(img, 1/255.0, (640, 640), swapRB=True)
net.setInput(blob)
output = net.forward()
class INT8Calibrator(trt.IInt8Calibrator):
def __init__(self, data_loader, cache_file='calibration.cache'):
self.data_loader = data_loader
self.cache_file = cache_file
self.batch_size = 8
def get_batch(self, names):
data = next(self.data_loader)
return [data]
def get_batch_size(self):
return self.batch_size
def read_calibration_cache(self):
if os.path.exists(self.cache_file):
with open(self.cache_file, 'rb') as f:
return f.read()
def write_calibration_cache(self, cache):
with open(self.cache_file, 'wb') as f:
f.write(cache)
from ultralytics import YOLO
# 导出为 TensorRT
model = YOLO('yolov8n.pt')
model.export(format='engine', half=True, int8=True, device=0)
# 加载和推理
model = YOLO('yolov8n.engine')
results = model.predict(source='image.jpg', device=0, half=True)
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import numpy as np
class TensorRTNode(Node):
def __init__(self):
super().__init__('tensorrt_inference')
self.bridge = CvBridge()
# 加载 TensorRT Engine
self.net = cv2.dnn.readNet('yolov8n.engine')
self.net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
self.net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
self.sub = self.create_subscription(Image, '/image_raw', self.callback, 10)
self.pub = self.create_publisher(Image, '/detections', 10)
def callback(self, msg):
img = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
blob = cv2.dnn.blobFromImage(img, 1/255.0, (640, 640), swapRB=True)
self.net.setInput(blob)
output = self.net.forward()
| 精度 | 相对 FP32 速度 | 精度损失 |
|---|---|---|
| FP32 | 1x | 无 |
| FP16 | 2-3x | 极小 |
| INT8 | 3-4x | < 1% mAP |
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) # 1GB
config.set_preview_feature(trt.PreviewFeature.FASTER_DYNAMIC_SHAPES_0806, 1)
config.set_flag(trt.BuilderFlag.DIRECT_IO) # 减少拷贝
Engine 构建:
INT8 量化:
内存管理:
调试:
trtexec --verbose 测试nvidia-smi dmon 监控 GPU