【深度学习】GPU使用教程

深度学习相关的代码大多数要使用 NVIDIA 显卡进行训练和预测,以提高训练速度和质量。Linux 服务器中如何管理 NVIDIA GPU 卡是一个必备的技能。下面介绍一下 GPU 使用的说明,帮助大家学会迅速使用NVIDIA显卡以及多卡的使用。

1. 创建虚拟环境

一般服务器的使用者较多,每个使用者所需要的环境不相同。如果大家都是用系统环境,很容易造成冲突,导致他人的代码不能正常运行或者导致系统内部的软件环境错误。所以,使用服务器首先需要创建自己的虚拟环境。

常用的软件有很多,例如Docker,Conda, pyenv和virtualenv。

1.1 Conda

如果需要的包要求不同版本的Python,你无需切换到不同的环境,因为conda同样是一个环境管理器。仅需要几条命令,你可以创建一个完全独立的环境来运行不同的Python版本,同时继续在你常规的环境中使用你常用的Python版本。conda使用起来方便快捷,同时如果服务器的资源也比较充足,非常适合使用conda。

下载并安装Anaconda

请参考:安装配置Anaconda

Conda使用cuda

conda install cudatoolkit

# 如果指定版本
#conda install cudatoolkit=8.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/

根据自己的需要安装更高的版本。

Conda创建自己的环境

conda create -n <your_env_name>

<your_env_name> 是自定义环境名。

Conda激活环境

conda activate <your_env_name>

Conda常用命令

# 帮助命令
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

2. NVIDIA多卡管理

在使用TensorFlow或者PyTorch等框架跑深度学习的时候,经常出现显存不足的情况,所以我们希望能够随时查看GPU时使用率。如果你是Nvidia的GPU,那么在命令行下,只需要一行命令就可以实现。

nvidia-smi
nvidia-smi -L

参数解释:

  • Fan:显示风扇转速,数值在0到100%之间,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是N/A;
  • Temp:显卡内部的温度,单位是摄氏度;
  • Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能;
  • Pwr:能耗表示;
  • Bus-Id:涉及GPU总线的相关信息;
  • Disp.A:是Display Active的意思,表示GPU的显示是否初始化;
  • Memory Usage:显存的使用率;
  • Volatile GPU-Util:浮动的GPU利用率;
  • Compute M:计算模式。

如果有多张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块。

设置CUDA_VISIBLE_DEVICES的方法:

  1. 通过bash脚本设置CUDA_VISIBLE_DEVICES:

    export CUDA_VISIBLE_DEVICES=0,1,2,3`
    
  2. 通过os.environ来设置CUDA_VISIBLE_DEVICES:

    import torch
    import os
    os.environ['CUDA_VISIBLE_DEVICES']='0,1,2'
    print(torch.cuda.device_count())
    

3. 安装Nvidia驱动/CUDA Toolkit

最好在安装完操作系统之后,直接使用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
    

4. Docker构建容器

使用Docker,用户不需要再去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突——而且通常不会需要消耗更多的硬件资源,不会明显降低性能。

如果程序基本调试成功,可以使用Docker来将程序打包。

docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

# or
nvidia-docker run --rm nvidia/cuda nvidia-smi

目前已经安装的Docker镜像有:

  • nvidia/cuda
  • pytorch/pytorch

5. pyenv+virtualenv轻量化管理python环境

除了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版本下不同环境的使用。

5.1 pyenv 的安装及使用

安装:

# 将 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

5.2 virtualenv 的安装及使用

通过Virtualenv是运行自己Python程序比较方便的方式:

# 安装
sudo pip install virtualenv

# 显示已有的虚拟环境
lsvirtualenv

# 创建自己的虚拟环境 (最好指定成Python3,否则默认是Python2)
mkvirtualenv -p /usr/bin/python3 your_env

# 进入自己的虚拟环境
workon your_env

# 复制一个虚拟环境
cpvirtualenv pytorch your_env

猜你喜欢

转载自blog.csdn.net/LogosTR_/article/details/126442619