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

Kaggle环境下Keras.Sequential模型无法调用GPU问题求助

问题分析与解决方案

1. 核心冲突:混用PyTorch与Keras/TensorFlow

你的DQNAgent类继承自PyTorch的nn.Module,但内部却用Keras构建模型,还错误地用torch.save保存Keras模型,框架混用直接导致运行逻辑混乱,是GPU不工作的关键原因之一。

修复方式:

  • 把DQNAgent改成普通类,替换PyTorch相关代码:
# 移除nn.Module继承,改成普通类
class DQNAgent:
    def __init__(self, state_size, action_size):
        self.state_size = state_size
        self.action_size = action_size
        self.memory = deque(maxlen=2000)
        self.gamma = 0.95  # discount rate
        self.epsilon = 1.0  # exploration rate
        self.epsilon_min = 0.01
        self.epsilon_decay = 0.995
        self.learning_rate = 0.001
        self.model = self._build_model()

    # 替换原来的save方法,用Keras原生方式保存权重
    def save(self, name):
        self.model.save_weights(name)
        print(f"权重已保存至 {name}")

2. 过时的TensorFlow 1.x配置无效

你写的TF1.x的ConfigProto和Session代码在Kaggle当前的TF2.x环境下完全不生效,而且两次赋值config导致第一次的GPU配置被覆盖,等于没设置。

替换为TF2.x的GPU适配代码:
直接让TF自动识别并使用GPU,同时开启内存增长避免占满显存:

import tensorflow as tf
from tensorflow import keras

# 检查GPU是否被检测到
print("可用GPU:", tf.config.list_physical_devices('GPU'))

# 开启GPU内存动态分配
gpus = tf.config.list_physical_devices('GPU')
if gpus:
    try:
        for gpu in gpus:
            tf.config.experimental.set_memory_growth(gpu, True)
    except RuntimeError as e:
        print(e)

3. Kaggle环境GPU启用检查

Kaggle默认不自动开GPU,必须手动设置:

  • 点击右上角Settings按钮
  • 在Accelerator选项中选择GPU
  • 保存设置后重启Notebook

4. 批量优化训练逻辑,减少CPU/GPU传输瓶颈

你的replay方法逐样本调用predict和fit,不仅效率极低,还容易导致数据一直在CPU上跑,完全没用到GPU。改成批量处理:

def replay(self, batch_size):
    minibatch = random.sample(self.memory, batch_size)
    # 批量提取所有数据
    states = np.array([x[0] for x in minibatch])
    actions = np.array([x[1] for x in minibatch])
    rewards = np.array([x[2] for x in minibatch])
    next_states = np.array([x[3] for x in minibatch])
    dones = np.array([x[4] for x in minibatch])

    # 批量预测next_state的Q值
    next_q_values = self.model.predict(next_states, verbose=0)
    # 计算目标Q值
    targets = rewards + self.gamma * np.max(next_q_values, axis=1) * (1 - dones)
    # 获取当前Q值并更新对应动作的目标值
    current_q_values = self.model.predict(states, verbose=0)
    current_q_values[np.arange(batch_size), actions] = targets

    # 批量训练,让GPU一次性处理所有数据
    self.model.fit(states, current_q_values, epochs=1, verbose=0)

    if self.epsilon > self.epsilon_min:
        self.epsilon *= self.epsilon_decay

5. 验证GPU运行状态

在模型训练前加入这段代码,确认模型是否真的跑在GPU上:

# 查看模型第一层权重所在设备
print("模型运行设备:", self.model.layers[0].weights[0].device)

同时可以看Kaggle右侧的GPU监控面板,训练时显存使用率和GPU负载会明显上升。


内容的提问来源于stack exchange,提问作者JAMSHAID

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:45:47