高通跃龙IQ-9100工业平台的开发经验分享(1): 部署 LLM 的差异与常见问题
设备: 高通跃龙IQ-9100 (Thundercomm Ride, SA8775P, Hexagon v73)
系统: Ubuntu 24.04 LTS with Qualcomm PPA
SDK: QAIRT 2.42 (手动部署) / PPA 提供 QAIRT 2.40
模型: Qwen2.5-7B-Instruct + Qwen3-4B
一、概述
高通跃龙IQ-9100 (SA8775P) 是高通的工业级平台,与消费级手机平台(如 Snapdragon 8 Gen 3)共享相同的 Hexagon v73 DSP 架构,但在软件栈、库路径、SDK 版本管理等方面存在显著差异。这些差异也会导致遇到一系列的部署问题。
本文记录在IQ-9100开发板上部署 LLM 时遇到的 7 个具体问题及解决方案。
二、平台差异对照
| 维度 | 消费级平台 (Snapdragon) | 工业平台 (IQ-9100 PPA) |
|---|---|---|
| QNN 库来源 | QAIRT SDK 手动部署 | libqnn1 PPA 包 |
| 库路径 | 用户自定义 | /usr/lib/ (ARM) + /usr/lib/rfsa/adsp/ (DSP) |
| genie 路径 | 用户自定义 | /usr/local/bin/ |
| DSP skel 管理 | 手动拷贝 | udev 规则 + symlink |
| SDK 版本 | 用户决定 | PPA 版本固定(如 2.40) |
| soc_id 支持 | 广泛 | udev 规则可能未覆盖 |

三、问题分享
3.1 问题:genie-t2t-run: No such file or directory
现象:执行 genie-t2t-run 提示找不到文件。
原因:PPA 将 Genie 二进制安装到 /usr/local/bin/,而非 /usr/bin/。默认 PATH 可能未包含该路径。
解决方案:
# 确认实际路径
which genie-t2t-run || find /usr -name "genie-t2t-run" 2>/dev/null
# 如果在 /usr/local/bin/,确保 PATH 包含它
export PATH="/usr/local/bin:$PATH"
3.2 问题:Failed to create device: 14001
现象:genie-t2t-run 加载模型时报 Failed to create device 错误码 14001。
原因:CDSP 守护进程(cdsprpcd)未运行,或 libcdsprpc.so 符号链接缺失。
解决方案:
# 重启 CDSP 守护进程
sudo systemctl restart cdsprpcd
# 检查状态
systemctl status cdsprpcd --no-pager
# 如果 libcdsprpc.so 符号链接缺失
sudo ln -sf /usr/lib/aarch64-linux-gnu/libcdsprpc.so.1.0.0 \
/usr/lib/aarch64-linux-gnu/libcdsprpc.so
3.3 问题:Unable to load system library ... libatomic.so.1
现象:运行 genie-t2t-run 时报动态库加载失败。
原因:libatomic1 在 Ubuntu 24.04 上默认未安装。Genie 二进制依赖它来支持原子操作。
解决方案:
sudo apt install -y libatomic1
3.4 问题:DSP skel 库找不到(udev 规则未覆盖 soc_id 667)
现象:推理时报 DSP 相关错误,HTP 后端无法初始化。
原因:PPA 提供的 udev 规则文件(/usr/lib/udev/rules.d/60-libqnn1.rules)通过 soc_id 来决定创建哪些 DSP 库的符号链接。IQ-9100 的 soc_id 为 667,但该值未被包含在 udev 规则中。
结果是:安装 libqnn1 包后,/usr/lib/rfsa/adsp/ 目录下没有创建 Hexagon v73 skel 库的符号链接,DSP 端找不到需要的 .so 文件。
解决方案:手动创建符号链接。
sudo ln -sf /usr/lib/rfsa/adsp/hexagon-v73/* /usr/lib/rfsa/adsp/
这会将 hexagon-v73/ 子目录下的所有库(包括 libQnnHtpV73Skel.so、libQnnHtpV73.so 等)链接到 DSP 库搜索路径。
3.5 问题:Stub lib id mismatch
现象:
Stub lib id mismatch: stub=v2.42.0 skel=v2.40.0
原因:QNN HTP 的 ARM 侧 stub 库和 DSP 侧 skel 库在 FastRPC 初始化时会校验版本号。两端的 QAIRT 版本必须精确匹配(major.minor.patch)。
PPA 提供的 skel 库是 QAIRT 2.40,而如果你从 QAIRT 2.42 SDK 部署了 ARM 侧库,就会出现版本不匹配。
解决方案:确保 ARM 侧和 DSP 侧使用相同版本的库。
# 从 QAIRT 2.42 SDK 拷贝 ARM 侧库
sudo cp libGenie.so libQnnHtp.so libQnnHtpPrepare.so libQnnSystem.so \
libQnnHtpV73Stub.so libQnnHtpNetRunExtensions.so /usr/lib/
# 从 QAIRT 2.42 SDK 拷贝 DSP 侧库
sudo cp libQnnHtpV73Skel.so libQnnHtpV73.so libqnnhtpv73.cat /usr/lib/rfsa/adsp/
# 更新链接器缓存
sudo ldconfig
需要拷贝的文件分两类:
- ARM 侧(
/usr/lib/):libGenie.so、libQnnHtp.so、libQnnHtpPrepare.so、libQnnSystem.so、libQnnHtpV73Stub.so、libQnnHtpNetRunExtensions.so - DSP 侧(
/usr/lib/rfsa/adsp/):libQnnHtpV73Skel.so、libQnnHtpV73.so、libqnnhtpv73.cat
3.6 问题:模型编译版本与设备 firmware 不匹配
现象:context binary 加载失败,或加载成功但推理输出异常。
原因:context binary 在编译时绑定了特定的 QAIRT 版本。如果设备端 DSP firmware 对应的 QAIRT 版本与编译版本不同,可能出现不兼容。
解决方案:
- 确认设备 firmware 版本:
strings /usr/lib/rfsa/adsp/libQnnHtpV73Skel.so | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+"
- 使用匹配版本的 SDK 编译:
| 设备 skel 版本 | 需要的 QAIRT SDK |
|---|---|
| v2.35.0.xxx | QAIRT 2.35 |
| v2.40.0.xxx | QAIRT 2.40 |
| v2.42.0.xxx | QAIRT 2.42 |
- 或者升级设备端库:将编译使用的 QAIRT 版本的 ARM 侧和 DSP 侧库全部部署到设备(见问题 5 的解决方案)。
3.7 问题:Error 6001 / DSP busy
现象:运行 genie-t2t-run 报错 6001,或 HTP 后端初始化失败。
原因:上一次推理进程没有正常退出,仍持有 DSP 资源。FastRPC 的 DSP 会话是独占的。
解决方案:
pkill -f genie-t2t-run
sleep 2
# 重试推理
如果仍然失败,重启 CDSP 守护进程:
sudo systemctl restart cdsprpcd
四、版本确认速查
在 IQ-9100 开发板上执行以下命令可以快速确认环境状态:
# 操作系统
cat /etc/os-release | head -2
# 内核
uname -r
# QNN PPA 版本
dpkg -l | grep libqnn
# ARM 侧 QNN 库版本
strings /usr/lib/libQnnHtp.so | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+"
# DSP 侧 skel 版本
strings /usr/lib/rfsa/adsp/libQnnHtpV73Skel.so | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+"
# Genie 版本
genie-t2t-run --help 2>&1 | head -1
# DSP 守护进程状态
systemctl status cdsprpcd --no-pager | head -3
# DSP 库符号链接
ls -la /usr/lib/rfsa/adsp/libQnnHtpV73Skel.so
五、总结
| # | 问题 | 根因 | 解决方案 |
|---|---|---|---|
| 1 | genie-t2t-run 找不到 |
安装在/usr/local/bin/ |
更新 PATH |
| 2 | Failed to create device: 14001 |
CDSP 守护进程未运行 | 重启cdsprpcd |
| 3 | libatomic.so.1 缺失 |
Ubuntu 24.04 未默认安装 | apt install libatomic1 |
| 4 | DSP skel 找不到 | udev 规则未覆盖 soc_id 667 | 手动 symlink hexagon-v73 |
| 5 | Stub/skel 版本不匹配 | PPA 版本 ≠ 编译 SDK 版本 | 部署匹配版本的库文件 |
| 6 | 编译版本 vs 设备 firmware | context binary 绑定 SDK 版本 | 用匹配版本编译或升级设备库 |
| 7 | Error 6001 / DSP busy | 前一进程未释放 DSP 资源 | pkill 后重试 |
IQ-9100 作为工业级平台,使用 PPA 包管理 QNN 运行时,与标准 QAIRT SDK 的手动部署方式在路径规范、版本管理和 udev 配置上均有差异。部署前需要逐一确认这些环境要素,避免在推理阶段才发现基础环境问题。
更多推荐

所有评论(0)