深度学习:服务器操作常见问题及解决方案

543 阅读3分钟

深度学习:服务器操作常见问题及解决方案

作者:光火

邮箱:victor_b_zhang@163.com

深度学习任务普遍需要显卡支持,因此相关领域的研究者经常会在服务器端开展工作。这时,除了代码潜藏的 Bugserver 操作过程中的各种问题也会带来极大困扰。考虑到这些问题相当繁杂且颇为常见,本文对此进行了汇总并提供相应的解决方案。文章不定期更新,建议追踪。

Driver/library version mismatch

  • 问题描述:命令行输入 nvidia-smi 后,出现如下报错信息,并且所有使用 GPU 的程序均无法正常运行
    Failed to initialize NVML: Driver/library version mismatch
    
  • 解决方案:一般是由于系统驱动自动升级,导致驱动版本与内核版本不一致引起的
    • 首先在终端输入如下命令

      cat /var/log/dpkg.log | grep nvidia
      

      如图,系统驱动已经自 525.89.02 更新为 525.105.17

      image.png

      随后通过下述命令,查看显卡驱动的内核版本

      cat /proc/driver/nvidia/version
      

      倘若显卡驱动仍为旧版本,则考虑重启服务器。在终端输入

      sudo reboot
      

      服务器重启后会重新加载内核,此时再输入 nvidia-smi 即可正常查看显卡使用状况并运行程序了。倘若问题仍未解决,可以参考这篇文章

ImportError: ... version GLIBCXX_3.4.29 not found

  • 问题描述:程序运行失败,并出现如下报错

    ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.29 not found
    
  • 解决方案:该报错说明默认路径下的 libstdc++.so.6 缺少 GLIBCXX_3.4.29,详细的解决方案可以参考这篇文章,这里做简要总结

    • 首先在终端输入如下命令,查看当前拥有的全部 GLIBCXX 版本

      strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
      

      倘若确实缺少对应的版本号(如本例中的 GLIBCXX_3.4.29),则继续查看当前系统的其他同类型文件,并找到一个相对较高的版本

      sudo find / -name "libstdc++.so.6*"
      

      选择该高版本路径,利用之前的指令查看 GLIBCXX

      strings 找到的高版本 GLIBCXX 路径 | grep GLIBCXX
      
      例如:
      strings /home/datamining/miniconda3/envs/target/lib/libstdc++.so.6.0.30 | grep GLIBCXX
      

      如若其中包含需要的版本,则复制到指定目录并建立新的链接

      # 复制
      # cp 搜索到的路径 
      cp /home/datamining/miniconda3/envs/target/lib/libstdc++.so.6.0.30 /lib/x86_64-linux-gnu/
      
      # 删除之前的链接
      sudo rm /lib/x86_64-linux-gnu/libstdc++.so.6
      
      # 创建新的链接
      sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 /lib/x86_64-linux-gnu/libstdc++.so.6
      

(errno: 98 - Address already in use).

  • 问题描述: 在多卡机使用 DDP 训练模型,但程序运行后出现如下报错。(关于 DDP 的具体介绍可以参考这篇文章

    The server socket has failed to bind to ?UNKNOWN? (errno: 98 - Address already in use).
    
  • 解决方案DDP 选择的默认端口号为 29500,倘若该端口当前被其他程序占用,则会产生冲突,导致上述报错。此处提供两种解决方案

    • 方法一:通过 nvidia-smips aux|grep python 查询对应的进程,并利用 kill -9 PID 强制释放资源
    • 方法二:在 DDP 的启动命令中手动添加 --master_port=xxxxx 选项,避开已被占用的 29500 端口
      # before
      nohup torchrun --nproc_per_node=4 train.py > nohup.out &
      # after
      nohup torchrun --nproc_per_node=4 --master_port=25641 train.py > nohup.out &
      

Server VS Code 插件需要反复安装

  • 问题描述:多人使用 VS Code 操纵同一台服务器,发现扩展(Extensions)经常需要重复安装
  • 解决方案:所有操作者统一将 VS Code 更新至最新版本【左上角点击 Help(帮助) 后选择 Check for Updates(检查更新) 】

nohup 后程序随 VS Code 窗口关闭而终止

  • 问题描述:使用 nohup 命令让程序后台运行,但 VS Code 窗口关闭后,程序也随之自动终止
  • 解决方案:使用 nohup 命令挂载程序后,在终端输入 exit 后再关闭窗口

参考资料