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