认识 RDK Model Zoo¶
所属章节:RDK 小课堂 · 第 2 章 Model Zoo · 第 2 课
适用板卡:RDK X5、RDK S100、RDK S100P、RDK S600(RDK Model Zoo
main分支,仓库 VERSION 2.0.0,提交口径7a97c178;板上浅克隆可能显示7a97c17,同一提交)课程目标:理解 main 分支如何用一套代码同时支持四块板;读懂 Sample 的目录、入口和接口;在 X5 与 S100 上跑通 ResNet-18,并读懂 Top-5 结果
学习方式:概念讲解 + 上板实操(一次只演示一块板)。仓库在板上
git clone https://github.com/D-Robotics/rdk_model_zoo.git后即可运行(工作目录建议/tmp/course_2-02/)。板子需能登录,并能访问archive.d-robotics.cc以下载制品配套课件:查看中文 HTML 课件源码
配套资源¶
| 资源 | 用途 |
|---|---|
| RDK Model Zoo | 本课主角:Sample、制品清单、共用工具(main) |
| ResNet Sample README | 支持矩阵、快速体验、预期结果与性能参考值 |
| ResNet 模型制品说明 | 制品清单、下载脚本、输入协议 |
| ResNet Python 运行说明 | main.py 参数、结果与集成示例 |
| 发布制品清单与板卡别名 | models.yaml(x5 / s)与 platforms.json |
| RDK 文档资源中心 | 各板卡手册与算法工具链文档 |
板端实测环境:RDK X5(SoC 实测 X5U)、RDK S100;Model Zoo main 提交口径 7a97c178(板上浅克隆可能显示 7a97c17)。
1. 本课要解决什么问题¶
上一课结论:BPU 只跑量化、编译之后的模型;X5 用 .bin,S 系列用 .hbm。
拿到模型之后,怎么在板子上跑起来?本课围绕三个问题:
- 一套代码四块板:
main分支如何同时支持 X5、S100、S100P、S600? - 一个 Sample 有什么:目录、入口和接口在哪里?
- 怎么跑通并读懂:在 X5 和 S100 上跑 ResNet-18,看 Top-5。
2. 完成本课后你能做到什么¶
- 用
--target x5|s100|s100p|s600|auto选板,并说出制品如何随 target 变化; - 读懂 Sample README 的支持矩阵,用
--list-models/--dry-run在电脑上预演; - 指出
model/、conversion/、runtime/、evaluator/、test_data/、tests/各自管什么; - 顺着
main.py → cli.py → ResNetClassifier.predict(preprocess → infer → postprocess)读推理路径; - 在 X5 与 S100 上完成:下载制品 →
model_info→ 跑main.py→ 读 Top-5; - 换板时只改 target、下载参数和制品路径,并避开常见坑(制品混用、target 与硬件不符、缺依赖等)。
3. Model Zoo 是什么(Part 1)¶
Model Zoo 是地瓜机器人维护的 BPU 模型示例集合。每个 Sample 里通常有:
| 内容 | 作用 |
|---|---|
| 转换好的模型 | 已编译的 .bin / .hbm,下载即用 |
| 板端推理代码 | Python(部分 Sample 另有 C++)入口,前后处理已写好 |
| 转换与评估 | conversion/ 转换配方;evaluator/ 数据集精度 |
当前交付线是 main 分支(仓库 VERSION = 2.0.0)。历史上的 rdk_x5、rdk_s 分支仍保留,但新开发以 main 为准。
3.1 仓库四个位置¶
| 目录 | 放什么 |
|---|---|
samples/ |
全部 Sample,按领域分:vision、speech、llm、robotics、vla |
utils/ |
共用工具:读图、读标签、Runtime 封装 |
docs/release/ |
制品清单 models.yaml(x5 / s)和 platforms.json |
datasets/ |
评估用数据和类别名,如 imagenet/imagenet_classes.names |
3.2 一套代码,四块板¶
Sample 代码只有一份。用 --target 告诉程序在哪块板上跑:
- 显式:
x5/s100/s100p/s600 auto:读板卡身份(/sys/class/boardinfo/soc_name或/sys/class/socinfo/soc_name),对照docs/release/platforms.json认出目标
目标定了,制品也就定了(示意):
| target | march | ResNet-18 制品(model/ 下) |
|---|---|---|
| x5 | bayes-e | resnet18_bayese_224x224_nv12.bin |
| s100 | nash-e | s100/resnet18_nashe_224x224_nv12.hbm |
| s100p | nash-m | s100p/resnet18_nashm_224x224_nv12.hbm |
| s600 | nash-p | s600/resnet18_nashp_224x224_nv12.hbm |
代码不变,变的只有 target 和制品。 S100P 不能使用 S100 的文件。model/ 目录本身不提交二进制,制品用 download.sh 按 Manifest 获取。
板卡身份别名(platforms.json):X5 的 socinfo_names 为 x5u / x5h / x5m;本课 X5 实测 SoC 为 X5U。
4. 走进 Sample(Part 2)¶
4.1 先判断能不能用¶
三步都不需要板卡,在电脑上就能做:
- 看 README 的 support-matrix(target × 变体 × 语言);
python3 …/main.py --list-models --target <目标>列出清单里的制品引用;--dry-run只解析选择,不加载模型、不触发板端 SDK。
示例(ResNet):ResNet-18 在四块板上均有 Python 制品;C++ 只覆盖 S 系列,X5 无 C++ 运行时。YOLOv8 Detect 在 Model Zoo 在线模型目录上,X5、S100、S100P、S600 四块板都有;不是每个模型都覆盖四块板,动手前先在 Model Zoo 在线模型目录的卡片标签或硬件平台筛选里确认平台与模型,以在线模型目录为准。
4.2 六个目录¶
以 samples/vision/resnet/ 为例:
| 目录 | 管什么 |
|---|---|
model/ |
制品获取(下载脚本 + README),不放二进制 |
conversion/ |
导出与量化配方(下一课) |
runtime/ |
板上运行代码(python/,部分含 cpp/) |
evaluator/ |
数据集上算精度 |
test_data/ |
能直接跑的输入(如 white_wolf.JPEG) |
tests/ |
行为与数值回归 |
Sample README 使用固定小节(overview、support-matrix、prerequisites、quickstart、expected-results、directory、entry-points、license 等),学会一个,其他 Sample 就好找。
4.3 入口与统一接口¶
main.py:取参数、构造模型、调用predict、打印结果;cli.py:参数、制品选择、列清单、预演、结果展示;ResNetClassifier:前后处理在 CPU,infer交给 BPU。
换成检测 / 分割等 Sample,公开接口名字仍是 preprocess / infer / postprocess / predict。
4.4 制品怎么选对¶
- manifest:
docs/release/{x5,s}/models.yaml,每个制品一行,下载地址和格式以它为准(本课对应版本头:X51.1.3,S1.1.2)。 - asset-id 与 model-path:asset-id 是清单里的完整名字,model-path 是本地文件,必须配对——只看文件名分不出输入协议。
- 运行前校验:请求的 target 与检测到的硬件不一致,直接报错,不会硬跑。
4.5 两种输入协议¶
| RDK X5 | S100 / S100P / S600 | |
|---|---|---|
| 协议 | packed NV12(--dry-run 字段 packed_nv12) |
split NV12(split_nv12) |
| 输入 | 单个张量 data,一维 uint8;224×224 → 75,264 字节 |
data_y (1,224,224,1) + data_uv (1,112,112,2) |
| 制品 | .bin |
.hbm |
你不用自己拼;Sample 的前处理会按绑定模型准备数据。输入张量用 model_info 核对;输入协议用 --dry-run 看。
5. 上板实操(Part 3)¶
工作目录约定:板上只写
/tmp/course_2-02/。
准备:在板上进入工作目录,执行git clone https://github.com/D-Robotics/rdk_model_zoo.git,再进入仓库根目录即可后续操作。制品下载走archive.d-robotics.cc,download.sh正常。
一次只看一块板。命令均在仓库根目录执行。
5.0 获取仓库¶
如果板子网络访问不了 GitHub,也可以在电脑上 clone 后用 scp 拷到板上的 /tmp/course_2-02/。
5.1 认清板卡¶
保留 2>/dev/null:X5 没有 boardinfo,S100 没有 socinfo;去掉后会出现一行 No such file or directory。
| 板 | 实测 soc_name |
|---|---|
| X5 | X5U |
| S100 | S100 |
X5 也可能是 X5H / X5M,以板上读数为准。
5.2 下载制品¶
bash samples/vision/resnet/model/download.sh x5 18
# 或
bash samples/vision/resnet/model/download.sh s100 18
| 板 | 制品 | 大小(实测) |
|---|---|---|
| X5 | samples/vision/resnet/model/resnet18_bayese_224x224_nv12.bin |
约 11.08 MB(11 081 728 B) |
| S100 | samples/vision/resnet/model/s100/resnet18_nashe_224x224_nv12.hbm |
约 12.19 MB(12 193 864 B) |
5.3 查看模型信息¶
| 板 | model_info 要点(实测) |
input_protocol(--dry-run) |
|---|---|---|
| X5 | 单输入 data,NV12,(1,3,224,224),aligned 75,264 字节 |
packed_nv12 |
| S100 | 双输入 data_y (1,224,224,1) U8 + data_uv (1,112,112,2) U8 |
split_nv12 |
model_info 的描述行可能带有构建机器的路径,截图分享前请留意(可裁掉该行)。
5.4 运行 Sample¶
短写法(制品已在默认位置时;本课实测 exit 0):
python3 samples/vision/resnet/runtime/python/main.py --target x5 --variant 18
python3 samples/vision/resnet/runtime/python/main.py --target s100 --variant 18
默认测试图为随仓 white_wolf.JPEG,标签为 datasets/imagenet/imagenet_classes.names。完整写法见 Sample README(--asset-id + --model-path 配对)。四种方式(--variant 18、完整写法、main.py 默认参数、run.sh)在本课实测中 Top-5 一致;--target auto 在 X5、S100 上均可自动识别。
5.5 怎么读结果¶
每行三项:class(ImageNet-1k 编号)、label、score(softmax 后)。
实测 Top-5(仓库提交口径 7a97c178;顺序与 README 预期一致):
| 名次 | 类别 | X5 分数 | S100 分数 |
|---|---|---|---|
| 1 | white wolf(class 270) | 0.998090 | 0.998109 |
| 2 | timber wolf | 0.000592 | 0.000565 |
| 3 | ice bear | 0.000189 | 0.000185 |
| 4 | Arctic fox | 0.000126 | 0.000137 |
| 5 | Samoyed | 0.000080 | 0.000087 |
README 参考值:随仓 white_wolf.JPEG 的 Rank-1 为 white wolf,X5 参考分数 0.998;ImageNetV2 MatchedFrequency 上 ResNet-18 Top-1:FP32 59.35%,X5 板端 58.91%,S100 板端 58.79%(来源:Sample README「性能数据」)。
5.6 跑 Sample 四步(小结)¶
- 下载制品:
download.sh <target> 18 hrt_model_exec model_infomain.py --target <板卡>- 读 Top-5,对照 README
换板:只改 target 和制品,四步不变。
5.7 可选:C++(S 系列;本课在 S100 上实测)¶
bash samples/vision/resnet/runtime/cpp/run.sh 默认输入是 zebra_cls.jpg(Top-1 zebra)。要看 white wolf 必须加:
bash samples/vision/resnet/runtime/cpp/run.sh \
--test-img samples/vision/resnet/test_data/white_wolf.JPEG
X5 无 C++ 运行时。
5.8 补充:perf¶
单次 hrt_model_exec perf --frame_count 200 --thread_num 1(无输入文件):X5 平均约 3.144 ms / 316.6 FPS;S100 平均约 0.628 ms / 1546.9 FPS。属单次测量,数值随运行有波动;量级可对照 Sample README 参考值(X5 2.740 ms、S100 0.631 ms)。
6. 换板与避坑(Part 4)¶
6.1 换板只改三处¶
--target:x5→s100/s100p/s600,或autodownload.sh的第一个参数同步改- S 系列制品在
s100/、s100p/、s600/子目录,路径跟着变
测试图片、标签文件和其他参数不用动。
6.2 常见坑¶
跑不起来时,先查这五项。
| 坑 | 说明 |
|---|---|
| S100P 不能用 S100 制品 | march 不同(nash-m vs nash-e) |
| target 与硬件不符 | 运行前校验直接报错 |
| 老镜像缺 PyYAML / Pillow | 老镜像或精简镜像可能出现;两块板上都已经具备,未装任何依赖 |
| 推理不自动下载 | 先跑 download.sh |
| C++ 默认 zebra | 看白狼必须加 --test-img |
7. 新手规则¶
- 先看支持矩阵,再用
--list-models/--dry-run预演。 - 制品按板卡命名,不跨板复用。
asset-id与model-path配对;只看文件名不够。- 板上用
git clone获取仓库;工作目录只写/tmp/course_2-02/。 - 读板卡身份时保留
2>/dev/null。
8. 常见问题¶
Q. 板上 git clone 失败怎么办?
A. 主流程仍是板上直接 git clone。若当前网络访问不了 GitHub,可以在能访问的电脑上 clone(可用 sparse / 浅克隆减小体积),再 scp 到 /tmp/course_2-02/——这只是可选备选,不是默认步骤。
Q. git rev-parse --short HEAD 为什么是 7a97c17 不是 7a97c178?
A. 浅克隆 / sparse 仓库下 git 可能缩成 7 位;完整克隆为 8 位 7a97c178。完整哈希相同:7a97c1780b0cfa131ff0007d662e255e5e41c12e。统一写作 7a97c178;板上可能显示 7a97c17,是同一提交。
Q. 为什么要保留 2>/dev/null?
A. X5 无 boardinfo,S100 无 socinfo;保留后各自正常输出,去掉会多一行报错。
Q. 系统镜像版本怎么写?
A. 板上可读 /etc/version:本课实测 X5 为 3.5.0-beta,S100 为 4.0.5-Beta,两者目前都是 Beta。
本课小结¶
main用--target选板,一套代码对应四块板的制品;- Sample 六个目录,入口是
main.py、cli.py与模型类; - 在 X5(SoC X5U)与 S100 上跑通 ResNet-18:Top-1 均为 white wolf(0.998090 / 0.998109)。
下一课(2-03):对照 Sample 量化——以 ResNet 为例,从 ONNX、校准数据到 .bin / .hbm,把 PTQ 完整走一遍,再把产物放回 Sample,用今天学的方法上板验证。
完成检查¶
- 能说出
--target与制品命名的对应关系 - 能指出 Sample 六个目录各自职责
- 在至少一块板上完成下载 →
model_info→main.py→ 读 Top-5 - 知道换板改哪三处,以及板上用
git clone获取仓库
拓展练习¶
- 在同一块板上对 ResNet-34 / 50 重复四步,对照
--list-models。 - 用
--dry-run --target s600预演,观察打印出的asset_id、model_path_exists(未下载时为 False)。 - (S100)对比 C++ 默认 zebra 与加
--test-img白狼的输出格式差异。
附录:命令速查¶
# 获取仓库(板上主流程)
cd /tmp/course_2-02
git clone https://github.com/D-Robotics/rdk_model_zoo.git
cd rdk_model_zoo
# 身份(保留 2>/dev/null)
cat /sys/class/boardinfo/soc_name /sys/class/socinfo/soc_name 2>/dev/null | tr -d '\0'
# 下载
bash samples/vision/resnet/model/download.sh x5 18
bash samples/vision/resnet/model/download.sh s100 18
# 模型信息
hrt_model_exec model_info --model_file samples/vision/resnet/model/resnet18_bayese_224x224_nv12.bin
hrt_model_exec model_info --model_file samples/vision/resnet/model/s100/resnet18_nashe_224x224_nv12.hbm
# 预演(可在电脑)
python3 samples/vision/resnet/runtime/python/main.py --list-models --target auto
python3 samples/vision/resnet/runtime/python/main.py --dry-run --target x5
python3 samples/vision/resnet/runtime/python/main.py --dry-run --target s100
# 推理
python3 samples/vision/resnet/runtime/python/main.py --target x5 --variant 18
python3 samples/vision/resnet/runtime/python/main.py --target s100 --variant 18
# S100 C++ 看白狼
bash samples/vision/resnet/runtime/cpp/run.sh \
--test-img samples/vision/resnet/test_data/white_wolf.JPEG
数字来源:本课在 RDK X5(X5U)、RDK S100 上实测(Model Zoo main 7a97c178);README 参考值见 Sample README_cn.md「性能数据 / 预期结果」。