Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 45 additions & 26 deletions examples/lora_examples/run_lora_brain_tumor_sweep.sh
Original file line number Diff line number Diff line change
@@ -1,33 +1,41 @@
#!/usr/bin/env bash
# ==============================================================================
# YOLO-Master-EsMoE-N LoRA Rank Sweep — Brain Tumor (Sparse Medical Detection)
#
# Usage:
# bash examples/lora_examples/run_lora_brain_tumor_sweep.sh
#
# Prerequisites:
# - yolo command available (pip install ultralytics or editable install)
# - Brain Tumor dataset downloaded (auto-downloads via brain-tumor.yaml on first run)
# - NVIDIA A40 (48 GB) or equivalent GPU
#
# Sweep matrix: r ∈ {4, 8, 16, 32} × alpha = 2×r
# Total experiments: 4 (serial execution for accurate timing)
# ==============================================================================
set -euo pipefail

# ==================== 配置区 ====================
CONDA_ENV="yolo_master"
CFG="examples/lora_examples/yolo_master_brain_tumor_lora.yaml"
PROJECT="runs/lora_examples"
GPU_ID=0
LOG_DIR="logs"
GPU_ID="${GPU_ID:-0}"
LOG_DIR="logs/brain_tumor_sweep"

# 实验参数矩阵 (r:alpha:name)
# Rank sweep: r:alpha:run_name
EXPERIMENTS=(
"4:8:brain_tumor_r4"
"8:16:brain_tumor_r8"
"16:32:brain_tumor_r16"
"32:64:brain_tumor_r32"
)
# ================================================

# 激活 conda 环境
source "$(conda info --base)/etc/profile.d/conda.sh"
conda activate "${CONDA_ENV}"

mkdir -p "${LOG_DIR}"

echo "=========================================="
echo "🚀 Brain Tumor LoRA Sweep Starting"
echo " GPU: ${GPU_ID}"
echo " Experiments: ${#EXPERIMENTS[@]}"
echo " Start Time: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo "==========================================================================="
echo " Brain Tumor LoRA Rank Sweep — YOLO-Master-EsMoE-N"
echo " GPU: ${GPU_ID} | Config: ${CFG} | Project: ${PROJECT}"
echo " Ranks: 4, 8, 16, 32 (alpha = 2×r)"
echo " Start: $(date '+%Y-%m-%d %H:%M:%S')"
echo "==========================================================================="

TOTAL=${#EXPERIMENTS[@]}
CURRENT=0
Expand All @@ -39,9 +47,10 @@ for EXP in "${EXPERIMENTS[@]}"; do
LOG_FILE="${LOG_DIR}/${NAME}.log"

echo ""
echo "[${CURRENT}/${TOTAL}] 🏋️ Training: ${NAME} (r=${R}, alpha=${ALPHA})"
echo " Log: ${LOG_FILE}"
echo " Started: $(date '+%H:%M:%S')"
echo "── [${CURRENT}/${TOTAL}] ${NAME} (r=${R}, α=${ALPHA}) ──"
echo " Log: ${LOG_FILE}"

START_TS=$(date +%s)

if CUDA_VISIBLE_DEVICES=${GPU_ID} yolo train \
cfg="${CFG}" \
Expand All @@ -51,19 +60,29 @@ for EXP in "${EXPERIMENTS[@]}"; do
name="${NAME}" \
project="${PROJECT}" \
> "${LOG_FILE}" 2>&1; then
echo " ✅ Completed: $(date '+%H:%M:%S')"

END_TS=$(date +%s)
ELAPSED=$((END_TS - START_TS))
MIN=$((ELAPSED / 60))
SEC=$((ELAPSED % 60))
echo " ✅ Done in ${MIN}m ${SEC}s"

BEST_MAP=$(grep -oP 'mAP50-95\(B\)=\K[0-9.]+' "${LOG_FILE}" | tail -1 || echo "N/A")
PEAK_VRAM=$(grep -oP '\d+\.?\d*G' "${LOG_FILE}" | tail -1 || echo "N/A")
echo " Best mAP50-95: ${BEST_MAP} | Peak VRAM: ${PEAK_VRAM}"

else
EXIT_CODE=$?
echo " ❌ FAILED (exit code ${EXIT_CODE}): $(date '+%H:%M:%S')"
echo " ❌ FAILED (exit ${EXIT_CODE})"
FAILED=$((FAILED + 1))
continue
fi
done

echo ""
echo "=========================================="
echo "🏁 Brain Tumor Sweep Finished: $(date '+%Y-%m-%d %H:%M:%S')"
echo " Total: ${TOTAL} | Success: $((TOTAL - FAILED)) | Failed: ${FAILED}"
echo "=========================================="
echo "==========================================================================="
echo " Brain Tumor Sweep Complete: $(date '+%Y-%m-%d %H:%M:%S')"
echo " Total: ${TOTAL} | Passed: $((TOTAL - FAILED)) | Failed: ${FAILED}"
echo "==========================================================================="

[ "${FAILED}" -eq 0 ] || exit 1
[ "${FAILED}" -eq 0 ] || exit 1
76 changes: 46 additions & 30 deletions examples/lora_examples/run_lora_visdrone_sweep.sh
Original file line number Diff line number Diff line change
@@ -1,33 +1,41 @@
#!/usr/bin/env bash
# ==============================================================================
# YOLO-Master-EsMoE-N LoRA Rank Sweep — VisDrone (Dense Aerial Detection)
#
# Usage:
# bash examples/lora_examples/run_lora_visdrone_sweep.sh
#
# Prerequisites:
# - yolo command available (pip install ultralytics or editable install)
# - VisDrone dataset downloaded (auto-downloads via VisDrone.yaml on first run)
# - NVIDIA A40 (48 GB) or equivalent GPU
#
# Sweep matrix: r ∈ {4, 8, 16, 32} × alpha = 2×r
# Total experiments: 4 (serial execution for accurate VRAM measurement)
# ==============================================================================
set -euo pipefail

# ==================== 配置区 ====================
CONDA_ENV="yolo_master"
CFG="examples/lora_examples/yolo_master_visdrone_lora.yaml"
PROJECT="runs/lora_examples"
GPU_ID=0
LOG_DIR="logs"
GPU_ID="${GPU_ID:-0}"
LOG_DIR="logs/visdrone_sweep"

# 实验参数矩阵 (r:alpha:name)
# Rank sweep: r:alpha:run_name
EXPERIMENTS=(
"4:8:visdrone_r4"
"8:16:visdrone_r8"
"16:32:visdrone_r16"
"32:64:visdrone_r32"
)
# ================================================

# 激活 conda 环境
source "$(conda info --base)/etc/profile.d/conda.sh"
conda activate "${CONDA_ENV}"

mkdir -p "${LOG_DIR}"

echo "=========================================="
echo "🚀 LoRA Sweep Starting"
echo " GPU: ${GPU_ID}"
echo " Experiments: ${#EXPERIMENTS[@]}"
echo " Start Time: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo "==========================================================================="
echo " VisDrone LoRA Rank Sweep — YOLO-Master-EsMoE-N"
echo " GPU: ${GPU_ID} | Config: ${CFG} | Project: ${PROJECT}"
echo " Ranks: 4, 8, 16, 32 (alpha = 2×r)"
echo " Start: $(date '+%Y-%m-%d %H:%M:%S')"
echo "==========================================================================="

TOTAL=${#EXPERIMENTS[@]}
CURRENT=0
Expand All @@ -39,11 +47,11 @@ for EXP in "${EXPERIMENTS[@]}"; do
LOG_FILE="${LOG_DIR}/${NAME}.log"

echo ""
echo "[${CURRENT}/${TOTAL}] 🏋️ Training: ${NAME} (r=${R}, alpha=${ALPHA})"
echo " Log: ${LOG_FILE}"
echo " Started: $(date '+%H:%M:%S')"
echo "── [${CURRENT}/${TOTAL}] ${NAME} (r=${R}, α=${ALPHA}) ──"
echo " Log: ${LOG_FILE}"

START_TS=$(date +%s)

# ✅ 关键修复:去掉 &,串行执行,避免 GPU 争抢
if CUDA_VISIBLE_DEVICES=${GPU_ID} yolo train \
cfg="${CFG}" \
device=0 \
Expand All @@ -52,22 +60,30 @@ for EXP in "${EXPERIMENTS[@]}"; do
name="${NAME}" \
project="${PROJECT}" \
> "${LOG_FILE}" 2>&1; then
echo " ✅ Completed: $(date '+%H:%M:%S')"

END_TS=$(date +%s)
ELAPSED=$((END_TS - START_TS))
MIN=$((ELAPSED / 60))
SEC=$((ELAPSED % 60))
echo " ✅ Done in ${MIN}m ${SEC}s"

# Extract key metrics from log for quick preview
BEST_MAP=$(grep -oP 'mAP50-95\(B\)=\K[0-9.]+' "${LOG_FILE}" | tail -1 || echo "N/A")
PEAK_VRAM=$(grep -oP '\d+\.?\d*G' "${LOG_FILE}" | tail -1 || echo "N/A")
echo " Best mAP50-95: ${BEST_MAP} | Peak VRAM: ${PEAK_VRAM}"

else
EXIT_CODE=$?
echo " ❌ FAILED (exit code ${EXIT_CODE}): $(date '+%H:%M:%S')"
echo " ❌ FAILED (exit ${EXIT_CODE})"
FAILED=$((FAILED + 1))
# set -e 下失败会退出,这里手动捕获以便继续下一个实验
# 如果希望失败即停,删除下面这行即可
continue
fi
done

echo ""
echo "=========================================="
echo "🏁 Sweep Finished: $(date '+%Y-%m-%d %H:%M:%S')"
echo " Total: ${TOTAL} | Success: $((TOTAL - FAILED)) | Failed: ${FAILED}"
echo "=========================================="
echo "==========================================================================="
echo " VisDrone Sweep Complete: $(date '+%Y-%m-%d %H:%M:%S')"
echo " Total: ${TOTAL} | Passed: $((TOTAL - FAILED)) | Failed: ${FAILED}"
echo "==========================================================================="

# 如果有失败的实验,以非零状态退出(方便 CI/调度系统感知)
[ "${FAILED}" -eq 0 ] || exit 1
[ "${FAILED}" -eq 0 ] || exit 1
Loading