在多GPU环境下运行NiftyNet Promise12 demo时出现错误
我之前在处理NiftyNet多GPU训练时也踩过类似的坑,结合你用TensorFlow 1.3 GPU版搭配NiftyNet 0.2.2的场景,给你几个具体的排查和修复方向:
1. 修正CUDA设备配置
你当前设置的cuda_devices = ""是空字符串,这在多GPU场景下会导致TensorFlow无法明确识别要调用的GPU设备。TensorFlow 1.x要求明确指定GPU的ID列表,比如你有3块GPU,应该改成:
cuda_devices = "0,1,2"
这里的0,1,2对应系统识别的GPU设备编号,可以通过nvidia-smi命令查看设备ID是否正确。
2. 匹配GPU数量与配置参数
确保num_gpus = 3和cuda_devices中列出的设备数量完全一致,否则会出现设备不匹配的错误。另外,TensorFlow 1.3对多GPU的支持有限,建议先通过以下命令验证TensorFlow是否能正确识别所有3块GPU:
python -c "import tensorflow as tf; sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))"
运行后如果终端输出里能看到3块GPU的信息,说明硬件和TF的GPU驱动配置是正常的。
3. 检查模型目录权限
你设置的model_dir = /promise12_model是系统根目录下的路径,普通用户通常没有写入权限,这会导致训练时无法保存模型参数。建议改成用户有权限的路径,比如:
model_dir = ~/promise12_model
或者手动创建该目录并赋予读写权限:
mkdir -p ~/promise12_model && chmod 755 ~/promise12_model
4. 调整数据加载线程数
多GPU训练时,数据加载的线程数需要和GPU数量匹配,避免出现数据瓶颈。你当前设置的num_threads = 2太少,建议调整为GPU数量的2倍左右,比如:
num_threads = 6
修改后的完整[SYSTEM]配置示例
[SYSTEM] cuda_devices = "0,1,2" num_threads = 6 num_gpus = 3 model_dir = ~/promise12_model
如果调整后还是报错,可以先尝试用2块GPU测试(把cuda_devices改成"0,1",num_gpus改成2),确认多GPU模式能正常运行后再切换到3块,逐步排查问题。
内容的提问来源于stack exchange,提问作者Daniel Blezek

