华丽丽跳坑了…今天用分布式的ps跑了线性规划…前期环境的搭建踩了不少坑,在此记录一下。
环境:Mac OS 10.14, Linux14
用到的代码:https://github.com/xswang/xflow.git
需要注意的是这份代码用到的ps-lite是之前fork的,和官方的代码版本不一致。
遇到的环境问题
linux上安装boost库:https://blog.csdn.net/this_capslock/article/details/47170313
"make: warning: Clock skew detected. Your build may be incomplete.”错误:需要make clean
linux下装protobuf:https://www.cnblogs.com/aelite/p/9026885.html
linux下安装zeromq(zmq):https://www.cnblogs.com/wangzhongqiu/p/6542892.html,http://zeromq.org/area:download(也可直接参照官网)
ps-lite相关的入门教程:http://kimihe.com/2018/06/05/Parameter%20Server研究之ps-lite源码分析与开发/
在make ps-lite的时候,遇到Make Error: Undefined symbols for architecture x86_64:https://stackoverflow.com/questions/32063186/make-error-undefined-symbols-for-architecture-x86-64问题,解决通过:make -stdlib=libstdc++ -lstdc++
有时候遇到cannot find -lxxx的问题:https://blog.51cto.com/eminzhang/1285705(可尝试)
在linux下安装了zmq,编译的时候却找不到头文件:https://github.com/pebbe/zmq3/issues/5
在xflow编译的时候:【cmake ..】 之后要【cmake .】,然后【make】。然后还有的问题就是项目中用到的ps-lite和现在官方的ps-lite依赖包不一致,要用他自己fork的ps-lite版本
运行ps-lite的时候,出现bind fail的问题:换个端口……
遇到的代码问题
小白如我,ide和brew / apt-get不能解决的问题都是瞎子摸象一般的在尝试……由于参考的代码只给出了local的bash文件,分布式的运行方法说的有些模糊…于是我尝试了很多姿势终于有了结果…
在/build/test/src下的xflow_lr的可执行文件是用来运行各个任务的入口。在本地运行的时候,直接跑根目录下的那个start_ps_local.sh就可以。
想要分布式跑的时候,首先要把script下的bash文件看懂…(start_scheduler, start_server,start_worker)。在跑每个bash文件的时候参数要加上bin文件的路径,或者仿照start_ps_local添加bin的路径。凭需要在指定的机器上跑bash文件:schedule,server,worker。注意在独立跑的这些bash文件中都要指定这些参数。
export DMLC_PS_ROOT_URI='192.169.1.163'
export DMLC_PS_ROOT_PORT=8890
export DMLC_NUM_SERVER=1
export DMLC_NUM_WORKER=3
没有仔细了解过ps的架构原理,所以在分布式部署的时候一直非常不解,如果server和worker不在同一台机器上,不应该是需要指定某一方的ip地址才能进行通信的吗?然后研究了一下发现自己忽略了schedule…它是管理server和worker通信的,只要对server和worker指定schedule的地址,就能够通过schedule进行数据的传递。