shell脚本-语法

例子:

#!/usr/bin/env bash

set -x
NGPUS=$1
PY_ARGS=${@:2}


while true
do
    PORT=$(( ((RANDOM<<15)|RANDOM) % 49152 + 10000 ))
    status="$(nc -z 127.0.0.1 $PORT < /dev/null &>/dev/null; echo $?)"
    if [ "${status}" != "0" ]; then
        break;
    fi
done
echo $PORT

python -m torch.distributed.launch --nproc_per_node=${NGPUS} --rdzv_endpoint=localhost:${PORT} train.py --launcher pytorch ${PY_ARGS}
#!/usr/bin/env bash

用于指定shell解释器

set -x

用于开启调试模式,在执行脚本时打印出每个命令及其参数。当你在脚本中加入 set -x 命令时,它会从那一点开始打印出接下来执行的命令。

PY_ARGS=${@:2}

用于捕获传递给脚本的第三个及以后的参数,并将它们赋值给变量PY_ARGS。‌在shell脚本中,$@是一个特殊的变量,它包含了所有传递给脚本或函数的参数。:2是一个参数扩展,用于从中排除前两个参数。因此,该表示从第三个参数开始的所有参数。这些参数随后被赋值给变量PY_ARGS,以便在脚本中使用。

if ; then
    break;
fi

这是一个条件判断语句,如果满足某个条件,就执行break语句。break会立即退出当前正在执行的最内层循环。

PORT=$(( ((RANDOM<<15)|RANDOM) % 49152 + 10000 )) 

RANDOM:在shell脚本中,RANDOM是一个特殊的变量,用于生成一个随机数。这个随机数的范围是0到32767。
<<15:这是一个位运算操作,它将RANDOM的值左移15位。左移操作会使得数字的二进制表示中的某些位被丢弃,而其他位则向左移动,这通常用于扩大数字的范围。在这个例子中,左移15位后,RANDOM的取值范围将变得非常大,因为左移操作实际上是将数字的范围扩大了2152^{15}215倍。
|:这是一个按位或操作符,用于组合两个数字的二进制表示。在这个例子中,它用于将左移操作后的结果与RANDOM的原始值进行组合,以确保生成的随机数不会超出预期的范围。
% 49152:取模操作,用于确保生成的随机数在指定的范围内。在这个例子中,% 49152确保生成的随机数在10000到16383之间(包括10000和16383),这是一个常见的端口号范围。
+ 10000:这是一个加法操作,用于将生成的随机数调整到10000到16383的范围内。由于之前通过左移和取模操作已经确保了数字在某个范围内,这个加法操作进一步确保了数字在10000到16383之间。
综上所述,这个命令通过复杂的数学运算生成了一个在10000到16383之间的随机端口号,这个范围包括了大多数未被广泛使用的端口号,因此适合用于需要随机选择一个未被占用的端口号的场景‌1。

 $(nc -z 127.0.0.1 $PORT < /dev/null &>/dev/null; echo $?)

这是一个在shell中运行的脚本片段,其中包含一个nc命令和一个子shell进程。
nc(Netcat)是一个强大的网络调试工具,可以用来检查某个端口是否开放。-z参数告诉nc只做扫描,不进行实际的连接。127.0.0.1是本地主机地址,$PORT是你想要检查的端口号。< /dev/null是将标准输入重定向到/dev/null(即不输入任何内容),&>/dev/null则是将标准输出和标准错误都重定向到/dev/null(即不在控制台上显示任何输出)。
echo $?输出最后一次命令的退出状态。在nc命令之后,echo $?将输出nc命令执行后的退出状态码。如果端口是开放的,nc将成功执行并且退出状态码将是0;如果端口是关闭的,nc会失败并且退出状态码将是非0值。
这个脚本片段可以用于shell脚本中,以编程方式检查端口是否开放。

python -m torch.distributed.launch --nproc_per_node=${NGPUS} --rdzv_endpoint=localhost:${PORT} train.py --launcher pytorch ${PY_ARGS}

python -m torch.distributed.launch: 这是 PyTorch 提供的一个模块,用于启动分布式训练。-m 参数告诉 Python 运行库中的模块作为脚本执行。
–nproc_per_node= N G P U S : 这个参数指定了每个节点上要启动的进程数。 {NGPUS}: 这个参数指定了每个节点上要启动的进程数。 NGPUS:这个参数指定了每个节点上要启动的进程数。{NGPUS} 是一个环境变量,表示可用的 GPU 数量。这意味着如果你有多个 GPU,你可以在每个 GPU 上运行一个进程。
–rdzv_endpoint=localhost: P O R T : 这个参数指定了 r e n d e z v o u s (集合点)的端点。 r e n d e z v o u s 是分布式训练中所有进程在开始前需要汇合的地点。 l o c a l h o s t 表示所有进程都在同一台机器上, {PORT}: 这个参数指定了 rendezvous(集合点)的端点。rendezvous 是分布式训练中所有进程在开始前需要汇合的地点。localhost 表示所有进程都在同一台机器上, PORT:这个参数指定了rendezvous(集合点)的端点。rendezvous是分布式训练中所有进程在开始前需要汇合的地点。localhost表示所有进程都在同一台机器上,{PORT} 是一个环境变量,表示集合点使用的端口号。
train.py: 这是你的训练脚本,包含了模型的训练逻辑。
–launcher pytorch: 这个参数指定了使用的启动器是 PyTorch。PyTorch 支持多种启动器,包括 PyTorch 自带的和第三方的。
${PY_ARGS}: 这是一个环境变量,包含了传递给 train.py 脚本的额外参数。这意味着你可以通过改变这个环境变量的值来改变训练脚本的行为,而不需要修改脚本本身。
综上所述,这行命令是用来在本地机器上启动 PyTorch 的分布式训练的,每个 GPU 上运行一个进程,所有的进程都会在指定的端口上集合,然后开始执行 train.py 脚本,并传递一些额外的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值