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.txt
和 cudnn.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占用资源太多不够用的情况呢?可能是版本对应的问题。
硬件版本对比 | master | node01 |
---|---|---|
nvidia驱动 | 495.44 | 510.47.03 |
cuda | 11.5 | 11.5 |
cudnn | 8.3.0 | 8.3.0 |
tensorflow | 2.4.1 | 2.6.2 |
keras | 2.4.0 | 2.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》