从“原始模型”到“板子上真正跑起来”
从“原始模型”到“板子上真正跑起来”
「原始模型」→「中间格式」→「厂商 IR」→「部署格式」→「NPU/CPU 上跑起来」。
核心关键词:
- 模型本体:LLM / VLM / YOLO / 其他 CV 模型
- 训练框架:PyTorch / TensorFlow / Darknet / Caffe / JAX
- 原始模型格式:.pt / .pb / .h5 / .cfg+.weights / .tflite / .bin / .safetensors
- 中间格式:ONNX
- 厂商 IR:各家私有中间表示
- 部署格式:RKNN / bmodel / engine / om / tflite / mnn / ncnn
一、任务层:你到底要干什么?
先不谈框架,先看“任务类型”——任务决定你会选什么模型家族。
-
LLM(大语言模型):
- Qwen、LLaMA、DeepSeek、Mistral、Gemma、Yi、Baichuan、Phi-3 等
- 用于:对话、推理、代码、总结、Agent 等 -
VLM / VL(视觉+语言):
- Qwen-VL、Qwen-VLM、LLaVA 等
- 用于:看图问答、OCR、图表理解、多模态推理 -
CV 模型(纯视觉):
- YOLO(目标检测)、ResNet(分类)、UNet(分割)、OCR 模型等
- 用于:检测、识别、分割、跟踪
任务层只决定“选哪一类模型”,不决定“用什么框架、什么格式”。
二、模型层:模型本体长什么样?
这里说的是“算法 + 网络结构”,跟框架无关。
-
LLM:
- Transformer 架构为主
- Qwen3-4B、LLaMA3-8B、DeepSeek-V2 等 -
VLM / VL:
- 视觉编码器(ViT / CNN)+ 文本 LLM + 多模态融合层
- Qwen3-VL-4B、Qwen3-VLM-4B 等 -
YOLO:
- YOLOv1–v4:Darknet 框架
- YOLOv5–v11:PyTorch 实现
- 本质是:Backbone + Neck + Head 的检测网络
这一层只关心“网络结构”,还没涉及
.pt、.onnx这些文件。
三、训练框架 & 原始模型格式
1. 主流训练框架
- PyTorch(现在最主流)
- TensorFlow / Keras
- JAX / Flax
- Darknet(YOLOv1–v4 原生框架)
- Caffe(老牌框架)
2. 各框架的“原始模型格式”
| 框架 | 原始模型格式示例 |
|---|---|
| PyTorch | .pt / .pth / .bin / .safetensors |
| TensorFlow | SavedModel / .pb / .h5 |
| Keras | .h5 |
| JAX / Flax | .msgpack / .safetensors |
| Darknet | .cfg + .weights |
| Caffe | .prototxt + .caffemodel |
| TFLite | .tflite(本身就是部署格式) |
这些就是你说的“原始模型格式”。
四、ONNX:整个生态的“通用中间格式”
ONNX(.onnx)不是原始格式,是“通用 IR(中间表示)”。
特点:
- 跨框架:PyTorch / TF / Caffe / MXNet 等都能导出 ONNX
- 跨硬件:CPU / GPU / NPU / DSP 都能用 ONNX 作为输入
- 跨推理引擎:TensorRT / OpenVINO / RKNN / MNN / NCNN / TFLite 等都能从 ONNX 转入
典型路径:
PyTorch(.pt) ┐
TensorFlow(.pb)├→ ONNX(.onnx) → 各家后端(RKNN / TensorRT / bmodel / om …)
Caffe(.prototxt+.caffemodel) ┘
你可以把 ONNX 理解为:AI 模型界的“USB-C 接口”。
五、厂商 IR & 部署格式:真正跑在芯片上的东西
每家芯片厂商都有自己的:
- 内部 IR(中间表示):不公开,是编译优化用的
- 部署格式(最终模型文件):给用户用的
1. 常见部署格式
| 厂商 / 平台 | 部署格式 |
|---|---|
| Rockchip NPU | RKNN |
| SOPHGO BM1684X | bmodel |
| NVIDIA GPU | TensorRT .engine |
| 华为昇腾 | OM |
| Intel | OpenVINO IR |
| ARM / 移动端 | .tflite |
| NCNN | .param + .bin |
| MNN | .mnn |
这些格式都是:
“厂商 IR 编译后的产物”,已经包含量化、算子调度、硬件指令等信息。
六、RKNN-Toolkit 的位置:它在整条链路里干什么?
1. RKNN-Toolkit 的输入
RKNN-Toolkit2 支持多种“前端格式”:
- Caffe:
.prototxt+.caffemodel - TensorFlow:
.pb/ SavedModel - TFLite:
.tflite - Darknet:
.cfg+.weights - ONNX:
.onnx
注意:PyTorch 不在列表里,因为 .pt/.pth 是动态图 + pickle,无法通用解析,所以必须:
PyTorch → ONNX → RKNN
2. RKNN 内部大致流程(推理版)
以任意一种输入为例:
Caffe / TF / TFLite / Darknet / ONNX
│
▼
对应的 Parser(前端解析器)
│
▼
Rockchip 自己的 IR(中间表示)
│
图优化 / 算子融合 / 量化
│
▼
RKNN(部署格式)
关键点:
- 内部并不是统一先转 ONNX
- 每种输入都有自己的 parser
- 最终都转成 Rockchip 自己的 IR,再编译成 RKNN
七、为什么 RKNN 支持 Caffe / TF / TFLite / Darknet,而不直接支持 PyTorch?
这正是你前面问的核心点之一。
1. 这四个有什么“特别”?
它们有共同特点:
- 静态图(Static Graph)
- 模型格式固定、结构稳定
- 文件结构清晰、易于解析
| 框架 | 模型结构 & 格式特点 |
|---|---|
| Caffe | .prototxt(结构)+ .caffemodel(权重) |
| TF | GraphDef / .pb / SavedModel |
| TFLite | FlatBuffer .tflite |
| Darknet | .cfg(结构)+ .weights(权重) |
Rockchip 可以为它们写稳定的解析器。
2. 为什么 PyTorch 不行?
.pt/.pth是 Python pickle 序列化- 动态计算图(Dynamic Graph)
- 每个模型结构都可能不一样
- 没有统一、稳定、可解析的“图描述格式”
所以:
无法写一个通用的 PyTorch Parser,只能要求用户先导出 ONNX。
八、RKNN-Toolkit:PC 端 vs ARM64 端的区别
你之前看到文档里写:
“ARM64 版本暂不支持该接口(如 load_caffe)”
这其实是因为:
-
PC 端(x86_64):
- 安装rknn-toolkit2
- 负责“模型转换”:Caffe/TF/TFLite/Darknet/ONNX → RKNN
- 依赖多、功能全 -
ARM64 端(板子上,rknn-toolkit-lite):
- 只负责“推理”:加载.rknn,做 inference
- 不做模型转换
- 所以不支持load_caffe()、load_tensorflow()等接口
总结:
转换在 PC 上做,推理在板子上做。
ARM64 端只吃 RKNN,不吃 Caffe/TF/TFLite/Darknet/ONNX。
九、YOLO & Darknet:为什么会有“原始框架”和“PyTorch 版本”
你问过一个很好的问题:
“既然有 YOLO,为什么还要 Darknet?为什么 YOLOv5 之后才变成 PyTorch 原始格式?”
1. YOLOv1–v4:原生在 Darknet 上
- YOLO 作者自己写了 Darknet 框架(C/CUDA)
- YOLOv1–v4 的官方实现都在 Darknet 上
- 模型格式:
.cfg+.weights - 所以 Darknet 是 YOLO 的原生框架
2. YOLOv5 之后:Ultralytics 用 PyTorch 重写
- YOLOv5 不是原作者写的
- Ultralytics 用 PyTorch 重写 YOLO
- 模型格式变成
.pt/.pth - 原生框架从 Darknet → PyTorch
所以:
- YOLOv1–v4:Darknet 原始格式
- YOLOv5–v11:PyTorch 原始格式
RKNN 支持 Darknet,是为了兼容大量存量的 YOLOv3/v4 项目。
十、把整个流程串成一条完整链路
以一个典型项目为例:你在 PC 上用 PyTorch 训练了一个 YOLOv8 模型,想在 RK3588 上 NPU 跑。
完整流程:
【训练阶段】
PyTorch 训练 YOLOv8 → 得到 best.pt
【中间格式】
best.pt → 导出 ONNX(best.onnx)
【厂商工具链】
best.onnx → RKNN-Toolkit2 → Rockchip IR → 编译 → model.rknn
【部署阶段】
把 model.rknn 拷到 RK3588 板子上
→ 用 rknn-toolkit-lite 加载 model.rknn
→ NPU 上跑推理
如果是老的 YOLOv3 Darknet 模型:
yolov3.cfg + yolov3.weights
│
▼
RKNN-Toolkit2 的 Darknet Parser
│
▼
Rockchip IR → RKNN
│
▼
板子上用 RKNN 推理
如果是 LLM / VLM(比如 Qwen3-VLM-4B):
原始:PyTorch / HF Transformers(.bin / .safetensors)
│
▼
导出 ONNX(部分模型支持)
│
▼
(如果 Rockchip 有支持)→ RKNN-Toolkit2 → RKNN
│
▼
NPU / CPU 混合推理
十一、整篇知识点小结(给你一个脑内“总图”)
- 任务层: LLM / VLM / YOLO / CV / OCR / 分割
- 模型层: Qwen / LLaMA / YOLOvX / ResNet / UNet …
- 训练框架: PyTorch / TF / JAX / Darknet / Caffe
- 原始模型格式:
.pt/.pb/.h5/.cfg+.weights/.tflite/.bin/.safetensors - 中间格式: ONNX(.onnx)
- 厂商 IR: 各家私有,不公开
- 部署格式: RKNN / bmodel / engine / om / tflite / mnn / ncnn
- RKNN-Toolkit:
- 前端:Caffe / TF / TFLite / Darknet / ONNX
- 中间:Rockchip IR
- 后端:RKNN
- PyTorch: 因为没有固定格式 → 必须先导出 ONNX
- PC vs ARM64:
- PC:负责转换
- ARM64:只负责推理(只吃 RKNN)
更多推荐


所有评论(0)