Keras多GPU模型尝试分配至不存在的CPU:1设备问题求助
解决Keras多GPU训练时尝试访问不存在的CPU:1问题
我之前在使用旧版Keras配合多GPU训练时也碰到过一模一样的问题,结合你的环境(Keras 2.1.6+源码编译TensorFlow、4GPU+1CPU),给你梳理下问题根源和可行的解决方案:
问题根源
Keras 2.1.6版本的multi_gpu_model实现存在设备分配的bug——当你显式把模型构建绑定到/cpu:0时,内部的模型复制逻辑会错误地尝试调用额外的CPU设备(比如cpu:1),但你的系统只有1个CPU设备,因此触发了设备不存在的报错。
解决方案
方案1:移除显式的CPU设备绑定
multi_gpu_model本身会自动处理模型在GPU间的复制和设备分配,完全不需要手动把模型绑定到/cpu:0。修改代码如下:
# 直接构建模型,不指定cpu:0 model = Model(inputs=inputs, outputs=x) # 复制模型到4个GPU p_model = multi_gpu_model(model, gpus=4) # 后续编译、训练代码保持不变 p_model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) batch_size = 32 p_model.fit(x=train_x, y=train_y, batch_size=batch_size...)
这种方法能避免干扰Keras的设备分配逻辑,让它自动选择合适的设备处理模型构建和GPU复制。
方案2:限制TensorFlow的可用设备范围
通过TF的配置显式指定只使用存在的CPU和GPU,阻止它尝试访问不存在的cpu:1。在代码最开头添加:
import tensorflow as tf from keras.backend.tensorflow_backend import set_session # 配置TF会话,指定可用设备数量 config = tf.ConfigProto() config.device_count['CPU'] = 1 # 仅启用1个CPU设备 config.device_count['GPU'] = 4 # 启用4个GPU设备 # 也可以直接指定GPU编号,确保只用到你的4个GPU config.gpu_options.visible_device_list = "0,1,2,3" # 将配置应用到TF会话 set_session(tf.Session(config=config))
方案3:升级Keras版本(推荐)
Keras 2.1.6是比较老旧的版本,后续的2.2.x及以上版本修复了大量多GPU训练相关的bug,包括这种错误的设备分配问题。如果你的TensorFlow版本兼容,建议升级到最新的稳定版Keras,从根源解决这类问题。
调试建议
可以先打印系统的可用设备列表,确认设备情况:
from tensorflow.python.client import device_lib print(device_lib.list_local_devices())
这会列出所有TF检测到的设备,你可以确认是否只有/cpu:0和4个GPU设备,帮助验证问题。
内容的提问来源于stack exchange,提问作者ItsKalvik
相关产品推荐
相关产品推荐

