File size: 2,992 Bytes
ac29381
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/bin/bash
# DreamZero SLURM 多节点训练启动脚本
#
# 用法:
#   sbatch scripts/cluster/slurm_train.sh libero          # 默认 4 节点 × 8 GPU
#   sbatch --nodes=8 scripts/cluster/slurm_train.sh manifeel  # 8 节点
#
# 或者覆盖参数:
#   sbatch scripts/cluster/slurm_train.sh robotwin \
#     --max_steps=100000 --training_args.learning_rate=5e-6

#SBATCH --job-name=dreamzero-sft
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=1
#SBATCH --gpus-per-node=8
#SBATCH --cpus-per-task=64
#SBATCH --mem-per-cpu=8G
#SBATCH --time=72:00:00
#SBATCH --output=logs/%x-%j.out
#SBATCH --error=logs/%x-%j.err
#SBATCH --partition=gpu

set -euo pipefail

# ============ 参数解析 ============
BENCHMARK=${1:-libero}
shift || true

# ============ 环境变量 ============
export NCCL_DEBUG=WARN
export NCCL_IB_DISABLE=0
export NCCL_IB_TIMEOUT=22
export NCCL_IB_RETRY_CNT=4
export NCCL_SOCKET_IFNAME=^docker0,lo
export HF_ENDPOINT=https://hf-mirror.com

NODES=${SLURM_NNODES:-4}
GPUS_PER_NODE=${SLURM_GPUS_PER_NODE:-8}
TOTAL_GPUS=$((NODES * GPUS_PER_NODE))

# 自动获取 MASTER_ADDR
if [ -n "${SLURM_NODELIST:-}" ]; then
    MASTER_ADDR=$(scontrol show hostname "$SLURM_NODELIST" | head -n1)
else
    MASTER_ADDR="localhost"
fi
MASTER_PORT=${MASTER_PORT:-29500}

echo "============================================"
echo " DreamZero SLURM Training"
echo "============================================"
echo " Nodes:       $NODES"
echo " GPUs/node:   $GPUS_PER_NODE"
echo " Total GPUs:  $TOTAL_GPUS"
echo " Master:      $MASTER_ADDR:$MASTER_PORT"
echo " Benchmark:   $BENCHMARK"
echo "============================================"

# ============ 路径 ============
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
OUTPUT_DIR="${OUTPUT_DIR:-$REPO_ROOT/output/${BENCHMARK}_full_${NODES}nodes}"

# ============ 运行训练 ============
torchrun \
    --nnodes="$NODES" \
    --nproc_per_node="$GPUS_PER_NODE" \
    --rdzv_id="dz_sft_${BENCHMARK}" \
    --rdzv_backend=c10d \
    --rdzv_endpoint="$MASTER_ADDR:$MASTER_PORT" \
    "$REPO_ROOT/groot/vla/experiment/experiment.py" \
    report_to=wandb \
    data="dreamzero/${BENCHMARK}" \
    wandb_project=dreamzero-sft \
    train_architecture=full \
    model=dreamzero/vla \
    model/dreamzero/action_head=wan_flow_matching_action_tf_wan22 \
    model/dreamzero/transform=dreamzero_cotrain \
    per_device_train_batch_size=1 \
    global_batch_size=$((TOTAL_GPUS * 4)) \
    save_steps=2000 \
    save_total_limit=4 \
    training_args.learning_rate=1e-5 \
    training_args.warmup_ratio=0.05 \
    training_args.deepspeed="groot/vla/configs/deepspeed/zero3_multinode.json" \
    training_args.bf16=true \
    training_args.tf32=true \
    training_args.eval_bf16=true \
    output_dir="$OUTPUT_DIR" \
    model.gradient_checkpointing=true \
    dataloader_num_workers=8 \
    dataloader_pin_memory=true \
    optim=adamw_bnb_8bit \
    bf16=true tf32=true eval_bf16=true \
    "$@"