1、更換Tensorflow版本后,horovodrun有問題,說沒有安裝MPI或Gloo。
解決:按步驟全部重新安裝一遍。
理解:不知道Horovod到tensorflow有什么依賴關系。可能也和版本有關系,我嘗試了多遍。目前使用tensorflow 1.14.0版本/MPI 4.0.0版本安裝環境沒有問題。
2、當使用兩台機器進行GPU訓練時,報如下錯誤:
WARNING: Open MPI accepted a TCP connection from what appears to be a another Open MPI process but cannot find a corresponding process entry for that peer.
解決:使用ifconfig查找通信使用的網卡,我這里是eno1
然后給mpirun命令添加-mca btl_tcp_if_include eno1參數即能正常運行。
我的執行命令如下:
mpirun --allow-run-as-root -np 2 -H ubuntu90:1,sugon92:1 -bind-to none -map-by slot -mca plm_rsh_args "-p 31028" -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib -mca btl_tcp_if_include eno1 python tensorflow_mnist.py
因為我的環境是docker,監聽端口不是22,所以還額外加了-mca plm_rsh_args "-p 31028"參數以表示ssh連接使用31028端口。
當然你也可以嘗試下GitHub上Run Horovod with Open MPI文章Hangs due to non-routed network interfaces章節中提供方法。(雖然我沒試通。。。)
3、運行訓練腳本時提示Failed to find dynamic library: libnccl.so ( libnccl.so: cannot open shared object file: No such file or directory )等錯誤信息。
解決:NCCL2未正確安裝。
我在安裝NCCL2中執行apt update提示
E: The method driver /usr/lib/apt/methods/https could not be found.
N: Is the package apt-transport-https installed?
執行apt install apt-transport-https安裝apt-transport-https即能正確安裝。
安裝過程中,一定要注意提示信息,確保每步執行正確。由於安裝軟件時,都有依賴包,有些執行步驟不會自動安裝依賴包。
4、多機GPU訓練腳本提示:NCCL INFO NET/IB : Using interface ib0 for sideband communication
解決:這里表示的意思是使用ib0接口進行通信,這里的ib0指得是infiniband網卡,用於高性能計算的一種通信網卡。默認設置為NCCL默認設置infiniband進行通信,但如果雙機的infibiband不能通信,則會導致多機並行計算失敗。我們可以將NCCL使用的網卡設置為我們正常使用的以太網卡即能成功運行,給mpirun命令添加如下參數:
-x NCCL_SOCKET_IFNAME=eno1
5、多機GPU訓練腳本提示:NCCL INFO NET/Plugin : No plugin found (libnccl-net.so), using internal implementation
解決:我理解是能接入外部的網絡通信實現包,如果沒有使用內部實現。例如外部包AWS OFI NCCL。所以這個提示是不影響正常運行的。
6、運行某些腳本時,提示:failed to allocate 3.21G (3452305408 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY: out of memory
解決:提示明顯時是顯存申請失敗,使用nvidia-smi命令查看N卡的信息,關注固有顯存以及使用情況。
嘗試使用config = tf.ConfigProto()控制GPU的顯存使用。
config.gpu_options.allow_growth = True #設置成動態申請
config.gpu_options.per_process_gpu_memory_fraction = 0.3 #設置成最大使用多少比例的顯存
嘗試無效果的話,使用添加代碼os.environ["CUDA_VISIBLE_DEVICES"] = "1"來選擇哪個GPU,也許有的GPU顯存被占用,亦不能釋放。可以指定一個完全空閑的GPU進行訓練。
或者可以在執行命令前加CUDA_VISIBLE_DEVICES=1來指定GPU。但這種對多機情況不適用,其他機器不能同步該參數。當然也可以將這個寫進~/.bashrc中,便可以了。
當整個卡都無法滿足顯存需求時,可以修改batch_size以適當減少顯存需求。
7、多機GPU訓練腳本提示:misc/ibvwrap.cc:212 NCCL WARN Call to ibv_open_device failed。
解決:IB卡的infiniband設備未找到。當我們利用MPI在IB卡做通信時,可以使用兩種協議進行通信,一種是TCP,一種是infiniband協議(RDMA)。這里錯誤是指的是未找到infiniband協議設備,使用ibv_devices指令查看當前機器的IB卡設備。
因為我是在容器內使用的,所以在創建容器時,需要加上--cap-add=IPC_LOCK --device=/dev/infiniband參數,具體見問題19。
8、代碼錯誤提示:RuntimeError: Global step should be created to use StepCounterHook.
解決:使用global_step = tf.train.get_or_create_global_step()生成global_step。
9、代碼錯誤提示:RuntimeError: Run called even after should_stop requested.
解決:
10、使用docker容器,訓練代碼時,提示Read -1, expected 7329, errno = 1。
解決:官方文檔說明這是因為權限問題,但可以忽略,不影響訓練執行。
11、使用docker容器執行多機GPU訓練,提示:A process or daemon was unable to complete a TCP connection to another process: Local host: fe31b0df9223 Remote host: 0f5f1d90a597 This is usually caused by a firewall on the remote host. Please check that any firewall (e.g., iptables) has been disabled and try again.
解決:有可能時網卡問題,新建Docker容器時,默認時以Bridge的模式。指定為Host模式即可。
在docker run運行命令后面加上--network host參數。
12、多卡訓練時,出現如下錯誤:
tensorflow.python.framework.errors_impl.FailedPreconditionError: Mismatched ALLREDUCE CPU/GPU device selection: One rank specified device CPU, but another rank specified device GPU. [[node DistributedAdamOptimizer_Allreduce/HorovodAllreduce_gradients_dense_1_BiasAdd_grad_tuple_control_dependency_1_0 (defined at <string>:80) ]]
解決:卸載horovod,使用HOROVOD_GPU_ALLREDUCE=NCCL pip install --no-cache-dir horovod安裝。
13、多卡訓練時,出現如下錯誤:
NCCL INFO Call to connect returned Connection refused, retrying
解決:新建一個docker環境,重新搭整個環境。(我試過重新安裝cuda/cuDNN/NCCL等,但是沒有效果)。
14、多機訓練時,出現如下錯誤:
hvd1:60423:60555 [1] NCCL INFO NET/IB : No device found.
hvd1:60422:60554 [0] NCCL INFO NET/Socket : Using [0]ib0:192.168.1.200<0>
hvd1:60423:60555 [1] NCCL INFO NET/Socket : Using [0]ib0:192.168.1.200<0>
hvd:27943:28074 [1] NCCL INFO Setting affinity for GPU 1 to ff00ff00
hvd1:60422:60554 [0] NCCL INFO Setting affinity for GPU 0 to ff00ff
hvd1:60423:60555 [1] NCCL INFO Setting affinity for GPU 1 to ff00ff00
hvd1:60422:60554 [0] include/socket.h:397 NCCL WARN Connect to 192.168.1.50<49823> failed : No route to host
hvd1:60422:60554 [0] NCCL INFO bootstrap.cc:95 -> 2
hvd1:60422:60554 [0] NCCL INFO bootstrap.cc:308 -> 2
hvd1:60422:60554 [0] NCCL INFO init.cc:443 -> 2
hvd1:60422:60554 [0] NCCL INFO init.cc:732 -> 2
hvd1:60422:60554 [0] NCCL INFO init.cc:771 -> 2
hvd1:60422:60554 [0] NCCL INFO init.cc:782 -> 2
解決:添加mpirun運行指令-x NCCL_SOCKET_IFNAME=eno1參數,由於我們IB卡沒有通,這里告訴NCCL指定eno1進行通信。如果你的IB卡的RDMA通信正常,NCCL會默認使用infiniband協議進行通信。
15、安裝CUDA時, 出錯:gpgkeys: protocol https’ not supported
解決:apt install gnupg-curl。
16、如安裝CUDA后,使用nvcc命令顯示:nvcc: command not found
解決:配置CUDA環境變量。
export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH
export PATH=$PATH:/usr/local/cuda/bin
17、多機訓練時,出錯:Unable to load libnccl-net.so : libnccl-net.so: cannot open shared object file: No such file or directory
解決:提示其實不影響訓練進行,NCCL可提供給第三方開發庫,但不是必須。如沒有這個庫,會自動選擇內部實現進行通信。詳細情況見Issues 162
18、docker容器下,Pytorch多卡訓練報錯:ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).
解決:新建容器時,添加--ipc=host參數。
19、docker容器下,欲使用IB卡的RMDA,出錯:
A process failed to create a queue pair. This usually means either the device has run out of queue pairs (too many connections) or there are insufficient resources available to allocate a queue pair (out of memory). The latter can happen if either 1) insufficient memory is available, or 2) no more physical memory can be registered with the device. For more information on memory registration see the Open MPI FAQs at: http://www.open-mpi.org/faq/?category=openfabrics#ib-locked-pages Local host: laser045 Local device: qib0 Queue pair type: Reliable connected (RC)
解決:首先做分布式GPU訓練,推薦使用nvidia-docker,這個命令起始就是基於英偉達的顯卡配置信息上給原裝的docker添加了一些配置參數。
解決本問題在於新建容器時命令如下:nvidia-docker run -it --network=host -v /mnt/share/ssh:/root/.ssh --cap-add=IPC_LOCK --device=/dev/infiniband horovod:latest。
關鍵參數為:--cap-add=IPC_LOCK --device=/dev/infiniband,表示關聯主機上的IB卡設備。
20、RuntimeError: Global step should be created to use StepCounterHook.
解決:使用global_step = tf.train.get_or_create_global_step()生成Global_step。
21、RuntimeError: Run called even after should_stop requested.。
解決:
05 | 解決方案
1、多機GPU運行
答:將SSH連接設置成無需密碼就能訪問的模式即可。
同時注意可以在/ect/hosts文件中添加主機名和IP地址的映射關系。
參考 SSH login without password
2、非22端口ssh連接運行
答:不能直接使用horovodrun命令,需要使用mpirun添加相關端口參數。
參考 Run Horovod with Open MPI文章中的Custom SSH ports章節。
只能找到統一端口的配置方式,未找到不同機不同監聽端口配置方式。
06 | 其他
CUDA/MPI等環境變量參考
PATH
/usr/local/mpi/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/tensorrt/bin
LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/compat/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/usr/local/lib/tensorflow
————————————————
版權聲明:本文為CSDN博主「ME_Seraph」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/pengshuyes/article/details/102906347