A100 MIG环境下多进程调用GPU函数报错,求解决方案
我有一台支持多实例GPU(MIG)的A100设备,用Python多进程并行跑四个包含GPU图模式处理的函数时,报错:Failed setting context: CUDA_ERROR_NOT_INITIALIZED: initialization error
我推测问题源于多进程各自拥有独立内存空间,需要在每个进程内单独初始化CUDA上下文,但设置os.environ["CUDA_VISIBLE_DEVICES"]并未生效,求解决办法。
示例代码:
import multiprocessing import os def cal_1(): ... # 调用GPU图模式执行的函数 return def cal_2(): ... # 调用GPU图模式执行的函数 return def cal_3(): ... # 调用GPU图模式执行的函数 return def cal_4(): ... # 调用GPU图模式执行的函数 return if __name__ == "__main__": p1 = multiprocessing.Process(target=cal_1) p2 = multiprocessing.Process(target=cal_2) p3 = multiprocessing.Process(target=cal_3) p4 = multiprocessing.Process(target=cal_4) p1.start() p2.start() p3.start() p4.start() p1.join() p2.join() p3.join() p4.join()
每个进程单独绑定MIG实例+初始化CUDA
别在主进程设置CUDA_VISIBLE_DEVICES,而是在每个子进程里先指定对应的MIG实例ID,再手动初始化CUDA。比如你已经创建了四个MIG实例,就给每个cal函数分配不同的ID:def cal_1(): # 绑定第一个MIG实例,ID根据你的实际配置修改 os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 以PyTorch为例,显式初始化CUDA,其他框架逻辑类似 import torch torch.cuda.init() # 这里写你的GPU图模式处理逻辑 ... return注意:必须提前用
nvidia-smi mig -l确认四个MIG实例已经创建完成,每个进程对应一个独立实例,不要重复分配。主进程避免任何GPU操作
如果主进程提前触发了CUDA初始化,子进程会继承混乱的上下文导致报错。所以主进程里不要导入PyTorch、TensorFlow这类会自动初始化CUDA的库,也不要执行任何GPU相关操作,把这些都放到子进程内延迟处理。改用spawn方式启动多进程
Python默认的fork方式会复制主进程的内存空间,包括未完全初始化的CUDA上下文,直接导致子进程出错。改成spawn启动方式,让每个子进程完全独立初始化:if __name__ == "__main__": multiprocessing.set_start_method('spawn') # 后续进程创建、启动逻辑不变 p1 = multiprocessing.Process(target=cal_1) ...先验证MIG实例状态
先执行命令nvidia-smi mig -l检查MIG实例状态,确保四个实例都正常可用,ID对应正确,避免分配错误。GPU图模式需进程独立处理
GPU图与当前进程的CUDA上下文绑定,不能在主进程创建图后传递给子进程。每个子进程要独立完成图的捕获、执行流程,全程在进程内部完成。
内容的提问来源于stack exchange,提问作者Salad96

