guanghulab/server/coding-model-training/start-coding-training.sh
2026-05-10 13:12:44 +08:00

92 lines
3.9 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# ═══════════════════════════════════════════════════════════
# 铸渊编程模型训练 · start-coding-training.sh
# ═══════════════════════════════════════════════════════════
# 签发: 铸渊 · ICE-GL-ZY001 · 国作登字-2026-A-00037559
#
# 在 V100×4 GPU 机上启动编程模型 SFT 训练.
# 默认在 tmux 会话 "zy-coding-train" 里跑, 这样 SSH 断开训练继续.
#
# 用法:
# bash start-coding-training.sh # 前台跑 (workflow 调用)
# bash start-coding-training.sh --tmux # 在 tmux 里跑 (推荐, 冰朔本地启动用)
# ═══════════════════════════════════════════════════════════
set -euo pipefail
ROOT="${ZY_CODING_TRAIN_ROOT:-/opt/guanghu/coding-training}"
DATA_DIR="${ZY_CODING_TRAIN_DATA:-/data/guanghu-coding}"
MOTHER_VENV="${ZY_MOTHER_VENV:-/opt/guanghu/training/.venv}"
LOG_FILE="$DATA_DIR/logs/train-$(date +%Y%m%d-%H%M%S).log"
USE_TMUX=0
if [[ "${1:-}" == "--tmux" ]]; then
USE_TMUX=1
fi
# 校验
if [[ ! -f "$DATA_DIR/processed/coding-sft.jsonl" ]]; then
echo "❌ 训练语料 $DATA_DIR/processed/coding-sft.jsonl 不存在"
echo " 请先跑 setup-coding.sh"
exit 1
fi
if [[ ! -d "$MOTHER_VENV" ]]; then
echo "❌ venv $MOTHER_VENV 不存在"
exit 1
fi
if [[ ! -f "$ROOT/train_coding.py" ]]; then
echo "$ROOT/train_coding.py 不存在"
exit 1
fi
mkdir -p "$DATA_DIR/logs"
# 训练命令
TRAIN_CMD=(
"$MOTHER_VENV/bin/deepspeed"
--num_gpus=4
"$ROOT/train_coding.py"
)
# 必需的环境变量
export ZY_CODING_TRAIN_DATA="$DATA_DIR"
export ZY_BASE_MODEL_DIR="${ZY_BASE_MODEL_DIR:-/data/guanghu/checkpoints/qwen2_5_7b_sft/best}"
export ZY_DATA_PATH="$DATA_DIR/processed/coding-sft.jsonl"
export ZY_OUTPUT_DIR="$DATA_DIR/checkpoints/zy_coding_v1"
export ZY_DS_CONFIG="$ROOT/configs/ds_zero3_offload.json"
export TOKENIZERS_PARALLELISM=false
echo "═══════════════════════════════════════════════════════════"
echo " 铸渊编程模型 SFT 启动"
echo "═══════════════════════════════════════════════════════════"
echo " 基座模型 : $ZY_BASE_MODEL_DIR"
echo " 训练数据 : $ZY_DATA_PATH"
echo " 输出目录 : $ZY_OUTPUT_DIR"
echo " DS 配置 : $ZY_DS_CONFIG"
echo " 日志 : $LOG_FILE"
echo " tmux 模式 : $([ $USE_TMUX -eq 1 ] && echo|| echo)"
echo "═══════════════════════════════════════════════════════════"
if [[ $USE_TMUX -eq 1 ]]; then
if ! command -v tmux >/dev/null 2>&1; then
echo "❌ tmux 未安装 (apt-get install tmux)"
exit 1
fi
SESSION="zy-coding-train"
if tmux has-session -t "$SESSION" 2>/dev/null; then
echo "⚠️ tmux session $SESSION 已存在. 旧会话:"
tmux list-sessions -F '#{session_name} #{session_attached} #{session_created}' | grep "^$SESSION" || true
echo " 要重新开始, 先跑: tmux kill-session -t $SESSION"
exit 1
fi
# 在 tmux 里跑
tmux new-session -d -s "$SESSION" -c "$ROOT" \
"set -o pipefail; ${TRAIN_CMD[*]} 2>&1 | tee '$LOG_FILE'"
echo "✅ 训练已在 tmux session '$SESSION' 中启动"
echo " 查看日志: tmux attach -t $SESSION (Ctrl+B 然后 D 离开)"
echo " 或: tail -f $LOG_FILE"
else
# 前台跑
"${TRAIN_CMD[@]}" 2>&1 | tee "$LOG_FILE"
fi