TensorFlow 2目标检测API修改分布式策略解决训练评估GPU混用报错
错误原因
该报错触发规则为TensorFlow不允许在同一个运行进程中创建并混用多个不同的tf.distribute.Strategy实例,你为训练、评估分别定义了不同设备配置的MirroredStrategy,因此触发限制。
可行解决方案
方案1:拆分训练、评估为独立进程(最推荐)
完全规避进程内策略冲突问题,稳定性最高:
- 训练脚本单独初始化2卡策略:
strategy = tf.distribute.MirroredStrategy(["GPU:0", "GPU:1"])
- 评估脚本单独初始化1卡策略:
strategy = tf.distribute.MirroredStrategy(["GPU:0"])
- 两个脚本分别启动运行即可,不需要修改额外逻辑。如果使用TensorFlow Object Detection API的预置脚本,直接分开执行训练、评估的启动命令即可。
方案2:单进程内动态重置策略
如果必须在同一个进程内先后执行训练、评估,可以在两个环节中间清空全局状态后再创建新策略:
- 完成训练流程后,先清空TensorFlow全局会话状态:
tf.keras.backend.clear_session()
- 再定义评估专用的单卡策略,注意不要在训练策略的上下文作用域内执行评估相关的初始化操作。
注意:该方案在部分旧版本TF2中可能存在状态残留问题,优先选择方案1。
方案3:通过限制可见GPU自动适配策略
不用手动指定策略的设备列表,通过调整CUDA可见设备让策略自动适配配置:
- 训练环节前设置可见设备为2卡:
gpus = tf.config.list_physical_devices('GPU') tf.config.set_visible_devices(gpus[:2], 'GPU') train_strategy = tf.distribute.MirroredStrategy()
- 评估环节前清空会话后重置可见设备为1卡:
tf.keras.backend.clear_session() gpus = tf.config.list_physical_devices('GPU') tf.config.set_visible_devices(gpus[:1], 'GPU') eval_strategy = tf.distribute.MirroredStrategy()
内容的提问来源于stack exchange,提问作者Chaine
相关产品推荐
相关产品推荐

