深度学习相关的代码大多数要使用 NVIDIA 显卡进行训练和预测,以提高训练速度和质量。Linux 服务器中如何管理 NVIDIA GPU 卡是一个必备的技能。下面介绍一下 GPU 使用的说明,帮助大家学会迅速使用NVIDIA显卡以及多卡的使用。
一般服务器的使用者较多,每个使用者所需要的环境不相同。如果大家都是用系统环境,很容易造成冲突,导致他人的代码不能正常运行或者导致系统内部的软件环境错误。所以,使用服务器首先需要创建自己的虚拟环境。
常用的软件有很多,例如Docker,Conda, pyenv和virtualenv。
如果需要的包要求不同版本的Python,你无需切换到不同的环境,因为conda同样是一个环境管理器。仅需要几条命令,你可以创建一个完全独立的环境来运行不同的Python版本,同时继续在你常规的环境中使用你常用的Python版本。conda使用起来方便快捷,同时如果服务器的资源也比较充足,非常适合使用conda。
请参考:安装配置Anaconda
conda install cudatoolkit
# 如果指定版本
#conda install cudatoolkit=8.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/
根据自己的需要安装更高的版本。
conda create -n <your_env_name>
是自定义环境名。
conda activate <your_env_name>
# 帮助命令
conda -h
conda help
# 配置频道(已有)
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/pkgs/main/
# 退出当前环境
conda deactivate
# 查看基本信息
conda info
conda info -h
# 查看当前存在环境
conda env list
conda info --envs
# 删除环境
conda remove -n yourname --all
在使用TensorFlow或者PyTorch等框架跑深度学习的时候,经常出现显存不足的情况,所以我们希望能够随时查看GPU时使用率。如果你是Nvidia的GPU,那么在命令行下,只需要一行命令就可以实现。
nvidia-smi
nvidia-smi -L
参数解释:
如果有多张NVIDIA卡,使用时可以任意选择使用哪个卡进行训练。选择特定的GPU运行程序可在程序运行命令前使用:CUDA_VISIBLE_DEVICES=0命令。0为服务器中的GPU编号,可以为0, 1, 2, 3等,表明对程序可见的GPU编号。
CUDA_VISIBLE_DEVICES=1 # 只有编号为1的GPU对程序是可见的,在代码中gpu[0]指的就是这块GPU。
CUDA_VISIBLE_DEVICES=0,2,3 # 只有编号为0,2,3的GPU对程序是可见的,在代码中gpu[0]指的是第0块,gpu[1]指的是第2块,gpu[2]指的是第3块。
CUDA_VISIBLE_DEVICES=2,0,3 # 只有编号为0,2,3的GPU对程序是可见的,但是在代码中gpu[0]指的是第2块,gpu[1]指的是第0块,gpu[2]指的是第3块。
通过bash脚本设置CUDA_VISIBLE_DEVICES:
export CUDA_VISIBLE_DEVICES=0,1,2,3`
通过os.environ来设置CUDA_VISIBLE_DEVICES:
import torch
import os
os.environ['CUDA_VISIBLE_DEVICES']='0,1,2'
print(torch.cuda.device_count())
最好在安装完操作系统之后,直接使用CUDA Toolkit安装统一安装驱动和CUDA Toolkit。
到Nvidia官网下载CUDA Toolkit,根据需要Toolkit的版本,下载安装文件。例如对于CUDA Toolkit 11.6,下载地址为:https://developer.nvidia.com/cuda-11-6-0-download-archive。
选择操作系统(Linux),CPU架构(x86_64),操作系统(Ubuntu),操作系统版本(20.04),安装类型(runfile,localfile);
下载文件
# 下载并使用 axel并行下载工具
sudo apt install axel
axel -n 5 https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run
查看已有的nvidia驱动
dpkg -l | grep -i nvidia
卸载驱动
sudo apt-get purge nvidia-driver-xxx
搜索并安装的驱动
apt-cache search nvidia | grep 460
sudo apt-get install nvidia-driver-460
使用Docker,用户不需要再去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突——而且通常不会需要消耗更多的硬件资源,不会明显降低性能。
如果程序基本调试成功,可以使用Docker来将程序打包。
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
# or
nvidia-docker run --rm nvidia/cuda nvidia-smi
目前已经安装的Docker镜像有:
除了docker和conda两个之外,对于一些简单的或者设备算力不高的情况,可以选择pyenv+virtualenv的组合,轻量化管理python环境。毕竟一个anaconda的安装包轻松就上十几个G,安装后的占用的资源也很多。
pyenv 是一个开源的 Python 版本管理工具,可以轻松地给系统安装任意 Python 版本,想玩哪个版本,瞬间就可以切换。有了 pyenv,我们不需要再为系统多版本 Python 共存问题而发愁,也不用为手动编译安装其他 Python 版本而浪费时间,只需要执行一条简单的命令就可以切换并使用任何其他版本,该工具真正地做到了开箱即用,简单实用。
virtualenv 是一个用来创建完全隔离的 Python 虚拟环境的工具,可以为每个项目工程创建一套独立的 Python 环境,从而可以解决不同工程对 Python 包,或者版本的依赖问题。假如有 A 和 B 两个工程,A 工程代码要跑起来需要 requests 1.18.4,而 B 工程跑起来需要 requests 2.18.4,这样在一个系统中就无法满足两个工程同时运行问题了。最好的解决办法是用 virtualenv 给每个工程创建一个完全隔离的 Python 虚拟环境,给每个虚拟环境安装相应版本的包,让程序使用对应的虚拟环境运行即可。这样既不影响系统 Python 环境,也能保证任何版本的 Python 程序可以在同一系统中运行。
最佳实践:使用 pyenv 安装任何版本的 Python,然后用 virtualenv 创建虚拟环境时指定需要的 Python 版本路径。简单来说,pyenv控制Python版本,virtualenv控制同Python版本下不同环境的使用。
安装:
# 将 pyenv 安装到 ~/.pyenv 目录(当然你可以安装到任意其他路径)
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
# 配置环境变量(zsh和bash,分别添加到~/.zshrc和 ~/.bashrc中)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
#添加 pyenv 初始化
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
#使当前 Shell 配置生效,完成安装
exec $SHELL
source ~/.zshrc
使用:
# 查看有哪些 Python 版本可以安装
pyenv install --list
# 安装某个 Python 版本
pyenv install -v 3.6.4
# 查看当前 Python 版本情况(* 表示系统当前的 Python 版本,system表示系统初始版本)
$ pyenv versions
system
2.6.7
* 3.6.4 (set by /Users/haohao/.pyenv/version)
# 切换 Python 版本(切换之后查看当前版本)
$ pyenv global 3.6.4
$ pyenv versions
system
* 3.6.4 (set by /Users/haohao/.pyenv/version)
$ python -V
Python 3.6.4
# 卸载某个 Python 版本
pyenv uninstall 3.6.4
通过Virtualenv是运行自己Python程序比较方便的方式:
# 安装
sudo pip install virtualenv
# 显示已有的虚拟环境
lsvirtualenv
# 创建自己的虚拟环境 (最好指定成Python3,否则默认是Python2)
mkvirtualenv -p /usr/bin/python3 your_env
# 进入自己的虚拟环境
workon your_env
# 复制一个虚拟环境
cpvirtualenv pytorch your_env