You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:57:38