2023-09-06-【记录】在-Slurm-平台的GPU集群上使用-Pytorch.md 11 KB


title: 【记录】在 Slurm 平台的GPU集群上使用 Pytorch urlname: -ji-lu--zai--Slurm--ping-tai-de-GPU-ji-qun-shang-shi-yong--Pytorch date: 2023-09-06 20:24:43 index_img: https://api.limour.top/randomImg?d=2023-09-06 20:24:43

tags: ['slurm', 'nvidia', 'torch']

{% note info %} 更新:不用编译了,直接装最新版就行,cuda 是可以兼容低版本驱动的,cuda-compat 似乎可以不装。之前运行检测失败是因为 HPC 上的环境变量没有指定驱动的 bin 和 lib 的路径。 {% endnote %} 先说结论,没有 root 权限的 HPC,千万不要想着用最新版本的 pytorch。自己编译也不行,因为已经不支持 cuda11.7 以下的版本了,而没有 root 权限,既改不了驱动,也装不了 cuda-compat,不要折腾了。

更换 conda

  • 安装 conda

    # 千万不要用系统提供的 conda
    # 一定要自己重新 init 一个
    # 因为除了自己的 home 目录会正确映射到集群的节点上
    # 其他的目录很可能不正确
    source ~/.bashrc
    conda clean --all
    conda install -y nano
    

    更换编译器

    #!/bin/bash
    
    ### 设置该作业的作业名
    #SBATCH --job-name=install-nvidia-gxx
    
    ### 指定该作业需要1个节点数
    #SBATCH --nodes=1
    
    ### 每个节点所运行的进程数为1
    #SBATCH --ntasks-per-node=1
    
    ### 程序的执行命令
    source ~/.bashrc
    ## https://gist.github.com/ax3l/9489132 查看对应 nvcc 支持的 g++ 版本
    conda create -y -n gcc -c conda-forge gcc=9.5.0
    source activate gcc
    conda install -c conda-forge gxx=9.5.0
    gcc -v
    g++ -v
    
    source ~/.bashrc
    conda run -n gcc whereis gcc
    # ~/miniconda3/envs/gcc/bin/gcc
    conda run -n gcc whereis g++
    # ~/miniconda3/envs/gcc/bin/g++
    

检测驱动版本

#!/bin/bash

### 设置该作业的作业名
#SBATCH --job-name=test-nvidia

### 指定该作业的运行分区,sinfo 获取分区列表
#SBATCH --partition=body

### 指定申请的节点
#SBATCH --nodelist=gpu4

### 排除指定的节点;
#SBATCH --exclude=gpu1

### 指定该作业需要1个节点数
#SBATCH --nodes=1

### 该作业需要1个CPU
#SBATCH --ntasks=1

### 申请1块GPU卡
#SBATCH --gres=gpu:1

### 作业最大的运行时间,超过时间后作业资源会被SLURM回收
#SBATCH --time=0:05:00

### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
#SBATCH --comment public_cluster

### 程序的执行命令
source ~/.bashrc
lspci | grep VGA
### modinfo nvidia
cat /proc/driver/nvidia/version 
### /opt/app/cuda/11.2/extras/demo_suite/bandwidthTest

安装 pytorch

方式一 conda

新版本

#!/bin/bash

### 设置该作业的作业名
#SBATCH --job-name=install-nvidia

### 指定该作业的运行分区,sinfo 获取分区列表
#SBATCH --partition=body

### 指定申请的节点
#SBATCH --nodelist=gpu4

### 排除指定的节点;
#SBATCH --exclude=gpu1

### 指定该作业需要1个节点数
#SBATCH --nodes=1

### 该作业需要1个CPU
#SBATCH --ntasks=1

### 申请1块GPU卡
#SBATCH --gres=gpu:1

### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
#SBATCH --comment public_cluster

### 程序的执行命令
source ~/.bashrc
source activate gcc
conda create -y -n gpu pytorch-cuda=11.8 -c pytorch -c nvidia
conda install -y -n gpu pytorch -c pytorch -c nvidia
conda install -y -n gpu torchvision torchaudio -c pytorch -c nvidia

旧版本

#!/bin/bash

### 设置该作业的作业名
#SBATCH --job-name=install-nvidia

### 指定该作业的运行分区,sinfo 获取分区列表
#SBATCH --partition=body

### 指定申请的节点
#SBATCH --nodelist=gpu4

### 排除指定的节点;
#SBATCH --exclude=gpu1

### 指定该作业需要1个节点数
#SBATCH --nodes=1

### 该作业需要1个CPU
#SBATCH --ntasks=1

### 申请1块GPU卡
#SBATCH --gres=gpu:1

### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
#SBATCH --comment public_cluster

### 程序的执行命令
source ~/.bashrc
source activate gcc
conda create -y -n gpu python=3.9 pytorch=1.10.2=py3.9_cuda11.1_cudnn8.0.5_0 torchvision=*=py39_cu111 torchaudio=*=py39_cu111 cudatoolkit=11.1 -c pytorch

方式二 编译安装

折腾了几天,发现 cuda11.2 不支持高于 10.0 的 gcc,而低版本的 gcc 在 ninja 上会报错,以后再折腾吧。

获取源码

source ~/.bashrc
# wget cuda -O -| tar -xf -
# wget cudnn -O -| tar -xf -
git clone --depth=1 --recursive https://github.com/pytorch/pytorch

对于子模块,可以先不要在git clone的时候加上--recursive,等主体部分下载完之后,该文件夹中有个隐藏文件称为:.gitmodules,把子项目中的url地址同样加上.cnpmjs.org后缀,然后利用git submodule sync更新子项目对应的url,最后再git submodule update --init --recursive,即可正常网速clone完所有子项目

如果集群无法访问 GitHub,可以先获取源码后,tar -zcPf /root/tmp/pytorch.tar.gz pytorch 打包,上传到集群tar -zxf pytorch.tar.gz 解包。

#!/bin/bash

### 设置该作业的作业名
#SBATCH --job-name=ungzip-nvidia

### 指定该作业需要1个节点数
#SBATCH --nodes=1

### 每个节点所运行的进程数为1
#SBATCH --ntasks-per-node=1

### 程序的执行命令
source ~/.bashrc
cd ~
tar -zxf pytorch.tar.gz

进行编译

#!/bin/bash

### 设置该作业的作业名
#SBATCH --job-name=install-nvidia

### 指定该作业的运行分区,sinfo 获取分区列表
#SBATCH --partition=body

### 指定申请的节点
#SBATCH --nodelist=gpu4

### 排除指定的节点;
#SBATCH --exclude=gpu1

### 指定该作业需要1个节点数
#SBATCH --nodes=1

### 该作业需要4个CPU
#SBATCH --ntasks=4

### 申请1块GPU卡
#SBATCH --gres=gpu:1

### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
#SBATCH --comment public_cluster

### 程序的执行命令
source ~/.bashrc
conda create -y -n gpu python=3.10 -c conda-forge
source activate gpu
conda install mkl mkl-include -c conda-forge
conda install cmake -c conda-forge
conda install ninja=1.11.1 -c conda-forge ## 确保是最新版本,不然报错
cd ~/pytorch/
pip install -r requirements.txt
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
export USE_CUDA=1
export USE_CUDNN=1
CUDNN_HOME=~/cuda/cudnn-linux-x86_64-8.9.4.25_cuda11-archive
export CUDNN_LIB_DIR=$CUDNN_HOME/lib
export CUDNN_INCLUDE_DIR=$CUDNN_HOME/include
export CUDNN_LIBRARY=$CUDNN_HOME/lib/libcudnn.so
export CUDNN_LIBRARY_PATH=$CUDNN_LIBRARY
export CUDA_HOME=/opt/app/cuda/11.2
export CMAKE_CUDA_COMPILER=$CUDA_HOME/bin/nvcc
export CMAKE_CUDA_ARCHITECTURES="60;70;75;80"
export TORCH_CUDA_ARCH_LIST="6.0;7.0;7.5;8.0"
GCC_HOME=~/miniconda3/envs/gcc
export CUDAHOSTCXX=$GCC_HOME/bin/g++
export CC=$GCC_HOME/bin/gcc
export CXX=$GCC_HOME/bin/g++
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$CUDA_HOME/extras/CUPTI/lib64:$CUDNN_LIB_DIR:$LD_LIBRARY_PATH
rm -rf build
python setup.py develop -allow-unsupported-compiler

检测 pytorch

source ~/.bashrc
conda run -n gpu whereis python
## /home/uxxx/miniconda3/envs/gpu/bin/python
nano test.py && chmod +x test.py
#!/home/uxxx/miniconda3/envs/gpu/bin/python

# 检测CUDA是否安装正确并能被Pytorch检测
import torch # 如果pytorch安装成功即可导入
print(torch.cuda.is_available()) # 查看CUDA是否可用
print(torch.cuda.device_count()) # 查看可用的CUDA数量
print(torch.version.cuda) # 查看CUDA的版本号

# 检测能否调用CUDA加速
a = torch.Tensor(5,3)
a = a.cuda()
print(a)
#!/bin/bash

### 设置该作业的作业名
#SBATCH --job-name=test-nvidia

### 指定该作业的运行分区,sinfo 获取分区列表
#SBATCH --partition=body

### 指定申请的节点
#SBATCH --nodelist=gpu4

### 排除指定的节点;
#SBATCH --exclude=gpu1

### 指定该作业需要1个节点数
#SBATCH --nodes=1

### 该作业需要1个CPU
#SBATCH --ntasks=1

### 申请1块GPU卡
#SBATCH --gres=gpu:1

### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
#SBATCH --comment public_cluster

### 程序的执行命令
source ~/.bashrc
source activate gpu
cd ~
GCC_HOME=~/miniconda3/envs/gcc
export CC=$GCC_HOME/bin/gcc
export CXX=$GCC_HOME/bin/g++
DRIVER_HOME=/opt/app/nvidia/460.91.03
export PATH=$DRIVER_HOME/bin:$PATH # 重要
export LD_LIBRARY_PATH=$DRIVER_HOME/lib:$LD_LIBRARY_PATH # 重要

python ./test.py

附加: 安装 ComfyUI

安装 xformers

#!/bin/bash

### 设置该作业的作业名
#SBATCH --job-name=install-nvidia-xformers

### 指定该作业的运行分区,sinfo 获取分区列表
#SBATCH --partition=body

### 指定申请的节点
#SBATCH --nodelist=gpu4

### 排除指定的节点;
#SBATCH --exclude=gpu1

### 指定该作业需要1个节点数
#SBATCH --nodes=1

### 该作业需要1个CPU
#SBATCH --ntasks=1

### 申请1块GPU卡
#SBATCH --gres=gpu:1

### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
#SBATCH --comment public_cluster

### 程序的执行命令
source ~/.bashrc
source activate gpu
cd ~
GCC_HOME=~/miniconda3/envs/gcc
export CC=$GCC_HOME/bin/gcc
export CXX=$GCC_HOME/bin/g++
DRIVER_HOME=/opt/app/nvidia/460.91.03
export PATH=$DRIVER_HOME/bin:$PATH # 重要
export LD_LIBRARY_PATH=$DRIVER_HOME/lib:$LD_LIBRARY_PATH # 重要

wget https://github.com/comfyanonymous/ComfyUI/archive/refs/heads/master.zip -O comfyUI.zip
unzip comfyUI.zip 
cd ComfyUI-master
pip install xformers
pip install -r requirements.txt

启动 comfyUI

  • 安装内网穿透

    #!/bin/bash
    
    ### 设置该作业的作业名
    #SBATCH --job-name=run-nvidia
    
    ### 指定该作业的运行分区,sinfo 获取分区列表
    #SBATCH --partition=body
    
    ### 指定申请的节点
    #SBATCH --nodelist=gpu4
    
    ### 排除指定的节点;
    #SBATCH --exclude=gpu1
    
    ### 指定该作业需要1个节点数
    #SBATCH --nodes=1
    
    ### 该作业需要4个CPU
    #SBATCH --ntasks=4
    
    ### 申请1块GPU卡
    #SBATCH --gres=gpu:1
    
    ### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
    #SBATCH --comment public_cluster
    
    ### 程序的执行命令
    source ~/.bashrc
    source activate gpu
    cd ~
    GCC_HOME=~/miniconda3/envs/gcc
    export CC=$GCC_HOME/bin/gcc
    export CXX=$GCC_HOME/bin/g++
    DRIVER_HOME=/opt/app/nvidia/460.91.03
    export PATH=$DRIVER_HOME/bin:$PATH # 重要
    export LD_LIBRARY_PATH=$DRIVER_HOME/lib:$LD_LIBRARY_PATH # 重要
    
    ~/github/npc -server=<ip>:8024 -vkey=<vkey> -type=tcp > ~/log/npc.log 2>&1 &
    
    cd ~/ComfyUI-master
    ## 更多参数在 comfy/cli_args.py 中
    echo 'running ComfyUI'
    python main.py --listen 0.0.0.0 --port 10239 > ~/log/comfyui.log 2>&1