#!/usr/bin/env bash # pod_prep_deep.sh — Pod で deep_even10_v1 (位置 1〜5 を各 10 本にそろえた 50 本) の学習の準備をする (2026-11-09 依頼 133). # 学習は回さない. lab_train.sh --model deep1b (依頼 135) の 4b が呼ぶ (deep1 は依頼 133 で呼んだ形). # # 前提: lab_train.sh 3a〜3f で Pod を準備してある (openpi・install_addon.py・add_trim_config.py). 続きの元のモデルは取らない # (π0.5 base から. 重みは学習の最初に openpi が gs://openpi-assets から取る) # Mac から次の 2 つを送ってある: # /workspace/data/mecharm_redblock_box_deep_even10_v1_raw_episodes.tar # /workspace/r2r2r/pi05/ (add_deep_config.py と convert_to_lerobot.py を使う) # # bash /workspace/r2r2r/pi05/openpi_addon/pod_prep_deep.sh # 例: bash ... 3000 b # は add_deep_config.py の --variant (依頼 135): # v1 = 設定 pi05_mecharm_deep_even10_lora・decay_steps 5_000 (依頼 133 の 2999. lab_train.sh --model deep1) # b = 設定 pi05_mecharm_deep_even10_b_lora・decay_steps を と同じに (lab_train.sh --model deep1b) # # すること (何度流しても同じ結果): # 1. tar を /workspace/data/<データ名>/ に広げ, エピソードの本数を確かめる (Mac で作ったときは 50 本) # 2. openpi の config.py に の設定を足す (--steps --variant) # 3. LeRobot 形式に変換 (repo_id local/<データ名>) # 4. 正規化の値をこの 50 本で測り直す (RUNPOD_TRAIN.md 4. の compute_norm_stats.py をこの設定で). # 置く場所は openpi が学習で読む assets/<設定の名前>/local/<データ名>/norm_stats.json. # 最後に「NORM sha256=<64 桁> path=」の1行を出す (lab_train.sh が由来に残し, 持ち帰る) # 5. 学習を始めるコマンドを出す (流さない) set -euo pipefail STEPS="${1:?学習のステップ数 (例 3000)}" VARIANT="${2:?add_deep_config.py の --variant (v1 か b)}" NAME=mecharm_redblock_box_deep_even10_v1 case "$VARIANT" in # 何かする前に確かめる (依頼 135) v1) CONFIG=pi05_mecharm_deep_even10_lora; EXP=deep_even10_v1 ;; b) CONFIG=pi05_mecharm_deep_even10_b_lora; EXP=deep_even10_v1_b ;; *) echo "[ERROR] は v1 か b: $VARIANT" >&2; exit 2 ;; esac N_MAC=50 TAR=/workspace/data/${NAME}_raw_episodes.tar DATA=/workspace/data/$NAME OPENPI=/workspace/openpi ADDON=/workspace/r2r2r/pi05/openpi_addon NORM_DST=assets/$CONFIG/local/$NAME/norm_stats.json # $OPENPI からの相対 [ -f "$TAR" ] || { echo "[ERROR] tar がない: $TAR" >&2; exit 1; } # shellcheck disable=SC1091 [ -f "$HOME/.local/bin/env" ] && source "$HOME/.local/bin/env" echo "== 1. tar を広げる → $DATA" # 前に広げたものへ上書きしない (pod_prep_trim_corr.sh と同じ. 空の一時フォルダに広げて確かめてから入れ替える) TMP="$DATA.tmp.$$" rm -rf "$TMP" mkdir -p "$TMP" tar xf "$TAR" -C "$TMP" N=$(find "$TMP/raw_episodes" -mindepth 2 -maxdepth 2 -name episode.npz | wc -l | tr -d ' ') [ "$N" = "$N_MAC" ] || { echo "[ERROR] tar のエピソードが $N 本 (Mac で作ったときは $N_MAC 本): $TAR" >&2; rm -rf "$TMP"; exit 1; } rm -rf "$DATA" mv "$TMP" "$DATA" echo " エピソード $N 本 (Mac で作ったときは $N_MAC 本)" cd "$OPENPI" echo "== 2. 学習設定 $CONFIG を足す (steps=${STEPS}・variant ${VARIANT}. π0.5 base から)" python3 "$ADDON/add_deep_config.py" "$OPENPI" --steps "$STEPS" --variant "$VARIANT" echo "== 3. LeRobot 形式に変換 (local/$NAME)" uv run python /workspace/r2r2r/pi05/convert_to_lerobot.py --raw-dir "$DATA/raw_episodes" --repo-id "local/$NAME" echo "== 4. 正規化の値をこの $N 本で測り直す (compute_norm_stats.py --config-name $CONFIG)" rm -f "$NORM_DST" # 前の回の値を残さない (測れなかったときに古い値で学習しない) uv run scripts/compute_norm_stats.py --config-name "$CONFIG" [ -s "$NORM_DST" ] || { echo "[ERROR] 正規化の値ができていない: $OPENPI/$NORM_DST" >&2; exit 1; } SHA=$(sha256sum "$NORM_DST" | cut -d' ' -f1) echo " $OPENPI/$NORM_DST (sha256 ${SHA:0:12}…)" echo "NORM sha256=$SHA path=$NORM_DST" echo "== 5. 準備できました. 学習はこのコマンドで始める (このスクリプトでは流さない):" echo " cd $OPENPI && XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 uv run scripts/train.py $CONFIG --exp-name=$EXP --overwrite 2>&1 | tee /workspace/logs/train_$EXP.log"