#!/usr/bin/env bash
#
# ⚠ 2026-08-24 警告 —— 这个脚本保留原样,是为了【复刻 2026-08-20 那次训练】。
#   新的训练请用 train_smolvla_v2.sh。原因:
#
#   下面 EVAL_SPLIT 的默认值 0.2 会把【每个 task 的最后 ceil(N×0.2) 集】从训练集里
#   拿掉(datasets/factory.py:156)。对本数据集(50 集 / 1 个 task)就是砍掉 ep40-49 ——
#   而那正好是整个第五个杯位(杯子在头部相机里横向 0.84,抓取时腰部 +11.7°)。
#
#   更糟的是 eval_steps 默认为 0,而 lerobot_train.py:748 是
#   `is_eval_step = cfg.eval_steps > 0 and ...` —— 【评估根本不会运行】。
#   2026-08-20 那次训练日志里 eval loss 的行数是 0。
#   也就是:20% 的数据 + 一整个杯位被丢掉,换来零信息。
#
#   要训能用的模型:EVAL_SPLIT=0.0(或直接用 v2 脚本,它的默认就是 0.0 并且带守卫)。
#   完整分析见 SMOLVLA-TRAINING-RECIPE.md §〇·七。
#
# SmolVLA 微调 · 右臂取杯 · 对照 v1 的 ACT
# 微调只训 action expert（freeze_vision_encoder=True, train_expert_only=True），
# 500M 的 SmolVLM2 底座是冻结的，比全量训练轻得多。
set -euo pipefail
PY=/home/robomates/miniconda3/envs/train310/bin/python
export HF_LEROBOT_HOME="${HF_LEROBOT_HOME:-/home/robomates/Robotic_challenge/data/huggingface/lerobot}"
BATCH="${BATCH:-2}"; WORKERS="${WORKERS:-2}"; STEPS="${STEPS:-20000}"
SAVE_FREQ="${SAVE_FREQ:-2000}"; LOG_FREQ="${LOG_FREQ:-100}"
OUT="${OUT:-/home/robomates/Robotic_challenge/05-training/runs/smolvla_$(date +%Y%m%d-%H%M)}"
cd /home/robomates/lerobot310
exec "$PY" -m lerobot.scripts.lerobot_train \
  --dataset.repo_id="Suyang99/xlerobot-cup-grasp-20260820-0230" \
  --policy.path=lerobot/smolvla_base \
  --policy.device=cuda \
  --rename_map='{"observation.images.head":"observation.images.camera1","observation.images.right_arm_wrist":"observation.images.camera2","observation.images.left_arm_wrist":"observation.images.camera3"}' \
  --dataset.eval_split="${EVAL_SPLIT:-0.2}" \
  --policy.push_to_hub=false \
  --batch_size="$BATCH" --num_workers="$WORKERS" --steps="$STEPS" \
  --save_freq="$SAVE_FREQ" --log_freq="$LOG_FREQ" \
  --output_dir="$OUT" --job_name=smolvla_cup_grasp_right "$@"
