7,646
社区成员
发帖
与我相关
我的任务
分享高通工业 AI Edge Box7×24 小时运行视觉质检任务,长期运行后图形预处理显存持续泄漏,定时重启进程才能恢复,如何实现无重启长效显存回收?
问题根因
图像预处理循环内创建的 GL 纹理、帧缓冲、着色器对象未主动销毁,循环推理持续新建图形资源,无自动回收逻辑;图形 SDK 底层缓存池无过期清理机制,显存占用持续线性上涨,最终显存耗尽进程崩溃。
长效显存管控全套优化方案
单帧推理后主动销毁临时图形资源
C++ 图形预处理循环完整资源释放代码,每帧运算完成立刻销毁纹理、缓冲对象,不等待循环结束统一释放:
void run_single_frame_preprocess(cv::Mat frame){
GLuint input_texture, render_fbo;// 创建GPU纹理与帧缓冲create_gl_texture(&input_texture, frame.data, frame.cols, frame.rows);create_fbo(&render_fbo);// GPU图像缩放、降噪预处理运算execute_gpu_preprocess_shader(input_texture, render_fbo);copy_fbo_to_cpu_buffer(render_fbo, output_tensor_data);// 核心:单帧运算完成立刻释放显存资源,杜绝累积泄漏glDeleteTextures(1, &input_texture);glDeleteFramebuffers(1, &render_fbo);}
定时全局缓存回收机制
每 300 帧推理执行一次全局闲置资源清理,释放 SDK 缓存池内超过 10 分钟未使用的纹理、缓冲对象:
frame_count = 0def full_pipeline(frame):global frame_count
frame_count +=1
run_single_frame_preprocess(frame)# 每300帧执行一次全局显存回收if frame_count % 300 == 0:
gpu_sdk.clear_idle_cache()
gc.collect() # 释放上层内存残留
限制单次批量处理图像数量
禁止一次性送入超过 8 张图像并行预处理,控制 GPU 显存峰值,避免批量资源堆积无法释放。
升级配套图形 SDK 稳定版本
修复旧版 SDK 已知的纹理缓存泄漏底层 bug,同步适配对应版本 QNN,保证图形与 AI 推理资源调度接口兼容。
显存占用监控告警
增加显存占用埋点,当显存占用超过阈值时自动触发缓存清理,无需重启进程即可释放闲置显存。
参考资料
高通工业边缘设备运维文档《Long-Running Vision App GPU Memory Leak Troubleshooting》
工业视觉落地文章《7×24 小时边缘视觉程序显存泄漏长效解决实践》