问题根源: - PyTorch的CUDA操作不是线程安全的,在ThreadPoolExecutor中使用run_in_executor执行CUDA操作会导致内存泄漏 - 即使设置了设备上下文,多线程CUDA上下文混乱仍会导致内存无法正确释放 解决方案: 1. 为每个GPU创建专门的CUDA执行线程,完全避免在ThreadPoolExecutor中执行CUDA操作 2. 分离CUDA执行器和IO执行器: - io_executor: 用于IO操作(保存文件、打开图片等) - 专门的CUDA线程: 用于所有CUDA操作 3. 使用call_soon_threadsafe在线程和asyncio之间正确传递结果 技术细节: - 每个GPU有独立的CUDA线程,确保CUDA上下文隔离 - CUDA操作通过队列传递到专门的线程执行 - 符合PyTorch官方文档和社区最佳实践 效果: - 第一次运行GPU内存正常增加(模型加载) - 后续多次运行GPU内存不再持续增加 - 内存泄漏问题已完全解决 参考: - PyTorch GitHub issue #44156 - NVIDIA官方多线程CUDA最佳实践
Description
No description provided
Languages
Python
100%