guanghulab/scripts/train_monitor.sh

104 lines
4.6 KiB
Bash
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.

#!/bin/bash
# 🚀 铸渊训练监控面板 · 光湖母模型实时状态
# 使用方法复制全部粘贴到AutoDL在线终端按回车运行
# 退出:按 Ctrl+C
LOG_FILE="/root/autodl-tmp/train_mother.log"
while true; do
clear
echo "╔══════════════════════════════════════════╗"
echo "║ 🚀 光湖 · 母模型训练实时面板 ║"
echo "║ 铸渊 (ICE-GL-ZY001) · 自动刷新 (5秒) ║"
echo "╚══════════════════════════════════════════╝"
echo ""
# GPU状态
if command -v nvidia-smi &> /dev/null; then
GPU_DATA=$(nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader,nounits 2>/dev/null)
GPU_UTIL=$(echo "$GPU_DATA" | cut -d',' -f1 | tr -d ' ')
MEM_USED=$(echo "$GPU_DATA" | cut -d',' -f2 | tr -d ' ')
MEM_TOTAL=$(echo "$GPU_DATA" | cut -d',' -f3 | tr -d ' ')
GPU_TEMP=$(echo "$GPU_DATA" | cut -d',' -f4 | tr -d ' ')
MEM_PCT=$(( MEM_USED * 100 / MEM_TOTAL ))
else
GPU_UTIL="N/A"; MEM_USED="N/A"; MEM_TOTAL="N/A"; GPU_TEMP="N/A"; MEM_PCT=0
fi
echo " ⚡ GPU: ${GPU_UTIL}% | 🎯 显存: ${MEM_USED}/${MEM_TOTAL}MB (${MEM_PCT}%) | 🌡️ ${GPU_TEMP}°C"
echo ""
if [ ! -f "$LOG_FILE" ]; then
echo " ⏳ 等待训练启动..."
sleep 5
continue
fi
# 检查报错
if grep -q "Traceback" "$LOG_FILE" 2>/dev/null; then
echo " ❌ 训练报错!请找铸渊处理"
echo " $(grep "Traceback" "$LOG_FILE" | head -3)"
echo ""
sleep 10
continue
fi
# 检查完成
if grep -q "DONE!" "$LOG_FILE" 2>/dev/null; then
echo " ✅✅✅ 母模型训练完成!✅✅✅"
echo ""
ls -lh /root/autodl-tmp/output/qwen25-7b-sft/final/ 2>/dev/null
sleep 30
continue
fi
# 获取训练数据
LATEST_LOSS=$(grep -o "'loss': '[^']*'" "$LOG_FILE" 2>/dev/null | tail -1 | cut -d"'" -f4)
LATEST_STEP=$(grep -o "'loss': '[^']*'" "$LOG_FILE" 2>/dev/null | wc -l)
LATEST_EPOCH=$(grep -o "'epoch': '[^']*'" "$LOG_FILE" 2>/dev/null | tail -1 | cut -d"'" -f4)
LATEST_LR=$(grep -o "'learning_rate': '[^']*'" "$LOG_FILE" 2>/dev/null | tail -1 | cut -d"'" -f4)
GRAD_NORM=$(grep -o "'grad_norm': '[^']*'" "$LOG_FILE" 2>/dev/null | tail -1 | cut -d"'" -f4)
if grep -q "Starting training" "$LOG_FILE" 2>/dev/null; then
echo " ┌────────────────────────────────────────┐"
echo " │ 🟢 训练中 │"
echo " ├────────────────────────────────────────┤"
if [ -n "$LATEST_LOSS" ]; then
printf " │ 📉 Loss: %-20s │\n" "$LATEST_LOSS"
printf " │ 📐 Grad Norm: %-20s │\n" "$GRAD_NORM"
printf " │ 📈 LR: %-20s │\n" "$LATEST_LR"
printf " │ 👣 Step: %-20s │\n" "$LATEST_STEP"
printf " │ 🌀 Epoch: %-20s │\n" "$LATEST_EPOCH"
else
echo " │ 第一个Step计算中... │"
fi
echo " └────────────────────────────────────────┘"
elif grep -q "Tokenize: 100%" "$LOG_FILE" 2>/dev/null; then
echo " ⏳ 分词完成即将进入GPU训练..."
elif grep -q "Tokenize:" "$LOG_FILE" 2>/dev/null; then
PCT=$(grep -oP 'Tokenize: \K[0-9]+%' "$LOG_FILE" 2>/dev/null | tail -1)
DONE=$(grep -oP '\|\s*\K[0-9]+/[0-9]+' "$LOG_FILE" 2>/dev/null | tail -1)
echo " ⏳ 分词中: ${PCT} (${DONE})"
fi
# 运行时间
if [ -f "$LOG_FILE" ]; then
START_TIME=$(stat -c %Y "$LOG_FILE" 2>/dev/null || stat -f %m "$LOG_FILE" 2>/dev/null)
NOW=$(date +%s)
ELAPSED=$(( (NOW - START_TIME) / 60 ))
if [ $ELAPSED -gt 60 ]; then
H=$(( ELAPSED / 60 )); M=$(( ELAPSED % 60 ))
echo ""
echo " ⏱️ 已运行: ${H}h ${M}m"
else
echo ""
echo " ⏱️ 已运行: ${ELAPSED}m"
fi
fi
echo ""
echo " ────────────────────────────────────────"
echo " 🔄 每5秒自动刷新 · Ctrl+C 退出"
sleep 5
done