第1回で「フィジカルAIを自宅で動かす」と宣言してから、6回かけてここまで来ました。VLMとVLAの違いを整理し(第1回)、VLMを自宅PCで動かし(第2回)、VLAをシミュレーションで動かし(第3回)、実機を用意して(第4回)、人が操縦してお手本データを集めました(第5回)。
今回が最終回です。やることを一言で書きます。第5回で集めた20回分のお手本を自宅のGPUで学習させ、ロボットが自分で積み木を箱に入れるところまでいきました。 人がリーダーを握らなくても、白いアームが自力で積み木を見つけ、掴み、箱に運ぶ。第1回で説明したVLAの「画像と言葉から動作を直接出す」が、自宅の机の上で現実になった瞬間です。
結論から成否も書きます。10回試して5回成功しました。そして、この「5割」と「失敗しても諦めずまた掴みに行く」という挙動こそが、今回いちばん伝えたい中身です。
使った環境は、Windows 11 Pro、RTX 5090(VRAM 32GB)、SO-ARM101(Advanced Kit)です。今回も学習から推論まで、WSL2は使いません。
この記事で使うコードについて(自作ではありません)
先に大事な前提を1つ。この記事で出てくる学習・推論のコマンド(train.py、lerobot.record など)は、私が独自に書いたものではありません。すべてHugging Faceが公開しているオープンソースのロボット学習フレームワーク「LeRobot」のものです(GitHub / 公式ドキュメント)。ACTという学習モデルもLeRobotに含まれています。
私がやっているのは、この公開されたコードを、SO-ARM101という実機と自分で集めたデータに合わせて動かすことです。第4回で導入したコードも、SO-ARM101に付属する動作検証済みのバージョン固定版(lerobot 0.3.4)でした。最新版はGitHubから入手できますが、LeRobotは開発が速く、バージョンによってコマンドやオプションが変わります。この記事のコマンドがそのまま通らない場合は、お使いのバージョンの違いをまず疑ってください。
今回のゴール(3つ)
- 第5回のデータで、模倣学習モデル(ACT)を自宅のGPUで学習させる
- 学習済みモデルで実機を動かし、人の操縦なしで積み木を箱に入れる
- 20回分・最小データで、どこまでできて何が限界かを実測する
3つ目まで見届けて、連載「誰でもできるフィジカルAI」は完結です。
最大の落とし穴:RTX 5090はマニュアルのCUDA 11.8では動かない
学習の前に、今回いちばん大きな壁を先に書きます。マニュアルは学習用に「CUDA 11.8対応版のPyTorchを入れろ」と指定しています。この通りにやると、RTX 5090では動きません。
理由は世代です。マニュアルのCUDA 11.8はRTX 3090世代を前提にしています。RTX 5090は最新のBlackwell世代(内部の識別名でsm_120)で、CUDA 11.8はこの新しいGPUを認識できません。そのまま入れると「sm_120は非対応」と拒否されるか、GPUを使わずCPUに落ちて学習が異常に遅くなります。
正解は**CUDA 12.8対応版(cu128)**です。フラッグシップの新しいGPUほど、対応するCUDAのバージョンも新しくないと動かない。ここはマニュアルが古いGPUを前提に書かれている典型で、最新の機材を買った人ほど踏みます。
第4回で入れたPyTorchは、実はCPU版でした。テレオペやデータ収集はGPUがなくても動くので問題なかったのですが、学習はGPUが必須です。まずそれを確認します。
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
2.7.1+cpu False と出ました。CPU版で、GPUを認識していません。これをcu128版に差し替えます。バージョンは2.7.1のまま、CUDA 12.8対応版を上書きインストールします。
pip install --force-reinstall torch==2.7.1 torchvision==0.22.1 --index-url https://download.pytorch.org/whl/cu128
CUDA本体を含むので数GBのダウンロードがあります。1つ注意で、このインストールの副作用で fsspec というライブラリが新しくなりすぎて、第5回で使ったデータ管理ライブラリと衝突します。次の一行で対応版に戻しておきます。
pip install "fsspec[http]==2025.3.0"
これで準備完了です。
GPUが本当に使えるかを、認識と演算の両方で確認する
差し替えたら、GPUが使えるか確認します。ここで大事なのは、「認識」だけでなく「実際に計算できるか」まで見ることです。認識はできても、いざ計算するとBlackwell用の処理が入っておらずコケる、ということがあるからです。
python -c "import torch; print('CUDA available:', torch.cuda.is_available()); print('device:', torch.cuda.get_device_name(0))"
CUDA available: True / device: NVIDIA GeForce RTX 5090 と出ました。認識はOKです。続けて、実際にGPUで行列計算をさせてみます。
python -c "import torch; x=torch.rand(1000,1000,device='cuda'); y=x@x; torch.cuda.synchronize(); print('GPU計算OK')"
GPU計算OK が出れば、Blackwell用の処理も正しく入っていて、学習に完全に進めます。ここまで確認して初めて、cu128への差し替えが成功したと言えます。
学習させる:20回のお手本からACTを育てる
いよいよ学習です。第5回のデータで、ACTという模倣学習の定番モデルを育てます。今回は初回なので、まず短めの3万ステップで回します。
python src/lerobot/scripts/train.py --dataset.repo_id=hideki/block_in_box --policy.type=act --output_dir=outputs/train/act_block_in_box --job_name=act_block_in_box --policy.device=cuda --steps=30000 --wandb.enable=false --policy.push_to_hub=false
--policy.type=act がモデルの種類、--policy.device=cuda でGPU学習、--steps=30000 が学習の反復回数です。実行すると学習ループが始まり、200ステップごとに loss(モデルの間違いの大きさ。小さいほど学習が進んでいる)が表示されます。
lossの下がり方がきれいでした。開始時6.261 → 12000ステップで0.117 → 20000ステップで0.073。1ステップあたり0.063秒で、3万ステップの見込みは約50分。RTX 5090が効いています。
フラッグシップGPUが、半分眠っている
学習中にGPUの使用状況を見て、気づいたことがあります。RTX 5090を完全に持て余していました。

専用GPUメモリは32GBのうち8GBしか使っておらず、24GBが遊んでいる。GPU使用率も51%で、半分は暇。原因は、マニュアルのデフォルト設定 batch_size=8(一度に処理するお手本の数)が、RTX 3090以下を想定した控えめな値だからです。5090の32GBなら、もっと大きなバッチを一度に処理できます。
今回は初回なので、まず結果を出すことを優先してデフォルトのまま完走させました。ただ、この「フラッグシップGPUがデフォルト設定では半分眠る」という事実は覚えておく価値があります。バッチを増やせばGPUをフル活用でき、学習の効率が上がる。マニュアル通りに動かすことと、機材を活かしきることは別、という良い実例です。
詰まり:学習の最後だけ、権限エラーでコケる
3万ステップを待っていたら、20000ステップのチェックポイント保存直後にこう落ちました。
OSError: [WinError 1314] クライアントは要求された特権を保有していません。
第5回でデータ可視化ビューアが落ちたのとまったく同じ権限エラーです。学習の進捗を保存したあと、「最新版」を指す近道(シンボリックリンク)を作ろうとして、Windowsの権限で弾かれています。
ここで大事なのは、学習そのものは成功しているということです。lossは0.073まで下がり、20000ステップ時点のモデルは既にフォルダに保存済み。コケたのは「最新版という別名の近道を張る」おまけ作業だけです。保存されたモデルフォルダを確認すると、モデル本体(約207MB)と設定ファイルがちゃんとありました。
loss 0.073は十分に実用域なので、この20000ステップ版で推論に進みます。恒久的に直すなら、第5回の可視化と同じく「管理者として実行」したプロンプトで学習を走らせればこの近道作成も通ります。学習と可視化は管理者権限で、が結論です。
推論の絶対条件:カメラは学習時と同じ位置に戻す
いよいよ実機推論です。その前に、絶対に守るべき条件が1つあります。推論時のカメラ位置は、学習(データ収集)時と完全に同じでなければいけません。
理由はモデルの仕組みです。ACTは積み木の位置を座標として理解しているのではなく、「あの俯瞰アングルの映像の中で、どこに映るか」として覚えています。カメラを数cmずらすと、同じ位置の積み木が映像の中の別の場所・別の見え方になり、モデルにとっては学習で一度も見たことのない映像になる。結果、大きく外します。
今回、うっかり俯瞰カメラを動かしてしまったので、学習時の位置に戻す作業をしました。方法は、第5回で録ったデータの中から俯瞰カメラの1フレームを取り出し、それを見本に今のカメラ位置を合わせる、というものです。
python -c "import cv2,glob,os; base=os.path.expanduser('~/.cache/huggingface/lerobot/hideki/block_in_box'); f=glob.glob(base+'/videos/**/*front*/*.mp4',recursive=True)[0]; c=cv2.VideoCapture(f); r,frame=c.read(); cv2.imwrite(os.path.join(os.path.expanduser('~'),'Desktop','ref_front.png'),frame)"
これで学習時の俯瞰映像がデスクトップに保存されるので、今のカメラ映像と見比べて、積み木や箱の映る位置が一致するように微調整します。照明・背景・箱の位置も学習時に揃えます。これらもすべて「映像の見え方」の一部だからです。
実機で自律動作させる
準備が整ったら推論です。コマンドは第5回の記録とほぼ同じで、リーダー(操縦アーム)を外し、学習済みモデルを指定します。
python -m lerobot.record --robot.type=so101_follower --robot.port=COM24 --robot.id=my_awesome_follower_arm --robot.cameras="{ handeye: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}, front: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}}" --display_data=true --dataset.repo_id=hideki/eval_block_in_box --dataset.single_task="Put the block in the box" --dataset.push_to_hub=false --policy.path=outputs/train/act_block_in_box/checkpoints/020000/pretrained_model
第5回の記録との違いは、操縦アームの指定を外したことと、--policy.path で学習済みモデルを指定したことです。
起動した瞬間、白いアームが自律で動き始めました。誰もリーダーを握っていないのに、積み木に向かって伸び、掴み、箱の上まで運んで落とす。人が20回見せたお手本から、機械が自分で作業を再現した瞬間です。第1回で「座標を経由せず画像から動作を直接出す」と書いたVLAが、目の前の机で動きました。
1エピソード終わると、第5回の記録と同じくリセット待ちになります。積み木を次の位置に置いて右矢印を押せば、また自律で動きます。
10回中5回。そして「失敗しても諦めない」
何度か試した実測はこうです。10回中5回成功。 そして、位置を学習範囲の端に置くほど、また回を重ねるほど、だんだん失敗が増えました。
この5割を正直に読み解きます。20エピソード、1回あたり約3秒という最小限のデータで5割掴めるのは、むしろ上出来です。残りの5割の失敗は、2つで説明がつきます。ひとつは、学習で積み木を置いた範囲の外に置くと、モデルにとって未知の状況になり外すこと。もうひとつは、動作の途中でわずかにずれると、次に入ってくる映像も学習で見たことのないものになり、ずれがどんどん膨らむこと(誤差の蓄積)。力覚のない模倣学習の宿命です。
ただ、今回いちばん心を動かされたのは、失敗の中身でした。掴み損ねても、アームは諦めずにもう一度掴みに行くのです。 これは決定的に重要です。もしモデルが「一連の手順を丸暗記」しているだけなら、一度ずれたら二度と復帰できません。掴み損ねた次の瞬間の映像を見て、また掴みに行く動作を作り直している——これは、モデルが手順を覚えたのではなく、その瞬間の状況を見て動作を生成している証拠です。第1回で説明したVLAの本質が、リカバリー行動という形で現れました。
20回のデータで、なぜ動くのか
「たった20回でなぜ動くのか」は当然の疑問です。答えは、ゼロから学習していないからです。
今回のモデルの目の部分(画像を見る仕組み)は、あらかじめ大量の画像で学習済みの重みを引き継いでいます。世界の見え方は既に知っていて、今回20回で覚えるのは「この作業のとき、どう手を動かすか」だけ。だから少数でも成立します。
ただし、その精度には正直な但し書きが要ります。20回で出るのは「学習したのとそっくりな状況」での精度です。あの積み木を、あの範囲に置いて、あの照明・背景で、なら5割掴める。机を変える、夜にやる、別の物にする、と途端に落ちます。実務で使うなら、データを50〜100回に増やし、位置・照明・背景をわざとばらけさせて多様性を上げる。これが次の一手です。
まとめ
- 最新GPUほどマニュアルの落とし穴を踏む。RTX 5090はマニュアル指定のCUDA 11.8では動かず、CUDA 12.8対応版(cu128)が必須。認識だけでなくGPU演算まで確認してから学習に入る。学習の途中でコケる権限エラーは第5回と同根で、管理者権限で走らせれば解決する。
- 学習自体はシンプル。20回のお手本でACTを3万ステップ学習し、lossは0.073まで下がった。ただしデフォルトのbatch_size 8ではRTX 5090が半分眠る。マニュアル通りと機材を活かしきることは別。
- 推論の絶対条件は、カメラ位置・照明・背景を学習時と揃えること。モデルは物体位置を映像の見え方として覚えているので、カメラをずらすと大きく外す。
- 実機で10回中5回成功。失敗しても諦めず再挑戦する挙動こそ、手順の丸暗記ではなく状況から動作を生成している証拠。20回・最小データの実力と限界がそのまま見えた。精度を上げる次の一手は、データを増やし多様性を出すこと。
第1回で「個人のGPUでは無理」という常識が変わった、と書きました。6回を通じて、Amazonで買えるアームと自宅のPC1台で、人の実演からロボットが自律で動くところまで、実際に一周できました。フィジカルAIは、もう研究室だけのものではありません。
この連載は今回で完結です。手を動かし、詰まり、その都度正直に書いてきました。同じことを自分の現場でやってみたい方の、地図になれば幸いです。
「自社の作業をロボットに覚えさせたい」「どの機材で、どれだけのデータで、どこまでできるのか、投資する前に見極めたい」という方は、無料の30分オンライン診断で交通整理できます。実機とシミュレーションのどちらから始めるべきか、データ設計、機材選定まで、この連載でやったことを土台に、技術顧問として率直にお話しします。
この記事の技術を、現場で実装したい方へ
AI×IoTの技術顧問として、月額契約で継続伴走しています。PoC設計・技術判断・組織設計・ベンダー管理・実装支援まで、現場で動くまで一緒に進めます。受託開発(請負)ではありません。
→ AI技術顧問サービスの詳細 / 無料30分オンライン診断 / 料金一覧






LEAVE A REPLY