如何在单GPU服务器上并行运行多版本TensorFlow-DQN训练脚本?
当然可行!我之前在类似的单GPU服务器上试过同时跑两个强化学习脚本,只要控制好TensorFlow的显存分配策略,就能避免GPU占用冲突的问题。下面给你一步步讲怎么操作:
1. 让TensorFlow按需分配显存(最推荐)
默认情况下,TensorFlow会一启动就占满整个GPU的显存,这就是你报错的核心原因。你只需要在每个DQN脚本的开头加入一段代码,让TensorFlow用多少显存就申请多少,而不是一次性占满:
如果你用的是TensorFlow 2.x:
import tensorflow as tf # 配置GPU显存按需增长 gpus = tf.config.list_physical_devices('GPU') if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) print("GPU显存按需分配已启用") except RuntimeError as e: # 打印错误信息 print(e)
如果你用的是TensorFlow 1.x + Keras:
import tensorflow as tf from tensorflow.keras.backend import set_session config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config) set_session(session)
这段代码会让每个脚本只占用当前训练需要的显存,给另一个脚本留出足够空间。
2. 手动限制每个脚本的显存占比
如果按需分配还是出现显存不足的情况,你可以直接给每个脚本设定最大显存使用量。比如你的GTX 780是3GB显存,你可以给每个脚本分配1.2GB左右(根据实际情况调整):
TensorFlow 2.x代码:
import tensorflow as tf gpus = tf.config.list_physical_devices('GPU') if gpus: try: # 给第一个GPU(你只有一个)设置显存限制,单位是MB tf.config.set_logical_device_configuration( gpus[0], [tf.config.LogicalDeviceConfiguration(memory_limit=1200)] ) logical_gpus = tf.config.list_logical_devices('GPU') print(f"{len(gpus)} 物理GPU,{len(logical_gpus)} 逻辑GPU") except RuntimeError as e: print(e)
这样两个脚本各自占用固定的显存份额,不会互相抢占资源。
3. 后台运行脚本的正确姿势
因为你是通过SSH连接服务器,直接跑脚本的话,断开SSH进程就会终止。推荐用下面两种方式让脚本后台运行:
方式一:用nohup
分别在终端执行这两个命令,把两个脚本放到后台运行,同时把输出日志保存到文件里:
# 运行第一个版本的DQN脚本,日志输出到v1.log nohup python your_dqn_script_v1.py > v1.log 2>&1 & # 运行第二个版本的DQN脚本,日志输出到v2.log nohup python your_dqn_script_v2.py > v2.log 2>&1 &
之后你可以用cat v1.log或者tail -f v1.log查看脚本的运行日志。
方式二:用tmux(更灵活)
如果你需要随时切换查看两个脚本的运行情况,tmux是更好的选择:
- 先创建一个名为
dqn_v1的会话:tmux new -s dqn_v1 - 在这个会话里运行第一个DQN脚本
- 按
Ctrl+B然后松开,再按D,把会话放到后台 - 再创建第二个会话:
tmux new -s dqn_v2,运行第二个脚本 - 之后想看哪个脚本的输出,就用
tmux attach -t dqn_v1或者tmux attach -t dqn_v2重新连接会话
4. 额外优化小技巧
- 调整DQN的超参数时,可以适当减小
batch_size、网络的神经元数量或者层数,这样每个脚本占用的显存会更少,更容易并行运行。 - 用
nvidia-smi命令查看显存使用情况,比如watch -n 1 nvidia-smi,每隔1秒刷新一次,确认两个脚本都在正常运行。
内容的提问来源于stack exchange,提问作者Antonio Serrano
相关产品推荐
相关产品推荐

