fix(ml): 优化PyTorch模型推理流程与资源管理
- 修改API接口路径从serve切换到common,统一资源调用 - 增加独立推理线程,隔离ArcSoft线程污染,保障FPU状态稳定 - 推理模块预热,降低PyTorch线程初启功率峰值,避免电流保护触发 - 推理前后记录系统内存信息,辅助OOM重启排查 - 主屏相机与副屏人脸识别推理前暂停,规避硬件并发带宽冲突重启 - 控制相机HAL清理时长,确保DMC带宽资源释放后再启动推理 - 异步推理调用增加超时机制,避免长时间卡死 - 推理结束后恢复相机,确保正常工作流程
This commit is contained in:
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user