ボルト超えの時代、走るロボットをどう止める? GPUで9,600回の強化学習
ボルト超えの時代、走るロボットをどう止める? GPUで9,600回の強化学習
2026年8月、中国・北京の人型ロボット競技大会では、100mを8秒台で走るロボットが話題になりました。[1] 一方、ゴール後にうまく止まれずマットに激突する場面も報じられています。[3]
2026年の人型ロボット競技大会。ゴール後、防護マットへ衝突する場面。(出典:Reuters)
速く走るだけでなく、走り終えた後にどう減速するか。 これも人型ロボットにとって重要な課題です。
前回の記事では、MacBook Airで人型ロボットの歩行学習に挑戦しました。今回は学習済みの走行AIを使い、100mのゴール通過後、5m以内に安定して止まることを目指します。
今回はまず、こちらで2種類の停止ルールを定義して試します。続いて、ロボットの速度や姿勢に応じて停止方法を選べるよう、強化学習に挑戦します。
ただし、AIに止まり方を学ばせるには、シミュレータ上で何度も走行と停止を試す必要があります。そこで今回はNVIDIA A100を使い、試行錯誤を高速化します。
AIはどんな止まり方を学ぶのか。そして、GPUでその学習をどこまで速くできるのか?
実験して確認していきましょう。
※本記事はMuJoCoによるシミュレーション実験です。北京大会の機体や事故原因を再現するものではなく、実機の安全性を検証するものでもありません。
今回試すこと
項目
内容
ロボット
Unitree G1(手指付きモデル)
物理シミュレータ
MuJoCo
走る・歩く・立つ動作
NVIDIAの学習済みAI「GEAR-SONIC」[2]
新たに学習するAI
ゴール後の指令を選ぶPPO
計算環境
HIGHRESOのNVIDIA A100 80GBとCPU
成功条件
ゴール後5m以内で、転倒・逸脱せず2秒間ほぼ静止
本記事では、走り方は学習し直さず、停止の判断だけを学習させます。
なお、G1やMuJoCoなどの基本用語については、前回の記事をご参照ください。
1. 🤖 学習済みAIでG1を走らせる
G1はロボット本体、GEAR-SONICはその動かし方を学んだAIモデルのことを指します。NVIDIAが公開したこの制御モデルに「走る(run)」「歩く(walk)」「立つ(idle)」などの動作と目標速度を渡すと、全身の関節の動かし方を計算します。
今回は、NVIDIAの公式GitHubで公開しているプログラムと、Hugging Faceで公開されている学習済みモデルを利用しました。モデルの推論はPythonから実行し、MuJoCo上のG1を動かしています。
動作計画器に渡す入力の一部は、次のとおりです。
feeds = {
直前のロボットの姿勢・関節角度
"context_mujoco_qpos": context_qpos[None].astype(np.float32),
目標速度(例:4.0m/s)
"target_vel": np.array([cmd.speed], np.float32),
動作モード(run / walk / idleなど)
"mode": np.array([int(cmd.mode)], np.int64),
腰の高さ指定(-1.0で無効)。ほかの入力は省略
"height": np.array([-1.0], np.float32),
}
「4.0m/sで走れ」と指示すると、GEAR-SONICが各関節の動かし方を計算し、MuJoCoが実際の身体の動きを再現します。動作指令は0.1秒ごと、関節の動かし方は0.02秒ごとに更新しています。
指令速度と実際の速度は違う
ただし、車の目標速度と同様、「4.0m/sで走れ」と指示しても、姿勢やモーターの制約でその速度が出るとは限りません。
指令速度
100mライン通過時の平均実速度
2.5m/s
2.02m/s
4.0m/s
3.49m/s
高速条件では最大4.19m/sを記録しましたが、大会の100m記録(8.64秒、平均約11.6m/s)には及びません。今回使用したGEAR-SONICの公式操作UIでは走行指令の上限が3.0m/sであり、実験ではこれを超える4.0m/sまで試しました。
今回は上記大会の最高速度再現ではなく、既存の走行AIでどのように停止できるかを検証していきます。
参考までに、下のGIFは停止指令を出す前の走行だけを切り出したものになります。
2.5m/sの方が幾分ジョギング気味なのがわかります。
同じseedでの走行比較。上段が2.5m/s指令、下段が4.0m/s指令。
2. 🏁 100m通過後、どう止める?
ゴールは座標で判定する
今回はカメラで白線を認識させたりしません。MuJoCoから得られるG1の骨盤の前進方向の位置を使い、スタートを0m、ゴールを100mと設定しました。
if obs.along < self.goal_line: # 骨盤の前進位置が100m未満
self.phase = "cruise" # 走行を継続
...
100m以上で停止制御に切り替え
self.phase, self.t_switch, self.x_switch = "stop", obs.t, obs.along
self.next_decision_t = obs.t
判定は0.1秒ごとなので、停止指令への切替は実際のライン通過から最大約0.1秒後です。実機なら、ここに画像認識や位置推定の仕組みが別途必要になります。
強化学習を使わず、まず2方式を試す
まずは強化学習を使わず、こちらで停止手順を2つ定義し、比較していきましょう。
方法
ゴール後の指令
A:即座に立位指令
直後にidleへ切り替える
B:段階的に減速
run → walk → slow_walk → idle
idleは立位を保つための動作モードで、切り替えた瞬間に止まるわけではありません。また、走行速度をゼロに指定するだけでは足踏みが続く場合があったため、最後はidleに切り替えます。どちらの方法も、ゴール前には減速しません。
左がA(ゴール通過後ただちにidleへ切替)、右がB(run→walk→slow_walk→idle)。どちらもゴール前には減速せず、ゴール通過後の停止指令だけを変えています(2.5m/s指令・seed 1234)。
実験してみると、ゴール通過速度が平均2.02m/sの条件では、両方式とも10/10回成功。平均停止距離はAが1.15m、Bが3.59mでした。
ところが、高速条件では次の差が出ました。
4.0m/s指令・各10回
A:即座に立位
B:段階減速
5m以内で停止
9/10
8/10
転倒
1回
0回
平均停止距離
2.78m
4.57m
Aでは4.19m/sで通過した試行が、停止指令の約2.15秒後に前方へ転倒しました。Bでは転倒しない一方、2回は5mを超過。短い距離で止まることと、穏やかに止まることは両立しない場合があります。
4.0m/s指令・seed 4。転倒判定時はゴール後約6.84m、滑った後の最終位置は約7.44m。
では、速度や姿勢に応じていつidleへ切り替えるか、AIに選ばせたらどうなるでしょうか?
3. 🧠 「止まり方」を強化学習する
走行AIはそのまま、判断役だけを学習
ここで使うのが、PPO(Proximal Policy Optimization) という強化学習の手法です。行動の選び方を一度に大きく変えすぎず、安定した学習を目指すのが特徴です。
走行や関節制御はGEAR-SONICに任せ、新たなAIがロボットの速度や姿勢をもとに、0.2秒ごとに次の3つの指令から選びます。
選択肢
内容
維持
現在の指令を続ける
一段階減速
runからwalkなど、次の低速モードへ進む
立位へ切替
idleに切り替える
停止制御はrun 1.5m/sから始まり、ゴール手前でPPOは操作できません。新しく学習するのは停止判断AIだけです。
PPOが動作指令を選び、GEAR-SONICが関節の動かし方を計算する。MuJoCoがその動きをシミュレーションし、停止結果に応じた報酬をもとにPPOを学習させる。
何を見て、何を褒める?
PPOには、ロボットの位置・速度・姿勢などを入力し、停止結果に応じて報酬を与えます。
区分
項目
内容
入力
位置・速度
ゴール後の距離、横位置、前後・左右の速度
入力
姿勢
胴体の前後・左右の傾き、回転速度
入力
動作状態
現在の減速段階、経過時間
報酬
安定停止
5m以内で2秒間ほぼ静止:+10点
報酬
転倒
−15点
報酬
その他の失敗
コース逸脱・5m超過・時間切れ:各−10点
減点
急減速
最大減速度が2.0m/s²を超える
減点
急な速度変化
ジャークが5.0m/s³を超える
減点
姿勢の崩れ
胴体の傾きが15°を超える
減点
停止時間・距離
3秒・4mを超えると、それぞれ減点
※各減点の上限は−2点です。安定停止は平均速度0.05m/s未満が2秒続くことを指します。
まず5m以内で安定して止まることを優先し、そのうえで急減速や姿勢の崩れ、停止に時間・距離がかかりすぎることを抑える設計です。
毎回100mを走り直さない
停止だけを練習したいのに、毎回100mの助走から始めるのは非効率です。そこで、先に走らせたゴール直後の状態を保存し、その地点から停止部分だけを繰り返しました。
保存するのは位置や速度だけでなく、GEAR-SONICの動作計画や履歴も含む状態です。これにより、100mの助走を毎回繰り返さず、ゴール通過直後の118種類の状態から停止だけを学習できます。
一方、最終評価では未使用の20種類の条件で、スタートから100mを走らせて停止性能を確認します。
助走を一度記録すれば、その後は停止部分だけを反復できる。
4. ⚡ A100で9,600回学習させたら?
強化学習の試行回数と実験条件
今回は、学習の進み方と計算時間を確認するため、96試行を1セットとして100セット、計9,600回の停止試行を行いました。
9,600回は最適な回数として導いたものではなく、まず学習の傾向を調べるために設定した回数です。
GPUが担当する処理
CPU上で24個のMuJoCoシミュレーションを並列実行し、ロボットの動きを物理計算します。一方、各関節の動かし方を求めるGEAR-SONICのAI推論はA100が担当します。
24個のプロセスが1枚のGPUを効率よく共有するため、CUDA MPSを使用。停止試行を繰り返してデータを集め、PPOの学習更新もGPUで行います。
CPUで物理シミュレーション、GPUでAI推論を分担。A100による高速化の主な要因は、GEAR-SONICの推論を効率よく並列処理できること。
17.5分で、仮想の停止動作12.1時間分
A100+MPSでは、9,600試行の学習が17.5分で終了しました。試行中にシミュレータ内で進んだ時間は合計43,409秒(約12.1時間)。これは実際の待ち時間ではなく、各ロボットの停止動作を足した仮想時間で、100mの助走は含んでいません。
左上:報酬、右上:停止成功率、左下:停止距離、右下:転倒率。報酬は学習序盤に改善しましたが、成功率は当初から高く、停止距離はむしろ長くなりました。
GPUで停止AIの学習は約3倍速くなる
CPUだけで実行する場合と、GPU(A100)を使う場合で、96回の停止試行とPPOの更新にかかる時間を比較しました。
使用したサーバーは、CPUがIntel Xeon Silver 4310(12コア/24スレッド、2.10GHz)、GPUがNVIDIA A100 80GB、メモリ約251GiBです。いずれも24プロセスで計測しました。
計算方法
96試行+更新の1セット
100セット
CPUのみ
25.9秒
約54分(推定)
A100・MPSなし
45.3秒
約93分(推定)
A100+MPS
8.5秒
17.5分(実測)
A100+MPSでは、CPUのみと比べて約3倍高速化しました。一方、MPSなしではGPUを使っても遅くなりました。
これは、24個のプロセスからGPUへ頻繁に推論を依頼する際、処理待ちや切り替えの負荷が生じるためと考えられます。CUDA MPSは複数プロセスのGPU処理を効率よく実行する仕組みで、今回の高速化にはこれが重要でした。
左から①シミュレーション処理速度、②PPOの更新時間、③1セットの処理時間、④100セットの総時間。GPUの効果は主にGEAR-SONICの推論にあり、PPOの更新自体はCPUの方が速い結果でした。なお、100セットのCPU時間は短時間計測からの推定値です。
5. 🏃 学習した止まり方はどう変わった?
ここでは、ゴール後の止まり方を決める3つの方法を比べます。
2つは人手で決めたルール、もう1つは強化学習で学んだ方法です。
A:即 idle … ゴール通過後、すぐ立位モードに切り替える
B:段階減速 … run → walk → slow_walk → idle と段階的に切り替える
PPO … 学習した停止判断AIが、0.2秒ごとに次の指令を選ぶ
未使用の20 seedを使い、スタートから100m走らせて、この3方式を比較しました。
左から、A:即 idle、B:段階減速、PPO。ゴール通過時は約4.10m/sであり、3つの止まり方の違いを比較した。
指標
即idle
段階減速
PPO
5m以内停止まで成功
18/20
18/20
18/20
平均停止距離
2.34m
4.28m
3.07m
平均停止時間
3.04秒
3.89秒
2.59秒
ピーク減速度
3.19m/s²
2.23m/s²
2.56m/s²
ピークジャーク
8.26m/s³
5.86m/s³
5.85m/s³
最大胴体傾斜
17.0°
13.9°
11.8°
成功数は3方式とも18/20。 残る2件はゴール前のコース逸脱と転倒です。停止距離などの平均は、逸脱後も走り切った1件を含む19試行で集計しています。
PPOは成功率を上げませんでしたが、即idleより減速が穏やかで、段階減速より短時間で止まりました。
なお、学習前後を比較すると、PPOは停止時の急減速や姿勢の崩れを抑える方向に変化しました。ただし、停止距離は長くなっており、学習によってすべての指標が改善したわけではありません。
AIが学んだのは「約1秒後に立位へ切り替える」
PPOは、ゴール通過後に目標速度1.5m/sの低速走行を指示し、19試行中14回は1.0秒後、残る5回は0.8秒後にidleへ切り替えました。実際の速度はその間も低下し、平均3.07mで停止しました。
左上:切替時刻とゴール通過速度。右下:切替時刻と骨盤の傾き。速度との明確な関係はなく、一部の試行では姿勢に応じて早めに切り替えています。
固定で1秒後にidleへ切り替えるルールと比べても、19試行中14回は同じ動作となり、平均停止距離の差は約0.06mでした。今回の条件では、PPOが単純な固定ルールを大きく上回ったとは言えません。
一方、PPOはロボットの姿勢に応じて停止タイミングを変える動作も学習しました。こうした状況に応じた判断を、人手で細かなルールを定義せずに獲得できることは、強化学習の利点です。
6. 🔍 まとめ
今回、学習済みのGEAR-SONICを利用し、走行動作を学習し直さず、停止判断だけを強化学習できました。
学習したPPOは、ルールベースでの即idleより急減速を抑え、段階減速より短時間で停止しました。ただし、停止成功率はどの方法も18/20で、固定1秒ルールと比べた優位性も限定的でした。
一方、A100+CUDA MPSでは9,600回の停止試行を17.5分で学習し、CPUのみと比べて1セット当たり約3倍高速化しました。GPUの価値は、停止性能を直接高めることではなく、試行条件や報酬を変えながら改善を繰り返す時間を短縮できることにあります。
今回はシミュレータ上でゴール位置を把握できましたが、実際のロボットでは、カメラ映像などから周囲の状況を認識し、判断する必要があります。
今後は、視覚情報をもとに周囲の状況を理解し、行動につなげるVLA(Vision-Language-Action)モデルなど、より高度なロボットAIの実験にも取り組んでいく予定です。
この記事を書いた人
おむ
画像認識・LLMを中心に、AIシステムの開発や技術検証に取り組むAIエンジニア。
参考資料
[1] IT之家「天工Ultraの100m決勝8.64秒」 ithome.com (大会の機体は本実験と異なる)
[2] Luo et al., SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control, arxiv.org 。公開モデル:huggingface.co 、公式実装:NVlabs/GR00T-WholeBodyControl
[3] Reuters, After outrunning Bolt, China's robot champion races towards real-world work, reuters.com
Mentions
✅ 一手来源: SONIC 项目页 nvlabs.github.io 代码(GR00T-WholeBodyControl) NVlabs/GR00T-WholeBodyControl 注意:「6 小时、一块 GPU」是 AGIBOT 自述,未核实。代码为 Apache-2.0,权重用 NVIDIA Open Model License,商用前要看清条款。
ボルト超えの時代、走るロボットをどう止める? GPUで9,600回の強化学習 ボルト超えの時代、走るロボットをどう止める? GPUで9,600回の強化学習 2026年8月、中国・北京の人型ロボット競技大会では、100mを8秒台で走るロボットが話題になりました。[1] 一方、ゴール後にうまく止まれずマットに激突する場面も報じられています。[3] 2026年の人型ロボット競技大会。ゴール後、防護マットへ衝突する場面。(出典:Reuters) 速く走るだけでなく、走り終えた後にどう減速するか。 これも人型ロボットにとって重要な課題です。 前回の記事では、MacBook Airで人型ロボットの歩行学習に挑戦しました。今回は学習済みの走行AIを使い、100mのゴール通過後、5m以内に安定して止まることを目指します。 今回はまず、こちらで2種類の停止ルールを定義して試します。続いて、ロボットの速度や姿勢に応じて停止方法を選べるよう、強化学習に挑戦します。 ただし、AIに止まり方を学ばせるには、シミュレータ上で何度も走行と停止を試す必要があります。そこで今回はNVIDIA A100を使い、試行錯誤を高速化します。 AIはどんな止まり方を学ぶのか。そして、GPUでその学習をどこまで速くできるのか? 実験して確認していきましょう。 ※本記事はMuJoCoによるシミュレーション実験です。北京大会の機体や事故原因を再現するものではなく、実機の安全性を検証するものでもありません。 今回試すこと 項目 内容 ロボット Unitree G1(手指付きモデル) 物理シミュレータ MuJoCo 走る・歩く・立つ動作 NVIDIAの学習済みAI「GEAR-SONIC」[2] 新たに学習するAI ゴール後の指令を選ぶPPO 計算環境 HIGHRESOのNVIDIA A100 80GBとCPU 成功条件 ゴール後5m以内で、転倒・逸脱せず2秒間ほぼ静止 本記事では、走り方は学習し直さず、停止の判断だけを学習させます。 なお、G1やMuJoCoなどの基本用語については、前回の記事をご参照ください。 1. 🤖 学習済みAIでG1を走らせる G1はロボット本体、GEAR-SONICはその動かし方を学んだAIモデルのことを指します。NVIDIAが公開したこの制御モデルに「走る(run)」「歩く(walk)」「立つ(idle)」などの動作と目標速度を渡すと、全身の関節の動かし方を計算します。 今回は、NVIDIAの公式GitHubで公開しているプログラムと、Hugging Faceで公開されている学習済みモデルを利用しました。モデルの推論はPythonから実行し、MuJoCo上のG1を動かしています。 動作計画器に渡す入力の一部は、次のとおりです。 feeds = { 直前のロボットの姿勢・関節角度 "context_mujoco_qpos": context_qpos[None].astype(np.float32), 目標速度(例:4.0m/s) "target_vel": np.array([cmd.speed], np.float32), 動作モード(run / walk / idleなど) "mode": np.array([int(cmd.mode)], np.int64), 腰の高さ指定(-1.0で無効)。ほかの入力は省略 "height": np.array([-1.0], np.float32), } 「4.0m/sで走れ」と指示すると、GEAR-SONICが各関節の動かし方を計算し、MuJoCoが実際の身体の動きを再現します。動作指令は0.1秒ごと、関節の動かし方は0.02秒ごとに更新しています。 指令速度と実際の速度は違う ただし、車の目標速度と同様、「4.0m/sで走れ」と指示しても、姿勢やモーターの制約でその速度が出るとは限りません。 指令速度 100mライン通過時の平均実速度 2.5m/s 2.02m/s 4.0m/s 3.49m/s 高速条件では最大4.19m/sを記録しましたが、大会の100m記録(8.64秒、平均約11.6m/s)には及びません。今回使用したGEAR-SONICの公式操作UIでは走行指令の上限が3.0m/sであり、実験ではこれを超える4.0m/sまで試しました。 今回は上記大会の最高速度再現ではなく、既存の走行AIでどのように停止できるかを検証していきます。 参考までに、下のGIFは停止指令を出す前の走行だけを切り出したものになります。 2.5m/sの方が幾分ジョギング気味なのがわかります。 同じseedでの走行比較。上段が2.5m/s指令、下段が4.0m/s指令。 2. 🏁 100m通過後、どう止める? ゴールは座標で判定する 今回はカメラで白線を認識させたりしません。MuJoCoから得られるG1の骨盤の前進方向の位置を使い、スタートを0m、ゴールを100mと設定しました。 if obs.along < self.goal_line: # 骨盤の前進位置が100m未満 self.phase = "cruise" # 走行を継続 ... 100m以上で停止制御に切り替え self.phase, self.t_switch, self.x_switch = "stop", obs.t, obs.along self.next_decision_t = obs.t 判定は0.1秒ごとなので、停止指令への切替は実際のライン通過から最大約0.1秒後です。実機なら、ここに画像認識や位置推定の仕組みが別途必要になります。 強化学習を使わず、まず2方式を試す まずは強化学習を使わず、こちらで停止手順を2つ定義し、比較していきましょう。 方法 ゴール後の指令 A:即座に立位指令 直後にidleへ切り替える B:段階的に減速 run → walk → slow_walk → idle idleは立位を保つための動作モードで、切り替えた瞬間に止まるわけではありません。また、走行速度をゼロに指定するだけでは足踏みが続く場合があったため、最後はidleに切り替えます。どちらの方法も、ゴール前には減速しません。 左がA(ゴール通過後ただちにidleへ切替)、右がB(run→walk→slow_walk→idle)。どちらもゴール前には減速せず、ゴール通過後の停止指令だけを変えています(2.5m/s指令・seed 1234)。 実験してみると、ゴール通過速度が平均2.02m/sの条件では、両方式とも10/10回成功。平均停止距離はAが1.15m、Bが3.59mでした。 ところが、高速条件では次の差が出ました。 4.0m/s指令・各10回 A:即座に立位 B:段階減速 5m以内で停止 9/10 8/10 転倒 1回 0回 平均停止距離 2.78m 4.57m Aでは4.19m/sで通過した試行が、停止指令の約2.15秒後に前方へ転倒しました。Bでは転倒しない一方、2回は5mを超過。短い距離で止まることと、穏やかに止まることは両立しない場合があります。 4.0m/s指令・seed 4。転倒判定時はゴール後約6.84m、滑った後の最終位置は約7.44m。 では、速度や姿勢に応じていつidleへ切り替えるか、AIに選ばせたらどうなるでしょうか? 3. 🧠 「止まり方」を強化学習する 走行AIはそのまま、判断役だけを学習 ここで使うのが、PPO(Proximal Policy Optimization) という強化学習の手法です。行動の選び方を一度に大きく変えすぎず、安定した学習を目指すのが特徴です。 走行や関節制御はGEAR-SONICに任せ、新たなAIがロボットの速度や姿勢をもとに、0.2秒ごとに次の3つの指令から選びます。 選択肢 内容 維持 現在の指令を続ける 一段階減速 runからwalkなど、次の低速モードへ進む 立位へ切替 idleに切り替える 停止制御はrun 1.5m/sから始まり、ゴール手前でPPOは操作できません。新しく学習するのは停止判断AIだけです。 PPOが動作指令を選び、GEAR-SONICが関節の動かし方を計算する。MuJoCoがその動きをシミュレーションし、停止結果に応じた報酬をもとにPPOを学習させる。 何を見て、何を褒める? PPOには、ロボットの位置・速度・姿勢などを入力し、停止結果に応じて報酬を与えます。 区分 項目 内容 入力 位置・速度 ゴール後の距離、横位置、前後・左右の速度 入力 姿勢 胴体の前後・左右の傾き、回転速度 入力 動作状態 現在の減速段階、経過時間 報酬 安定停止 5m以内で2秒間ほぼ静止:+10点 報酬 転倒 −15点 報酬 その他の失敗 コース逸脱・5m超過・時間切れ:各−10点 減点 急減速 最大減速度が2.0m/s²を超える 減点 急な速度変化 ジャークが5.0m/s³を超える 減点 姿勢の崩れ 胴体の傾きが15°を超える 減点 停止時間・距離 3秒・4mを超えると、それぞれ減点 ※各減点の上限は−2点です。安定停止は平均速度0.05m/s未満が2秒続くことを指します。 まず5m以内で安定して止まることを優先し、そのうえで急減速や姿勢の崩れ、停止に時間・距離がかかりすぎることを抑える設計です。 毎回100mを走り直さない 停止だけを練習したいのに、毎回100mの助走から始めるのは非効率です。そこで、先に走らせたゴール直後の状態を保存し、その地点から停止部分だけを繰り返しました。 保存するのは位置や速度だけでなく、GEAR-SONICの動作計画や履歴も含む状態です。これにより、100mの助走を毎回繰り返さず、ゴール通過直後の118種類の状態から停止だけを学習できます。 一方、最終評価では未使用の20種類の条件で、スタートから100mを走らせて停止性能を確認します。 助走を一度記録すれば、その後は停止部分だけを反復できる。 4. ⚡ A100で9,600回学習させたら? 強化学習の試行回数と実験条件 今回は、学習の進み方と計算時間を確認するため、96試行を1セットとして100セット、計9,600回の停止試行を行いました。 9,600回は最適な回数として導いたものではなく、まず学習の傾向を調べるために設定した回数です。 GPUが担当する処理 CPU上で24個のMuJoCoシミュレーションを並列実行し、ロボットの動きを物理計算します。一方、各関節の動かし方を求めるGEAR-SONICのAI推論はA100が担当します。 24個のプロセスが1枚のGPUを効率よく共有するため、CUDA MPSを使用。停止試行を繰り返してデータを集め、PPOの学習更新もGPUで行います。 CPUで物理シミュレーション、GPUでAI推論を分担。A100による高速化の主な要因は、GEAR-SONICの推論を効率よく並列処理できること。 17.5分で、仮想の停止動作12.1時間分 A100+MPSでは、9,600試行の学習が17.5分で終了しました。試行中にシミュレータ内で進んだ時間は合計43,409秒(約12.1時間)。これは実際の待ち時間ではなく、各ロボットの停止動作を足した仮想時間で、100mの助走は含んでいません。 左上:報酬、右上:停止成功率、左下:停止距離、右下:転倒率。報酬は学習序盤に改善しましたが、成功率は当初から高く、停止距離はむしろ長くなりました。 GPUで停止AIの学習は約3倍速くなる CPUだけで実行する場合と、GPU(A100)を使う場合で、96回の停止試行とPPOの更新にかかる時間を比較しました。 使用したサーバーは、CPUがIntel Xeon Silver 4310(12コア/24スレッド、2.10GHz)、GPUがNVIDIA A100 80GB、メモリ約251GiBです。いずれも24プロセスで計測しました。 計算方法 96試行+更新の1セット 100セット CPUのみ 25.9秒 約54分(推定) A100・MPSなし 45.3秒 約93分(推定) A100+MPS 8.5秒 17.5分(実測) A100+MPSでは、CPUのみと比べて約3倍高速化しました。一方、MPSなしではGPUを使っても遅くなりました。 これは、24個のプロセスからGPUへ頻繁に推論を依頼する際、処理待ちや切り替えの負荷が生じるためと考えられます。CUDA MPSは複数プロセスのGPU処理を効率よく実行する仕組みで、今回の高速化にはこれが重要でした。 左から①シミュレーション処理速度、②PPOの更新時間、③1セットの処理時間、④100セットの総時間。GPUの効果は主にGEAR-SONICの推論にあり、PPOの更新自体はCPUの方が速い結果でした。なお、100セットのCPU時間は短時間計測からの推定値です。 5. 🏃 学習した止まり方はどう変わった? ここでは、ゴール後の止まり方を決める3つの方法を比べます。 2つは人手で決めたルール、もう1つは強化学習で学んだ方法です。 A:即 idle … ゴール通過後、すぐ立位モードに切り替える B:段階減速 … run → walk → slow_walk → idle と段階的に切り替える PPO … 学習した停止判断AIが、0.2秒ごとに次の指令を選ぶ 未使用の20 seedを使い、スタートから100m走らせて、この3方式を比較しました。 左から、A:即 idle、B:段階減速、PPO。ゴール通過時は約4.10m/sであり、3つの止まり方の違いを比較した。 指標 即idle 段階減速 PPO 5m以内停止まで成功 18/20 18/20 18/20 平均停止距離 2.34m 4.28m 3.07m 平均停止時間 3.04秒 3.89秒 2.59秒 ピーク減速度 3.19m/s² 2.23m/s² 2.56m/s² ピークジャーク 8.26m/s³ 5.86m/s³ 5.85m/s³ 最大胴体傾斜 17.0° 13.9° 11.8° 成功数は3方式とも18/20。 残る2件はゴール前のコース逸脱と転倒です。停止距離などの平均は、逸脱後も走り切った1件を含む19試行で集計しています。 PPOは成功率を上げませんでしたが、即idleより減速が穏やかで、段階減速より短時間で止まりました。 なお、学習前後を比較すると、PPOは停止時の急減速や姿勢の崩れを抑える方向に変化しました。ただし、停止距離は長くなっており、学習によってすべての指標が改善したわけではありません。 AIが学んだのは「約1秒後に立位へ切り替える」 PPOは、ゴール通過後に目標速度1.5m/sの低速走行を指示し、19試行中14回は1.0秒後、残る5回は0.8秒後にidleへ切り替えました。実際の速度はその間も低下し、平均3.07mで停止しました。 左上:切替時刻とゴール通過速度。右下:切替時刻と骨盤の傾き。速度との明確な関係はなく、一部の試行では姿勢に応じて早めに切り替えています。 固定で1秒後にidleへ切り替えるルールと比べても、19試行中14回は同じ動作となり、平均停止距離の差は約0.06mでした。今回の条件では、PPOが単純な固定ルールを大きく上回ったとは言えません。 一方、PPOはロボットの姿勢に応じて停止タイミングを変える動作も学習しました。こうした状況に応じた判断を、人手で細かなルールを定義せずに獲得できることは、強化学習の利点です。 6. 🔍 まとめ 今回、学習済みのGEAR-SONICを利用し、走行動作を学習し直さず、停止判断だけを強化学習できました。 学習したPPOは、ルールベースでの即idleより急減速を抑え、段階減速より短時間で停止しました。ただし、停止成功率はどの方法も18/20で、固定1秒ルールと比べた優位性も限定的でした。 一方、A100+CUDA MPSでは9,600回の停止試行を17.5分で学習し、CPUのみと比べて1セット当たり約3倍高速化しました。GPUの価値は、停止性能を直接高めることではなく、試行条件や報酬を変えながら改善を繰り返す時間を短縮できることにあります。 今回はシミュレータ上でゴール位置を把握できましたが、実際のロボットでは、カメラ映像などから周囲の状況を認識し、判断する必要があります。 今後は、視覚情報をもとに周囲の状況を理解し、行動につなげるVLA(Vision-Language-Action)モデルなど、より高度なロボットAIの実験にも取り組んでいく予定です。 この記事を書いた人 おむ 画像認識・LLMを中心に、AIシステムの開発や技術検証に取り組むAIエンジニア。 参考資料 [1] IT之家「天工Ultraの100m決勝8.64秒」 ithome.com (大会の機体は本実験と異なる) [2] Luo et al., SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control, arxiv.org 。公開モデル:huggingface.co 、公式実装:NVlabs/GR00T-WholeBodyControl [3] Reuters, After outrunning Bolt, China's robot champion races towards real-world work, reuters.com
@DannyLimanseta Look into Motionbricks. Nvidia was supposed to release a UE5 plugin for it but haven't yet. Maybe you could get it working. MotionBricks: Scalable Real-Time Motions with Modular Latent Generative Model github.com/NVlabs/GR00T-WholeBodyControl/tree/mai… I'm working on this: x.com