我正在尝试运行分布式GCMLE培训工作,但不断出现以下错误:
An error was raised. This may be due to a preemption in a connected worker or parameter server. The current session will be closed and a new session will be created. Error: OS Error
trainer包是一个自定义估算器,其建模方式与cloudml-samples
人口普查自定义估算器:https://github.com/GoogleCloudPlatform/cloudml-samples/tree/master/census/customestimator/trainer相同。可以肯定地说task.py
文件是完全相同的,并且在model.py
文件中,input_fn()
和parse_csv()
函数是相同的,唯一的不同是在我的model_fn()
。
如果我将模型配置为与单个standard_p100
GPU一起运行,则可以约15步/秒的速度进行训练。但是,如果我将配置更新为具有4个工作程序和3个参数服务器的分布式设置(请参阅下面的配置),则会弹出抢占错误,并且10个步骤将花费约600秒...
config-distributed.yaml:
trainingInput:
scaleTier: CUSTOM
masterType: standard_p100
workerType: standard_p100
parameterServerType: large_model
workerCount: 3
parameterServerCount: 3
如果我在普查自定义估算器样本中使用相同的配置,则模型的训练速度将达到预期的速度,并且不会遇到抢占错误。我尝试修改人口普查示例以更精确地模仿我的确切代码,但仍然无法重现该错误。
有人在尝试训练分布式ml引擎工作时是否遇到过类似的抢占问题?关于如何更好地调试问题的任何建议?我在网上找到的唯一建议是建议参数服务器的数量至少为工作人员数量的一半(这就是为什么我将参数服务器提高到3个的原因),但是我仍然没有运气。
要从日志中添加更多上下文,这是我尝试在分布式设置中进行训练时会发生的典型(重复)模式:
master-replica-0 loss = 16.5019, step = 53 (124.505 sec)
master-replica-0 An error was raised. This may be due to a preemption in a connected worker or parameter server. The current session will be closed and a new session will be created. Error: OS Error
master-replica-0 Graph was finalized.
master-replica-0 Restoring parameters from gs://.../model.ckpt-0
master-replica-0 Running local_init_op.
master-replica-0 Done running local_init_op.
master-replica-0 Saving checkpoints for 0 into gs://...
master-replica-0 Skip the current checkpoint eval due to throttle secs (600 secs).
master-replica-0 An error was raised. This may be due to a preemption in a connected worker or parameter server. The current session will be closed and a new session will be created. Error: OS Error
然后重复此循环...
更新
我将参数服务器的数量增加到10个,并将步数/秒增加到5-10个之间(仅使用单个GPU时,步数/秒仍少于15个),并且错误仍然发生,但偶尔出现。如果更多的参数服务器有所帮助,这将意味着什么?无论(<5-10%),CPU和内存的利用率都很低,因此看来PS似乎没有超载,但是该模型确实有很多变量需要更新(5万个单词嵌入,带有大量维数) )。这会以某种方式助长问题吗?
答案 0 :(得分:0)
具有大量参数的分布式培训的瓶颈通常是网络带宽。如果您对网络的饱和度过高,则数据包会丢失,TensorFlow会认为参数服务器已关闭。通过添加更多参数服务器,您可以分配网络负载。
请记住,如果您的模型适合使用GPU,则通常不会因为拥有任何网络开销而在具有8个GPU的单个计算机上获得比在具有单个GPU的8个计算机上更好的吞吐量。