ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Jetson nano 部署 yolov5 6.0:TensorRT 加速全流程与 TaoToken 统一 Key 配置

Jetson nano 部署 yolov5 6.0:TensorRT 加速全流程与 TaoToken 统一 Key 配置 1. Jetson nano 上跑 yolov5 6.0 到底卡在哪TensorRT 加速部署的真实场景如果你手上有一块 Jetson nano想让它跑 yolov5 6.0 做目标检测大概率会遇到同一个问题直接用 PyTorch 推理帧率低到怀疑人生。我实测过nano 的 4GB 版本在纯 PyTorch 环境下跑 yolov5s单帧推理时间经常在 300ms 以上也就是 3 FPS 左右摄像头画面基本是幻灯片。这不是模型的问题而是 nano 的 GPU 算力128 核 Maxwell和 CPU 性能都有限PyTorch 的算子调度开销又大所以必须走 TensorRT 这条路。TensorRT 是 NVIDIA 的推理加速引擎它会把训练好的模型重新编译成针对特定 GPU 优化的 engine 文件做层融合、精度校准、kernel 自动调优。在 nano 上yolov5s 转成 TensorRT FP16 engine 后单帧推理能压到 30ms 以内也就是 30 FPS 左右提升接近 10 倍。这个数字不是理论值是我在 nano 上反复跑出来的。所以这篇内容的核心就是把 yolov5 6.0 从训练好的 .pt 文件一步步转成 nano 能跑的 TensorRT engine并写一个能直接用的推理脚本。适合谁看手里有 Jetson nano、已经装好系统、想跑目标检测但被帧率卡住的开发者。你需要会基本的 Linux 命令知道怎么用 SSH 连 nano能看懂 Python 脚本。不需要你精通 CUDA因为 TensorRT 的转换流程是固定的照着做就行。另外文章里还会讲怎么用 TaoToken 统一管理多工具的 API Key因为部署过程中你可能要调用模型对话、代码补全等工具统一 Key 能省不少事。整个流程分四步环境准备、模型导出、engine 构建、推理验证。每一步我都会给可复制的命令和配置包括踩过的坑。先说明一点nano 的算力有限建议用 yolov5s 或 yolov5n不要用 yolov5l 或 x否则 engine 构建时间会很长推理帧率也上不去。2. TaoToken 前置统一 Key 管理多工具 API 调用在开始部署之前先说一下 TaoToken 的作用。你在做 Jetson nano 部署的过程中可能会用到多个 AI 工具比如用模型对话查 TensorRT 报错、用代码补全写推理脚本、用文档工具查 API 参数。每个工具单独配 Key 很麻烦TaoToken 的思路是提供一个统一的 API Key兼容 OpenAI 风格的接口你只需要在 TaoToken 控制台创建一个 Key就能在多个工具里复用。TaoToken 的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数直接填这个就行。你需要先注册账号然后在控制台的 API Keys 页面创建一个 Key格式类似sk-xxxx。这个 Key 就是你在各个工具里填的凭证。具体怎么用比如你在 nano 上写推理脚本时想调用模型对话来帮你解释某个 TensorRT 报错可以在终端里用 curl 请求 TaoToken 的 API。或者你在本地用 Cline、CC Switch 这类工具时把 Base URL 填成https://taotoken.net/apiKey 填你创建的 KeyModel ID 填你需要的模型名。这样你不需要在每个工具里单独申请 Key一个 Key 走天下。对于长期做编码和 Agent 开发的场景TaoToken 还提供了 Coding Plan适合需要频繁调用 API 的开发者。你可以访问 https://taotoken.net/api-keys 管理你的 Key或者访问 https://taotoken.net/doc 看接入文档。如果你只是想验证模型效果可以用模型对话功能地址是 https://taotoken.net/chat 。这些链接都带 UTM 参数方便你直接跳转。需要强调的是TaoToken 是一个合法的 API 聚合服务不是灰色中转。你用它来管理 Key是为了方便不是为了绕过什么限制。在 nano 部署场景里它的价值在于你可以在 nano 上通过 API 调用模型能力比如让模型帮你分析推理日志而不需要在 nano 上装一堆 SDK。nano 的存储和内存都有限能省一点是一点。3. 可复制配置从 .pt 到 .wts 再到 TensorRT engine这一节是核心操作部分我会给出完整的命令和配置文件。先说明前提你已经在本地笔记本上训练好了 yolov5 6.0 模型得到了 best.pt。如果你还没训练建议先在本地用 yolov5 6.0 训练nano 上训练不现实算力不够。训练部分可以参考官方仓库这里不展开。第一步把 best.pt 转成 best.wts。wts 是 TensorRT 需要的权重格式tensorrtx 项目用它来构建 engine。在 yolov5 6.0 的一级目录下新建gen_wts.py内容如下import sys import argparse import os import struct import torch from utils.torch_utils import select_device def parse_args(): parser argparse.ArgumentParser(descriptionConvert .pt file to .wts) parser.add_argument(-w, --weights, requiredTrue, helpInput weights (.pt) file path (required)) parser.add_argument(-o, --output, helpOutput (.wts) file path (optional)) args parser.parse_args() if not os.path.isfile(args.weights): raise SystemExit(Invalid input file) if not args.output: args.output os.path.splitext(args.weights)[0] .wts elif os.path.isdir(args.output): args.output os.path.join( args.output, os.path.splitext(os.path.basename(args.weights))[0] .wts) return args.weights, args.output pt_file, wts_file parse_args() device select_device(cpu) model torch.load(pt_file, map_locationdevice) model model[ema if model.get(ema) else model].float() anchor_grid model.model[-1].anchors * model.model[-1].stride[..., None, None] delattr(model.model[-1], anchor_grid) model.model[-1].register_buffer(anchor_grid, anchor_grid) model.to(device).eval() with open(wts_file, w) as f: f.write({}\n.format(len(model.state_dict().keys()))) for k, v in model.state_dict().items(): vr v.reshape(-1).cpu().numpy() f.write({} {} .format(k, len(vr))) for vv in vr: f.write( ) f.write(struct.pack(f, float(vv)).hex()) f.write(\n)运行命令python gen_wts.py -w best.pt -o best.wts这一步会在当前目录生成 best.wts。注意如果你的模型是自定义类别数比如 4 类需要在 tensorrtx 的yololayer.h里修改CLASS_NUM为 4否则 engine 构建会出错。第二步把 tensorrtx 复制到 nano 上。tensorrtx 是 wang-xinyu 维护的项目里面有针对 yolov5 的 TensorRT 实现。你可以从 GitHub 下载 tensorrtx-master然后 scp 到 nanoscp -r tensorrtx-master nano192.168.1.100:~/ scp best.wts nano192.168.1.100:~/tensorrtx-master/yolov5/第三步在 nano 上修改yololayer.h。打开tensorrtx-master/yolov5/yololayer.h找到static constexpr int CLASS_NUM 80;改成你的类别数比如 4。同时检查INPUT_H和INPUT_W默认是 640如果你训练时用的是 416也要改。第四步构建 engine。在 tensorrtx-master 目录下mkdir build cd build cmake .. make -j4 sudo ./yolov5 -s best.wts best.engine n这里的n表示 yolov5n如果是 yolov5s改成s。命令执行后会生成 best.engine。这个过程在 nano 上可能需要几分钟到十几分钟取决于模型大小。如果报错cmake找不到先装 cmakesudo apt install cmake。第五步写推理脚本。tensorrtx 自带yolov5_trt.py但那个脚本依赖 pycuda在 nano 上装 pycuda 比较麻烦。我建议直接用 C 版本的yolov5可执行文件或者用 Python 的 tensorrt 绑定。下面是一个简化的 Python 推理脚本用 tensorrt 和 pycudaimport tensorrt as trt import pycuda.driver as cuda import pycuda.autoinit import numpy as np import cv2 class YOLOv5TRT: def __init__(self, engine_path): self.logger trt.Logger(trt.Logger.WARNING) with open(engine_path, rb) as f, trt.Runtime(self.logger) as runtime: self.engine runtime.deserialize_cuda_engine(f.read()) self.context self.engine.create_execution_context() self.inputs, self.outputs, self.bindings [], [], [] self.stream cuda.Stream() for binding in self.engine: size trt.volume(self.engine.get_binding_shape(binding)) dtype trt.nptype(self.engine.get_binding_dtype(binding)) host_mem cuda.pagelocked_empty(size, dtype) device_mem cuda.mem_alloc(host_mem.nbytes) self.bindings.append(int(device_mem)) if self.engine.binding_is_input(binding): self.inputs.append({host: host_mem, device: device_mem}) else: self.outputs.append({host: host_mem, device: device_mem}) def infer(self, img): img cv2.resize(img, (640, 640)) img img[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0 np.copyto(self.inputs[0][host], img.ravel()) cuda.memcpy_htod_async(self.inputs[0][device], self.inputs[0][host], self.stream) self.context.execute_async_v2(bindingsself.bindings, stream_handleself.stream.handle) for out in self.outputs: cuda.memcpy_dtoh_async(out[host], out[device], self.stream) self.stream.synchronize() return [out[host] for out in self.outputs]这个脚本只是骨架后处理需要你自己根据输出维度解析。如果你不想写后处理直接用 tensorrtx 的 C 版本更省事。4. 验证请求与成功结果推理帧率与 API 调用测试engine 构建完成后先验证推理是否正常。用 tensorrtx 自带的 C 可执行文件sudo ./yolov5 -d best.engine这个命令会跑一张测试图输出检测结果。如果看到类似detected 3 objects的输出说明 engine 没问题。然后测帧率sudo ./yolov5 -d best.engine -i test.mp4在 nano 上yolov5s FP16 engine 的推理帧率大概在 25-30 FPSyolov5n 能到 40 FPS 左右。如果低于 20 FPS检查是不是用了 FP32 而不是 FP16。构建 engine 时加-s参数默认是 FP16但如果你手动改了可能会降速。接下来验证 TaoToken 的 API 调用。在 nano 上你可以用 curl 测试curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:gpt-4o,messages:[{role:user,content:TensorRT engine 构建失败怎么办}]}如果返回 JSON 格式的回复说明 Key 配置正确。这个测试的意义在于当你在 nano 上遇到报错时可以直接用 API 问模型不需要在本地开浏览器。nano 的浏览器很卡用 curl 更高效。如果你用 Cline 或 CC Switch 这类工具配置如下{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: gpt-4o }注意 Base URL 是https://taotoken.net/api不要加/v1因为 TaoToken 的接口路径已经包含了。Model ID 根据你需要的模型填比如gpt-4o、claude-3-5-sonnet等。如果你用 Codex 的 auth.json格式类似{ api_key: sk-你的Key, base_url: https://taotoken.net/api }验证成功后你可以在 nano 上写一个简单的脚本把推理日志发给 TaoToken让模型帮你分析。比如import requests def ask_taotoken(prompt): headers { Authorization: Bearer sk-你的Key, Content-Type: application/json } data { model: gpt-4o, messages: [{role: user, content: prompt}] } resp requests.post(https://taotoken.net/api/v1/chat/completions, headersheaders, jsondata) return resp.json()[choices][0][message][content]这个脚本在 nano 上跑没问题因为 requests 库很轻量。实测下来从 nano 发请求到 TaoToken延迟在 1-2 秒可以接受。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth部署过程中最容易遇到的报错有四个我逐个说。第一个是401 Unauthorized。这个通常出现在调用 TaoToken API 时原因是你 Key 填错了或者 Key 前面多了空格。检查Authorization头是不是Bearer sk-xxxx注意 Bearer 后面有一个空格。另外如果你在 Cline 里填了https://taotoken.net/api/v1也会 401因为正确的 Base URL 是https://taotoken.net/api不要加/v1。如果你用 CC Switch检查配置文件里的base_url和api_key是否对应。第二个是local proxy failed。这个报错通常出现在你本地开了代理工具但 nano 上没配代理。nano 访问外网需要走路由器的网关如果你本地用了代理nano 可能连不上 TaoToken。解决办法在 nano 上检查curl -v https://taotoken.net/api是否能通。如果不通检查 nano 的 DNS 和网关设置。注意这里不涉及任何代理配置只是网络连通性问题。第三个是reading choices报错。这个出现在你解析 TaoToken 返回的 JSON 时代码里写了resp.json()[choices]但返回结构不是这个。TaoToken 兼容 OpenAI 格式正常返回是{choices: [{message: {content: ...}}]}。如果你用的是流式输出需要逐行解析data:前缀。检查你的请求头有没有stream: true如果有就要用流式解析。第四个是OAuth相关报错。如果你用 Claude Code 或类似工具可能会遇到 OAuth 认证失败。TaoToken 的 API Key 是直接填在配置里的不需要 OAuth 流程。如果你在工具里看到 OAuth 选项选择 API Key 模式然后填https://taotoken.net/api和你的 Key。如果你用 ClaudeCodeAnthropic 的配置Base URL 填https://taotoken.net/apiKey 填sk-xxxxModel ID 填claude-3-5-sonnet。另外TensorRT 构建 engine 时可能报Segmentation fault。这个通常是yololayer.h里的CLASS_NUM和你的模型不匹配。比如你训练了 4 类但CLASS_NUM还是 80构建时会越界。改成 4 后重新make再构建。还有cmake报错找不到 TensorRT检查 nano 的 JetPack 版本TensorRT 路径通常在/usr/lib/aarch64-linux-gnu/。6. 语义一致 CTAKey 管理与接入文档部署完成后你可能会想把这套流程自动化比如用脚本定期构建 engine或者用 Agent 监控推理日志。这时候 TaoToken 的 Coding Plan 就派上用场了。你可以访问 https://taotoken.net/coding-plan 了解详情它适合需要长期调用 API 的编码场景。如果你在配置过程中遇到 Key 问题直接去 https://taotoken.net/api-keys 管理你的 Key可以创建多个 Key 分配给不同工具。接入文档在 https://taotoken.net/doc 里面有详细的 API 参数说明和示例代码。如果你只是想快速验证模型效果用 https://taotoken.net/chat 就行不需要写代码。最后说一个实用技巧在 nano 上把常用的 TaoToken 请求封装成 shell 函数放在~/.bashrc里这样你遇到报错时直接敲命令就能问模型。比如ask() { curl -s -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {\model\:\gpt-4o\,\messages\:[{\role\:\user\,\content\:\$1\}]} \ | python3 -c import sys,json; print(json.load(sys.stdin)[choices][0][message][content]) }然后ask TensorRT engine 构建报错怎么办就能直接得到回复。这个技巧在 nano 上特别有用因为 nano 的图形界面很卡用终端更流畅。整个部署流程走下来从 .pt 到 engine 再到推理大概需要半天时间主要时间花在 engine 构建上。构建一次之后后续推理都是秒级启动。
返回列表