初始化:换发型/换发色/训练发型服务
包含: - hair_service_sd: 主服务(换发型/换发色/生发,端口8801) - photo_service: LoRA调度+训练(端口32678) - hair_grow_service: 调试测试页(端口8888,含4个测试页) - 批量训练脚本(batch_train_hairstyles.py) - 发际线mask自动识别(hairline_mask.py,4种方案) - 手绘mask换发型(hair_swap_manual.py) - 文档:README.md + LARGE_FILES.md + docs/ 大文件(模型权重200G、训练数据123G)已排除,见 LARGE_FILES.md OSS/COS密钥已脱敏为环境变量,原文件备份在本地
This commit is contained in:
Executable
+76
@@ -0,0 +1,76 @@
|
||||
#!/bin/bash
|
||||
# 全自动串行 rsync 同步脚本
|
||||
# 策略:单链路串行传输,避免并行抢带宽;按依赖优先级排序
|
||||
# 已传数据自动续传(--partial)
|
||||
|
||||
set -u
|
||||
LOGDIR="/home/xsl/change_hair/project/logs"
|
||||
DONE_MARKER="$LOGDIR/sync_all.done"
|
||||
mkdir -p "$LOGDIR"
|
||||
|
||||
# 如果已全部完成,直接退出
|
||||
[ -f "$DONE_MARKER" ] && { echo "所有同步任务已完成,跳过"; exit 0; }
|
||||
|
||||
# 任务定义:名称|源|目标
|
||||
# 优先级排序:换发色关键链路优先 → 换发型 → 训练相关 → 大数据最后
|
||||
TASKS=(
|
||||
"photo_service|szlc@192.168.101.63:/home/szlc/project/photo_service/|/home/xsl/change_hair/project/photo_service/"
|
||||
"project_data|szlc@192.168.101.63:/home/szlc/project/data/|/home/xsl/change_hair/project/data/"
|
||||
"hair_service_sd|szlc@192.168.101.63:/home/szlc/project/hair_service_sd/|/home/xsl/change_hair/project/hair_service_sd/"
|
||||
"conda_py310|szlc@192.168.101.63:/home/szlc/miniconda3/envs/py310/|/home/xsl/miniconda3/envs/py310/"
|
||||
"conda_my_hair|szlc@192.168.101.63:/home/szlc/miniconda3/envs/my_hair/|/home/xsl/miniconda3/envs/my_hair/"
|
||||
"conda_sdwebui|szlc@192.168.101.63:/home/szlc/miniconda3/envs/sdwebui/|/home/xsl/miniconda3/envs/sdwebui/"
|
||||
"kohya_ss_home|szlc@192.168.101.63:/home/szlc/project/kohya_ss_home/|/home/xsl/change_hair/project/kohya_ss_home/"
|
||||
"onediff|szlc@192.168.101.63:/home/szlc/project/onediff/|/home/xsl/change_hair/project/onediff/"
|
||||
"train_material|szlc@192.168.101.63:/data/train_material/|/home/xsl/change_hair/data/train_material/"
|
||||
)
|
||||
|
||||
echo "========================================" | tee -a "$LOGDIR/sync_main.log"
|
||||
echo "串行同步开始: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a "$LOGDIR/sync_main.log"
|
||||
echo "========================================" | tee -a "$LOGDIR/sync_main.log"
|
||||
|
||||
FAIL=0
|
||||
for task in "${TASKS[@]}"; do
|
||||
NAME="${task%%|*}"; rest="${task#*|}"
|
||||
SRC="${rest%%|*}"; DST="${rest#*|}"
|
||||
TLOG="$LOGDIR/sync_${NAME}.log"
|
||||
|
||||
# 已完成的任务跳过(用标记文件判断)
|
||||
if [ -f "$LOGDIR/sync_${NAME}.ok" ]; then
|
||||
echo "[$(date '+%H:%M:%S')] [$NAME] 已完成,跳过" | tee -a "$LOGDIR/sync_main.log"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "[$(date '+%H:%M:%S')] [$NAME] 开始: $SRC -> $DST" | tee -a "$LOGDIR/sync_main.log"
|
||||
mkdir -p "$DST"
|
||||
|
||||
# rsync 串行传输,最多重试3次
|
||||
RETRY=0
|
||||
while [ $RETRY -lt 3 ]; do
|
||||
if rsync -a --partial --inplace --info=progress2,NAME0 \
|
||||
-e "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o ConnectTimeout=15" \
|
||||
"$SRC" "$DST" >>"$TLOG" 2>&1; then
|
||||
touch "$LOGDIR/sync_${NAME}.ok"
|
||||
echo "[$(date '+%H:%M:%S')] [$NAME] 完成 ✓" | tee -a "$LOGDIR/sync_main.log"
|
||||
break
|
||||
else
|
||||
RETRY=$((RETRY+1))
|
||||
echo "[$(date '+%H:%M:%S')] [$NAME] 第${RETRY}次失败,重试中..." | tee -a "$LOGDIR/sync_main.log"
|
||||
sleep 5
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $RETRY -ge 3 ]; then
|
||||
echo "[$(date '+%H:%M:%S')] [$NAME] 失败 ✗ (重试3次)" | tee -a "$LOGDIR/sync_main.log"
|
||||
FAIL=$((FAIL+1))
|
||||
fi
|
||||
done
|
||||
|
||||
echo "========================================" | tee -a "$LOGDIR/sync_main.log"
|
||||
echo "同步全部结束: $(date '+%Y-%m-%d %H:%M:%S'), 失败任务数: $FAIL" | tee -a "$LOGDIR/sync_main.log"
|
||||
echo "========================================" | tee -a "$LOGDIR/sync_main.log"
|
||||
|
||||
if [ $FAIL -eq 0 ]; then
|
||||
touch "$DONE_MARKER"
|
||||
echo "全部成功完成" | tee -a "$LOGDIR/sync_main.log"
|
||||
fi
|
||||
Reference in New Issue
Block a user