multi_worker分布式tensorflow训练出现的问题

主要代码参考链接

0 常用指令

# 单独运行其中一个分布式程序ctrl+c无法关闭,因此需要直接杀死进程
# 查找正在运行的和python相关的程序
user@node01:~$ ps -aux|grep python

# 杀死进程
user@node01:~$ sudo kill 33717 # 33717是对应端口号

1 版本不适配问题

预装的tensorflow版本是1.0+版本不够,最后选的2.6版本
cuda是11.5
keras也是2.6
numpy是1.19

2 查看不到cuda和cudnn

原指令是:

# 查看cuda
cat /usr/local/cuda/version.txt
# 查看cudnn
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

因最新版本的version.txtcudnn.h文件均不存在了
故最新指令是:

# 查看cuda
cat /usr/local/cuda/version.json
# 或
nvcc -V

# 查看cudnn
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

3 运行分布式代码时出现以下问题

在这里插入图片描述
怀疑是版本不适配的缘故(cuda和tensorflow,以及可能的python、gcc等)
查看适配版本

查看当前版本指令:

# 查看cuda见第2步

# 查看tensorflow版本
root@node01:/home/user/keras# source activate tf
(tf) root@node01:/home/user/keras# python
Python 3.6.13 |Anaconda, Inc.| (default, Feb 23 2021, 21:15:04) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> tf.__version__

# 查看python版本
python --version

# 查看GCC版本
gcc -v

查看发现gcc的版本是5.5,太低了,打算升级版本
选择下载10版本的,但出现了以下错误:

(tf) root@node01:/usr/bin# sudo add-apt-repository ppa:ubuntu-toolchain-r/test
(tf) root@node01:/usr/bin# sudo apt-get update
(tf) root@node01:/usr/bin# sudo apt-get install -y gcc-10 g++-10

在这里插入图片描述
解决:
在这里插入图片描述
发现有8.3.0和8会有冲突,故:

(tf) root@node01:/usr/local/cuda-11.5/targets/x86_64-linux/lib# sudo ln -sf /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.0.3 /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_adv_train.so.8
(tf) root@node01:/usr/local/cuda-11.5/targets/x86_64-linux/lib# sudo ln -sf /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.0.3 /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8
(tf) root@node01:/usr/local/cuda-11.5/targets/x86_64-linux/lib# sudo ln -sf /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.0.3 /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8
(tf) root@node01:/usr/local/cuda-11.5/targets/x86_64-linux/lib# sudo ln -sf /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.0.3 /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8
(tf) root@node01:/usr/local/cuda-11.5/targets/x86_64-linux/lib# sudo ln -sf /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.0.3 /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_ops_train.so.8
(tf) root@node01:/usr/local/cuda-11.5/targets/x86_64-linux/lib# sudo ln -sf /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.0.3 /usr/local/cuda-11.5/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8

并且查看现存版本里边也没有刚刚下载的10版本只有5版本:

(tf) root@node01:/usr/bin# sudo update-alternatives --query gcc
Name: gcc
Link: /usr/bin/gcc
Status: auto
Best: /usr/bin/gcc-5
Value: /usr/bin/gcc-5

Alternative: /usr/bin/gcc-5
Priority: 50
# 查看是否安装下载成功
(tf) root@node01:/usr/bin# ls /usr/bin/gcc*
	/usr/bin/gcc      /usr/bin/gcc-7      /usr/bin/gcc-ar-7   /usr/bin/gcc-nm-7       /usr/bin/gcc-ranlib-7
	/usr/bin/gcc-10   /usr/bin/gcc-ar     /usr/bin/gcc-nm     /usr/bin/gcc-ranlib
	/usr/bin/gcc10.3  /usr/bin/gcc-ar-10  /usr/bin/gcc-nm-10  /usr/bin/gcc-ranlib-10
	/usr/bin/gcc-5    /usr/bin/gcc-ar-5   /usr/bin/gcc-nm-5   /usr/bin/gcc-ranlib-5
# 发现是成功的

# 安装并设置优先级为50(最高级)
(tf) root@node01:/usr/bin# sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 50

# 降低gcc5的优先级
(tf) root@node01:/usr/bin# sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20
	update-alternatives: 使用 /usr/bin/gcc-10 来在自动模式中提供 /usr/bin/gcc (gcc)

# 再次查看
(tf) root@node01:/usr/bin# sudo update-alternatives --query gcc
Name: gcc
Link: /usr/bin/gcc
Status: auto
Best: /usr/bin/gcc-10
Value: /usr/bin/gcc-10

Alternative: /usr/bin/gcc-10
Priority: 50

Alternative: /usr/bin/gcc-5
Priority: 20

# 查看gcc版本
(tf) root@node01:/home/user/keras# gcc -v
	Using built-in specs.
	COLLECT_GCC=gcc
	COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper
	OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa:hsa
	OFFLOAD_TARGET_DEFAULT=1
	Target: x86_64-linux-gnu
	Configured with: ../src/configure -v --with-pkgversion='Ubuntu 10.3.0-1ubuntu1~18.04~1' --with-bugurl=file:///usr/share/doc/gcc-10/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-10 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-10-xgJY7J/gcc-10-10.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-10-xgJY7J/gcc-10-10.3.0/debian/tmp-gcn/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
	Thread model: posix
	Supported LTO compression algorithms: zlib zstd
	gcc version 10.3.0 (Ubuntu 10.3.0-1ubuntu1~18.04~1)
# ok了

重新运行代码还是出现同样的问题

4 解决步骤

1 针对找不到libcupti.so.11.2

# 添加环境变量
(tf) root@node01:/home/user/keras# vim ~/.bashrc
# 添加下列语句
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/usr/local/cuda-11.5/extras/CUPTI/lib64
# 使之生效
(tf) root@node01:/home/user/keras# source ~/.bashrc

# 查看是否设置成功
(tf) root@node01:/home/user/keras# echo $LD_LIBRARY_PATH
	LD_LIBRARY_PATH:/usr/local/cuda-11.5/extras/CUPTI/lib64

再次运行发现:
在这里插入图片描述
程序不报错了,但之前的两个ERROR没有了。不知道为啥,再看看吧

2 查看到另一个目录下含有libcupti.so.11.5

但是没有11.2,于是打算把这个文件重命名为11.2
mv libcupti.so.11.5 libcupti.so.11.2
在这里插入图片描述
运行后发现,报错没有了:
在这里插入图片描述
但注意,还有最后一个没法执行共享策略的问题(该数据集不可共享),需要解决。

3 数据集共享问题(不影响)

和分布式tensorflow策略有关,有待深入了解之后再解决

---------------------------2022.4.1日修改更新----------------------------

实际上,后面发现这个错误暂时不需要考虑。
因为试过在一台机器上开两个端口模拟在两台机器上训练,是可以正常训练完的!
训练流程是:
需要打开两个终端,同时执行两个文件

(tf) root@node01:/home/user/keras# python keras_distributed_mnist_worker0.py

(tf) root@node01:/home/user/keras# python keras_distributed_mnist_worker01.py

可以训练完全,准确率和损失率和单机训练一致。

因此,问题变成:两台实体服务器之间的通信问题。

4 服务器之间的通信问题(没有问题)

有待解决。

突然想到一个问题:操纵两台机器是通过master的终端使用ssh的方式进行远程连接上node01的,但是之前尝试过在node01上ssh连接master没连接上,因为不影响这两台机器的操作,所以也没多想(会有这种情况出现吗?后面再查查)。两个机器之间能够通讯的前提就是相互能ping通,按道理实验的代码设置集群IP的方式也是跟官网一致的,应该是就可以顺利通信的,所以真的可能就是这两台硬件设备的问题。
查了一下,类似问题很少,基本上都是主机和虚拟机之间没法ping通的问题。
可能的原因是:防火墙的问题
明天再去试试~该睡觉了。

--------------------------2022.4.2修改更新--------------------------
今天试了一下,发现master和node01是可以相互ping通的,而且master是可以ssh远程连接node01的,但node01确实没法ssh连接master。
尝试防火墙的相关设置,发现两台机器的防火墙都是永久关闭的,应该不是这个问题。
后面发现好像,master上没有安装openssh-server,安装~

sudo apt-get install openssh-server
	正在读取软件包列表... 完成
	正在分析软件包的依赖关系树       
	正在读取状态信息... 完成       
	下列软件包是自动安装的并且现在不需要了:
	  chromium-codecs-ffmpeg-extra lib32gcc1 libc6-i386 libopencore-amrnb0 libopencore-amrwb0
	  linux-hwe-5.4-headers-5.4.0-42
	使用'sudo apt autoremove'来卸载它(它们)。
	将会同时安装下列软件:
	  ncurses-term openssh-client openssh-sftp-server ssh-import-id
	建议安装:
	  keychain libpam-ssh monkeysphere ssh-askpass molly-guard rssh
	下列【新】软件包将被安装:
	  ncurses-term openssh-server openssh-sftp-server ssh-import-id
	下列软件包将被升级:
	  openssh-client
	升级了 1 个软件包,新安装了 4 个软件包,要卸载 0 个软件包,有 238 个软件包未被升级。

之后,node01也可以成功连接上master啦!

然而实践证明,ssh连接上了问题还是没解决。

-------------------------------2022.4.6修改更新--------------------------------

5 node01出现的问题

在这里插入图片描述
发现并非通信的问题,因为两个机器可以相互通信上,而在master上开两个端口模拟训练是没问题的(如上图),因此可能问题出在node01,因此在node01上进行验证:
发现果然存在问题:tensorflow.python.framework.errors_impl.InternalError: Failed copying input tensor from /job:worker/replica:0/task:1/device:CPU:0 to /job:worker/replica:0/task:1/device:GPU:0 in order to run _EagerConst: Dst tensor is not initialized.在这里插入图片描述接下来就是要解决这个问题了!

5 解决方法

-----------------------------------2022.4.7-------------------------------------
了解到,一般出现这种问题都是由于第一个程序占用GPU资源太大,第二个程序运行时GPU容量不够。
因此,尝试指定GPU容量运行;或者人为对物理GPU分片,形成多个逻辑GPU。

5.1 设置GPU自增长

注意,须在strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()之后运行,不然会报以下错误:
在这里插入图片描述

但是,放在之后运行又会出现以下错误:
在这里插入图片描述

崩溃。。。

5.2 版本对应问题

想了想,为啥同样master上就可以正常训练而不会出现GPU占用资源太多不够用的情况呢?可能是版本对应的问题。

硬件版本对比masternode01
nvidia驱动495.44510.47.03
cuda11.511.5
cudnn8.3.08.3.0
tensorflow2.4.12.6.2
keras2.4.02.6.0

----------------------------------------2022.4.10---------------------------------------------------
官网查看发现虽然版本不尽相同,但也是符合的,问题出在哪呢?
因为重新安装驱动比较麻烦,决定先把node01的tensorflow和keras版本调成和master一致。

哇哇哇,把node01的tensorflow-gpu改为2.4.1,keras自动为2.4.0,然后在node01上的单机训练也成功了!!!!

下一步,进行两台机器上的训练。

5.3 node01上的找不到包的问题

在两台机器上测试,发现两台机器运行后没有报错,但也无法训练下去,并且实时查看gpu调用情况发现未调用,定睛一看,node01仍然存在一个warning,真是命途多舛阿。
在这里插入图片描述
找不到libcusolver.so.10这个library,并且在报错提示中的/usr/local/cuda-11.5/extras/CUPTI/lib64路径下也未发现这个文件。但在上一级路径中有:
在这里插入图片描述
准备复制过去更改一下看是否可行。
实践证明,又出现了别的错误。很烦。。

2022-04-10 21:06:01.864047: E tensorflow/stream_executor/cuda/cuda_blas.cc:226] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED

5.4 解决上述问题

出现上述问题的主要原因是显存不够,我们需要设置自增长,而不是默认的全部占用。
参考这篇博客
运行成功!!!

再次去两台机器上运行测试一下!

5.5 两台机器测试

测试成功!!!但遗憾的是,分布式训练竟然比单机两端口模拟训练慢很多~
在这里插入图片描述查看两台机器GPU的占用情况,发现master几乎用满了,而node01因为设置了自增长而只使用了367mb资源,会不会是这个原因呢。

在master上也设置自增长发现master上也只占用了260+mb,应该是这个程序就只需要那些资源。可能是两台机器相比于一台机器有一个延迟问题?

这是一个很好的文档,好好研读一下
书名:《简明的tensorflow 2》

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值