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
相关产品推荐
相关产品推荐

