第一部分:宏观认知与整体感受 (破冰与建立大局观)

  1. 贵公司使用 RDK X5 套件有多长时间了?主要用在哪一类产品或项目上?
  2. 从你们的实践经验来看,RDK X5 平台(或更广义的地平线征程5芯片)最大的优点是什么?
  3. 反过来说,你们觉得它最主要的槽点、或者说开发过程中最痛苦的地方是哪里?
  4. 对于一个刚接触这个平台的新手,你们认为学习曲线陡峭吗?大概需要多久能上手跑通第一个自研模型?
  5. 你们目前使用的 RDK X5 软件栈(工具链、固件、驱动)是哪个版本的?为什么选择这个版本,有没有踩过版本兼容性的坑?
  6. 整个算法从开发到部署,你们内部形成的一套标准流程(SOP)是怎样的?(例如:PyTorch训练 ONNX导出 量化 编译 板端验证)
  7. 在这个流程中,哪个环节最耗时、最容易出问题?
  8. 你们团队中,负责算法、嵌入式软件和硬件的工程师是如何分工协作的?
  9. 地平线官方的技术支持(FAE)响应速度和解决问题的能力如何?你们主要通过什么渠道联系他们?
  10. RDK X5 和其他你们接触过的嵌入式AI平台(如 NVIDIA Jetson, TI Jacinto, NXP i.MX)相比,在开发体验和性能上有什么显著差异?

第二部分:文档、资源与开发环境

  1. 【核心问题】 我们刚开始,请问最关键的几份文档是哪些?例如《快速入门指南》、《工具链用户手册》、《Runtime API手册》等,你们内部有没有整理过一个“必读文档列表”?
  2. 【核心问题】 请问 RDK X5 的完整SDK包(包含工具链、交叉编译环境、板端固件、示例代码等)应该从地平线哪个官方渠道下载?是开发者社区、还是需要向销售/FAE申请的特定FTP?
  3. 下载链接或获取方式能方便提供一下吗?或者给个关键词,我们自己去搜。
  4. 你们的开发主机环境是什么?(例如 Ubuntu 18.04, 20.04?)有没有推荐的 Linux 发行版和版本?
  5. 你们是直接在物理机上搭建开发环境,还是使用 Docker?如果是 Docker,有没有官方或你们自己制作好的 Docker Image 可以分享或参考?
  6. 除了官方SDK,还有没有哪些第三方工具、脚本或社区项目是你们觉得非常有用的?
  7. 地平线的开发者社区(例如“地平线开发者社区”)活跃度如何?你们会在上面提问或分享吗?
  8. 板端的操作系统,你们是直接用官方提供的,还是会根据产品需求进行裁剪或定制?
  9. RDK X5 板子刷机和系统升级的流程是怎样的?有什么需要特别注意的地方吗?
  10. 开发环境搭建过程中,有没有遇到过什么依赖库版本冲突的“天坑”?

第三部分:算法工具链 (OpenExplorer) 核心细节

模型准备与转换

  1. 你们的算法模型主要是用什么框架训练的?(PyTorch, TensorFlow, Caffe?)
  2. 将训练好的模型导出为 ONNX 格式时,有没有什么“最佳实践”?比如,ONNX Opset 版本推荐用哪个?
  3. 地平线的工具链对 ONNX 算子(Operator)的支持情况如何?你们有没有遇到过大量不支持的算子?
  4. 对于不支持的算子,你们通常是怎么处理的?是选择:
    1. 修改模型结构,规避这个算子?
    2. 开发自定义算子(Custom Operator)?
    3. 还是把这部分放在 CPU 上执行?
  5. 如果开发自定义算子,流程复杂吗?官方文档对这块的描述清晰吗?有没有现成的例子可以参考?
  6. 模型转换工具(例如 hb_mapper makertbin)最常用、最重要的参数是哪些?
  7. 在模型检查(hb_mapper checker)阶段,最常遇到的错误或警告是什么?分别代表什么问题?
  8. 模型的输入格式有什么要求?比如 NCHW还是 NHWCRGB 还是 BGR?需不需要归一化到 [-1, 1] 或 [0, 1]?这些是在模型转换时指定,还是在板端运行时处理?

模型量化 (Quantization)

  1. 这是BPU优化的核心,你们通常采用哪种量化方式?训练后量化(PTQ)还是量化感知训练(QAT)?
  2. 如果用PTQ,校准数据集(calibration data)的选择有什么讲究?大概需要多少张图片?需要和训练集/测试集同分布吗?
  3. 量化工具对于校准数据集的格式和预处理有什么要求?
  4. 量化后的模型,精度损失一般在什么范围?你们如何评估量化带来的精度下降?
  5. 遇到量化后精度骤降的情况,你们的排查思路是怎样的?有没有工具可以分析是哪个层(layer)对量化最敏感?
  6. 对于混合精度(部分层FP32,部分层INT8),工具链支持得好吗?配置复杂吗?
  7. 你们有没有尝试过 per-channel 量化?相比 per-tensor 量化,效果提升和性能开销如何?

模型编译与优化

  1. hb_mapper makertbin 编译模型时,-march 参数你们选择哪个?(例如 bernoulli2
  2. 编译时,有没有可以手动指定的优化选项来提升性能?比如算子融合、内存布局优化等。
  3. 如何为模型在BPU上的运行分配核心(BPU Core)?工具链是自动分配还是可以手动指定?
  4. 编译生成的 .hbm 模型文件,除了包含模型权重和结构,还包含了哪些信息?
  5. 你们有没有用过地平线提供的性能仿真工具(Simulator)?它预估的性能(FPS, Latency)和板端实测差距大吗?

第四部分:板端部署与 Runtime API

  1. 在 RDK X5 板端,你们主要使用哪一套 API 来加载和运行模型?是 hbdkhbon,还是更上层的 hbDNN?它们各自的优缺点和适用场景是什么?
  2. 模型加载和初始化的过程耗时吗?对于需要快速启动的应用,有什么优化方法?
  3. 输入数据(例如摄像头采集的图像)的预处理(如 resize, crop, padding, BGRRGB, HWCCHW, aipp)是在哪里完成的?
    1. 完全在 CPU 上用 OpenCV 等库处理?
    2. 利用了地平线提供的硬件加速模块(如 VPU/JPU)?
    3. BPU 模型本身是否可以集成一些预处理操作?
  4. 预处理这块,你们踩过哪些坑?性能瓶颈主要在哪?
  5. 如何获取模型的输入/输出 Tensor 的地址、形状(Shape)和数据类型?
  6. 内存管理是怎么做的?特别是输入输出 Tensor 的内存,是需要我们手动 malloc/free,还是由 Runtime API 管理?
  7. ddr 带宽是瓶颈吗?如何高效地进行 CPU 和 BPU 之间的数据拷贝?有没有零拷贝(Zero-copy)的实现方法?
  8. 推理是同步(synchronous)调用还是异步(asynchronous)调用?你们的项目里用哪种多?
  9. 如果是异步调用,回调函数(callback)的执行线程是在哪里?需要注意线程安全问题吗?
  10. 如何在板端获取单次推理的耗时?以及各个层的耗时?
  11. 板端有没有类似 htop 的工具,可以实时查看 BPU、CPU、内存的使用率?叫什么名字?怎么用?
  12. 你们有没有试过在一个应用中同时运行多个不同的模型?BPU调度和资源分配上有没有遇到问题?

第五部分:性能分析与调试 (Profiling & Debugging)

  1. 当模型在板端的实际运行速度(FPS)不达预期时,你们的性能分析(Profiling)流程是怎样的?
  2. 主要使用哪些工具来定位性能瓶颈?是 hb_perf 工具吗?它的使用复杂吗?
  3. hb_perf 的输出报告怎么解读?能看到每个算子在BPU上的具体耗时吗?
  4. 常见的性能瓶颈有哪些?是某个算子特别耗时、数据搬运(DMA)开销大,还是 CPU 预处理跟不上?
  5. 针对不同的瓶颈,你们有哪些对应的优化策略?
  6. 当模型的推理结果和预期(例如和PC端ONNX Runtime的输出)不一致时,你们的调试(Debugging)流程是怎样的?
  7. 有没有办法获取BPU中间某一层的输出结果,并与PC端的结果进行比对?
  8. 官方有没有提供 Dump 工具或者 API 来实现这个功能?
  9. 精度问题排查下来,最常见的原因是什么?是量化问题、预处理不一致,还是算子实现的差异?
  10. 在板端运行的程序如果崩溃(segmentation fault),你们一般如何 GDB 调试?是用交叉编译的 gdbserver 吗?
  11. 日志系统完善吗?Runtime API 会不会在出错时打印出有用的错误信息?

第六部分:硬件与系统集成

  1. RDK X5 套件的散热做得怎么样?在长时间高负载运行BPU时,有没有出现过热降频甚至死机的问题?
  2. 你们有没有自己加装风扇或者散热片?
  3. 你们主要接入的是什么类型的摄像头?MIPI CSI 接口的驱动和适配工作量大吗?
  4. 摄像头图像采集(ISP相关)的调试,是地平线的工具链支持,还是需要摄像头模组厂商的技术支持?
  5. 整个系统的功耗大概是多少?你们有没有做过精细的功耗评估和优化?
  6. 板端的存储(eMMC)读写速度如何?对于需要加载大模型或者频繁读写文件的应用,会不会成为瓶颈?
  7. 除了BPU,你们有没有用到芯片上的其他硬件加速单元,比如 VPU (视频编解码), JPU (JPEG编解码)?和BPU流水线配合得好吗?

第七部分:项目实践与经验之谈 (“踩坑”分享)

  1. 回顾整个项目,哪个“坑”让你们团队印象最深刻,花了最长时间才解决?
  2. 有没有哪个问题,最后发现是官方文档的描述有误导或者不清晰导致的?
  3. 在版本升级时(比如从一个SDK版本升级到另一个),遇到过哪些痛苦的兼容性问题?
  4. 有没有什么你们自己总结出来的、文档里没写的“奇技淫巧”或“祖传秘方”?
  5. 对于模型的网络结构设计,有没有什么针对地平线BPU的“潜规则”?比如,用哪种激活函数(ReLU vs SiLU)性能更好?多用 3x3 卷积?避免使用某些特定结构?
  6. 你们认为,一个合格的、能在这个平台上高效工作的算法工程师,需要具备哪些额外的技能点?(比如对嵌入式系统、对编译原理的理解?)
  7. 如果能回到项目开始的时候,你们会在技术选型或开发流程上做出哪些不一样的决定?
  8. 在开发过程中,有没有哪些操作是“高危”的,一不小心就可能导致板子变砖?
  9. 对于多线程或多进程程序,BPU Runtime 的实例是线程安全的吗?你们是如何处理多线程访问BPU的?
  10. 最后,对于我们这样的新团队,如果只能给三条建议,会是什么?