-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
集群训练比单机更慢? #957
Comments
请问如何启动两个机器训练的?
|
@reyoung 每台机器上都各自有一个paddle_pserver和paddle_train进程 |
可否把启动的方法贴一下? |
HOSTS = [ #environments setting for all processes in cluster job |
python paddle.py 看cpu占用率一直也不高 百分之十几 |
不是特别清楚,可能的原因有
|
@reyoung 直接用的实例的脚本 设置基本上都是默认 因该是把数据等量复制到另一台服务器上了 |
等量的复制,那么一个pass过的数据量相当于原来两个pass,时间就至少要乘2了。
batch size可以调大一些。 另外trainer_count是设置使用多少块CPU/GPU的参数,可以和系统的CPU核数一样或者是核数减一比较好 |
会把所有数据复制到所有节点, 这个功能主要帮助调试阶段使用,避免到每个节点上手工准备数据。 这个参数使得所有节点利用同样的数据副本进行训练。 多机调试pass过后,建议使用下面参数进行训练:
这个参数会引用所有节点中 --job_workspace 引用的目录,完成多机训练。 因此, 用户需要手工划分每个节点的训练数据。 |
另外, Paddle也提供了performance tuning tools, 会动态实时获取运行时,dataprovider数据准备阶段、计算不同阶段、sgd更新、多机参数更新、多机同步效率等工具,甚至该工具能帮你捕获实际每条连接通信阶段的耗时(不包括准备数据)、每条连接耗时分布等等。 打开编译选项: WITH_TIMER 能使能上述功能。 |
@backyes batch_size变大(之前是256 现在增大到2048单次训练时间减少了4倍)但等于成倍的减少了训练次数 最后精度会下降 为了达到收敛还也要增大num_passes 总的训练时间 还是增加了 主要cpu占用上不去 |
@backyes 训练数据是50万条词id 每个样本大约有10几个id @Provider(init_hook=initializer, cache=CacheType.CACHE_PASS_IN_MEM) |
|
@reyoung trainer_count设置1个 cpu物理核心是两个 mini_batch是什么参数 没有看到啊 |
推荐直接把trainer_count设置成2 另外,看起来硬件并不给力啊。这么看还是得看一下网卡是什么型号的,网络参数是什么样的。有可能网卡是100M之类的,那就非常不适合深度学习了。 可以直接benchmark一下两台机器的网络情况,最高带宽有多少。 |
@backyes -WITH_TIMER是在编译时打开的吧 docker镜像里有么? |
@reyoung cpu物理核心是两个 但有48个线程 网卡是千兆网卡 trainer_count不是设置gpu或者thread个数的么 我看官方文档上说的 |
经验上来说,对于这种纯浮点运算为主的神经网路,在cpu上,计算单元一般要比访存先成为瓶颈,因此一般不建议开巨多的线程,只会增加切换代价。 另外,两个物理核心对应48个超线程,是什么处理器?方便的话就cat /proc/cpuinfo看看,可能彼此对概念的理解不一样。 另外,我觉得你能提供我上面给出的几个items量化数据,对诊断你的性能问题非常重要。请提供全一点。 另外,前兆网卡的确不太合适做深度学习分布式训练,会让通信成为瓶颈。 |
@backyes |
单机上错误率 可以稳定在0.03左右 集群训练成了0.1而且一直不变化 |
@backyes 网络监控读写大概160m/s左右 |
如果是用了8CPU的docker镜像,那trainer_count开到8左右。
算法不拟合说明学习率之类的东西没调对。。。用RmsProp,学习率设成1e-3左右,一般不会是最差的。单机和多机对于batch_size的概念是不一样的。参考文档 http://www.paddlepaddle.org/doc/ui/api/trainer_config_helpers/optimizers.html#settings
一来千兆网络带宽确实略少。二来,在docker里面的网络应该是过bridge的吧,可能性能会有一些损失。尝试下直接--host用主机网卡。 |
@reyoung 学习率是1e-3配置跟单机上的一样 但好像集群训练没训练一次 都是重新训练 |
@reyoung host的话,paddle的IP和端口应该如何配置,直接配置主机IP的话,主机能知道这是发给DOCKER的吗? |
确定第二个Pass和第一个Pass的Cost完全一样么? 尝试一下学习率调成 5e-4
和怎么使用docker的bridge网络,没区别。 |
从你提供的信息,我们对齐下各自对概念的理解,然后在讨论系统层面的性能问题:
官网查到: e5-2670 v3 处理器(Cpu Socket), 有12个物理核(cpu core)、允许设置24个超线程(HyperThread)
另外,
一般来说,从上面的信息确定, 你的单节点(node,就是一个服务器)配备2颗e5-2670 v3 cpu(一般叫cpu socket), 每个socket cpu拥有12个物理核(cpu core),每个物理核能开启2个超线程(对应到cat /proc/cpuinfo中的processor)。 所以, 你说的两个核,是指两个cpu socket, 而不是理解的2个cpu core。 所以,建议trainer_count的设置要参照cpu core的数目,所以建议配置成48。(也可以考虑对比下关闭超线程,然后使用24个trainer_count来对比下性能,一般这种浮点运算量大的任务,超线程作用不大,反而会污染cache,降低数据访存效率,但是最终取决于你的模型特点)。 上面是你如果在裸机下跑的配置建议。 你用的是docker, 具体参照上述方法,根据docker配置自行调整。
你是千兆网卡,所以这里160m/s 具体应该是160Mb/s (因此160MB/s 就不止千兆理论峰值了)? 如果是这样的话, 那么实际你每秒只能传输20MB数据。
推断, 90MB/20MB ~=4.5s, 所以完成一次迭代需要的传输时间最短要4.5 *2 = 9s 。 (这个严格参照了你提供的网络流量均值数据)
docker 默认会通过linux kernel的tcp/ip stack 来做network 的virtualization,所以你的传输代价可能会收到linux kenrel 的iptables等的性能影响。 但是你160m/s 的传输速度本身应该不会触发到tcp/ip 的performance bottelneck。 你可以尝试通过,增加--port_num, 来增加网络通信的并发度,尝试驾驭1G网络的带宽。 记得,千兆网卡应该也是多核多队列支持的,所以,--port_num 间接增加的连接数,不仅能提高网络带宽的利用效率,提高tcp性能, 同时也能提高paddle pserver的parameter update并行度,优化整体的pserver性能。 (因为你的计算节点只有2个,但是如果计算节点数量与单节点的cpu core相当,那么你就不要考虑增加--port_num) 。 综上, 尝试优化方法:
|
@backyes 物理网卡传输速率是130mb/s ,刚才说的160mb/s |
@backyes 额 这个主要是为了测试paddle和其他平台的集群训练效率 将来会选择一个做长远使用 |
感谢您的关注。另外, https://github.com/PaddlePaddle/Paddle/tree/develop/benchmark 这里有一些公开的benchmark测试数据,包括评测代码。 另外,多机的性能与system level的优化至关紧要,因此从你目前的多机互联配置来看,可能所有平台都不会获取较好的性能。 另外, 从目前的讨论来看,您的多机互联网络的瓶颈是制约多机性能的主要因素。 另外也欢迎您share使用上述优化建议后的进一步性能数据。
如果此处的讨论解决了你的问题,请关闭此issue :-) |
Closing this issue due to inactivity, feel free to reopen it. |
* update mobile according to paddle-mobile repo * Update mobile_readme_en.md
连接了两个服务器 测试lstm模型的集群训练时间,结果比单机还慢(单机是2500s左右,集群是11800s) 且cpu占用不高。
The text was updated successfully, but these errors were encountered: