【发布时间】:2021-07-26 17:20:44
【问题描述】:
我正在通过深度强化学习实战一书学习 DRL。在第 3 章中,他们介绍了简单的游戏 Gridworld(instructions here,在规则部分)以及 PyTorch 中的相应代码。
我已经对代码进行了实验,用不到 3 分钟的时间来训练网络并获得 89% 的胜利(训练后赢得 100 场比赛中的 89 场)。
作为练习,我已将代码迁移到 tensorflow。所有代码都是here。
问题在于,使用我的 tensorflow 端口,训练网络需要将近 2 个小时,胜率达到 84%。两个版本都使用唯一的 CPU 进行训练(我没有 GPU)
训练损失数字和获胜率似乎是正确的(我们必须考虑到游戏是随机的并且可能存在不可能的状态)。问题在于整个过程的性能。
我做错了什么,但是什么?
主要区别在于训练循环,在torch中是这样的:
loss_fn = torch.nn.MSELoss()
learning_rate = 1e-3
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
....
Q1 = model(state1_batch)
with torch.no_grad():
Q2 = model2(state2_batch) #B
Y = reward_batch + gamma * ((1-done_batch) * torch.max(Q2,dim=1)[0])
X = Q1.gather(dim=1,index=action_batch.long().unsqueeze(dim=1)).squeeze()
loss = loss_fn(X, Y.detach())
optimizer.zero_grad()
loss.backward()
optimizer.step()
在 tensorflow 版本中:
loss_fn = tf.keras.losses.MSE
learning_rate = 1e-3
optimizer = tf.keras.optimizers.Adam(learning_rate)
...
Q2 = model2(state2_batch) #B
with tf.GradientTape() as tape:
Q1 = model(state1_batch)
Y = reward_batch + gamma * ((1-done_batch) * tf.math.reduce_max(Q2, axis=1))
X = [Q1[i][action_batch[i]] for i in range(len(action_batch))]
loss = loss_fn(X, Y)
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
为什么培训需要这么长时间?
【问题讨论】:
-
您可以尝试禁用急切执行并查看它的效果吗?
tf.compat.v1.disable_eager_execution() -
我还没有完成循环,因为它花费了太多时间:5000 个 epoch 中的 228 个需要 14 分钟。所以,它似乎比没有 disable_eager 慢一点。
-
唯一明显的区别是,没有
disable_eager_execution,CPU 大约是 30-35%。使用disable_eager_execution几乎达到 100%,界面感觉很慢。 -
嗨@Gulzar,两个代码(PyTorch 和 Tensorflow)都在问题中链接
-
尝试明确传递
training=False or True。Q2 = model2(state2_batch, training=False)和Q1 = model(state1_batch, training=True)
标签: python performance tensorflow deep-learning pytorch