TensorFlow多Worker分布式MNIST训练报心跳超时UNAVAILABLE错误
问题原因
核心触发原因是Worker 1、Worker 2跑完训练流程后直接退出了进程,没有等Worker 0完成模型保存。
从日志能看到3个Worker都顺利跑完了3轮训练,而你的代码逻辑里只有编号0的Worker会执行save()存模型,Worker 1、Worker 2执行完fit()之后就走到脚本末尾直接终止了。但MultiWorkerMirroredStrategy从任务启动到完全结束的全流程都要求所有Worker保持存活、维持心跳连接,其他节点提前退出就会触发协调服务的心跳超时报错,直接打断Worker 0的存盘操作。
另外单机部署多Worker时默认的心跳超时阈值偏短,如果存模型时磁盘IO阻塞、多个进程抢CPU资源导致Worker响应变慢,也容易误触发这类超时错误。
解决方法
按以下顺序调整即可:
- 增加节点同步屏障,保证所有Worker等模型保存完成后再退出。不要让非0号Worker跑完
fit()就直接终止,在代码末尾加入同步逻辑,所有节点都走到同步点确认状态后再往下执行:
如果不想调用TensorFlow内部工具API,也可以给非0号Worker加固定等待时长,比如在import time from tensorflow.python.distribute.multi_worker_util import barrier # 第一次同步:确认所有Worker都完成训练 while True: try: barrier( cluster_spec=strategy.cluster_resolver.cluster_spec(), task_type=tf_config['task']['type'], task_id=tf_config['task']['index'] ) break except Exception: time.sleep(1) # 仅Worker 0执行模型保存 if tf_config['task']['index'] == 0: multi_worker_model.save("./saved_model") # 建议指定独立目录,不要直接存在脚本根目录避免权限/文件冲突 # 第二次同步:确认Worker 0保存完成,其他Worker再退出 while True: try: barrier( cluster_spec=strategy.cluster_resolver.cluster_spec(), task_type=tf_config['task']['type'], task_id=tf_config['task']['index'] ) break except Exception: time.sleep(1)fit()执行完后加time.sleep(120),预留足够的存盘时间再让进程退出,适合快速验证场景。 - 调大协调服务心跳超时阈值,避免IO阻塞、资源抢占导致的误判。在初始化
MultiWorkerMirroredStrategy之前加入环境变量配置:# 超时时间设为5分钟,单位秒,可根据模型大小调整 os.environ["TF_COORDINATION_SERVICE_TIMEOUT"] = "300" - 单机跑多Worker时建议给每个进程绑定独立CPU核心,避免多个进程抢资源导致进程假死触发超时,比如启动Worker 0时用
taskset -c 0,1 python tf_mnist_multi_worker.py,Worker 1绑2、3核,Worker 2绑4、5核。 - 模型保存建议用独立空目录,不要直接存在脚本当前目录,避免多个进程同时扫描目录产生文件读写冲突。
内容的提问来源于stack exchange,提问作者SJ1928
相关产品推荐
相关产品推荐

