第一部分:宏观认知与整体感受 (破冰与建立大局观)
- 贵公司使用 RDK X5 套件有多长时间了?主要用在哪一类产品或项目上?
- 从你们的实践经验来看,RDK X5 平台(或更广义的地平线征程5芯片)最大的优点是什么?
- 反过来说,你们觉得它最主要的槽点、或者说开发过程中最痛苦的地方是哪里?
- 对于一个刚接触这个平台的新手,你们认为学习曲线陡峭吗?大概需要多久能上手跑通第一个自研模型?
- 你们目前使用的 RDK X5 软件栈(工具链、固件、驱动)是哪个版本的?为什么选择这个版本,有没有踩过版本兼容性的坑?
- 整个算法从开发到部署,你们内部形成的一套标准流程(SOP)是怎样的?(例如:PyTorch训练 → ONNX导出 → 量化 → 编译 → 板端验证)
- 在这个流程中,哪个环节最耗时、最容易出问题?
- 你们团队中,负责算法、嵌入式软件和硬件的工程师是如何分工协作的?
- 地平线官方的技术支持(FAE)响应速度和解决问题的能力如何?你们主要通过什么渠道联系他们?
- RDK X5 和其他你们接触过的嵌入式AI平台(如 NVIDIA Jetson, TI Jacinto, NXP i.MX)相比,在开发体验和性能上有什么显著差异?
第二部分:文档、资源与开发环境
- 【核心问题】 我们刚开始,请问最关键的几份文档是哪些?例如《快速入门指南》、《工具链用户手册》、《Runtime API手册》等,你们内部有没有整理过一个“必读文档列表”?
- 【核心问题】 请问 RDK X5 的完整SDK包(包含工具链、交叉编译环境、板端固件、示例代码等)应该从地平线哪个官方渠道下载?是开发者社区、还是需要向销售/FAE申请的特定FTP?
- 下载链接或获取方式能方便提供一下吗?或者给个关键词,我们自己去搜。
- 你们的开发主机环境是什么?(例如 Ubuntu 18.04, 20.04?)有没有推荐的 Linux 发行版和版本?
- 你们是直接在物理机上搭建开发环境,还是使用 Docker?如果是 Docker,有没有官方或你们自己制作好的 Docker Image 可以分享或参考?
- 除了官方SDK,还有没有哪些第三方工具、脚本或社区项目是你们觉得非常有用的?
- 地平线的开发者社区(例如“地平线开发者社区”)活跃度如何?你们会在上面提问或分享吗?
- 板端的操作系统,你们是直接用官方提供的,还是会根据产品需求进行裁剪或定制?
- RDK X5 板子刷机和系统升级的流程是怎样的?有什么需要特别注意的地方吗?
- 开发环境搭建过程中,有没有遇到过什么依赖库版本冲突的“天坑”?
第三部分:算法工具链 (OpenExplorer) 核心细节
模型准备与转换
- 你们的算法模型主要是用什么框架训练的?(PyTorch, TensorFlow, Caffe?)
- 将训练好的模型导出为 ONNX 格式时,有没有什么“最佳实践”?比如,ONNX Opset 版本推荐用哪个?
- 地平线的工具链对 ONNX 算子(Operator)的支持情况如何?你们有没有遇到过大量不支持的算子?
- 对于不支持的算子,你们通常是怎么处理的?是选择:
- 修改模型结构,规避这个算子?
- 开发自定义算子(Custom Operator)?
- 还是把这部分放在 CPU 上执行?
- 如果开发自定义算子,流程复杂吗?官方文档对这块的描述清晰吗?有没有现成的例子可以参考?
- 模型转换工具(例如
hb_mapper makertbin)最常用、最重要的参数是哪些? - 在模型检查(
hb_mapper checker)阶段,最常遇到的错误或警告是什么?分别代表什么问题? - 模型的输入格式有什么要求?比如
NCHW还是NHWC?RGB还是BGR?需不需要归一化到[-1, 1]或[0, 1]?这些是在模型转换时指定,还是在板端运行时处理?
模型量化 (Quantization)
- 这是BPU优化的核心,你们通常采用哪种量化方式?训练后量化(PTQ)还是量化感知训练(QAT)?
- 如果用PTQ,校准数据集(calibration data)的选择有什么讲究?大概需要多少张图片?需要和训练集/测试集同分布吗?
- 量化工具对于校准数据集的格式和预处理有什么要求?
- 量化后的模型,精度损失一般在什么范围?你们如何评估量化带来的精度下降?
- 遇到量化后精度骤降的情况,你们的排查思路是怎样的?有没有工具可以分析是哪个层(layer)对量化最敏感?
- 对于混合精度(部分层FP32,部分层INT8),工具链支持得好吗?配置复杂吗?
- 你们有没有尝试过 per-channel 量化?相比 per-tensor 量化,效果提升和性能开销如何?
模型编译与优化
hb_mapper makertbin编译模型时,-march参数你们选择哪个?(例如bernoulli2)- 编译时,有没有可以手动指定的优化选项来提升性能?比如算子融合、内存布局优化等。
- 如何为模型在BPU上的运行分配核心(BPU Core)?工具链是自动分配还是可以手动指定?
- 编译生成的
.hbm模型文件,除了包含模型权重和结构,还包含了哪些信息? - 你们有没有用过地平线提供的性能仿真工具(Simulator)?它预估的性能(FPS, Latency)和板端实测差距大吗?
第四部分:板端部署与 Runtime API
- 在 RDK X5 板端,你们主要使用哪一套 API 来加载和运行模型?是
hbdk,hbon,还是更上层的hbDNN?它们各自的优缺点和适用场景是什么? - 模型加载和初始化的过程耗时吗?对于需要快速启动的应用,有什么优化方法?
- 输入数据(例如摄像头采集的图像)的预处理(如 resize, crop, padding, BGR→RGB, HWC→CHW, aipp)是在哪里完成的?
- 完全在 CPU 上用 OpenCV 等库处理?
- 利用了地平线提供的硬件加速模块(如 VPU/JPU)?
- BPU 模型本身是否可以集成一些预处理操作?
- 预处理这块,你们踩过哪些坑?性能瓶颈主要在哪?
- 如何获取模型的输入/输出 Tensor 的地址、形状(Shape)和数据类型?
- 内存管理是怎么做的?特别是输入输出 Tensor 的内存,是需要我们手动
malloc/free,还是由 Runtime API 管理? ddr带宽是瓶颈吗?如何高效地进行 CPU 和 BPU 之间的数据拷贝?有没有零拷贝(Zero-copy)的实现方法?- 推理是同步(synchronous)调用还是异步(asynchronous)调用?你们的项目里用哪种多?
- 如果是异步调用,回调函数(callback)的执行线程是在哪里?需要注意线程安全问题吗?
- 如何在板端获取单次推理的耗时?以及各个层的耗时?
- 板端有没有类似
htop的工具,可以实时查看 BPU、CPU、内存的使用率?叫什么名字?怎么用? - 你们有没有试过在一个应用中同时运行多个不同的模型?BPU调度和资源分配上有没有遇到问题?
第五部分:性能分析与调试 (Profiling & Debugging)
- 当模型在板端的实际运行速度(FPS)不达预期时,你们的性能分析(Profiling)流程是怎样的?
- 主要使用哪些工具来定位性能瓶颈?是
hb_perf工具吗?它的使用复杂吗? hb_perf的输出报告怎么解读?能看到每个算子在BPU上的具体耗时吗?- 常见的性能瓶颈有哪些?是某个算子特别耗时、数据搬运(DMA)开销大,还是 CPU 预处理跟不上?
- 针对不同的瓶颈,你们有哪些对应的优化策略?
- 当模型的推理结果和预期(例如和PC端ONNX Runtime的输出)不一致时,你们的调试(Debugging)流程是怎样的?
- 有没有办法获取BPU中间某一层的输出结果,并与PC端的结果进行比对?
- 官方有没有提供 Dump 工具或者 API 来实现这个功能?
- 精度问题排查下来,最常见的原因是什么?是量化问题、预处理不一致,还是算子实现的差异?
- 在板端运行的程序如果崩溃(segmentation fault),你们一般如何 GDB 调试?是用交叉编译的 gdbserver 吗?
- 日志系统完善吗?Runtime API 会不会在出错时打印出有用的错误信息?
第六部分:硬件与系统集成
- RDK X5 套件的散热做得怎么样?在长时间高负载运行BPU时,有没有出现过热降频甚至死机的问题?
- 你们有没有自己加装风扇或者散热片?
- 你们主要接入的是什么类型的摄像头?MIPI CSI 接口的驱动和适配工作量大吗?
- 摄像头图像采集(ISP相关)的调试,是地平线的工具链支持,还是需要摄像头模组厂商的技术支持?
- 整个系统的功耗大概是多少?你们有没有做过精细的功耗评估和优化?
- 板端的存储(eMMC)读写速度如何?对于需要加载大模型或者频繁读写文件的应用,会不会成为瓶颈?
- 除了BPU,你们有没有用到芯片上的其他硬件加速单元,比如 VPU (视频编解码), JPU (JPEG编解码)?和BPU流水线配合得好吗?
第七部分:项目实践与经验之谈 (“踩坑”分享)
- 回顾整个项目,哪个“坑”让你们团队印象最深刻,花了最长时间才解决?
- 有没有哪个问题,最后发现是官方文档的描述有误导或者不清晰导致的?
- 在版本升级时(比如从一个SDK版本升级到另一个),遇到过哪些痛苦的兼容性问题?
- 有没有什么你们自己总结出来的、文档里没写的“奇技淫巧”或“祖传秘方”?
- 对于模型的网络结构设计,有没有什么针对地平线BPU的“潜规则”?比如,用哪种激活函数(ReLU vs SiLU)性能更好?多用 3x3 卷积?避免使用某些特定结构?
- 你们认为,一个合格的、能在这个平台上高效工作的算法工程师,需要具备哪些额外的技能点?(比如对嵌入式系统、对编译原理的理解?)
- 如果能回到项目开始的时候,你们会在技术选型或开发流程上做出哪些不一样的决定?
- 在开发过程中,有没有哪些操作是“高危”的,一不小心就可能导致板子变砖?
- 对于多线程或多进程程序,BPU Runtime 的实例是线程安全的吗?你们是如何处理多线程访问BPU的?
- 最后,对于我们这样的新团队,如果只能给三条建议,会是什么?