lerobot v.0.4.x 学習後の推論
はじめに
Colab での学習(lerobot v.0.4.x )が前回までに終わりました。
今回は学習で生成されたpretrained_model で推論を行います。
以下の記事を参考にさせていただきました。感謝申し上げます。
ロボット初心者がLeRobot SO-101に挑戦(その2:模倣学習 ※奮闘中)
学習
学習は Colab を使い、以下のコマンドで実行しました。
pretrained_model に入っているモデルを使います。
!lerobot-train \
--dataset.repo_id=USER_NAME/record-test \
--policy.type=act \
--output_dir="/content/drive/MyDrive/lerobot_outputs/act_study" \
--job_name="act_finetune_2026" \
--batch_size=32 \
--steps=50000 \
--save_freq=2500 \
--eval_freq=5000 \
--policy.device=cuda \
--policy.push_to_hub=false \
--resume=false
実働PCの状態確認
推論を行うノートPC に GPU があるか調べておきます。
python3 - <<'EOF'
import torch
print("CUDA available:", torch.cuda.is_available())
print("GPU:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "None")
EOF
RTX を積んだ Linux PCなら以下が出るはずです。推論時のオプション設定の中にある
--policy.device= は、True なら cuda、False なら cpu を選択します。
CUDA available: True
GPU: NVIDIA RTX xxxx
推論とオプションの説明
以下を実行します。〜/lerobot のフォルダにいる前提で組んでいます。
学習済みのモデルは 〜/lerobot の下にコピーしておきます。
今回は 10000step 学習してできた 010000 というフォルダを丸ごとコピーしています。
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_follower_arm \
--robot.cameras='{front: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}' \
--policy.path=./010000/pretrained_model \
--policy.device=cuda \
--dataset.repo_id=local/eval_test_01 \
--dataset.single_task="Grab the box" \
--dataset.num_episodes=1 \
--dataset.push_to_hub=false
オプションの説明
--dataset.repo_id は必ず指定する必要があります。
本来、以下のように huggingface 上の位置を指定します。
--dataset.repo_id=UserName/so101_eval_001
しかし、今回はこのコマンドでは、以下のオプションでうにハブにプッシュしません
--dataset.push_to_hub=false
そのため、ローカルに保存する場所を指定する任意の文字列を設定すればOKです。
文字は、英数字と _ - だけで、空白は不可です。ただし、以下のようにすると
--dataset.repo_id=local_eval
以下のエラーがでます。これは、dataset_name は必ず abc/def のように / が入る構造で指定しなければいけないという縛りに従っていなかったためです。
.....
sanity_check_dataset_name _, dataset_name = repo_id.split("/")
.....
つまり、以下のように / が入っていればOKです。
--dataset.repo_id=local/eval_test
推論が終わると、動作中のカメラ画像(動画)が、以下の場所に保存されます。
~/.cache/huggingface/lerobot/local/eval_test/videos/observation.images.front/chunk-000/file-000.mp4
なお、このフォルダがすでにあるとエラーがでますので、推論毎にフォルダを消去するか、名前を毎回変えるか、する必要があります。
例えば、以下のようにすると自動的に変わるので、便利かも。
--dataset.repo_id=eval_$(date +%Y%m%d_%H%M)
全体を示すと以下です
RUN_ID=eval_$(date +%Y%m%d_%H%M)
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_follower_arm \
--robot.cameras='{front: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}' \
--policy.path=./lerobot/010000/pretrained_model \
--policy.device=cuda \
--dataset.repo_id=$RUN_ID \
--dataset.single_task="Move the box" \
--dataset.num_episodes=1 \
--dataset.push_to_hub=false
その他のオプションです。
今回の設定は、あえて以下にしています。
episode_time_s なし
dataset.root なし
push_to_hub なし(dataset.push_to_hub=false と設定、意味は同じ)
推論開始
アームが学習通りにものを移動させました。成功です。
以下、画面表示の内容を説明します。
まず、resnet18 がダウンロードされ、~/.cache/torch/hub/checkpoints/ に保存されます。
これは初回だけです。
Downloading: "https://download.pytorch.org/models/resnet18-f37072fd.pth" to /home/abc/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth
100%|███████████████████████████████████████████████████████████████████████| 44.7M/44.7M [00:07<00:00, 6.65MB/s]
次は、ACT policy 本体の重み(./010000/pretrained_model)をロードします。
Loading weights from local directory
カメラやフォロワーアームが接続されます。
INFO 2026-01-27 14:22:41 a_opencv.py:180 OpenCVCamera(2) connected.
INFO 2026-01-27 14:22:41 follower.py:107 my_follower_arm SOFollower connected.
推論しながら、episode 0 の記録を開始します。
INFO 2026-01-27 14:22:41 ls/utils.py:227 Recording episode 0
後は動画のサイズ、fps やデコーディングなどの情報が表示され、最後に録画終了、カメラやアームがのdisconnected が表示されます。
.....
INFO 2026-01-27 14:24:00 ls/utils.py:227 Stop recording
INFO 2026-01-27 14:24:04 a_opencv.py:541 OpenCVCamera(2) disconnected.
INFO 2026-01-27 14:24:04 follower.py:236 my_follower_arm SOFollower disconnected.
INFO 2026-01-27 14:24:04 ls/utils.py:227 Exiting
終了したら、以下に保存された動画を見てみましょう。
~/.cache/huggingface/lerobot/local/eval_test/videos/observation.images.front/chunk-000/file-000.mp4
終わりに
ちょっとしたエラーはありましたが、比較的スムーズに推論ができました。