大家好!
这两天在尝试使用PaddlePaddle平台。之前按照操作说明单机训练可以有结果,但是进行多机训练时出错。
按照 http://www.paddlepaddle.org/docs/0.14.0/documentation/fluid/zh/new_docs/user_guides/howto/training/cluster_quick_start.html 这个文档进行的操作。
报错信息如下:
root@3374a3140ee5:/app/ap/recognize_digits# PADDLE_TRAINING_ROLE=TRAINER PADDLE_PSERVER_IPS=ps0.paddlepaddle.com,ps1.paddlepaddle.com PADDLE_TRAINERS=2 PADDLE_TRAINER_ID=1 PADDLE_PSERVER_PORT=6174 python fluid_dist.py
F0720 09:45:08.417428 591 grpc_client.cc:276] Send name:[fc_0.b_0@GRAD.trainer_1], ep:[ps1.paddlepaddle.com:6174] meets grpc error:Deadline Exceeded
*** Check failure stack trace: ***
@ 0x7f69cdad679d google::LogMessage::Fail()
@ 0x7f69cdada24c google::LogMessage::SendToLog()
@ 0x7f69cdad62c3 google::LogMessage::Flush()
@ 0x7f69cdadb75e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f69ce2e16ef paddle::operators::distributed::GRPCClient::Proceed()
@ 0x7f69d8856c80 (unknown)
@ 0x7f6a198526ba start_thread
@ 0x7f6a1958841d clone
@ (nil) (unknown)
Aborted (core dumped)
我是在docker里面进行操作的。 启用了4个docker实例,模拟4个主机。
/etc/hosts 里面配置如下:
172.17.0.9 ps0.paddlepaddle.com
172.17.0.10 ps1.paddlepaddle.com
172.17.0.11 trainer0.paddlepaddle.com
172.17.0.12 trainer1.paddlepaddle.com
4个docker实例可以互相访问,端口都打开着。
大家在多机训练时是怎么做的。有人遇到过类似的问题吗?希望得到高手指点,在此先谢过了!
rpc超时时间可能太短了。
在执行前加入一个环境变量的配置:
有以下几种情况都可能导致多级启动失败:
1. Pserver启动失败:
先启动Pserver, 直到Pserver端打印出类似日志后再启动Trainer.
2. trainer启动时间差了很多, 同步情况下,多个trainer会等待执行最慢的那个trainer。
因此尽量保证trainer能够一起启动,或者时间差不太大。可配合调整参数:
3. 按照官方文档检查一下参数的配置,错误的 trainer count 也会导致该问题。
4. 检查端口连通性, 看Pserver启动的端口,在Trainer端能否正常连接。
谢谢 ┞思恋变成爱┱ 的答复!
我加入了export FLAGS_rpc_deadline=300000 ,执行还是报错。目前的错误信息如下:
root@89b616b8afa4:/recognize_digits# PADDLE_TRAINING_ROLE=TRAINER PADDLE_PSERVER_IPS=ps0.paddlepaddle.com,ps1.paddlepaddle.com PADDLE_TRAINERS=2 PADDLE_TRAINER_ID=0 PADDLE_PSERVER_PORT=6174 python fluid_dist.py
step 10, loss: [265.1646728515625]
pure virtual method called
terminate called without an active exception
*** Aborted at 1532503364 (unix time) try "date -d @1532503364" if you are using GNU date ***
PC: @ 0x0 (unknown)
*** SIGABRT (@0x461) received by PID 1121 (TID 0x7f3f935b0700) from PID 1121; stack trace: ***
@ 0x7f3f9318d390 (unknown)
@ 0x7f3f92de7428 gsignal
@ 0x7f3f92de902a abort
@ 0x7f3f5215e84d __gnu_cxx::__verbose_terminate_handler()
@ 0x7f3f5215c6b6 (unknown)
@ 0x7f3f5215c701 std::terminate()
@ 0x7f3f5215d23f __cxa_pure_virtual
@ 0x7f3f47a00c86 grpc::Channel::~Channel()
@ 0x7f3f47a00d39 grpc::Channel::~Channel()
@ 0x7f3f47118e69 std::_Sp_counted_base<>::_M_release()
@ 0x7f3f4799c16e paddle::operators::distributed::GRPCClient::~GRPCClient()
@ 0x7f3f4799c281 paddle::operators::distributed::GRPCClient::~GRPCClient()
@ 0x7f3f479a3f2a std::unique_ptr<>::~unique_ptr()
@ 0x7f3f92debff8 (unknown)
@ 0x7f3f92dec045 exit
@ 0x7f3f92dd2837 __libc_start_main
@ 0x4933e9 _start
@ 0x0 (unknown)
Aborted (core dumped)
pserver 端 我执行的命令是 PADDLE_TRAINING_ROLE=PSERVER PADDLE_CURRENT_IP=ps0.paddlepaddle.com PADDLE_PSERVER_IPS=ps0.paddleddle.com,ps1.paddlepaddle.com PADDLE_TRAINERS=2 PADDLE_PSERVER_PORT=6174 python train_digital.py 之后没有打印出任何提示信息。
后来我把超时调整成50分钟,也还是报同样的错误。
通过其他机器 telnet 可以访问到 6174 ,提示如下信息:
telnet 172.17.0.9 6174
Trying 172.17.0.9...
Connected to 172.17.0.9.
Escape character is '^]'.
@@ .Xshell
收到您的反馈,已经转入内部进行问题定位,请等待回复~~
谢谢 “挪威的仙人掌”的回复。 我期待着你们的进一步回复。多谢!
您好,此前是我们的版本内存在bug,非常感谢您的报错。
现在bug已经修复,您需要下载最新版本PaddlePaddle进行编译,能够解决问题。
https://github.com/PaddlePaddle/Paddle/issues/11851
再补充一个参考内容
谢谢 “挪威的仙人掌” 的回复!
我重新下载最新的paddle代码,编译通过了。单机测试可以运行,多机训练又出现新的问题。
仍是按照 http://www.paddlepaddle.org/docs/0.14.0/documentation/fluid/zh/new_docs/user_guides/howto/training/cluster_quick_start.html 这个文档进行的操作,选择的测试代码 fluid_dist.py
报错信息如下:
Traceback (most recent call last):
File "fluid_dist.py", line 54, in
train(False, train_program)
File "fluid_dist.py", line 38, in train
train_func=train_program, place=place, optimizer_func=optimizer_func)
File "/usr/local/lib/python2.7/dist-packages/paddle/fluid/trainer.py", line 273, in __init__
self._dist_transpile_if_necessary(optimize_ops, params_grads)
File "/usr/local/lib/python2.7/dist-packages/paddle/fluid/trainer.py", line 352, in _dist_transpile_if_necessary
self.trainer_id, pservers=pserver_endpoints, trainers=trainers)
File "/usr/local/lib/python2.7/dist-packages/paddle/fluid/transpiler/distribute_transpiler.py", line 253, in transpile
RPC_OP_ROLE_ATTR_NAME: RPC_OP_ROLE_ATTR_VALUE
File "/usr/local/lib/python2.7/dist-packages/paddle/fluid/framework.py", line 1068, in _insert_op
op = Operator(block=self, desc=op_desc, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/paddle/fluid/framework.py", line 502, in __init__
proto = OpProtoHolder.instance().get_op_proto(type)
File "/usr/local/lib/python2.7/dist-packages/paddle/fluid/framework.py", line 407, in get_op_proto
raise ValueError("Operator \"%s\" has not been registered." % type)
ValueError: Operator "send" has not been registered.
是不是代码里还有问题? 编译后的paddle 文件名称为 “paddlepaddle-0.0.0-cp27-cp27mu-linux_x86_64.whl”显示的版本号为 0.0.0
我看一下这个问题,develop分支的代码比较新,文档可能没有跟上。
您这边可以再试一下,现在的文档是否能够满足需求
您好,想问问您详细搭建的步骤,能请您教一下么?