跳到主要内容

RunTask 命令详解

概述

RunTask是Aladdin提供的一个高级命令,它可以通过执行脚本或者Python启动一个分布式任务。 setting-example 在上面这图中,Resource指定需要多少资源执行任务。图中的例子指定了2个节点,每个节点分配了8个NVIDIA-H800A-NV-80G型GPU。另外,每个GPU对应分配13C的CPU和200G内存。

容器配置

假设启动的是一个torchrun的分布式训练任务,比如:

runTask脚本命令例子
torchrun  --nproc_per_node $nproc_per_node \
--nnodes $nnodes \
--node_rank $node_rank \
--master_addr $master_addr \
--master_port $master_port \
./llama_pretrain/llama_pretrain.py \
......

对于两个节点的分布式任务,torchrun通常需要指定参数nproc_per_node,nnodes,node_rank,master_addr,master_port。并且在每个节点中分别启动。 举个例子,下面的代码是典型的启动分布式任务命令:

torchrun分布式命令例子
### 节点1:主节点
torchrun --nproc_per_node 8 \
--nnodes 2 --node_rank 0 --master_addr 127.0.0.1 --master_port $master_port \
./llama_pretrain/llama_pretrain.py \
......

### 节点2
torchrun --nproc_per_node 8 \
--nnodes 2 --node_rank 0 --master_addr 127.0.0.1 --master_port $master_port \
./llama_pretrain/llama_pretrain.py \
......

那么,启动runTask的时候,具体执行了哪些操作,使得一个简单的命令就能够启动两个节点,并在两个节点中成功启动命令的呢?

实际上,当提交了runTask任务后,Aladdin分别启动了两个Pod,每个Pod按照要求分配了8个GPU。同时,对于每个Pod中的容器,Aladdin赋予了以下环境变量:

环境变量节点1节点2说明
nproc_per_node88配置中每个节点的GPU数量
nnodes22配置中指定的worker数量
node_rank01按照创建顺序指定
master_addr本机ip节点1的ipworker0的IP
master_port指定的一个端口与节点1中相同的端口统一指定的端口

这样,上面的runTask脚本命令例子实际上转化成了torchrun分布式命令例子的样子。

为了验证这一点,我们可以执行以下脚本:

验证脚本
### 输出个环境变量
echo nproc_per_node=$nproc_per_node
echo nnodes=$nnodes
echo node_rank=$node_rank
echo master_addr=$master_addr
echo master_port=$master_port

### 输出环境变量展开后的命令
torchrun --nproc_per_node $nproc_per_node \
--nnodes $nnodes \
--node_rank $node_rank \
--master_addr $master_addr \
--master_port $master_port \
./llama_pretrain/llama_pretrain.py \
--model_type llama \
--config_overrides "num_attention_heads=32,num_hidden_layers=1,num_key_value_heads=1" \
--tokenizer_name ./llama_tokenizer \
--train_file ./llama_pretrain/data/pretrain_data.txt \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--bf16 True \
--overwrite_output_dir \
--do_train \
--do_eval \
--logging_strategy steps \
--logging_steps 10 \
--output_dir ./llama_pretrain/tmp \
--save_strategy no \
--num_train_epochs 1

当我们在这个脚本上执行Run Task时,安装以下步骤分别查看log。

view log

choose worker

我们分别得到一下结果:

worker0的log
2025-04-29 16:58:23.637 [INFO] 172.19.131.52  task-tlptpvki11-9f77e533-0c70-490b-8487-3fd32c57d4b3-worker-1
2025-04-29 16:58:23.683 [INFO] * Starting OpenBSD Secure Shell server sshd
2025-04-29 16:58:23.697 [INFO] ...done.
2025-04-29 16:58:23.876 [INFO] nproc_per_node=4
2025-04-29 16:58:23.876 [INFO] nnodes=2
2025-04-29 16:58:23.876 [INFO] node_rank=0
2025-04-29 16:58:23.876 [INFO] master_addr=172.19.131.247
2025-04-29 16:58:23.876 [INFO] master_port=23456
2025-04-29 16:58:23.876 [INFO] torchrun --nproc_per_node 4 --nnodes 2 --node_rank 0 --master_addr 172.19.131.247 --master_port 23456 ./llama_pretrain/llama_pretrain.py --model_type llama --config_overrides num_attention_heads=32,num_hidden_layers=1,num_key_value_heads=1 --tokenizer_name ./llama_tokenizer --train_file ./llama_pretrain/data/pretrain_data.txt --per_device_train_batch_size 1 --per_device_eval_batch_size 1 --bf16 True --overwrite_output_dir --do_train --do_eval --logging_strategy steps --logging_steps 10 --output_dir ./llama_pretrain/tmp --save_strategy no --num_train_epochs 1
worker1的log
2025-04-29 16:58:23.741 [INFO] 172.19.131.247  task-tlptpvki11-9f77e533-0c70-490b-8487-3fd32c57d4b3-worker-0
2025-04-29 16:58:23.786 [INFO] * Starting OpenBSD Secure Shell server sshd
2025-04-29 16:58:23.798 [INFO] ...done.
2025-04-29 16:58:23.871 [INFO] nproc_per_node=4
2025-04-29 16:58:23.871 [INFO] nnodes=2
2025-04-29 16:58:23.871 [INFO] node_rank=1
2025-04-29 16:58:23.871 [INFO] master_addr=172.19.131.247
2025-04-29 16:58:23.871 [INFO] master_port=23456
2025-04-29 16:58:23.871 [INFO] torchrun --nproc_per_node 4 --nnodes 2 --node_rank 1 --master_addr 172.19.131.247 --master_port 23456 ./llama_pretrain/llama_pretrain.py --model_type llama --config_overrides num_attention_heads=32,num_hidden_layers=1,num_key_value_heads=1 --tokenizer_name ./llama_tokenizer --train_file ./llama_pretrain/data/pretrain_data.txt --per_device_train_batch_size 1 --per_device_eval_batch_size 1 --bf16 True --overwrite_output_dir --do_train --do_eval --logging_strategy steps --logging_steps 10 --output_dir ./llama_pretrain/tmp --save_strategy no --num_train_epochs 1

可以看出对于两个worker都正确配置了环境变量

常见平台的命令例子

下面给出在常见平台中执行分布式命令时的命令例子

torchrun

torchrun
torchrun  --nproc_per_node $nproc_per_node \
--nnodes $nnodes \
--node_rank $node_rank \
--master_addr $master_addr \
--master_port $master_port \
./llama_pretrain/llama_pretrain.py \
.......

Llama-Factory

Llama-Factory
FORCE_TORCHRUN=1 NPROC_PER_NODE=$nproc_per_node NNODES=$nnodes NODE_RANK=$node_rank MASTER_ADDR=$master_addr MASTER_PORT=$master_port \
llamafactory-cli train train_example.yaml

Swift

Swift
NPROC_PER_NODE=$nproc_per_node \
NNODES=$nnodes \
NODE_RANK=$node_rank \
MASTER_ADDR=$master_addr \
MASTER_PORT=$master_port \
PYTORCH_CUDA_ALLOC_CONF="expandable_segments:True,max_split_size_mb:128" \
swift sft \
--model "/model/Qwen/Qwen2.5-7B-Instruct" \
--train_type lora \
--dataset "/workspace/swift-math-sft/blossom-math-v3-10k.json" \
--output_dir "saves/qwen-sft-math/lora" \
--num_train_epochs 1 \
......