一本手册,串起 BSP 与模型两条主线
此前分散在 docs.html 的设备接入文档已收敛:通用接入内容 → devices.html / platform.html,BSP 与模型部署 → 本手册 (developers/docs),工具链原理 → developers.html。三处相互链接,不再重复。
板级支持包 BSP
Bootloader、Kernel、Device Tree、驱动、Rootfs 的版本化构建与定制。含 Yocto / Buildroot 双构建流与 A/B 分区。
- U-Boot 2023.10 + Secure Boot
- Linux 5.15 LTS + PREEMPT_RT
- 驱动矩阵与 Device Tree 覆盖
模型量产部署
与 developers.html 五段流水线一一对应:量化、编译、仿真、在环、OTA。产物直接落入 BSP 镜像的 /data/models。
- PTQ / QAT 量化,INT8/INT4 混合精度
- 面向 NPU-v2 / M55 的图优化编译
- 仿真预演 → 在环真测 → 灰度 OTA
developers/docs 定位
本文档即 developers/docs。访问 /iot/docs.html 与 /iot/developers.html#docs 指向同一手册,统一由开发者中心维护。
BSP 五层模型:每一层都可独立版本化
BSP 不是一个镜像,而是五层产物的组合。每一层都有独立的仓库、版本与校验,支持单层增量升级与回滚。
Bootloader
U-Boot 2023.10
Secure Boot / A/B
Kernel
Linux 5.15 LTS
Device Tree + RT
Drivers
NPU / ISP / VPU
Wi-Fi / 4G / CAN
Rootfs
Yocto / Buildroot
systemd / OTA Agent
Runtime
libhy-npu / hy-rt
模型加载与调度
支持板型矩阵
同一套 BSP 构建流,多板型同源管理。
| 板型 | SoC / NPU | 内核 | Rootfs | 状态 |
|---|---|---|---|---|
| HY-Edge X1 | NPU-v2 @1 GHz | 5.15-rt | Yocto | 量产 |
| HY-Gateway G3 | Cortex-A55 + NPU-v1 | 5.15 | Yocto | 量产 |
| HY-MCU M55 | Cortex-M55 + Helium | 5.15-rt / FreeRTOS | Buildroot | 量产 |
| HY-EVB R1 | RISC-V 64 + NPU-v2 | 5.15 | Buildroot | EVT |
BSP 仓库结构
mono-repo + submodules,repo manifest 锁定版本。
一次构建,六类产物
全部写入 out/hy-edge-x1/,由 bsp-manifest.json 索引。
| 产物 | 文件 | 说明 |
|---|---|---|
| Bootloader | u-boot.bin + env.bin | A/B 槽,支持回滚 |
| Kernel | Image + *.dtb | 含 Device Tree Overlays |
| Rootfs | rootfs.ext4 / squashfs | 只读 + 可写叠加层 |
| 镜像 | hy-edge-x1_v2.4.img | 可直接烧录 |
| SDK | sdk-aarch64.sh | 交叉工具链 + sysroot |
| 清单 | bsp-manifest.json | 版本/SHA256/签名 |
从空板到首帧推理,只需三步
假设你已有一块 HY-Edge X1 开发板与一台 Ubuntu 22.04 主机。BSP 已编译好镜像,模型为 YOLOv8n。
获取 BSP 与工具链
拉取 manifest,安装 huayun-cli,校验签名。
约 5 分钟 · 含依赖安装
编译与烧录
一键构建或直接烧录官方镜像,启动后串口可见登录。
约 10 分钟 · 首次构建约 18 分钟
部署模型并推理
量化→编译→推送至板端,运行 demo 看到首帧结果。
约 15 分钟 · 含校准与编译
在环校验与 OTA
板端 profiler 对齐仿真,确认后打包 OTA 灰度发布。
可选 · 流水线自动完成
# 1) 安装 huayun CLI
curl -fsSL https://get.huayuniot.com/cli | bash
huayun env check # 校验宿主机依赖
huayun auth login --token $HUAYUN_TOKEN
# 2) 拉取 BSP(manifest 锁定版本)
repo init -u https://manifest.huayuniot.com/bsp -b v2.4.0
repo sync -j8
huayun bsp verify --manifest bsp-manifest.json # 验签
# 3) 烧录官方镜像(跳过本地编译)
huayun flash --board hy-edge-x1 \
--image out/hy-edge-x1/hy-edge-x1_v2.4.0.img --port /dev/ttyUSB0
# 串口登录:user/huayun IP: 192.168.1.10(USB-RNDIS)# 4) 量化 → 编译 → 推送 → 在环(与 developers.html 一致)
huayun pipeline run \
--model yolov8n.onnx --calib coco_calib_500/ \
--target npu-v2 --board hy-edge-x1 \
--hil auto --ota-diff --from v2.3.0
# 流水线产物自动落入 BSP 叠加层:
# /data/models/yolov8n_npu-v2.hyb
# /data/models/yolov8n.json (meta)
# 5) 板端首帧推理(SSH 到板子)
ssh user@192.168.1.10
hy-rt run --model /data/models/yolov8n_npu-v2.hyb \
--input /data/samples/bus.jpg --dump result.json
cat result.json | jq .latency_ms
# → 3.18 ms mAP 0.408 ✓huayun bsp build --board hy-edge-x1 --variant yocto --jobs 8 首次约 18 分钟,二次增量约 2 分钟;产物含交叉 SDK sdk-aarch64.sh,可在宿主机交叉编译你的应用。Bootloader、Kernel、Rootfs:分层定制不踩坑
按层定制,按层验证。每一层都有最小可启动验证,避免一次性集成爆炸。
Bootloader — U-Boot 2023.10
支持 A/B 槽、recovery、USB 烧录与 ECDSA 验签。环境变量分区独立,OTA 不覆盖。
#define BOOT_A "mmc 0:2"
#define BOOT_B "mmc 0:4"
bootcmd=run boot_a; if test $? -ne 0; then run boot_b; fi
verify yes # ECDSA 验签内核与 dtb- 串口 115200 / USB DFU 二选一烧录
- 看门狗 30s,启动失败自动切 B 槽
- env 独立分区,支持
fw_setenv在线改参
Kernel & Device Tree
基于 5.15 LTS,合入 PREEMPT_RT 补丁;所有外设通过 Device Tree 描述,支持 overlays。
&npu {
compatible = "huayun,npu-v2";
reg = <0x0 0x58000000 0x0 0x100000>;
interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_npu>; // 1 GHz
status = "okay";
};kernel/fragments/huayun.config增量配置,不改 defconfigdts/overlays/按板型叠加,开箱即用huayun bsp kernel-menuconfig可视化裁剪
Rootfs — Yocto / Buildroot
双构建流可选:Yocto 适合多机型矩阵,Buildroot 适合极简启动。均已预置 OTA Agent 与 NPU 运行时。
| 构建 | 启动时间 | 镜像大小 | 适用 |
|---|---|---|---|
| Yocto Kirkstone | ~4.8 s | 1.2 GB ext4 | 网关/边缘一体机 |
| Buildroot 2024.02 | ~1.9 s | 38 MB squashfs | MCU/极简终端 |
只读 Rootfs + 可写叠加
/ 为 squashfs 只读,/data 为 ext4 可写。OTA 直接替换只读层。
预置服务
hy-ota-agent、hy-npu-daemon、hy-profiler 开机自启。
| 驱动 | 内核模块 | 版本 | 接口 | 校验方式 |
|---|---|---|---|---|
| NPU-v2 | hy_npu.ko | 2.4.1 | /dev/hy-npu0 + libhy-npu.so | 板端 hy-npu-test --burn 100 |
| ISP / Camera | hy_isp.ko | 1.8.3 | V4L2 /dev/video0-3 | v4l2-ctl --stream-mmap |
| VPU 编解码 | hy_vpu.ko | 1.6.0 | V4L2 M2M | hy-vpu-bench |
| Wi-Fi / BT | rtl88x2cs.ko | 5.12 | cfg80211 | iw dev wlan0 scan |
| 4G Modem | qmi_wwan | — | qmi / AT | uqmi -d /dev/cdc-wdm0 |
| CAN / RS485 | mcp251x / 8250 | — | SocketCAN / ttyS* | candump can0 |
journalctl -u hy-npu-daemon -f。与工具链同构的五段部署
本节是 developers.html 五段流程 的 BSP 落地版。同样的命令,同样的产物,只是多了一个 --board,让模型直接落盘到可烧录镜像。
量化
校准集 200~1k 张,KL/MSE 自动择优,逐层 SNR 可视化。
编译
算子融合、内存复用、布局转换,多 target 秒级切换。
仿真
主机侧数值+时序仿真,热力图定位误差层。
在环与落盘
真机 profiler + 自动落入 /data/models,即刻推理。
# 1) 量化(PTQ,200 张校准集,KL 散度)
huayun quantize \
--model yolov8n.onnx --calib coco_calib_500/ \
--precision int8 --metric kl --per-channel --export-report
# → yolov8n_int8.onnx + quant_report.html
# 体积 12.4 MB → 3.2 MB (-74%) mAP 0.412 → 0.408
# 2) 编译到 NPU-v2(同模型可多编译)
huayun compile \
--model yolov8n_int8.onnx --target npu-v2 --opt O2 \
--memory-plan reuse --dump-perf
# LAT 8.4 ms → 3.1 ms MEM 4.8 MB → 3.1 MB 融合 24→16 ops
# 3) 主机侧仿真(不上板)
huayun simulate \
--artifact yolov8n_npu-v2.hyb --samples val_200/ --mode numeric+timing
# cos_sim mean 0.992 min 0.978 (layer14) SNR 31.4 dB# 4) 在环真测 + 自动部署到板端 /data/models
huayun hil run \
--artifact yolov8n_npu-v2.hyb \
--device npu-v2@192.168.1.10 \
--samples val_200/ --profile --deploy
# 部署路径:/data/models/yolov8n_npu-v2.hyb (board /data)
# HIL: p50 3.18 ms p95 3.42 ms NPU 87% DDR 1.2 GB/s
# 准确率 mAP 0.406 (Δ -0.002 vs 仿真) HIL 通过 184/200
# 5) 板端推理(或宿主机远程)
huayun hil replay --case fail_07.jpg # 异常回灌
hy-rt run --model /data/models/yolov8n_npu-v2.hyb --input bus.jpg
# 一键流水线等价:
huayun pipeline run --model yolov8n.onnx --calib coco_calib_500/ \
--target npu-v2 --board hy-edge-x1 --hil auto --deploy/data/models/<name>_<target>.hyb/.bin,元信息 /data/models/<name>.json(含输入尺寸、后处理、量化参数),样例 /data/samples/。应用通过 libhy-npu.so 或 hy-rt 加载,无需关心路径细节。模型不是文件,是系统的一部分
从文件权限、系统服务到 A/B 分区,逐项勾选,避免“板上能跑、量产就崩”。
文件布局与权限
/data/models 属 hy_npu:hy_npu (770),SELinux 标记 hy_model_t。避免 world-writable。
系统服务自启动
模型服务由 systemd 管理,NPU 就绪后拉起,失败自动重试 3 次。
资源预留
/data 至少预留 2× 模型大小;内存 cgroup 为推理进程预留 64 MB。
A/B 模型槽
/data/models/a / /data/models/b 双槽,OTA 切换原子操作,回滚 <1s。
健康检查
开机自检:hy-npu-test --quick + 模型 warmup 3 帧,失败上报云端。
| 检查项 | 命令 | 预期 |
|---|---|---|
| 驱动就绪 | ls /dev/hy-npu* | 出现 /dev/hy-npu0 |
| 运行时版本 | hy-rt --version | 与 bsp-manifest.json 一致 |
| 模型完整性 | hy-rt verify --model *.hyb | SHA256 + 签名 OK |
| 首帧延迟 | hy-rt bench --model *.hyb --warmup 3 | p50 < 4 ms (X1) |
| 内存占用 | cat /proc/meminfo | 推理期峰值 < 50 MB |
[Unit]
Description=HuaYun Model Runtime
After=hy-npu-daemon.service network.target
Requires=hy-npu-daemon.service
[Service]
Type=simple
User=hy_npu
Group=hy_npu
ExecStartPre=/usr/bin/hy-npu-test --quick
ExecStart=/usr/bin/hy-rt serve \
--model /data/models/yolov8n_npu-v2.hyb \
--config /data/models/yolov8n.json \
--port 5100 --workers 2
Restart=on-failure
RestartSec=3
MemoryMax=256M
[Install]
WantedBy=multi-user.target
# 将模型叠加进 Rootfs 再出厂镜像(CI)
huayun bsp overlay \
--board hy-edge-x1 \
--add-model yolov8n_npu-v2.hyb:/data/models/ \
--add-config yolov8n.json:/data/models/
huayun bsp build --board hy-edge-x1 --pack
# → hy-edge-x1_v2.4.0+model.img 开机即推理仿真对齐在环,数据对齐体感
性能不是实验室数字。板端 Profiler 的火焰图、带宽与功耗,才是量产依据。
板端 Profiler 火焰图
逐算子 latency、NPU 利用率、DDR 带宽与功耗,异常帧一键回灌。
hy-profiler --model yolov8n_npu-v2.hyb --duration 10s
# NPU 87% DDR 1.2 GB/s 功耗 2.8 W
# Top ops:
# Conv_12 0.42 ms 38% | DwConv 0.18 ms 16%
hy-profiler --export flame.html && open flame.html精度对齐清单
仿真与在环的余弦、SNR、mAP 需在阈值内,否则回溯量化。
| 指标 | 阈值 | 当前 |
|---|---|---|
| 余弦相似度 mean | > 0.985 | 0.992 |
| SNR | > 28 dB | 31.4 dB |
| mAP Δ (在环-量化) | < 0.008 | -0.002 |
| Top-5 误差层 | 无塌陷 (<0.95) | min 0.978 |
调优三板斧
先量化、再编译、最后调度。每一步都可单独回归。
- 量化侧: 敏感层回退 FP16,校准集加难例
- 编译侧:
--opt O2 → O3,开启 Winograd - 调度侧: 双缓冲 + 流水,NPU/CPU 异构重叠
差分、灰度、签名、回滚——一个都不能少
BSP 与模型分别打包、联合编排。BSP 走 A/B 分区替换,模型走双槽切换,失败均可秒级回滚。
差分升级
二进制差分,平均流量仅全量的 12~15%,千台设备节省 85% 带宽。
huayun ota build --board hy-edge-x1 \
--from v2.3.0 --to v2.4.0 --diff --sign
# BSP diff 48 MB → 5.2 MB (-89%) signed ✓
# Model diff 3.2 MB → 418 KB (-87%) signed ✓
huayun ota upload --file ota_v2.4.0_diff.bin灰度与熔断
按地域/批次/机型灰度,错误率超阈值自动熔断回滚。
huayun ota rollout \
--version v2.4.0 --strategy canary:1%→10%→100% \
--auto-rollback error>2% --timeout 48h
huayun ota status v2.4.0
# 进度 1% ✓ 10% ✓ 100% 成功率 99.76%安全与可信
全链路签名、板端验签、防回滚计数与断点续传。
- ECDSA P-256 签名 + X.509 证书链
- TLS 1.2+ 传输,断点续传 + 哈希校验
- 防回滚:
rollback_version < anti-rollback拒绝 - 看板:成功率、失败码分布、熔断日志
C / Python / REST,一处集成
BSP 驱动与模型运行时提供统一 SDK。宿主机交叉编译,板端直接链接。
| 域 | API / 命令 | 说明 | 头文件 / 包 |
|---|---|---|---|
| BSP / NPU | hy_npu_init() / hy_npu_run(model, in, out) | 同步推理,零拷贝输入 | libhy-npu.so / hy_npu.h |
| BSP / 系统 | huayun-bsp-info --json | 读取 BSP 五层版本与 SHA256 | 板端 /usr/bin/huayun-bsp-info |
| Runtime | hy-rt run --model *.hyb --input img.jpg | 命令行一键推理 | hy-rt |
| Runtime / C | hy_rt_load() / hy_rt_infer() / hy_rt_unload() | 长驻服务推荐 | hy_runtime.h |
| Python | from hy_npu import Model; m.infer(img) | 与 C 运行时同后端 | pip install hy-npu |
| REST | POST /v1/models/{id}/infer | 板端 hy-rt serve 暴露 | http://192.168.1.10:5100 |
| OTA | hy-ota-agent status / logs | 升级状态与失败码 | hy-ota-agent |
#include "hy_npu.h"
hy_model_t *m = hy_npu_load("/data/models/yolov8n_npu-v2.hyb");
hy_tensor_t in = { .data = img, .size = 640*640*3 };
hy_tensor_t out;
hy_npu_run(m, &in, &out); // 3.1 ms @ NPU-v2
hy_npu_unload(m);from hy_npu import Model
m = Model("/data/models/yolov8n_npu-v2.hyb")
for img in dataset:
r = m.infer(img) # dict: boxes, scores
print(r["latency_ms"], r["boxes"][:1])source /opt/hy-sdk/environment-setup-aarch64-huayun-linux 后,$CC a.c -lhy-npu -o a 即可。SDK 已在 sdk-aarch64.sh 中提供,CI 可直接 huayun bsp sdk --board hy-edge-x1 生成。量产前必读的十个坑
按 “现象 → 根因 → 命令 → 解决” 编排,支持在 huayun bsp doctor 中自动检测 7 项。
板子无法启动,串口无输出 Bootloader
排查:
huayun flash --verify 校验镜像;短接 BOOT 键进 DFU 模式重烧;测量 5V/3A 供电。恢复:
huayun flash --board hy-edge-x1 --image hy-edge-x1_v2.4.0.img --force。内核启动卡在 “Starting kernel ...” Kernel / DT
排查: 确认 dtb 名称
hy-edge-x1.dtb 与板型一致;huayun bsp verify --board hy-edge-x1 校验 manifest。解决: 重新
repo sync 并 huayun bsp build --board hy-edge-x1 --kernel-only。/dev/hy-npu0 不存在,推理报 ENODEV Drivers
dmesg | grep hy_npu / lsmod | grep hy_npu / journalctl -u hy-npu-daemon。常见: 内核未启用 NPU 配置
CONFIG_HY_NPU=m;电源域未打开 hy-pm npu on;签名不匹配导致模块拒绝加载。量化后 mAP 掉 3 个点以上 Quantize
quant_report.html 逐层 SNR,标红层回退 FP16;校准集换为难例分布(加夜景/小目标);切 QAT 微调 3 epoch。huayun quantize --mixed-precision auto --fallback fp16 --layers 14,22。仿真 pass 但在环精度掉点 HIL
排查: 对比主机与板端
preprocess.yaml,确认 mean/std、resize、BGR/RGB 完全一致;用 huayun hil replay --case fail_07.jpg --dump-tensors 比对中间张量。首帧延迟抖动大(p95 > p50 ×1.5) Runtime
--warmup 3;关闭 CPU 频控 hy-pm performance;将推理线程绑定大核 taskset -c 4-7 hy-rt run ...。OTA 升级后回滚,日志 “anti-rollback” OTA
解决: 检查
bsp-manifest.json 中 rollback_version;量产切勿随意递增防回滚值;测试板可 huayun bsp rollback-reset --force(会熔断安全)。如何一键体检? Doctor
huayun bsp doctor --board hy-edge-x1 --model yolov8n_npu-v2.hyb 自动检测:驱动、运行时版本、模型签名、首帧延迟、内存、OTA Agent 与分区健康,并输出 doctor.html 报告。