文章目录
注:集群初始的base环境:torch1.8.1+cu111 python3.8.5
第一步:编写脚本文件(采用脚本提交模式提交作业)
1.1创建并编写脚本文件
脚本格式1 日期:2022.03.11
#!/bin/sh
#JSUB -q normal
#JSUB -m gpu02
#JSUB -n 2
#JSUB -e error.%J
#JSUB -o output.%J
#JSUB -J task1
source /hpcfiles/users/cc/.conda/envs/chenyun python
python main.py
其中source 后面的环境获取方式如下
方法1:
(py37torch190) [cc@master01 ~]$ conda info --envs
# conda environments:
#
base /apps/software/anaconda3
chenyun /hpcfiles/users/cc/.conda/envs/chenyun
py37th171 /hpcfiles/users/cc/.conda/envs/py37th171
py37torch190 * /hpcfiles/users/cc/.conda/envs/py37torch190
pytorch181 /hpcfiles/users/cc/.conda/envs/pytorch181
tf20 /hpcfiles/users/cc/.conda/envs/tf20
# 就是选择你要运行程序所使用的python解释器来自于哪个字环境,注意在显示的目录后面加上/bin,然后再空格接上python,如下所示:
/hpcfiles/users/cc/.conda/envs/py37torch190/bin python
方法2:
进入conda env list中列出的子环境,然后输入which python
(py37torch190) [cc@master01 HGANMDA-cc]$ which python
~/.conda/envs/py37torch190/bin/python
此时,source后面的内容就把最后一个/换成空格:
source ~/.conda/envs/py37torch190/bin/python
其中,~其实代表的是根目录,这里是/hpcfiles/users/cc,每个用户不同,可以cd ~查看一下你的用户根目录。
脚本格式2
#!/bin/sh
#JSUB -q normal
#JSUB -n 2
#JSUB -e error.%J
#JSUB -o output.%J
#JSUB -J task1
~/.conda/envs/py37torch190/bin/python main.py
# 其中python环境指定获取方式为,在激活的conda子环境下输入which python 来找
(py37torch190) [cc@master01 HGANMDA-cc]$ which python
~/.conda/envs/py37torch190/bin/python
此时
#这里 ~/.conda/envs/py37torch190/bin/python 即为绝对路径上的编译器
脚本格式3
#!/bin/sh
#JSUB -m gpu02
#JSUB -q normal
#JSUB -n 2
#JSUB -e ./result/error-wfy.%J
#JSUB -o ./result/output-wfy.%J
#JSUB -J wfy-head2
source /apps/software/anaconda3/bin/activate py37th111cuda
python main.py
这种方式source /apps/software/anaconda3/bin/activate
#这句话就是用来指定环境的,其中py37th111cuda就是我的conda子环境,因此只需要改动py37th111cuda子环境即可
1.2上述脚本文件内容解释
#!/bin/sh
#JSUB -q normal
#JSUB -n 2
#JSUB -e error.%J #可以重定位./result/error.%J
#JSUB -o output.%J #可以重定位
#JSUB -J task1
source /hpcfiles/users/cc/.conda/envs/py37torch190/bin python
python main.py
vim test1.sh
输入以下内容
#!/bin/sh
#JSUB -m gpu02 #指定使用哪一块GPU,可以提前去系统上看一下,哪一块还有显存算力
#JSUB -q normal #任务提交队列,默认即可,无需改动
#JSUB -n 2 #指定执行该任务的CPU数目 2-4个即可
#JSUB -e error.%J #错误信息输出到 error.%J 文件中,%J代表作业号
#JSUB -o output.%J #正确信息输出到 output.%J 文件中
#JSUB -J my_job #指定作业名字,方便辨识作业
source /apps/software/anaconda3/bin/activate pyth37 #用于指定运行作业的python环境,可使用conda info --envs命令来查看你的conda当中有哪些可以指定的环境
python src/main_pytorch.py --input data/gen_disease_idx_mul --schema mirna-disease-mirna,disease-mirna-disease >> train.log
** 注意,其中">> train.log"表示将训练过程中print的结果重定向到train.log文件当中,如果不写,控制台内容可以在error.作业号文件当中查看 ; python 文件名也可以写成./r 等其他执行命令脚本
**
1.3 到底用几个cpu核
经过测试,用1-2个核就可以了,核数多了并不能加快运算,只是占用设备…
测试实验2
作业306-unet-batchsize=2 cpu=1 时间:29mins
作用314-unet-batchsize=4 cpu=1 时间:24mins
作业315-unet-batchsize=4 cpu=3 时间:30mins
可得出结论cpu设计1-2即可,不影响运行,除非要占用空间!!
batchsize是有效的。
第二步:提交作业
jsub <脚本名.sh #提交当前指令所在路径下的脚本文件,
jsub <./test1.sh #将当前相对路径下的test1.sh的shell命令脚本提交到队列当中,运行脚本中的作业执行命令
第三步:查看作业完成状态
创建快捷方式-查询GPU
## 查询gpu
alias gpu01='jexec -m gpu01 nvidia-smi'
alias gpu02='jexec -m gpu02 nvidia-smi'
资源查看
jhosts #查看可用的cpu资源
jhosts attrib -l #查看所有资源包含cpu、内存、显卡等资源
jhosts attrib -l hostname #查看指定机器的资源情况,hostname是指定机器的名字,例如:gpu01
作业查看
jjobs ##不使用参数,显示目前正在排队或运行的作业
jjobs -a #显示最近完成的作业及正在运行或排队的作业
jjobs <作业号> # 例如,jjobs 110,显示100号指定作业的状态
jjobs -l 410 #显示指定作业的详细信息,后面的数字是作业的编号,你可以修改
jjobs -u all # 查看所有人的作业以及使用使用的资源数
终止作业
jctrl kill <作业号> #强制杀掉指定的作业
第四步:资源信息与资源指定
资源信息
命令行输入:jhosts attrib -l 后可以看到:
整个算力集群共2个GPU服务器:gpu01和gpu02,每台有32个cpu核心+两块特斯拉v100s-32GB,分别为cuda:0和cuda:1,每台的32个CPU用完就会锁住,因此一个作业用2个cpu核心就行,多了也只是占用,不会提升速度,除非任务量很大,也很着急,怕资源被占用,可以考虑用4个。
也可以查看单独一台gpu服务器的内存情况
如何在脚本中指定gpu服务器,在代码中指定cuda0或者cuda1
脚本指定gpu服务器
在脚本中添加这一句#JSUB -m gpu01,即指定gpu01服务器
#!/bin/sh
#JSUB -m gpu01
#JSUB -q normal
#JSUB -n 2
#JSUB -e ./result/error-wfy.%J
#JSUB -o ./result/output-wfy.%J
#JSUB -J wfy-head2
source /apps/software/anaconda3/bin/activate py37th111cuda
python main.py
代码中指定GPU卡:cuda:0还是cuda:1,及GPU0中的哪张卡
cuda()和to(device)这两个方法的作用是将模型中的参数和计算转移到指定的设备上,使得模型能够在指定的设备上进行计算。其中,model.to(device) 可以将模型的参数和计算转移到任何指定的设备上,而 model.cuda() 只能将模型的参数和计算转移到 GPU 上进行计算。
方法1-环境变量指定
#这句话放在train.py文件的开头即可设定程序可见的gpu
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
# 设置程序可见的gpu并按照所示顺序从0-n编号,打印device时只显示cuda,因为其他的不可见了
# 1说明指定cuda:1,一共两块显卡,另一块就是cuda:0,一台gpu01和gpu02分别有两块卡。
# 这是设置运算环境的代码
if torch.cuda.is_available():
context = torch.device('cuda')
print("driver type::",context)
else:
context = torch.device('cpu')
print("driver type:",context)
# 这是设置运算环境的代码简写
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
方法2-device指定
# 将构建的tensor或者模型放到指定设备上(GPU)
torch.device('cuda',0) #这里的0指的是设备的序号
torch.device('cuda:0')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 测试:
print('torch.cuda.is_available()',torch.cuda.is_available()) #输出:torch.cuda.is_available() True
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('device:',device) # 输出:device: cuda:0
常见错误记录
-
如果用官网conda安装pytorch出错,尝试用官网的pip安装
-
RuntimeError: CUDA error: out of memory
RuntimeError: CUDA error: out of memory. nvidia-persistenced failed to initialize. Check syslog for more details.
需修改代码中的cuda编号,切换GPU或者改小batch_size即可解决
os.environ[‘CUDA_VISIBLE_DEVICES’] = ‘1’
os.environ[‘CUDA_VISIBLE_DEVICES’] = ‘0’
或者
device = torch.device(“cuda:0” if torch.cuda.is_available() else “cpu”)
device = torch.device(“cuda:1” if torch.cuda.is_available() else “cpu”)
注意:
#添加GPU设备语句
os.environ[‘CUDA_VISIBLE_DEVICES’] = ‘1’
os.environ[‘KMP_DUPLICATE_LIB_OK’] = ‘TRUE’ #在代码开始之前,头文件导入后添加