一般的超算的拓扑结构是若干个登陆节点+若干个交换机+大量计算CPU节点+大量GPU计算节点+一个(或若干个)存储节点+管理节点。
其中存储节点的共享存储可以被所有节点访问。
一般运作方式是,如果我的计算依赖非常共性的软件,我可以找超算管理员安装,使用的时候可以通过module load来初始化自己所需软件。
我校瀚海20上已有共性软件如下:
Vasp和Gaussian是算力消耗的大头,但是超算用户覆盖几十个学院的几百个方向,不可能面面俱到,把所有人需要的软件都装在/opt 也是不现实的。
所以如果我的计算依赖的是比较小众的软件,那么我可以把软件安装在共享存储上,在程序运行的时候可以访问共享存储调用相关文件运行。
这里就会出问题了,安装软件的时候我是在登陆节点访问存储节点,一般来说登陆节点无需强算力没有GPU,但是软件在安装过程中会通过获取当前设备的硬件信息来来决定安装版本,比如PyTorch,在运行
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch
官方安装命令的时候,如果本机没有英伟达GPU,则会默认安装CPU-only版本的pytorch。
在官方repo下也有一个issue是请求安装cuda版本但是只装上了CPU-only版本
虽然这个issue的状态已经是'closed',但是我仍然遇到了类似的问题:
猜测是安装过程中通过硬件来决定版本,而且在安装命令中无法强制声明安装cuda版本的pytorch而非CPU-only版本。
思来想去,想出一个办法,重新开个新的env,提交一个“计算”任务,申请一个cpu线程,一张显卡,来运行安装程序。
以下是slurm提交“算例”的脚本:
#!/bin/sh
# script for software install
#SBATCH -J torch_install
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
#SBATCH -N 1 --ntasks-per-node=1 -p GPU-V100 --gres=gpu:v100:1
echo Time is `date`
echo Directory is $PWD
echo This job runs on the following nodes:
echo $SLURM_JOB_NODELIST
echo This job has allocated $SLURM_JOB_CPUS_PER_NODE cpu cores.
source /home/ess/pjzhang/conda_start.sh
conda create --name torch15gpu
conda activate torch15gpu
# activate the enviroment
module load cuda/10.2.89
# load cuda env
conda install pytorch==1.5.0 cudatoolkit=10.2 -c pytorch
# install GPU-based dependency
echo End at `date`
# for the measure of the running time of the
安装花不了多长时间,而且只用一核,所以机时费可以忽略不计 (四舍五入不要钱)。
这样conda install pytorch的时候就可以检测到GPU就可以安装正常版本了。
然后就可以运行真正的算例了,提交之后随便找个节点login进去看看状态:
还行,跑上了。
能自己搞定的事儿就不麻烦管理员了。
=========
其他创作的分类整理:
参考