| #!/bin/bash |
|
|
| |
| REMOTE_USER="root" |
| PROJECT_PATH="/path/to/code/DyME" |
| |
| |
|
|
| TRAIN_SCRIPT="main" |
| SCRIPT_ARGS="--config norm" |
|
|
| |
| |
| |
| readonly WORKER_HOSTS=( |
| "xx.xx.xx.xx" |
| ) |
|
|
| |
| ENV_SETUP_CMDS=" |
| export WANDB_API_KEY=YOUR_WANDB_KEY; |
| export http_proxy='YOUR_PROXY'; |
| export https_proxy='YOUR_PROXY'; |
| " |
|
|
| CONFIG_FILE="${PROJECT_PATH}/multi_node_config_raw.yaml" |
|
|
| |
| |
| |
| cleanup() { |
| echo "🛑 检测到中断或退出,正在清理所有节点进程..." |
| bash kill_all.sh |
| wait |
| echo "✅ 清理完成。" |
| } |
|
|
|
|
| trap cleanup SIGINT EXIT |
|
|
|
|
| echo "🧹 启动前预清理..." |
| cleanup |
|
|
| echo "环境安装" |
| pip install -r ${PROJECT_PATH}/requirements.txt & |
| LOCAL_PID=$! |
|
|
| for HOST in "${WORKER_HOSTS[@]}"; do |
| echo "在节点 ${HOST} 上启动安装..." |
| |
| ssh ${REMOTE_USER}@${HOST} "pip install -r ${PROJECT_PATH}/requirements.txt;http_proxy='YOUR_PROXY' https_proxy='YOUR_PROXY' python -m spacy download en_core_web_sm" & |
| done |
|
|
| echo "等待所有安装任务完成..." |
| wait |
| echo "所有节点环境安装完成!" |
|
|
| echo "🚀 正在启动主节点 (rank 0)..." |
| cd ${PROJECT_PATH} || exit |
|
|
| MASTER_CMD="${ENV_SETUP_CMDS} accelerate launch \ |
| --config_file ${CONFIG_FILE} \ |
| --machine_rank 0 \ |
| -m ${TRAIN_SCRIPT} ${SCRIPT_ARGS}" |
|
|
| eval "${MASTER_CMD}" 2>&1 | tee master.log & |
| MASTER_PID=$! |
|
|
| RANK=1 |
| for HOST in "${WORKER_HOSTS[@]}"; do |
| echo "🚀 正在启动从属节点 ${HOST} (rank ${RANK})..." |
| REMOTE_CMD="cd ${PROJECT_PATH}; ${ENV_SETUP_CMDS} accelerate launch \ |
| --config_file ${CONFIG_FILE} \ |
| --machine_rank ${RANK} \ |
| -m ${TRAIN_SCRIPT} ${SCRIPT_ARGS}" |
|
|
| ssh -n ${REMOTE_USER}@${HOST} "${REMOTE_CMD}" 2>&1 | tee worker_${RANK}.log & |
| RANK=$((RANK+1)) |
| done |
|
|
| echo "✅ 所有进程启动完毕。主进程 PID: $MASTER_PID" |
| echo "⏳ 等待训练结束... (按 Ctrl+C 可强制终止所有节点)" |
|
|
| wait $MASTER_PID |