YAML Metadata Warning:empty or missing yaml metadata in repo card

Check out the documentation for more information.

Cyclo-Lab โ†’ LeRobot Sim2Real ์›Œํฌํ”Œ๋กœ์šฐ

FFW_SG2 (L-Table) ๊ธฐ์ค€. HF ๊ณ„์ •: JSHNSL.

ํ•ต์‹ฌ: ๋‹จ๊ณ„๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋Š” ํŒŒ์ด์ฌ์ด ๋‹ค๋ฅด๋‹ค.

๋ช…๋ น ์‹ค์ฒด ์šฉ๋„
lerobot-python lerobot venv (/root/lerobot_env, py3.12 / lerobot 0.5.2 / ๋ฐ์ดํ„ฐ v3.0) ๋ณ€ํ™˜ยท์—…๋กœ๋“œยทํ•™์Šต
python Isaac Sim (_isaac_sim/python.sh, py3.11 / lerobot 0.3.3 / ๋ฐ์ดํ„ฐ v2.1) ์‹œ๋ฎฌ ๋กค์•„์›ƒ (isaaclab)
$ISAACLAB_PATH/_isaac_sim/python.sh ์œ„ python์˜ ํ’€ ๊ฒฝ๋กœ isaac python์— pip ์„ค์น˜ํ•  ๋•Œ

โš ๏ธ ๋ฒ„์ „ ๋ถ„๋ฆฌ: ํ•™์Šต์šฉ venv๋Š” lerobot 0.5.2(v3.0). ๋กค์•„์›ƒ์šฉ isaac python์€ 3.11์ด๋ผ 0.5.2(โ‰ฅ3.12 ์š”๊ตฌ)๋ฅผ ๋ชป ๋„ฃ์–ด 0.3.3 ์œ ์ง€. ๋‘˜์€ ๋ณ„๊ฐœ๋ผ ์„œ๋กœ ์˜ํ–ฅ ์—†์Œ.


์ด ์ €์žฅ์†Œ ๊ตฌ์กฐ (JSHNSL/humanoid-imitation-learning)

์ฝ”๋“œ ยท ๋ชจ๋ธ ยท ๋ฐ์ดํ„ฐ์…‹์ด ์ด repo ํ•œ ๊ณณ์— ๋ชจ์—ฌ ์žˆ์Œ. ๋ฒ ์ด์Šค๋Š” ROBOTIS cyclo_lab + lerobot-cyclo 0.5.2.

humanoid-imitation-learning/
โ”œโ”€โ”€ README.md                        ์ด ๋ฌธ์„œ (= WORKFLOW.md)
โ”œโ”€โ”€ LEROBOT_UPGRADE.md               lerobot 0.3.3 โ†’ 0.5.2 ์—…๊ทธ๋ ˆ์ด๋“œ
โ”œโ”€โ”€ DASHBOARD_CHANGES.md             ๋Œ€์‹œ๋ณด๋“œ ์„ธ์…˜ ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ
โ”œโ”€โ”€ HDF5_HUB_README.md               HDF5 ํ—ˆ๋ธŒ repo์˜ README (sync_docs.py๊ฐ€ ์—…๋กœ๋“œ)
โ”œโ”€โ”€ push_dataset.py                  LeRobot ๋ฐ์ดํ„ฐ์…‹ HF ์—…๋กœ๋“œ (ํ•™์Šต์šฉ repo)
โ”œโ”€โ”€ push_hdf5.py                     ์›๋ณธ HDF5 HF ์—…๋กœ๋“œ (HDF5 ํ—ˆ๋ธŒ repo)
โ”œโ”€โ”€ merge_hdf5_demos.py              HDF5 ๋ณ‘ํ•ฉ (์„ธ์…˜/๋‹จ๊ณ„๋ณ„)
โ”œโ”€โ”€ hpo_optuna.py                    Optuna ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹ + ํŠœ๋‹๊ฐ’์œผ๋กœ ํ•™์Šต
โ”œโ”€โ”€ hpo_train_shim.py                โ”” ํŠœ๋‹์ด ์“ฐ๋Š” ํ•™์Šต ๋Ÿฐ์ฒ˜ (diffusion ์ƒ˜ํ”Œ๋Ÿฌ ๋ฒ„๊ทธ ์šฐํšŒ)
โ”œโ”€โ”€ sg2_ltable_dashboard.py          ๋…นํ™”ยทํŒŒ์ดํ”„๋ผ์ธ ๋Œ€์‹œ๋ณด๋“œ (์„ธ์…˜ ๋„ค์ด๋ฐ)
โ”œโ”€โ”€ scripts/sim2real/imitation_learning/
โ”‚   โ”œโ”€โ”€ data_converter/isaaclab2lerobot.py      HDF5 โ†’ LeRobot(v3.0) ๋ณ€ํ™˜
โ”‚   โ””โ”€โ”€ inference/
โ”‚       โ”œโ”€โ”€ eval_policy_sim.py                   ์‹œ๋ฎฌ ๋กค์•„์›ƒ ํ‰๊ฐ€
โ”‚       โ””โ”€โ”€ convert_policy_v05_to_v03.py         0.5.2 ์ •์ฑ… โ†’ 0.3.3 (๋กค์•„์›ƒ์šฉ)
โ”œโ”€โ”€ models/                          ํ•™์Šต ์ •์ฑ… (0.5.2 ์›๋ณธ + _v03 ๋กค์•„์›ƒ์šฉ)
โ””โ”€โ”€ datasets/ffw_sg2_ltable_merge/   v3.0 LeRobot ๋ฐ์ดํ„ฐ์…‹

์žฌํ˜„ ์ˆœ์„œ: โ‘  cyclo_lab + lerobot-cyclo ์ค€๋น„ โ†’ โ‘ก ์œ„ ์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์น˜ โ†’ โ‘ข ์•„๋ž˜ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰.


Setup โ€” ํ™˜๊ฒฝ ์ค€๋น„ (์ตœ์ดˆ 1ํšŒ)

Prerequisites: NVIDIA Docker(Container Toolkit) ยท Isaac Sim ์ปจํ…Œ์ด๋„ˆ ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ์กฑ ยท NVIDIA GPU + ๋“œ๋ผ์ด๋ฒ„

1. EKAIWORKER ์˜ค๋ฒ„๋ ˆ์ด ํด๋ก  + ์…‹์—… โ€” cyclo_lab / ai_worker / robotis_applications ํ•œ ๋ฒˆ์—:

git clone https://github.com/Disniekie01/EKAIWORKER.git AIWORKER
cd AIWORKER
./setup.sh ~/AIWORKER

setup.sh๊ฐ€ ์„ธ ์ €์žฅ์†Œ๋ฅผ ๊ณ ์ • ์ปค๋ฐ‹์œผ๋กœ ํด๋ก  + ์„œ๋ธŒ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” + ์˜ค๋ฒ„๋ ˆ์ด ์ ์šฉ๊นŒ์ง€ ์ž๋™ ์ฒ˜๋ฆฌ (upstream ์ „์ฒด๋ฅผ vendoring ํ•˜์ง€ ์•Š์Œ). ๊ตฌ์„ฑ:

  • cyclo_lab โ€” Isaac Sim ํ™˜๊ฒฝ ยท ๋…นํ™” ยท Mimic ํŒŒ์ดํ”„๋ผ์ธ (+ ์ด ์›Œํฌํ”Œ๋กœ์šฐ ์Šคํฌ๋ฆฝํŠธ)
  • ai_worker โ€” ๋ชจ์…˜ ์ œ์–ด
  • robotis_applications โ€” VR teleop ํผ๋ธ”๋ฆฌ์…”

2. Docker ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™:

cd ~/AIWORKER/cyclo_lab/docker && ./container.sh start              # ํ•™์Šตยท์‹œ๋ฎฌ (ํ•„์ˆ˜)
cd ~/AIWORKER/robotis_applications/docker && ./container.sh start   # VR teleop (๋…นํ™” ์‹œ)
cd ~/AIWORKER/ai_worker/docker && ./container.sh start              # ๋ชจ์…˜ ์ œ์–ด (๋…นํ™” ์‹œ)

์ปจํ…Œ์ด๋„ˆ ์ง„์ž… (์ดํ›„ ๋ชจ๋“  ์ž‘์—…์€ ์ด ์•ˆ์—์„œ):

cd ~/AIWORKER/cyclo_lab && ./docker/container.sh enter

ํฌํ•จ๋œ ๊ฒƒ: Isaac Sim 5.1.0 ยท Isaac Lab v2.3.0 ยท CycloneDDS 0.10.2 ยท LeRobot venv

3. LeRobot 0.5.2(v3.0) ์„ค์น˜ (ํ•™์Šต venv /root/lerobot_env, ์ž์„ธํžˆ๋Š” LEROBOT_UPGRADE.md):

(a) venv๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด (lerobot-python alias ๋™์ž‘) โ€” ์—…๊ทธ๋ ˆ์ด๋“œ๋งŒ:

lerobot-pip install "lerobot[training,av-dep] @ git+https://github.com/ROBOTIS-GIT/lerobot-cyclo.git"

(b) venv๊ฐ€ ์—†์œผ๋ฉด โ€” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒ์„ฑ. โš ๏ธ python3๋Š” isaac 3.11 alias๋ผ ์•ˆ ๋จ โ†’ ์‹œ์Šคํ…œ python3.12๋กœ:

/usr/bin/python3.12 -m venv /root/lerobot_env
/root/lerobot_env/bin/pip install --upgrade pip
/root/lerobot_env/bin/pip install "lerobot[training,av-dep] @ git+https://github.com/ROBOTIS-GIT/lerobot-cyclo.git" h5py
# alias ๋“ฑ๋ก
cat >> ~/.bashrc <<'EOF'
export LEROBOT_VENV=/root/lerobot_env
alias lerobot-python='${LEROBOT_VENV}/bin/python3'
alias lerobot-pip='${LEROBOT_VENV}/bin/pip'
alias lerobot-hf='${LEROBOT_VENV}/bin/hf'
alias lerobot-activate='source ${LEROBOT_VENV}/bin/activate'
EOF
source ~/.bashrc
lerobot-python -c "import lerobot; print(lerobot.__version__)"   # 0.5.2 ํ™•์ธ

โš ๏ธ (ํ•„์ˆ˜) torch/torchvision ๋ฒ„์ „ ๋งž์ถ”๊ธฐ โ€” ์•ˆ ๋งž์œผ๋ฉด ํ•™์Šต์ด mismatch๋กœ ์•ˆ ๋Ž:

lerobot-python -c "import torch,torchvision; print(torch.__version__, torchvision.__version__)"
# ๋ฐ˜๋“œ์‹œ  2.7.1+cu128 / 0.22.1+cu128  ์ด์–ด์•ผ ํ•จ.
# ๋‹ค๋ฅด๋ฉด(์˜ˆ: 2.7.0/0.22.0) ๊ฐ•์ œ ์žฌ์„ค์น˜:
lerobot-pip install --index-url https://download.pytorch.org/whl/cu128 \
    --force-reinstall "torch==2.7.1" "torchvision==0.22.1"

๋กค์•„์›ƒ์šฉ isaac python(3.11)์€ 0.3.3 ์œ ์ง€ (4-a ์ฐธ๊ณ ).

4. (๋…นํ™” ์‹œ) VR teleop ๋Œ€์‹œ๋ณด๋“œ:

cd ~/AIWORKER/cyclo_lab && python3 sg2_ltable_dashboard.py     # http://localhost:8765

5. ์ด repo์˜ ์Šคํฌ๋ฆฝํŠธ ๋ฐ›๊ธฐ (์ปจํ…Œ์ด๋„ˆ ์•ˆ, /workspace/cyclo_lab ์—์„œ):

cd /workspace/cyclo_lab

# ๋ฃจํŠธ ์Šคํฌ๋ฆฝํŠธ (๋ณ€ํ™˜ยท์—…๋กœ๋“œยท๋ณ‘ํ•ฉยทํŠœ๋‹)
lerobot-hf download JSHNSL/humanoid-imitation-learning \
    push_dataset.py push_hdf5.py merge_hdf5_demos.py \
    hpo_optuna.py hpo_train_shim.py sync_docs.py \
    --local-dir .

# ๋กค์•„์›ƒ/๋ณ€ํ™˜ ์Šคํฌ๋ฆฝํŠธ (๊ฒฝ๋กœ ๊ตฌ์กฐ ๊ทธ๋Œ€๋กœ ์žฌํ˜„๋จ)
lerobot-hf download JSHNSL/humanoid-imitation-learning \
    --include "scripts/sim2real/imitation_learning/**" \
    --local-dir .

--local-dir . ์ด๋ผ repo ์•ˆ์˜ ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋Œ€๋กœ ์žฌํ˜„๋œ๋‹ค โ†’ scripts/sim2real/imitation_learning/inference/eval_policy_sim.py ๋“ฑ์ด ์ œ์ž๋ฆฌ์— ๋–จ์–ด์ง„๋‹ค.

โš ๏ธ ๊ธฐ์กด ํŒŒ์ผ์„ ๋ฎ์–ด์“ด๋‹ค. ๋กœ์ปฌ์—์„œ ๊ณ ์นœ ๊ฒŒ ์žˆ์œผ๋ฉด ๋จผ์ € ๋ฐฑ์—…ํ•  ๊ฒƒ. โš ๏ธ model repo๋ผ --repo-type ์ด ํ•„์š” ์—†๋‹ค (๊ธฐ๋ณธ๊ฐ’์ด model).

6. (์„ ํƒ) ๋ฐ์ดํ„ฐ์…‹ยท๋ชจ๋ธ: JSHNSL/humanoid-imitation-learning ์˜ models/ ยท ๋ฐ์ดํ„ฐ์…‹ repo ffw_sg2_ltable_merge ยท HDF5 ํ—ˆ๋ธŒ ffw_sg2_hdf5 ์—์„œ.

โ†’ ์ดํ›„ ๋งค๋ฒˆ์€ ./docker/container.sh enter ๋กœ ์ ‘์†ํ•ด์„œ ์•„๋ž˜ 1~4๋‹จ๊ณ„ ์‹คํ–‰.


๊ฒฝ๋กœ ๊ทœ์น™ (์ด repo ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผํ•  ๋•Œ)

์ด repo์—๋Š” scripts/ ยท datasets/ffw_sg2_ltable_merge/ ยท models/ ๊ฐ€ ๋“ค์–ด์žˆ์Œ. ์•„๋ž˜ ๋ช…๋ น์€ cyclo_lab ๋ฃจํŠธ(/workspace/cyclo_lab)์—์„œ ์‹คํ–‰ ๊ธฐ์ค€์ด๋ฉฐ, repo์˜ ํด๋”๋ฅผ cyclo_lab์— ๋ฐฐ์น˜ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค:

repo ํด๋” cyclo_lab์— ๋‘๋Š” ์œ„์น˜ ๋ช…๋ น์—์„œ ์“ฐ๋Š” ๊ฒฝ๋กœ
scripts/ ๊ทธ๋Œ€๋กœ scripts/sim2real/...
datasets/ffw_sg2_ltable_merge/ ./datasets/ ์•„๋ž˜ --dataset.root=./datasets/ffw_sg2_ltable_merge
models/<์ด๋ฆ„>/ ./models/ ์•„๋ž˜ ๋กค์•„์›ƒ --policy ./models/<์ด๋ฆ„>

์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ: ๋ณ€ํ™˜ ์ถœ๋ ฅ(./datasets/lerobot/<ํƒ€์ž„์Šคํƒฌํ”„>)ยทํ•™์Šต ์ถœ๋ ฅ(./outputs/train/<NAME>)์„ ๋Œ€์‹  ์“ฐ๋ฉด ๋œ๋‹ค.


1. HDF5 โ†’ LeRobot ๋ณ€ํ™˜ (lerobot-python) โ€” ์ง์ ‘ ๋ฐ์ดํ„ฐ ๋งŒ๋“ค ๋•Œ๋งŒ

lerobot-python scripts/sim2real/imitation_learning/data_converter/isaaclab2lerobot.py \
    --task=Cyclo-Real-Pick-Place-LTable-FFW-SG2-v0 \
    --robot_type FFW_SG2 \
    --dataset_file ./datasets/ffw_sg2_l_table_raw.hdf5

๊ฒฐ๊ณผ: ./datasets/lerobot/<ํƒ€์ž„์Šคํƒฌํ”„>/ (data/ videos/ meta/)


1.5 ์—ฌ๋Ÿฌ HDF5 ๋ณ‘ํ•ฉ (์„ ํƒ) (lerobot-python)

์—ฌ๋Ÿฌ ์„ธ์…˜/๋‹จ๊ณ„์˜ HDF5๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์„œ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ. ์Šคํฌ๋ฆฝํŠธ: merge_hdf5_demos.py (์ €์žฅ์†Œ ๋ฃจํŠธ์— ์žˆ์Œ โ†’ ์ปจํ…Œ์ด๋„ˆ /workspace/cyclo_lab์—์„œ ์‹คํ–‰).

lerobot-python merge_hdf5_demos.py \
    --inputs <ํŒŒ์ผ1.hdf5> <ํŒŒ์ผ2.hdf5> ... \
    --output <๋ณ‘ํ•ฉ๊ฒฐ๊ณผ.hdf5>
  • --inputs : ํ•ฉ์น  HDF5๋“ค (์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ, ํ•„์ˆ˜)
  • --output : ๊ฒฐ๊ณผ ํŒŒ์ผ (ํ•„์ˆ˜)
  • --prefix : ์ถœ๋ ฅ ๋ฐ๋ชจ ๋ผ๋ฒจ ์ ‘๋‘์‚ฌ (๊ธฐ๋ณธ demo)

์˜ˆ โ€” ํ•œ ํƒœ์Šคํฌ์˜ ๋ชจ๋“  joint ์„ธ์…˜์„ glob์œผ๋กœ:

lerobot-python merge_hdf5_demos.py \
    --inputs datasets/ffw_sg2_l_table/*/*_joint.hdf5 \
    --output datasets/ffw_sg2_l_table_merged_joint.hdf5
  • ๋ฐ๋ชจ ๋ผ๋ฒจ(demo_0..demo_N)์€ ์ˆซ์ž์ˆœ ์ •๋ ฌ + ์ˆœ์ฐจ ์žฌ๋ฒˆํ˜ธ ์ฒ˜๋ฆฌ๋จ
  • ํ•ฉ์น˜๋Š” ํŒŒ์ผ๋ผ๋ฆฌ ๋กœ๋ด‡ยทํƒœ์Šคํฌยท์ฐจ์›ยท์นด๋ฉ”๋ผ๊ฐ€ ๊ฐ™์•„์•ผ ํ•จ (๋ณดํ†ต joint๋ผ๋ฆฌ)
  • ๋ณ‘ํ•ฉ ํ›„ isaaclab2lerobot(1๋‹จ๊ณ„)์— --dataset_file ๋กœ ๋„˜๊ฒจ ๋ณ€ํ™˜
  • raw๋ฅผ ์„ž์„ ๋• ๋จผ์ € action_data_converter --action_type joint ๋กœ ํ†ต์ผ

2. HuggingFace ์—…๋กœ๋“œ โ€” ์ „๋ถ€ humanoid-imitation-learning ํ•œ repo๋กœ

๋ณ„๋„ ๋ฐ์ดํ„ฐ์…‹/๋ชจ๋ธ repo๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ด repo์˜ ํ•˜์œ„ํด๋”(datasets/, models/)์— ๋ชจ์€๋‹ค.

๋กœ๊ทธ์ธ (1ํšŒ):

export HF_TOKEN=hf_writeํ† ํฐ          # ๋˜๋Š”: lerobot-python -c "from huggingface_hub import login; login()"
unset HF_HUB_OFFLINE                  # ์˜คํ”„๋ผ์ธ ๋ณ€์ˆ˜ ๋‚จ์•„์žˆ์œผ๋ฉด ํ•ด์ œ

๋ฐ์ดํ„ฐ์…‹ โ†’ ๋ณ„๋„ dataset repo (ํ•™์Šต์—์„œ --dataset.repo_id๋กœ ๋ฐ”๋กœ ๋‹น๊ธฐ๋ ค๋ฉด dataset ํƒ€์ž… repo์—ฌ์•ผ ํ•จ):

lerobot-python push_dataset.py \
    --repo_id JSHNSL/ffw_sg2_ltable_merge \
    --root ./datasets/lerobot/<ํƒ€์ž„์Šคํƒฌํ”„>       # 1๋‹จ๊ณ„ ๋ณ€ํ™˜ ์ถœ๋ ฅ ํด๋”

โ†’ https://huggingface.co/datasets/JSHNSL/ffw_sg2_ltable_merge (3๋‹จ๊ณ„ ํ•™์Šต์ด ์ด๊ฑธ ์”€)

๋ชจ๋ธ(ํ•™์Šต ๊ฒฐ๊ณผ) โ†’ models/<์ด๋ฆ„>/:

lerobot-python -c "
from huggingface_hub import upload_folder
upload_folder(folder_path='./outputs/train/act_merge/checkpoints/last/pretrained_model',
  repo_id='JSHNSL/humanoid-imitation-learning', repo_type='model',
  path_in_repo='models/act_merge')
"

๊ทธ๋ž˜์„œ ํ•™์Šต์€ --policy.push_to_hub=false๋กœ ๋‘๊ณ (๋ณ„๋„ repo ์•ˆ ๋งŒ๋“ค๊ฒŒ), ์—ฌ๊ธฐ์ฒ˜๋Ÿผ ์ˆ˜๋™ ์—…๋กœ๋“œํ•œ๋‹ค.


2.5 ์›๋ณธ HDF5 โ†’ HDF5 ํ—ˆ๋ธŒ repo (push_hdf5.py)

push_dataset.py๋Š” ๋ณ€ํ™˜๋œ LeRobot ๋ฐ์ดํ„ฐ์…‹(meta/ data/ videos/)๋งŒ ์˜ฌ๋ฆฐ๋‹ค. Isaac Sim์—์„œ ๋‚˜์˜จ ์›๋ณธ HDF5(raw / annotate / ik / generate / joint)๋Š” ๋ณ„๋„ "ํ—ˆ๋ธŒ" dataset repo์— ์Œ“๋Š”๋‹ค.

์™œ ๋”ฐ๋กœ?

  • ํ•™์Šต์šฉ repo(ffw_sg2_ltable_merge)๋Š” ํ•™์Šต ๋•Œ๋งˆ๋‹ค ํ†ต์งธ๋กœ ๋ฐ›์œผ๋ฏ€๋กœ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•จ (HDF5๋Š” ์ˆ˜ GB)
  • ํ—ˆ๋ธŒ repo์—” ์•ž์œผ๋กœ ๋‹ค๋ฅธ ํƒœ์Šคํฌ HDF5๋„ ๊ณ„์† ๋ˆ„์  ๊ฐ€๋Šฅ

ํ—ˆ๋ธŒ repo: JSHNSL/ffw_sg2_hdf5 (dataset ํƒ€์ž…, public) โ†’ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ ๋ฐฉ๋ฒ•์€ ๊ทธ repo์˜ README์—๋„ ์ •๋ฆฌ๋˜์–ด ์žˆ์Œ (HDF5_HUB_README.md)

export HF_TOKEN=hf_writeํ† ํฐ
unset HF_HUB_OFFLINE

# 1) ๋ญ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ์ง€ ๋จผ์ € ํ™•์ธ (์—…๋กœ๋“œ ์•ˆ ํ•จ)
lerobot-python push_hdf5.py \
    --repo_id JSHNSL/ffw_sg2_hdf5 \
    --paths datasets/ffw_sg2_l_table \
    --dry_run

# 2) ์‹ค์ œ ์—…๋กœ๋“œ (repo ์—†์œผ๋ฉด ์ž๋™ ์ƒ์„ฑ)
lerobot-python push_hdf5.py \
    --repo_id JSHNSL/ffw_sg2_hdf5 \
    --paths datasets/ffw_sg2_l_table

ํด๋” ๊ตฌ์กฐ๊ฐ€ repo ์•ˆ์— ๊ทธ๋Œ€๋กœ ๋ณด์กด๋œ๋‹ค โ€” ํƒœ์Šคํฌ๋ณ„๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ถ„๋ฆฌ๋จ:

ffw_sg2_l_table/20260710/1421_58_ffw_sg2_l_table_raw.hdf5
ffw_sg2_l_table/20260710/1425_58_ffw_sg2_l_table_ik.hdf5
...

์ฃผ์š” ์˜ต์…˜:

์˜ต์…˜ ์„ค๋ช…
--paths ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ. ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์žฌ๊ท€ ํƒ์ƒ‰(*.hdf5), ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์ด repo ์•ˆ ์ตœ์ƒ์œ„ ํด๋”๊ฐ€ ๋จ
--dry_run ์˜ฌ๋ฆด ๋ชฉ๋ก + ์ด ์šฉ๋Ÿ‰๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ (ํ•ญ์ƒ ๋จผ์ € ์‹คํ–‰ ๊ถŒ์žฅ)
--path_in_repo repo ์•ˆ ์ ‘๋‘ ๊ฒฝ๋กœ (์˜ˆ: --path_in_repo hdf5). ๊ธฐ๋ณธ์€ repo ๋ฃจํŠธ
--private ๋น„๊ณต๊ฐœ repo๋กœ ์ƒ์„ฑ

ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ์˜ฌ๋ฆฌ๊ธฐ / ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ ํ•œ ๋ฒˆ์—:

lerobot-python push_hdf5.py --repo_id JSHNSL/ffw_sg2_hdf5 \
    --paths datasets/ffw_sg2_l_table_joint.hdf5 datasets/other_dataset --dry_run

๋‹ค์‹œ ๋ฐ›๊ธฐ (lerobot-hf = venv์˜ hf CLI. --repo-type dataset ํ•„์ˆ˜):

# ํŒŒ์ผ ํ•˜๋‚˜
lerobot-hf download JSHNSL/ffw_sg2_hdf5 --repo-type dataset \
    0713_ffw_sg2_l_table_annotate_merge_num96.hdf5 \
    --local-dir ./datasets

# ํŒจํ„ด์œผ๋กœ (์˜ˆ: joint ๋‹จ๊ณ„๋งŒ)
lerobot-hf download JSHNSL/ffw_sg2_hdf5 --repo-type dataset \
    --include "*_joint.hdf5" --local-dir ./datasets

โš ๏ธ HDF5๋Š” ํฌ๋‹ค(๋‹จ์ผ 3~5GB๋„ ์žˆ์Œ). ์—…๋กœ๋“œ ์ „ --dry_run์œผ๋กœ ์ด ์šฉ๋Ÿ‰ ํ™•์ธ ํ•„์ˆ˜.


2.6 HF์— ์˜ฌ๋ฆฐ ํŒŒ์ผ ์‚ญ์ œ

์ž˜๋ชป ์˜ฌ๋ ธ์„ ๋•Œ. lerobot-hf repos delete-files ์‚ฌ์šฉ (write ํ† ํฐ ํ•„์š”).

lerobot-hf auth login          # ์•ˆ ํ–ˆ์œผ๋ฉด

dataset repo (HDF5 ํ—ˆ๋ธŒ ๋“ฑ) โ€” --repo-type dataset ํ•„์ˆ˜:

# ํŒŒ์ผ ํ•˜๋‚˜
lerobot-hf repos delete-files JSHNSL/ffw_sg2_hdf5 \
    1425_58_ffw_sg2_l_table_ik.hdf5 --repo-type dataset

# ์—ฌ๋Ÿฌ ๊ฐœ (๊ณต๋ฐฑ ๊ตฌ๋ถ„)
lerobot-hf repos delete-files JSHNSL/ffw_sg2_hdf5 \
    a.hdf5 b.hdf5 --repo-type dataset

# ํŒจํ„ด (fnmatch, '*'๋Š” ์žฌ๊ท€)
lerobot-hf repos delete-files JSHNSL/ffw_sg2_hdf5 \
    "*_ik.hdf5" --repo-type dataset

# ํด๋” ํ†ต์งธ๋กœ
lerobot-hf repos delete-files JSHNSL/ffw_sg2_hdf5 \
    "ffw_sg2_l_table/*" --repo-type dataset

model repo (humanoid-imitation-learning) โ€” --repo-type ์ƒ๋žต (๊ธฐ๋ณธ์ด model):

lerobot-hf repos delete-files JSHNSL/humanoid-imitation-learning "models/act_8ep/*"

repo ์ž์ฒด ์‚ญ์ œ:

lerobot-hf repos delete JSHNSL/์–ด๋–คrepo --repo-type dataset

์ฃผ์˜์‚ฌํ•ญ:

  • โš ๏ธ --repo-type dataset ๋นผ๋จน์œผ๋ฉด model repo๋ฅผ ์ฐพ์•„์„œ ์—‰๋šฑํ•˜๊ฒŒ ์‹คํŒจํ•œ๋‹ค (๋‹ค์šด๋กœ๋“œ ๋•Œ์™€ ๊ฐ™์€ ํ•จ์ •)
  • ํŒจํ„ด์ด ๋ญ˜ ์ง€์šธ์ง€ ์• ๋งคํ•˜๋ฉด repo์˜ Files and versions ํƒญ์—์„œ ๋จผ์ € ํ™•์ธ
  • --create-pr ๋ถ™์ด๋ฉด ๋ฐ”๋กœ ์•ˆ ์ง€์šฐ๊ณ  PR๋กœ ๋งŒ๋“ค์–ด ๊ฒ€ํ†  ํ›„ ๋จธ์ง€ ๊ฐ€๋Šฅ (์‹ค์ˆ˜ ๋ฐฉ์ง€)

โš ๏ธ ์‚ญ์ œํ•ด๋„ ์šฉ๋Ÿ‰์€ ์•ˆ ์ค„์–ด๋“ ๋‹ค โ†’ ์Šค์ฟผ์‹œ๋กœ ํšŒ์ˆ˜

HF๋Š” git ๊ธฐ๋ฐ˜์ด๋ผ delete-files๋กœ ์ง€์›Œ๋„ ํžˆ์Šคํ† ๋ฆฌ์— blob์ด ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์ €์žฅ์†Œ ์šฉ๋Ÿ‰์€ ์•ˆ ์ค„์–ด๋“ ๋‹ค. repo๋ฅผ ์•ˆ ์ง€์šฐ๊ณ  ์šฉ๋Ÿ‰์„ ํšŒ์ˆ˜ํ•˜๋ ค๋ฉด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์Šค์ฟผ์‹œํ•œ๋‹ค (์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ๋ˆŒ๋Ÿฌ ์˜› blob ์ œ๊ฑฐ).

# โ‘  ๋จผ์ € ํŒŒ์ผ์„ ์‹ค์ œ๋กœ ์‚ญ์ œ (์•„์ง ํžˆ์Šคํ† ๋ฆฌ์—” ๋‚จ์•„์žˆ์Œ)
lerobot-hf repos delete-files JSHNSL/ffw_sg2_hdf5 "์ง€์šธํŒŒ์ผ.hdf5" --repo-type dataset

# โ‘ก ํžˆ์Šคํ† ๋ฆฌ ์Šค์ฟผ์‹œ โ†’ ์—ฌ๊ธฐ์„œ ์šฉ๋Ÿ‰์ด ์‹ค์ œ๋กœ ํšŒ์ˆ˜๋จ
lerobot-python -c "
from huggingface_hub import HfApi
HfApi().super_squash_history(repo_id='JSHNSL/ffw_sg2_hdf5', repo_type='dataset')
print('squashed')
"

์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค: โ‘ ๋กœ ์ง€์šฐ๊ณ  โ†’ โ‘ก๋กœ ์Šค์ฟผ์‹œ. ์Šค์ฟผ์‹œ๋Š” ํ˜„์žฌ HEAD ์ƒํƒœ๋งŒ ๋‚จ๊ธฐ๊ณ  ์ด์ „ ์ปค๋ฐ‹์„ ์ „๋ถ€ ๋ฒ„๋ฆฌ๋ฏ€๋กœ, ์ด๋ฏธ ์‚ญ์ œ๋œ ํŒŒ์ผ์˜ blob์ด ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค.

๋Œ€๊ฐ€:

  • โš ๏ธ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ์˜๊ตฌ ์†Œ๋ฉธ โ€” ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋‹ค
  • โš ๏ธ ์Šค์ฟผ์‹œํ•œ ๋ธŒ๋žœ์น˜๋Š” ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์™€ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๊ฐˆ๋ผ์ ธ ๋จธ์ง€ ๋ถˆ๊ฐ€
  • ๊ณผ๊ฑฐ ๋ฒ„์ „์— ์ ‘๊ทผํ•  ์ผ์ด ์—†์„ ๋•Œ๋งŒ. (HDF5 ์›๋ณธ ๋ณด๊ด€ repo๋ฉด ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋ณ„ ์˜๋ฏธ ์—†์–ด ๋ถ€๋‹ด์ด ์ ๋‹ค)
  • CLI ๋ช…๋ น์€ ์—†๋‹ค โ†’ ํŒŒ์ด์ฌ์œผ๋กœ๋งŒ ๊ฐ€๋Šฅ. write ํ† ํฐ ํ•„์š”.
๋ฐฉ๋ฒ• ์šฉ๋Ÿ‰ ํšŒ์ˆ˜ ํžˆ์Šคํ† ๋ฆฌ repo
delete-files ๋งŒ โŒ ์œ ์ง€ ์œ ์ง€
delete-files + super_squash_history โœ… ์†Œ๋ฉธ ์œ ์ง€ โ† ๋ณดํ†ต ์ด๊ฑธ ์›ํ•จ
repo ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑ โœ… ์†Œ๋ฉธ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•จ (READMEยท์„ค์ • ๋‹ค์‹œ)

3. ํ•™์Šต โ€” ACT / VQ-BeT / Diffusion (lerobot-python)

๋ฐ์ดํ„ฐ๋Š” dataset repo JSHNSL/ffw_sg2_ltable_merge ์—์„œ ์ž๋™์œผ๋กœ ๋ฐ›์Œ (์—†์œผ๋ฉด 2๋‹จ๊ณ„์—์„œ ๋จผ์ € ์ƒ์„ฑ).

๊ณตํ†ต ๋ช…๋ น (<POLICY>, <NAME>๋งŒ ๋ฐ”๊ฟˆ):

unset HF_HUB_OFFLINE
lerobot-python -m lerobot.scripts.lerobot_train \
    --dataset.repo_id=JSHNSL/ffw_sg2_ltable_merge \
    --policy.type=<POLICY> \
    --output_dir=./outputs/train/<NAME> \
    --policy.device=cuda \
    --policy.push_to_hub=false \
    --num_workers=8 --dataset.video_backend=pyav \
    --steps=100000 --save_freq=20000
์ •์ฑ… <POLICY> <NAME> ํŠน์ง•
ACT act act_merge ๊ธฐ๋ณธยท๋น ๋ฆ„ยท์•ˆ์ •์ 
VQ-BeT vqbet vqbet_merge ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ
Diffusion diffusion diffusion_merge ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌยท๋А๋ฆผยท๋ชจ๋ธ ํผ, diffusers ํ•„์š”
  • ๋ชจ๋“ˆ๋ช…(0.5.x): lerobot.scripts.lerobot_train (๊ตฌ๋ฒ„์ „ ...train ์•„๋‹˜)
  • --dataset.repo_id : dataset repo JSHNSL/ffw_sg2_ltable_merge โ†’ HF์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œยท์บ์‹œ (์˜จ๋ผ์ธยท๋กœ๊ทธ์ธ ํ•„์š”)
  • โš ๏ธ model repo(JSHNSL/humanoid-imitation-learning)๋ฅผ ๋„ฃ์œผ๋ฉด dataset ์กฐํšŒ 404 โ†’ ๋ฐ˜๋“œ์‹œ dataset repo๋งŒ
  • ๋กœ์ปฌ ํด๋”๋กœ ์“ฐ๋ ค๋ฉด โ†’ --dataset.root=<meta/info.json ์žˆ๋Š” ํด๋”> ์ถ”๊ฐ€ (์˜ˆ: ์ง์ ‘ ๋ณ€ํ™˜ํ•œ ./datasets/lerobot/<ํƒ€์ž„์Šคํƒฌํ”„>)
  • --num_workers=8 --dataset.video_backend=pyav : ์›Œ์ปค ์„ธ๊ทธํดํŠธ ํšŒํ”ผ. (์•ˆ์ „๋นต์€ --num_workers=0, ๋Œ€์‹  ๋А๋ฆผ)
  • --policy.push_to_hub=false : ์—…๋กœ๋“œ๋Š” 2๋‹จ๊ณ„์—์„œ humanoid๋กœ ์ˆ˜๋™
  • diffusion ModuleNotFoundError: diffusers โ†’ lerobot-pip install diffusers
  • ํ•˜๋‚˜์”ฉ ๋Œ๋ฆฌ๊ธฐ (๋™์‹œ ์‹คํ–‰ ์‹œ GPU OOM). ๋ฐ์ดํ„ฐ์…‹์€ v3.0 ํ•„์š” (v2.1์ด๋ฉด 3.5๋กœ ๋ณ€ํ™˜)

ํ•™์Šต ๊ฒฐ๊ณผ ํ™•์ธ

  • ํ•™์Šต ์ค‘(ํ„ฐ๋ฏธ๋„): step:200 ... loss:0.12 grdn:0.30 updt_s:0.01 ... โ†’ loss๊ฐ€ ๊พธ์ค€ํžˆ ๋‚ด๋ ค๊ฐ€๋ฉด ์ •์ƒ
  • ์ฒดํฌํฌ์ธํŠธ: outputs/train/<NAME>/checkpoints/ (020000/, last/ ...)
  • ์ตœ์ข… ์ •์ฑ… ํŒŒ์ผ: outputs/train/<NAME>/checkpoints/last/pretrained_model/ (config.json + model.safetensors)
  • ์‹ค์ œ ์„ฑ๋Šฅ(์„ฑ๊ณต๋ฅ ): 4๋‹จ๊ณ„ ์‹œ๋ฎฌ ๋กค์•„์›ƒ์œผ๋กœ ์ธก์ • (์ง„์งœ ํ‰๊ฐ€๋Š” ์ด๊ฒƒ)
  • ํ™•์ธ ๋๋‚˜๋ฉด โ†’ 2๋‹จ๊ณ„๋กœ models/<NAME> ์—…๋กœ๋“œ

3.2 ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹ โ€” Optuna (hpo_optuna.py)

์ •์ฑ… ์ด๋ฆ„ + ๋ฐ์ดํ„ฐ์…‹๋งŒ ์ฃผ๋ฉด โ†’ ํƒ์ƒ‰ โ†’ best ์ €์žฅ โ†’ ๊ทธ ๊ฐ’์œผ๋กœ ์ „์ฒด ํ•™์Šต โ†’ HF ์—…๋กœ๋“œ๊นŒ์ง€.

lerobot-pip install optuna        # ์ตœ์ดˆ 1ํšŒ

ํŒŒ์ผ 2๊ฐœ ํ•„์š”: hpo_optuna.py + hpo_train_shim.py (๊ฐ™์€ ํด๋”์—). shim์€ trial ํ•™์Šต์„ ์‹คํ–‰ํ•˜๋Š” ๋Ÿฐ์ฒ˜๋‹ค.


ํ•œ ๋ฐฉ์—: ํƒ์ƒ‰ โ†’ ํ•™์Šต โ†’ ๋ฐฐํฌ

lerobot-hf auth login          # ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ๋จผ์ € (1ํšŒ)

lerobot-python hpo_optuna.py \
    --policy diffusion \
    --repo_id JSHNSL/ffw_sg2_ltable_merge \
    --n_trials 12 \
    --steps 5000 \
    --num_workers 8 \
    --then_train \
    --full_steps 100000 \
    --push_to_hub \
    --hub_name diffusion_tuned \
    --fresh

--policy: act | vqbet | diffusion

๊ฒฐ๊ณผ๋ฌผ

  • best ํŒŒ๋ผ๋ฏธํ„ฐ โ†’ outputs/hpo/<policy>/best_params.json
  • ํ•™์Šต ๊ฒฐ๊ณผ โ†’ outputs/train/<policy>_tuned/checkpoints/last/pretrained_model/
  • ์—…๋กœ๋“œ โ†’ JSHNSL/humanoid-imitation-learning ์˜ models/<hub_name>/ (๊ฐ€์ค‘์น˜ + hpo_best_params.json)

๋‚˜๋ˆ ์„œ ์‹คํ–‰

ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ ๋ช…๋ น
ํƒ์ƒ‰๋งŒ hpo_optuna.py --policy act --n_trials 12 --steps 5000
์ €์žฅ๋œ best๋กœ ํ•™์Šต๋งŒ hpo_optuna.py --policy act --train_best
์ €์žฅ๋œ best๋กœ ํ•™์Šต + ๋ฐฐํฌ hpo_optuna.py --policy act --train_best --push_to_hub
๊ฒฐ๊ณผ ๋ณด๊ธฐ hpo_optuna.py --policy act --report_only
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์œ„ ๋ช…๋ น์— --fresh ์ถ”๊ฐ€

--then_train = "ํ•™์Šต๊นŒ์ง€", --push_to_hub = "๋ฐฐํฌ๊นŒ์ง€". ๋‘˜ ๋‹ค ์—†์œผ๋ฉด ํƒ์ƒ‰๋งŒ ํ•œ๋‹ค. --fresh ์—†์ด ์žฌ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ์กด study์— trial์ด ๋ˆ„์ ๋œ๋‹ค.


์ฃผ์š” ์˜ต์…˜

์ธ์ž ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
--n_trials 20 ์‹œ๋„ํ•  ์กฐํ•ฉ ์ˆ˜. core ๊ณต๊ฐ„(45์ฐจ์›)์ด๋ฉด **1015๋กœ ์ถฉ๋ถ„**
--steps 8000 trial๋‹น ํ•™์Šต ์Šคํ…. ๋„ˆ๋ฌด ์ค„์ด์ง€ ๋ง ๊ฒƒ (์•„๋ž˜ ์ฐธ๊ณ )
--num_workers 8 dataloader ์›Œ์ปค. 8์ด๋ฉด GPU๊ฐ€ ์ด๋ฏธ ํฌํ™” โ€” ๋” ๋Š˜๋ ค๋„ ์ด๋“ ์—†๋‹ค
--val_ratio 0.2 ์—ํ”ผ์†Œ๋“œ์˜ 20%๋ฅผ val๋กœ ๋ถ„๋ฆฌ
--fresh โ€” ๊ธฐ์กด study๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ
--space core ์•„๋ž˜ ์ฐธ๊ณ 
์ „์ฒด ํ•™์Šต
--full_steps 100000 ์ „์ฒด ํ•™์Šต ์Šคํ…
--save_freq full_steps/5 ์ฒดํฌํฌ์ธํŠธ ์ฃผ๊ธฐ
--full_batch_size ํŠœ๋‹๋œ ๊ฐ’ OOM ๋‚  ๋•Œ ๋ฎ์–ด์“ฐ๊ธฐ
--full_num_workers --num_workers ์ „์ฒด ํ•™์Šต์šฉ ์›Œ์ปค
--hub_name / --hub_repo_id <policy>_tuned / humanoid repo ์—…๋กœ๋“œ ์œ„์น˜
--train_extra โ€” ๋‚˜๋จธ์ง€๋ฅผ lerobot_train์— ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ (๋งจ ๋’ค์—)

๋ฌด์—‡์„ ํŠœ๋‹ํ•˜๋Š”๊ฐ€ โ€” --space core (๊ธฐ๋ณธ)

์ •์ฑ… ํƒ์ƒ‰ ๋Œ€์ƒ
ACT optimizer_lr, optimizer_lr_backbone, optimizer_weight_decay, dropout, batch_size
VQ-BeT optimizer_lr, optimizer_vqvae_lr, optimizer_weight_decay, dropout, batch_size
Diffusion optimizer_lr, optimizer_weight_decay, scheduler_warmup_steps, batch_size

chunk_size ยท horizon ยท n_action_steps ยท kl_weight ยท offset_loss_weight ๋“ฑ์€ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  lerobot ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ณ ์ •ํ•œ๋‹ค. ์ด์œ :

๋ชฉ์ ํ•จ์ˆ˜๊ฐ€ val loss์ธ๋ฐ, ์ด ๊ฐ’๋“ค์€ ์†์‹ค์˜ ์ •์˜ ์ž์ฒด๋ฅผ ๋ฐ”๊พผ๋‹ค.

  • ์˜ˆ์ธก ๊ธธ์ด(horizon/chunk_size): 8์Šคํ… ์•ž ์˜ˆ์ธก์ด 32์Šคํ… ์•ž๋ณด๋‹ค ์‰ฌ์šฐ๋‹ˆ loss๊ฐ€ ๋‚ฎ๋‹ค โ†’ ํƒ์ƒ‰์ด ๋ฌด์กฐ๊ฑด ์งง์€ chunk๋ฅผ ๊ณ ๋ฅธ๋‹ค. ์ •์ž‘ ๊ธด chunk๊ฐ€ ํƒœ์Šคํฌ ์„ฑ๊ณต์—” ๋” ์ข‹์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ์†์‹ค ๊ฐ€์ค‘์น˜(kl_weight, offset_loss_weight): ์†์‹ค ํ•ญ์— ๊ณฑํ•ด์ง€๋Š” ๊ฐ’์ด๋ผ ์ž‘์„์ˆ˜๋ก ์ˆซ์ž๊ฐ€ ์ž‘์•„์ง„๋‹ค. ํ’ˆ์งˆ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ตœ์†Ÿ๊ฐ’์ด ๋ฝ‘ํžŒ๋‹ค.

์ฆ‰ ์ด๊ฒƒ๋“ค์„ ๋„ฃ์œผ๋ฉด ํƒ์ƒ‰์ด ๋ชฉ์ ํ•จ์ˆ˜๋ฅผ ์†์ธ๋‹ค. ๋‚จ์€ ๊ฒƒ(ํ•™์Šต๋ฅ ยทweight decayยทdropoutยทbatch)์€ ๊ฐ™์€ ๋ชฉ์ ํ•จ์ˆ˜๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž˜ ์ตœ์ ํ™”ํ•˜๋Š”์ง€๋งŒ ๋ฐ”๊พธ๋ฏ€๋กœ ๊ณต์ •ํ•˜๋‹ค.

--space full ๋กœ ์ „๋ถ€ ํƒ์ƒ‰ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์œ„ ํŽธํ–ฅ ๊ฒฝ๊ณ ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.


๋ชฉ์ ํ•จ์ˆ˜ = held-out validation loss

lerobot์—” validation split์ด ์—†๊ณ  ๋‚ด์žฅ eval_freq๋Š” gym ํ™˜๊ฒฝ ์ „์šฉ์ด๋ผ, ์—ํ”ผ์†Œ๋“œ๋ฅผ ๋‚˜๋ˆ (--dataset.episodes) val์„ ์ง์ ‘ ๋งŒ๋“ ๋‹ค. ๊ฐ trial์€ train ์—ํ”ผ์†Œ๋“œ๋กœ ์งง๊ฒŒ ํ•™์Šต โ†’ ๊ทธ ์ฒดํฌํฌ์ธํŠธ๋ฅผ val ์—ํ”ผ์†Œ๋“œ์—์„œ ์ฑ„์ (lerobot๊ณผ ๋™์ผํ•œ preprocessor) โ†’ Optuna๊ฐ€ val loss๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค.

โš ๏ธ val loss๋Š” ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋Š” ํ”„๋ก์‹œ์ผ ๋ฟ, ํƒœ์Šคํฌ ์„ฑ๊ณต์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ตœ์ข… ์„ ํƒ์€ 4๋‹จ๊ณ„ ์‹œ๋ฎฌ ๋กค์•„์›ƒ ์„ฑ๊ณต๋ฅ ๋กœ ํ•  ๊ฒƒ.


์˜ˆ์‚ฐ ์ •ํ•˜๊ธฐ

diffusion ์‹ค์ธก 5.7 step/s (RTX PRO 5000, batch 16):

์„ค์ • ์ด ์—ฐ์‚ฐ ํƒ์ƒ‰ ์‹œ๊ฐ„
--n_trials 12 --steps 5000 (๊ถŒ์žฅ) 60k ์Šคํ… ~3์‹œ๊ฐ„
--n_trials 20 --steps 8000 160k ์Šคํ… ~8์‹œ๊ฐ„

์—ฌ๊ธฐ์— --full_steps 100000 ์ „์ฒด ํ•™์Šต์ด ~5์‹œ๊ฐ„ ์ถ”๊ฐ€๋œ๋‹ค. (pruning์ด ๊ฐ€๋ง ์—†๋Š” trial์„ ์กฐ๊ธฐ ์ข…๋ฃŒํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ๋Š” ๋” ์งง๋‹ค)

โš ๏ธ ์‹œ๊ฐ„์„ ์ค„์ด๋ ค๋ฉด --n_trials๋ฅผ ๋‚ฎ์ถœ ๊ฒƒ. --steps๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ๋ง ๊ฒƒ. ์งง๊ฒŒ ํ•™์Šตํ•˜๋ฉด ์ดˆ๋ฐ˜์—๋งŒ ๋น ๋ฅธ ๋†’์€ ํ•™์Šต๋ฅ ์ด ์œ ๋ฆฌํ•ด ๋ณด์ธ๋‹ค โ†’ ์ •์ž‘ ์ „์ฒด ํ•™์Šต์—์„  ๋‚˜์œ ๊ฐ’์„ ๊ณ ๋ฅด๊ฒŒ ๋œ๋‹ค.

โš ๏ธ ๋ณ‘๋ ฌ(--n_jobs)์€ ์ด GPU์—์„  ์ด๋“์ด ์—†๋‹ค. ํ•™์Šต 1๊ฐœ๊ฐ€ ์ด๋ฏธ GPU 100% / 10.5GB๋ฅผ ์“ด๋‹ค.


๊ธด ํ•™์Šต์€ tmux ์•ˆ์—์„œ (ํŠนํžˆ EC2)

SSH๊ฐ€ ๋Š๊ธฐ๋ฉด ํ•™์Šต์ด ๊ฐ™์ด ์ฃฝ๋Š”๋‹ค (connection reset by peer).

tmux new -s hpo
# ... ์ปจํ…Œ์ด๋„ˆ ์ง„์ž… ํ›„ ์œ„ ๋ช…๋ น ์‹คํ–‰ ...
# ๋น ์ ธ๋‚˜์˜ค๊ธฐ: Ctrl+B ๋ˆ„๋ฅด๊ณ  D   (ํ•™์Šต์€ ๊ณ„์† ๋Œ์•„๊ฐ)

tmux attach -t hpo      # ์žฌ์ ‘์† ํ›„ ์ด์–ด์„œ ๋ณด๊ธฐ

3.5 ๊ธฐ์กด v2.1 ๋ฐ์ดํ„ฐ์…‹ โ†’ v3.0 ๋ณ€ํ™˜ (lerobot-python)

์˜ˆ์ „์— ๋งŒ๋“  standalone v2.1 ๋ฐ์ดํ„ฐ์…‹ repo๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ํ•„์š”. (์ด repo์˜ ๋ฐ์ดํ„ฐ๋Š” ์ด๋ฏธ v3.0์ด๋ผ ๋ถˆํ•„์š”)

lerobot-python -m lerobot.scripts.convert_dataset_v21_to_v30 \
    --repo-id <์˜ˆ์ „-v2.1-๋ฐ์ดํ„ฐ์…‹-repo> \
    --push-to-hub true
  • HF ๋กœ๊ทธ์ธยท์˜จ๋ผ์ธ ํ•„์š” (HF_HUB_OFFLINE ์„ค์ •๋ผ ์žˆ์œผ๋ฉด ํ•ด์ œ)
  • ์ด๋ฏธ v3.0์ด๋ฉด --force-conversion
  • ์ƒˆ๋กœ ๋ฝ‘๋Š” ๋ฐ์ดํ„ฐ๋Š” (0.5.2 ๋ณ€ํ™˜๊ธฐ๋ผ) ์ฒ˜์Œ๋ถ€ํ„ฐ v3.0 โ†’ ๋ณ€ํ™˜ ๋ถˆํ•„์š”

4. ์‹œ๋ฎฌ ๋กค์•„์›ƒ ํ‰๊ฐ€ (python = isaac)

์™œ ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ๊ฐ€: ๋กค์•„์›ƒ์€ Isaac Sim(py3.11 / lerobot 0.3.3) ์•ˆ์—์„œ ์ •์ฑ…์„ ๋กœ๋“œํ•จ. Isaac Sim์ด 3.11์ด๋ผ 0.5.2(โ‰ฅ3.12)๋ฅผ ๋ชป ๋„ฃ์Œ โ†’ 0.5.2๋กœ ํ•™์Šตํ•œ ์ •์ฑ…์€ 0.3.3์šฉ์œผ๋กœ ๋ณ€ํ™˜ ํ›„ ๋กค์•„์›ƒ. (์˜ˆ์ „ 0.3.3 ์ •์ฑ…์€ ๋ณ€ํ™˜ ์—†์ด ๋ฐ”๋กœ repo_id ์‚ฌ์šฉ)

4-a. isaac python ํ™˜๊ฒฝ ์„ธํŒ… (1ํšŒ)

$ISAACLAB_PATH/_isaac_sim/python.sh -m pip install --no-deps lerobot==0.3.3
$ISAACLAB_PATH/_isaac_sim/python.sh -m pip install \
    draccus deepdiff jsonlines termcolor packaging imageio datasets \
    einops safetensors huggingface_hub
# diffusion ์“ธ ๋•Œ๋งŒ ์ถ”๊ฐ€:  diffusers
$ISAACLAB_PATH/_isaac_sim/python.sh -m pip install diffusers

# โš ๏ธ ๋งˆ์ง€๋ง‰์— ๋ฐ˜๋“œ์‹œ numpy๋ฅผ ๋˜๋Œ๋ฆฐ๋‹ค (์•„๋ž˜ ์ฐธ๊ณ )
$ISAACLAB_PATH/_isaac_sim/python.sh -m pip install "numpy==1.26.0"

โš ๏ธ (ํ•„์ˆ˜) numpy๋Š” ๋ฐ˜๋“œ์‹œ 1.x โ€” ์•ˆ ๊ทธ๋Ÿฌ๋ฉด ๋กค์•„์›ƒ์ด Segmentation fault ๋กœ ์ฃฝ๋Š”๋‹ค.

datasets ๋ฅผ ์„ค์น˜ํ•˜๋ฉด numpy๊ฐ€ 2.x๋กœ ๋”ธ๋ ค ์˜ฌ๋ผ๊ฐ„๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Isaac Sim์˜ ์ปดํŒŒ์ผ๋œ ๋ชจ๋“ˆ๋“ค์€ numpy 1.x์— ๋งž์ถฐ ๋นŒ๋“œ๋ผ ์žˆ๋‹ค (isaaclab, isaaclab-tasks, nvidia-srl-usd ๊ฐ€ ์ „๋ถ€ numpy<2 ๋ฅผ ์š”๊ตฌ). numpy 2.x์™€ 1.x๋Š” C ABI๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š์•„ ์ž„ํฌํŠธ/์‹คํ–‰ ์ค‘ segfault ๊ฐ€ ๋‚œ๋‹ค. (ModuleNotFoundError ๊ฐ€ ์•„๋‹ˆ๋ผ ์•„๋ฌด ๋ฉ”์‹œ์ง€ ์—†์ด ์ฃฝ๋Š”๋‹ค โ€” ๊ทธ๋ž˜์„œ ์›์ธ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.)

์„ค์น˜ ํ›„ ๋ฐ˜๋“œ์‹œ ํ™•์ธ โ€” ์ •์ƒ ๊ฐ’:

$ISAACLAB_PATH/_isaac_sim/python.sh -c "
import numpy, lerobot, torch
print('numpy  :', numpy.__version__)     # 1.26.0   โ† 2.x๋ฉด segfault!
print('lerobot:', lerobot.__version__)   # 0.3.3
print('torch  :', torch.__version__)     # 2.7.0+cu128
"

2.x๋ฉด ๋˜๋Œ๋ฆฐ๋‹ค:

$ISAACLAB_PATH/_isaac_sim/python.sh -m pip install "numpy==1.26.0"

packaging ๋„ 26.x๋กœ ์˜ฌ๋ผ๊ฐ€ ์žˆ์œผ๋ฉด lerobot๊ณผ ์ถฉ๋Œํ•˜๋‹ˆ ๋˜๋Œ๋ฆฐ๋‹ค:

$ISAACLAB_PATH/_isaac_sim/python.sh -m pip install "packaging>=24.2,<26"

โš ๏ธ ModuleNotFoundError: No module named 'pip._vendor.packaging._structures' ๊ฐ€ ๋‚˜๋ฉด Isaac Sim ๋‚ด์žฅ pip ์ž์ฒด๊ฐ€ ์†์ƒ๋œ ๊ฒƒ์ด๋‹ค. -m pip ๋กœ๋Š” ๋ชป ๊ณ ์น˜๋‹ˆ ํ‘œ์ค€ ๋ชจ๋“ˆ ensurepip ์œผ๋กœ ๋ณต๊ตฌํ•œ๋‹ค:

$ISAACLAB_PATH/_isaac_sim/python.sh -m ensurepip --upgrade
$ISAACLAB_PATH/_isaac_sim/python.sh -m pip --version     # ๋ณต๊ตฌ ํ™•์ธ

๊ทธ๋ž˜๋„ ์•ˆ ๋˜๋ฉด get-pip.py ๋กœ ๋ณต๊ตฌํ•œ๋‹ค (pip ์—†์ด๋„ ๋™์ž‘ โ€” ์ž๊ธฐ ์•ˆ์— pip wheel์„ ํ’ˆ๊ณ  ์žˆ์Œ):

curl -sS https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py
$ISAACLAB_PATH/_isaac_sim/python.sh /tmp/get-pip.py --ignore-installed
$ISAACLAB_PATH/_isaac_sim/python.sh -m pip --version

โš ๏ธ --force-reinstall ์€ ์“ฐ์ง€ ๋ง ๊ฒƒ. ๊ทธ๊ฑด ๊ธฐ์กด pip์„ ์ œ๊ฑฐํ•œ ๋’ค ์žฌ์„ค์น˜ํ•˜๋Š”๋ฐ, ์ œ๊ฑฐ ๊ณผ์ •์—์„œ ์ด๋ฏธ ์‚ฌ๋ผ์ง„ _structures.py ๋ฅผ ์˜ฎ๊ธฐ๋ ค๋‹ค ๋˜ ์ฃฝ๋Š”๋‹ค:

ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory:
  '.../pip/_vendor/packaging/_structures.py'

--ignore-installed ๋Š” ์ œ๊ฑฐ ์—†์ด ๋ฎ์–ด์“ฐ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•œ๋‹ค.

๊ทธ๊ฒƒ๋งˆ์ € ์•ˆ ๋˜๋ฉด ๊นจ์ง„ pip์„ ํ†ต์งธ๋กœ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ์„ค์น˜:

SP=$ISAACLAB_PATH/_isaac_sim/kit/python/lib/python3.11/site-packages
rm -rf "$SP/pip" "$SP"/pip-*.dist-info
$ISAACLAB_PATH/_isaac_sim/python.sh /tmp/get-pip.py
$ISAACLAB_PATH/_isaac_sim/python.sh -m pip --version

๋ณต๊ตฌ ํ›„ ์œ„ ์„ค์น˜ ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

4-b. 0.5.2 ์ •์ฑ… โ†’ 0.3.3 ๋ณ€ํ™˜ (์ง์ ‘ ํ•™์Šตํ•œ ์ •์ฑ…๋งŒ, lerobot-python)

์ด repo์˜ models/*_v03๋Š” ์ด๋ฏธ ๋ณ€ํ™˜๋ณธ โ†’ ์ด ๋‹จ๊ณ„ ๊ฑด๋„ˆ๋›ฐ๊ณ  4-c๋กœ ๋ฐ”๋กœ. (์ง์ ‘ ํ•™์Šตํ–ˆ์„ ๋•Œ๋งŒ ํ•„์š”)

# --policy: ์ง์ ‘ ํ•™์Šต ์ถœ๋ ฅ ํด๋” (๋˜๋Š” repo_id / ๋ฐ›์€ ํด๋”)
lerobot-python scripts/sim2real/imitation_learning/inference/convert_policy_v05_to_v03.py \
    --policy ./outputs/train/vqbet_merge/checkpoints/last/pretrained_model \
    --out ./models/vqbet_merge_v03
  • config ์ •๋ฆฌ + ์ •๊ทœํ™” ํ†ต๊ณ„ ์ฃผ์ž… โ†’ 0.3.3๊ฐ€ ๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๊ฒŒ (์•„ํ‚คํ…์ฒ˜ weight๋Š” ๊ทธ๋Œ€๋กœ๋ผ ๋ฌธ์ œ์—†์Œ)
  • ์ƒˆ config ํ•„๋“œ ์—๋Ÿฌ ๋‚˜๋ฉด ์Šคํฌ๋ฆฝํŠธ _STRIP_KEYS์— ๊ทธ ํ•„๋“œ ์ถ”๊ฐ€ (diffusion ๋Œ€์‘์ฒ˜๋Ÿผ)
  • ๋ณ€ํ™˜ ํ›„ shape mismatch๋ฉด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ฐ”๋€ ๊ฒƒ โ†’ DDS ํ•„์š” (ACT/VQ-BeT/Diffusion์€ OK ํ™•์ธ๋จ)
  • ๋ณ€ํ™˜๋ณธ์„ humanoid์— ๋‘๋ ค๋ฉด โ†’ models/<์ด๋ฆ„>_v03๋กœ ์—…๋กœ๋“œ(2๋‹จ๊ณ„ ๋ฐฉ์‹)

4-c. ๋กค์•„์›ƒ ์‹คํ–‰ (python = isaac)

HF_HUB_OFFLINE=1 python scripts/sim2real/imitation_learning/inference/eval_policy_sim.py \
    --task Cyclo-Real-Pick-Place-LTable-FFW-SG2-v0 \
    --robot_type FFW_SG2 \
    --policy ./models/vqbet_merge_v03 --policy_type vqbet \
    --num_rollouts 10 --enable_cameras \
    --scripted_l_motion
  • --policy : ์ด repo์˜ ./models/<์ด๋ฆ„>_v03 (๋˜๋Š” ์ง์ ‘ ๋ณ€ํ™˜ํ•œ ํด๋”) / repo_id(์˜ˆ์ „ 0.3.3 ์ •์ฑ…)
  • ์ •์ฑ… ๋ฐ”๊พธ๊ธฐ: --policy_type act | vqbet | diffusion + --policy ํด๋”๋„ ๊ทธ ์ •์ฑ… ๊ฒƒ์œผ๋กœ (์˜ˆ: ./models/diffusion_merge_v03 --policy_type diffusion)
  • --scripted_l_motion: L-Table์€ ์ด๋™์ด ์Šคํฌ๋ฆฝํŠธ๋ผ ํ•„์ˆ˜ (์ •์ฑ…์€ ํŒŒ์ง€/๋†“๊ธฐ๋งŒ ํ•™์Šต)
  • ๊ฐ•์ œ ์ข…๋ฃŒ: ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ pkill -9 -f eval_policy_sim.py

4-d. (๋Œ€์•ˆ) ๋ณ€ํ™˜ ์—†์ด 0.5.2 ๊ทธ๋Œ€๋กœ โ€” DDS 2-ํ”„๋กœ์„ธ์Šค

0.5.2 ์ •์ฑ…์„ ๊ทธ๋Œ€๋กœ ์“ฐ๋ ค๋ฉด ์ •์ฑ…์„ ๋ณ„๋„ 3.12 ํ”„๋กœ์„ธ์Šค๋กœ ์„œ๋น™ + Isaac Sim(3.11)๊ณผ DDS ํ†ต์‹  (cyclo_intelligence ๋ฐฉ์‹). ๋ณ€ํ™˜ ๋ถˆํ•„์š”ํ•˜๋‚˜ ์…‹์—…์ด ๋ฌด๊ฑฐ์›€ โ†’ ์‹ค๋ฌผ/์ •์‹ ๋ฐฐํฌ์šฉ. ๋น ๋ฅธ ์‹œ๋ฎฌ ํ™•์ธ์€ 4-b(๋ณ€ํ™˜) ๋ฐฉ์‹์ด ์‹ค์šฉ์ .


์ตœ์ดˆ 1ํšŒ๋งŒ ํ•„์š”ํ–ˆ๋˜ ํ™˜๊ฒฝ ์ˆ˜์ • (์ฐธ๊ณ )

๋ฌธ์ œ ํ•ด๊ฒฐ (์–ด๋””์„œ, ์ „๋ถ€ lerobot venv)
lerobot 0.5.2(v3.0)๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ lerobot-pip install "lerobot @ git+https://github.com/ROBOTIS-GIT/lerobot-cyclo.git"
0.5.2 av ์ถฉ๋Œ (av.option) lerobot-pip install "av>=15.0.0,<16.0.0"
0.5.2 ํ•™์Šต์— accelerate ํ•„์š” lerobot-pip install "lerobot[training] @ git+https://github.com/ROBOTIS-GIT/lerobot-cyclo.git"
Blackwell GPU(sm_120) torch 0.5.2๋Š” cu128 ๊ธฐ๋ณธ์ด๋ผ ์ž๋™ ํ•ด๊ฒฐ. (๊ตฌ๋ฒ„์ „ 0.3.3: lerobot-pip install --index-url https://download.pytorch.org/whl/cu128 --force-reinstall "torch==2.7.1" "torchvision==0.22.1")
ํ•™์Šต ์‹œ ์˜์ƒ ๋””์ฝ”๋”ฉ ์„ธ๊ทธํดํŠธ --num_workers=0 (๋˜๋Š” apt install ffmpeg)
isaac python ์— lerobot ์˜์กด์„ฑ ์—†์Œ ์œ„ 4-a (๋กค์•„์›ƒ์šฉ 0.3.3)

์ •์ฑ… ์ข…๋ฅ˜

act (๊ธฐ๋ณธ, ๋ฌด๋‚œ) ยท vqbet (๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ) ยท diffusion (๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ, ์ถ”๋ก  ๋А๋ฆผ) ์–ด๋А ๋‹จ๊ณ„๋“  --policy.type / --policy_type ๋งŒ ๋ฐ”๊พธ๋ฉด ๋™์ผํ•˜๊ฒŒ ๋™์ž‘.

ํ•œ ์ค„ ์š”์•ฝ: ๋ณ€ํ™˜(lerobot-python) โ†’ ์—…๋กœ๋“œ(lerobot-python) โ†’ ํ•™์Šต(lerobot-python) โ†’ ๋กค์•„์›ƒ(python + HF_HUB_OFFLINE=1)

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support