File size: 2,628 Bytes
4f91c02
5fe2fc4
 
 
 
4f91c02
 
5fe2fc4
4f91c02
 
5fe2fc4
 
 
 
4f91c02
5fe2fc4
 
 
4f91c02
62a0e4e
5fe2fc4
4f91c02
62a0e4e
4f91c02
 
 
5fe2fc4
 
4f91c02
 
 
5fe2fc4
4f91c02
5fe2fc4
4f91c02
5fe2fc4
4f91c02
 
 
 
 
5fe2fc4
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
#!/usr/bin/env bash
# Multi-node training launcher (FSDP). Master + workers, 8 GPU/node.
# Configure your cluster via env: MASTER_NODE (host), WORKER_NODES, MASTER_ADDR (host IB/high-speed IP),
# and the NCCL_* / IFNAME settings below (cluster-specific โ€” adjust to your fabric).
# Run from an orchestrator node; the master is launched remotely over ssh (no local training process).
# ์‚ฌ์šฉ: scripts/launch.sh <rdzv_id> <config_abspath> <outdir> <logdir> [extra train.py args...]
set -u
R="${OPENPATH_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"
RDZV="$1"; CFG="$2"; OUTDIR="$3"; LOGDIR="$4"; shift 4
EXTRA="$*"
HOST="${MASTER_NODE:-node1}"                  # master node hostname
EP="${MASTER_ADDR:-10.0.0.1}:29500"           # master node IB/high-speed IP (rendezvous rank0)
WORKERS="${WORKER_NODES:-node2 node3 node4 node5}"
NNODES=$(( 1 + $(echo "$WORKERS" | wc -w) ))  # host + workers
PYC="\$HOME/.cache/op_pyc_$RDZV"  # ๋…ธ๋“œ-๋กœ์ปฌ. ์›๊ฒฉ ์…ธ์—์„œ ํ™•์žฅ๋˜๋„๋ก escape
# โ˜… NCCL/๋„คํŠธ์›Œํฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ํŠน์ • โ€” ์ž์‹ ์˜ IB HCA/์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ต์ฒด:
ENV="WANDB_MODE=disabled NCCL_DEBUG=WARN NCCL_IB_HCA=${NCCL_IB_HCA:-mlx5_0} \
NCCL_SOCKET_IFNAME=${NCCL_SOCKET_IFNAME:-eth0} GLOO_SOCKET_IFNAME=${GLOO_SOCKET_IFNAME:-eth0} \
NCCL_IB_TIMEOUT=22 NCCL_IB_RETRY_CNT=13 NCCL_IB_QPS_PER_CONNECTION=4 \
PYTHONDONTWRITEBYTECODE=1 PYTHONPYCACHEPREFIX=$PYC PYTHONPATH=$R/OpenPath"
TR="venv/bin/torchrun --nnodes=$NNODES --nproc-per-node=8 --rdzv-backend=c10d \
--rdzv-endpoint=$EP --rdzv-id=$RDZV \
OpenPath/dinov2/train/train.py --config-file $CFG --output-dir $OUTDIR $EXTRA"

mkdir -p "$LOGDIR" "$OUTDIR"

# 1) launch master remotely โ€” โ˜…ssh๋ฅผ &๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ(์•ˆ ๊ทธ๋Ÿฌ๋ฉด ์›๊ฒฉ setsid์˜ ์ƒ์† fd๋ฅผ ๋ฌผ๊ณ  ssh๊ฐ€ ๋ฐ˜ํ™˜ ์•ˆ ํ•จ=๋Ÿฐ์ฒ˜ ํ–‰)
echo "launching master on $HOST ..."
ssh -n -o BatchMode=yes "$HOST" "mkdir -p $PYC; cd $R && setsid env $ENV $TR > $LOGDIR/${HOST}.log 2>&1 < /dev/null & echo ${HOST}-host-fired" &

# 2) host torchrun๊ฐ€ store ๋ฐ”์ธ๋”ฉํ•  ์‹œ๊ฐ„(๊ณ ์ • ๋Œ€๊ธฐ). c10d๋Š” ์›Œ์ปค๊ฐ€ ์žฌ์‹œ๋„๋กœ ๋ถ™์œผ๋ฏ€๋กœ ssํด๋ง ๋ถˆํ•„์š”.
echo "waiting 30s for master store bind on $EP ..."
sleep 30
echo "firing workers"

# 3) launch workers in parallel
for n in $WORKERS; do
  ssh -n -o BatchMode=yes "$n" "mkdir -p $PYC; cd $R && setsid env $ENV $TR > $LOGDIR/${n}.log 2>&1 < /dev/null & echo ${n}-fired" &
done
# โ˜… wait ๋Œ€์‹  ๊ณ ์ • sleep โ€” bg ssh๊ฐ€ ์›๊ฒฉ setsid์˜ fd๋ฅผ ๋ฌผ์–ด ๋ฐ˜ํ™˜ ์•ˆ ํ•  ์ˆ˜ ์žˆ์–ด wait๋Š” ์˜์›ํžˆ ๋ฉˆ์ถค(autoresume blocking ํ˜ธ์ถœ๋„ ๋ง‰ํž˜).
sleep 20
echo "ALL launched: master $HOST + workers $WORKERS | rdzv=$RDZV | logs=$LOGDIR | out=$OUTDIR"