はじめに
こんにちは.今話題のオープンソース6軸ロボットアーム,LeRobot SO-101もかなり普及してきましたね.それと合わせてロボット向けの基盤モデルも目覚ましい進化を遂げています.
本稿では基盤モデルのうちの1つであるSmolVLAを自前データセットで転移学習して,SO-101の実機を動かしてみる一連の流れを実際に行ってみたのでご紹介します.
実験環境
今回の実験で使用した各種環境は以下の通りです.
ロボットアーム
これがなきゃ始まらない.ロボットアーム実機です.
- アーム本体: LeRobot SO-101 (GitHub)
- 私は部材を自前で3Dプリントして,サーボとIF基板だけ買ってきて組み上げました.型番は公式GitHubのBOMを参照ください.
- 手首カメラ: InnoMaker 1080P USB2.0 UVCカメラ (Amazon)
- 記事公開時点でリンク見直したら品切れしてました...残念...
アーム制御用PC
SO-101と手首カメラを接続して操作・制御するためのPCです.
- M3 MacBook Pro (RAM 36GB)
SmolVLAの推論(実機デプロイ)もMacBookで行いました.
転移学習用PC
SmolVLAの転移学習は以下のスペックのBTOマシンで行いました.
- OS: Ubuntu 22.04
- CPU: Intel Core i9-12900K
- GPU: NVIDIA RTX3090
- RAM: 64GB
予算が許す方はAWSやGoogle ColabのGPUインスタンスを利用するのがよいと思います.
このマシンだと結構時間がかかりました.
その他の備品や小物
全く同じ環境を再現できるように,一応その他の備品類も掲載しておきます.
- 机: 山善(YAMAZEN) 折りたたみ デスク (Amazon)
- 消しゴム: DAISO ミニ4P消しゴム (DAISOオンラインストア)
- グレーの円: DAISO シリコーンコースター (DAISOオンラインストア)
LeRobot~SmolVLAの開発環境構築
先月あたりにQiita記事として紹介したので,そちらを参照ください.
データセット収集
以下のコマンドで,テレオペによるデータセット収集を行えます.
portやidは適宜読み替えてください.{HF_USER}の箇所は,HuggingFace CLIをインストール済み & 各種環境変数を設定済みの想定で書かれています.まだの方は適宜インストールしてください.
公式サンプル: https://huggingface.co/docs/lerobot/getting_started_real_world_robot#record-a-dataset
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem585A0076841 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=2 \
--dataset.single_task="Grab the black cube"
e.g.
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=acs_so101_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 1280, height: 720, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5A460814251 \
--teleop.id=acs_so101_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so101_pp_blue_box \
--dataset.num_episodes=2 \
--dataset.single_task="Pick and place the blue box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=5 \
--dataset.push_to_hub=true
また,同じデータセットへ継ぎ足し記録したいときは --resume=true を用います.新規作成データセットでresumeを入れているとエラーになるので,継ぎ足しのときだけ使います.
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=acs_so101_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 1280, height: 720, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem5A460814251 \
--teleop.id=acs_so101_leader \
--display_data=true \
--dataset.repo_id=${HF_USER}/so101_pp_blue_box \
--dataset.num_episodes=2 \
--dataset.single_task="Pick and place the blue box" \
--dataset.episode_time_s=30 \
--dataset.reset_time_s=5 \
--dataset.push_to_hub=true \
--resume=true
実際の様子はこちら.青い消しゴムを掴んで,グレーの円の中に置きます.
今回は相場に倣って50エピソード分のデータを集めたいので,この動きを50回繰り返しました.地味に大変でした...
このデータセットは以下のリポジトリで公開されています.
転移学習
データセットが撮れたらいよいよSmolVLAの転移学習を行います.転移学習用マシンにもLeRobot環境をインストールしましょう.
例えば上の${HF_USER}/so101_pp_blue_box
にアップロードしたデータセットを使う場合,転移学習の実行は以下のコマンドで行えます.各パラメータの調整に関しては公式情報や別記事を参照ください.
python lerobot/scripts/train.py \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=${HF_USER}/so101_pp_blue_box \
--policy.repo_id=${HF_USER}/so101_pp_blue_box_policy_01 \
--batch_size=64 \
--steps=20000
私の環境では学習が完了するまでに約20時間くらいかかった気がします.次はAWSでGPUインスタンス用意しようと思います...
また,この転移学習済み重みは以下のリポジトリで公開されています.
実機デプロイ
上で学習した ${HF_USER}/so101_pp_blue_box_policy_01
のポリシー(学習済み重み)を利用する場合は次のようにします.--dataset.episode_time_s=300
とすることで,推論が5分間実行され続けます.
python -m lerobot.record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem5A460824801 \
--robot.id=acs_so101_follower \
--robot.cameras="{ wrist: {type: opencv, index_or_path: 0, width: 1280, height: 720, fps: 30}}" \
--dataset.single_task="Pick and place the blue box" \
--dataset.repo_id=${HF_USER}/eval_so101_pp_blue_box \
--policy.path=${HF_USER}/so101_pp_blue_box_policy_01 \
--dataset.episode_time_s=300 \
--dataset.num_episodes=10 \
--display_data=true \
--resume=true
--dataset.single_task="Pick and place the blue box"
のオプションがVLAのLの部分のプロンプトに相当します.今回は学習データセットを記録した際と同じ文章をそのまま使いました.
...
そして!実際に!MacBook Proで推論して動いている様子が!!こちら!!
別アングルからも.
ちゃんと青い消しゴムを掴んで,グレーの円の中に置けていますね!健気で可愛い.
「掴んで置く」たったこれだけの動きなのにアームからとてつもない知性を感じます.
おわりに
いかがでしたか?SO-101でデータセット収集,VLA転移学習,実機デプロイまで一連行ってみました.データセットも重みも公開済みなので,同じアーム,同じカメラ,同じような色の机と消しゴムたちを揃えたらお手元でも再現できる...かもしれません.もし試された方がいらしたらぜひコメントで教えてください!
どなたかの参考になれば,そしてあわよくばこれをキッカケにロボットに興味を持ってくれる方が1人でも増えたら嬉しいです.
それでは.
参考
- LeRobot SO-101 公式GitHub: https://github.com/TheRobotStudio/SO-ARM100
- SmolVLA 公式HuggingFace: https://huggingface.co/blog/smolvla
- LeRobot SO-101のコマンドが刷新されたのでメモ(環境構築〜SmolVLAまで): https://qiita.com/B-SKY-Lab/items/3d14414b5bd997534983