前情概要:拥有多块GPU,需要跑多个模型测试baseline
所以需要同时跑多个训练代码,使用shell脚本和python的argparse库解析参数是最方便的。
1.argparse解析参数
现在看下可选参数的用法,所谓可选参数,也就是命令行参数是可选的
# -*- coding: utf-8 -*-
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--square", help="display a square of a given number", type=int)
parser.add_argument("--cubic", help="display a cubic of a given number", type=int)
args = parser.parse_args()
if args.square:
print args.square**2
if args.cubic:
print args.cubic**3
将上面的代码保存为文件 argparse_usage.py,在终端运行,结果如下:
$ python argparse_usage.py --h
usage: argparse_usage.py [-h] [--square SQUARE] [--cubic CUBIC]
optional arguments:
-h, --help show this help message and exit
--square SQUARE display a square of a given number
--cubic CUBIC display a cubic of a given number
$ python argparse_usage.py --square 8
64
$ python argparse_usage.py --cubic 8
512
$ python argparse_usage.py 8
usage: argparse_usage.py [-h] [--square SQUARE] [--cubic CUBIC]
argparse_usage.py: error: unrecognized arguments: 8
$ python argparse_usage.py # 没有输出
详情见:这个博客’
2.使用shell脚本实现多进程并发
如图示代码:每两个执行程序后面都带有一个&符号,表示挂在后台执行(同时执行),因为分别用到两块不同的GPU,wait表示等上述两个程序执行完毕才接着执行下述文件
使用
nohup sh *.sh > myout.file 2>&1 &
执行shell脚本
解释:
& 放在命令到结尾,表示后台运行,防止终端一直被某个进程占用,这样终端可以执行别到任务
nohup放在命令的开头,表示不挂起(no hang up),也即,关闭终端或者退出某个账号,进程也继续保持运行状态
0 表示stdin标准输入
1 表示stdout标准输出
2 表示stderr标准错误
2>&1 也就表示将错误重定向到标准输出上
所以该语句表示:即使关闭终端窗口,依然继续执行,并且将所有的输出都输入了一个myout.file的文件中
监控GPU运行状态
发现一直在跑
结束语
做到这里,大家就可以挂机跑去睡觉啦!等第二天起床,发现所有训练都跑完咯!