在写深度学习程序的时候,有时候变量太多或者需要自定义一些变量的时候我们一般讲运行命令写在shell脚本里,命名为train.sh
等
下面介绍了shell的基本命令和mmlab等中经常使用的shell操作
Shell运行
下面写一个简单的shell程序
#!/bin/bash
echo "Hello World !"
使用./train.sh
来运行上述脚本,此程序的#!
这句放在第一行告诉终端用什么解释器来运行shell脚本,一般我们都用bash
就可以了,最终终端会输出"Hello World !"
如果./train.sh无法运行,可能是权限不够,在执行命令之前输入chmod +x train.sh即可
Shell变量
定义变量
知道怎么运行shell脚本之后,我们下面来定义shell中的变量,像其他编程语言一样,我们直接对变量赋值即可,如下
your_name="harry"
变量命名有一些基本的规则
- 不能以数字开头
- 不能使用标点符号
- 变量和
=
中间不能有空格 - 变量名中间不能有空格,但可以有下划线
_
变量的使用需要加$
符号,例如
your_name="harry"
echo $your_name
echo ${your_name}
其中花括号{}
是可选地,但是为了书写规范和避免出现不必要的错误,例如${your_name}aaa
,这里如果不加括号,变量名就会被误认为your_nameaaa
,所以我们默认加上花括号即可
只读变量
只读变量一旦定义就不可被修改
your_name="harry"
readonly your_name
删除变量
your_name="harry"
unset your_name
Shell字符串
同其他编程语言相同,字符串也有单引号和双引号,但二者有所区别
单引号:单引号的所有内容均会原样输出,即单引号不能加变量和转义字符
双引号:双引号可以加变量和转义字符
# 使用单引号
your_name="harry"
str='Hello, I know you are \"$your_name\"! \n'
# output
# Hello, I know you are \"$your_name\"! \n
# 使用双引号
your_name="harry"
str="Hello, I know you are \"$your_name\"! \n"
# output
# Hello, I know you are "harry"! \n
拼接字符串
可以用单引号''
和双引号""
拼接字符串
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
# output
# hello, harry !
# hello, ${your_name} !
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
# output
# hello, harry !
# hello, harry !
Shell传递参数
下面向Shell中传递三个参数1,2,3
#!/bin/bash
echo "第零个参数:$0";
echo "第一个参数:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
我们在命令行输入./train.sh 1 2 3
,输出结果如下
第零个参数:./train.sh
第一个参数:1
第二个参数为:2
第三个参数为:3
一般来说第0个参数不算参数,参数总量从1算起,123一共三个参数
一些特殊参数
参数 | 说明 |
---|---|
$# | 传递的参数个数 |
常用深度学习参数
mmediting的shell脚本
#!/usr/bin/env bash
CONFIG=$1
GPUS=$2
PORT=${PORT:-29500}
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \
torchrun --nproc_per_node=$GPUS --master_port=$PORT \
$(dirname "$0")/train.py $CONFIG --launcher pytorch ${@:3}
运行时执行CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 ./tools/dist_train.sh configs/file_data.py 8
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
: 环境变量,不算在参数内./tools/dist_train.sh
: 运行的脚本configs/file_data.py
: 第一个参数,配置文件8
: 第二个参数,代表GPU的数量
接下来我们看一下dist_train.sh
里面的内容
CONFIG=$1
: 配置文件变量,等于传入参数的configs/file_data.py
GPUS=$2
: GPU的数量,等于第二个传入参数8
PORT=${PORT:-29500}
: 一种定义变量的方法,如果命令行不设置PORT的值,就是29500,如果设置了按照设置的来,设置方法PORT=2131 ./tools/dist_train.sh
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH
: 给python添加环境变量$(dirname $0)
表示切换到train.sh所在目录,后面还有/..
的原因是脚本是在tools
文件夹下的,不是主目录。因此这句的意思是返回shell脚本所在目录的上一级目录,并将其加入到python环境中${@:3}
: 表示命令行中第三个及之后的参数,这里我们一共只有两个参数,所以他就是空