| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| set -u |
| R="${OPENPATH_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}" |
| RDZV="$1"; CFG="$2"; OUTDIR="$3"; LOGDIR="$4"; shift 4 |
| EXTRA="$*" |
| HOST="${MASTER_NODE:-node1}" |
| EP="${MASTER_ADDR:-10.0.0.1}:29500" |
| WORKERS="${WORKER_NODES:-node2 node3 node4 node5}" |
| NNODES=$(( 1 + $(echo "$WORKERS" | wc -w) )) |
| PYC="\$HOME/.cache/op_pyc_$RDZV" |
| |
| 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" |
|
|
| |
| 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" & |
|
|
| |
| echo "waiting 30s for master store bind on $EP ..." |
| sleep 30 |
| echo "firing workers" |
|
|
| |
| 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 |
| |
| sleep 20 |
| echo "ALL launched: master $HOST + workers $WORKERS | rdzv=$RDZV | logs=$LOGDIR | out=$OUTDIR" |
|
|