从“原始模型”到“板子上真正跑起来”

「原始模型」→「中间格式」→「厂商 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/.pthPython 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 混合推理

十一、整篇知识点小结(给你一个脑内“总图”)

  1. 任务层: LLM / VLM / YOLO / CV / OCR / 分割
  2. 模型层: Qwen / LLaMA / YOLOvX / ResNet / UNet …
  3. 训练框架: PyTorch / TF / JAX / Darknet / Caffe
  4. 原始模型格式: .pt / .pb / .h5 / .cfg+.weights / .tflite / .bin / .safetensors
  5. 中间格式: ONNX(.onnx)
  6. 厂商 IR: 各家私有,不公开
  7. 部署格式: RKNN / bmodel / engine / om / tflite / mnn / ncnn
  8. RKNN-Toolkit:
    • 前端:Caffe / TF / TFLite / Darknet / ONNX
    • 中间:Rockchip IR
    • 后端:RKNN
  9. PyTorch: 因为没有固定格式 → 必须先导出 ONNX
  10. PC vs ARM64:
    • PC:负责转换
    • ARM64:只负责推理(只吃 RKNN)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐