fix(ml): 优化PyTorch模型推理流程与资源管理

- 修改API接口路径从serve切换到common,统一资源调用
- 增加独立推理线程,隔离ArcSoft线程污染,保障FPU状态稳定
- 推理模块预热,降低PyTorch线程初启功率峰值,避免电流保护触发
- 推理前后记录系统内存信息,辅助OOM重启排查
- 主屏相机与副屏人脸识别推理前暂停,规避硬件并发带宽冲突重启
- 控制相机HAL清理时长,确保DMC带宽资源释放后再启动推理
- 异步推理调用增加超时机制,避免长时间卡死
- 推理结束后恢复相机,确保正常工作流程
This commit is contained in:
mazengfei
2026-07-08 16:23:37 +08:00
parent b6ed47ff87
commit 5a7b090c02
3 changed files with 63 additions and 5 deletions
@@ -1297,7 +1297,24 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
startTime = System.currentTimeMillis()
log("registerDataChange photoUri bitmap保存文件路径:${file?.absolutePath}")
//val nameList = FoodModule.queryFood(bitmap)
val scoreList = FoodModule.getFoodScoreList(bitmap)
// 推理前同时暂停主屏相机和副屏人脸识别,让 ArcSoft 线程进入空闲后再启动 PyTorch
withContext(Dispatchers.Main) {
shutdownCamera()
presentation?.pauseCamera()
}
// 等待相机 HAL 在内核层(uvcvideo URB / DMC system_status)完成异步清理
// 实测:unbindAll() 之后 HAL 仍会在 ~200ms 内写 sysfs_dmc/system_status
// 若此时 PyTorch forward() 同时占用大量 DRAM 带宽,RK3588 DMC 频率切换
// 与高带宽访问并发会触发硬件级故障导致设备重启。
// 1500ms 给 HAL 足够时间完成 DMC 带宽 hold 释放后再启动推理。
Timber.tag(TAG).d("queryFoodData: 等待相机HAL完成DMC清理 (1500ms)...")
kotlinx.coroutines.delay(1500)
Timber.tag(TAG).d("queryFoodData: 延迟结束,开始 forward()")
val scoreList = try {
FoodModule.getFoodScoreList(bitmap)
} finally {
withContext(Dispatchers.Main) { setupCamera() }
}
val foodName = if (scoreList.isNotEmpty()) {
val recDataJson = GsonUtils.toJson(scoreList)
log("registerDataChange main,getFoodScoreList耗时:${System.currentTimeMillis() - startTime}")