rknn3_init 失败排查(全场景) rknn3_init 失败排查rknn3_init 失败的根因有且仅有 5 类按概率从高到低排列原因 1多个 rknn3_transfer proxy 进程冲突 (概率最高)现象: demo 或 server 报ERROR_PIPE(ret-9 on rknn3_init)、socket readBad file descriptor根因: 每次启动 server/proxy 都会 fork 子进程进程名带_hash后缀。残留的子进程占用 USB/PCIe 通道新进程无法访问设备。修复:# killall 匹配不上子进程名有 _hash 后缀必须用 pkill -f pkill -9 -f rknn3_transfer_proxy sleep 2 ps aux | grep rknn3_transfer | grep -v grep # 确认干净原因 2CDC ACM 驱动抢占 USB 端点 (Debian/Firefly)现象:rknn-smi -v能显示固件版本但 demo/server 报ERROR_PIPE。proxy 日志显示devid-1。根因: Debian/Firefly 内核CONFIG_USB_ACMy编译进内核不能 rmmod。RK1828 枚举为2207:0020时4 个 CDC ACM 接口被cdc_acm驱动自动绑定proxy 无法通过 usbfs 访问设备。诊断:ls /sys/bus/usb/drivers/cdc_acm/ | grep 5-1 # 有输出 → CDC ACM 已绑定必须解绑修复:for i in 1 2 3 4; do echo 5-1:1.$i /sys/bus/usb/drivers/cdc_acm/unbind 2/dev/null done注意: 每次 RK1828 重枚举重启、拔插、authorized toggle后 CDC ACM 会自动重新绑定需再次解绑。原因 3USB autosuspend 导致端点永久损坏 (最隐蔽)现象: proxy 日志出现LIBUSB_ERROR_IO→ 之后所有 rknn3_init 全部失败。kill、authorized toggle、unbind全部无效。根因链:autosuspend2 (默认) → USB 2 秒无活动自动挂起 → 挂起打断 NPU control transfer → error -71 (EPROTO) → libusb 层收到 EPROTO → LIBUSB_ERROR_IO → RK1828 固件 USB 端点状态**硬件级损坏**只有物理断电才能恢复关键特征:LIBUSB_ERROR_IO出现后任何软件操作都无法恢复。必须物理拔插 USB 线等 15 秒以上电容放电冷复位 RK1828 USB 控制器。修复预防:# 插设备前先禁用 autosuspend echo -1 /sys/module/usbcore/parameters/autosuspend # 验证 cat /sys/module/usbcore/parameters/autosuspend # 必须 -1修复已损坏唯一方案:pkill -9 -f rknn3_transfer_proxy # 1. 物理拔掉 RK1828 USB 线 # 2. 等 15 秒以上 # 3. 重新插上等 5 秒 # 4. 验证设备重新枚举 lsusb | grep 2207 dmesg | tail -5 | grep error\|5-1 # 不应有 error # 5. 禁用 autosuspend echo -1 /sys/module/usbcore/parameters/autosuspend # 6. 解绑 CDC ACM、启动 proxy原因 4PCIe DMA 地址越界 (32-bit 限制)现象: demo 运行一段时间后报failed to transfer dma, ret-14rknn3_init 超时。根因: RK1828 DMA 引擎只支持 32-bit 物理地址。新内核6.x将 DMA buffer 分配到 4GB 以上高位内存时NPU 无法访问。诊断:dmesg | grep rkep_mem_create # phy: 0x2ffac0000 → 4GB, 有问题 # phy: 0x80000000 → 4GB, OK dmesg | grep failed to transfer dma # ret-14 → EFAULT (地址不可达) # ret-110 → ETIMEDOUT (链路超时)修复:❌不要用mem4GFirefly RK3588 内存 ≥8G限制 4G 导致系统无法启动✅用cma512M内核参数在 extlinux.conf 的 APPEND 行追加如/boot/extlinux/extlinux.conf验证dmesg | grep -i cmadmesg | grep rkep_mem_create | head -3phy 地址应在 4GB 以内原因 5SIGKILL 导致固件状态残留现象:kill -9proxy 后新 proxyrknn-smi -v报Failed to initialize。根因: SIGKILL 不走正常 close 路径不触发 release 回调RK1828 固件侧 USB 端点状态残留脏数据。修复:# USB 模式 — authorized toggle 重置 echo 0 /sys/bus/usb/devices/5-1/authorized sleep 2 echo 1 /sys/bus/usb/devices/5-1/authorized sleep 3 # 重新解绑 CDC ACM重枚举后自动绑定 for i in 1 2 3 4; do echo 5-1:1.$i /sys/bus/usb/drivers/cdc_acm/unbind 2/dev/null; done # 验证 rknn-smi -v ​ # PCIe 模式 — PCIe hot reset echo 1 /sys/bus/pci/devices/0000:01:00.0/remove 2/dev/null sleep 2 echo 1 /sys/bus/pci/rescan sleep 3 rknn-smi -v排查口诀先看 proxy 几个ps aux | grep rknn3_transfer多个→pkill -9 -f 再看 CDC ACM ls /sys/bus/usb/drivers/cdc_acm/ | grep 5-1有→unbind 三看 autosuspendcat /sys/module/usbcore/parameters/autosuspend不是-1→echo -1 四看 DMA 地址 dmesg | grep rkep_mem_create4GB→加 mem4G 五看 smi 通不通rknn-smi -vFailed→authorized togglerknn3_init 失败速查表错误信息根因快速修复ERROR_PIPE/ret-9多 proxy 冲突pkill -9 -f rknn3_transfer_proxyERROR_PIPE smi 正常CDC ACM 抢占echo 5-1:1.x .../cdc_acm/unbindLIBUSB_ERROR_IOautosuspend 导致端点损坏物理拔插 USB等 15srknn3_find_devices faillibusb 枚举失败物理拔插 手动起 proxy --device-idfailed to transfer dma, ret-14PCIe DMA 地址 4GBmem4G内核参数Failed to initialize rknnsmiSIGKILL 脏状态authorized toggle (USB) / PCIe rescanserverSegmentation faultfind_devices 失败后未处理手动起 proxy → server--device-id 2022123456常见问题ERROR_PIPE (errno11)现象:recv TransferClient recv failed, ret -1, ERROR_PIPE原因: 多个rknn3_transfer_进程冲突socket 被占用解决:sudo killall rknn3_transfer_→ 重起单个 proxycurl 中文请求乱码 (invalid UTF-8 byte)现象: server 日志报json.exception.type_error.316收到中文变乱码原因: SSH 终端直接粘贴含中文的 curl 命令时终端编码处理导致中文变成非法 UTF-8 字节。这是终端问题不是 server bug。验证: 先用英文 curl 测试正常返回即确认服务无问题解决: 用文件传 JSON不要直接在命令行里写中文cat /tmp/chat.json EOF {model:qwen2.5-3b,messages:[{role:user,content:请简单介绍一下你自己}],max_tokens:128} EOF curl -s http://127.0.0.1:8080/v1/chat/completions -H Content-Type: application/json -d /tmp/chat.json