【记录】在 Slurm 平台的GPU集群上使用 Pytorch

Last updated on March 19, 2024 pm

更新:不用编译了,直接装最新版就行,cuda 是可以兼容低版本驱动的,cuda-compat 似乎可以不装。之前运行检测失败是因为 HPC 上的环境变量没有指定驱动的 bin 和 lib 的路径。

先说结论,没有 root 权限的 HPC,千万不要想着用最新版本的 pytorch。自己编译也不行,因为已经不支持 cuda11.7 以下的版本了,而没有 root 权限,既改不了驱动,也装不了 cuda-compat,不要折腾了。

更换 conda

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

更换编译器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/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
1
2
3
4
5
source ~/.bashrc
conda run -n gcc whereis gcc
# ~/miniconda3/envs/gcc/bin/gcc
conda run -n gcc whereis g++
# ~/miniconda3/envs/gcc/bin/g++

检测驱动版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/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

新版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/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

旧版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/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 上会报错,以后再折腾吧。

获取源码

1
2
3
4
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 解包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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

进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/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

1
2
3
4
source ~/.bashrc
conda run -n gpu whereis python
## /home/uxxx/miniconda3/envs/gpu/bin/python
nano test.py && chmod +x test.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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

【记录】在 Slurm 平台的GPU集群上使用 Pytorch
https://hexo.limour.top/-ji-lu--zai--Slurm--ping-tai-de-GPU-ji-qun-shang-shi-yong--Pytorch
Author
Limour
Posted on
September 6, 2023
Updated on
March 19, 2024
Licensed under