RLによる4Bモデルの訓練後学習で、テスラ・ロードスターをGPT-6 Astraより21%向上させる
Post-training 4B model with RL to fly Tesla Roadster 21% better than GPT-6 Astra (skypilot.ai)
要約
この記事では、物理シミュレーター上でテスラ・ロードスターを飛行させるための強化学習(RL)環境を構築し、大規模言語モデル(LLM)に操縦させた実験について解説しています。最新のオープンソースモデルはリアルタイムでの操縦に失敗しましたが、RLで訓練された4Bモデルは、特に強風下で優れた性能を発揮し、GPT-6 Astraをも上回る結果を示しました。
全文翻訳
RLによる4Bモデルの訓練後学習で、テスラ・ロードスターをGPT-6 Astraより21%向上させる
先週木曜日(10月15日)、テスラの新型ロードスターが、車体が逆さまになるほど湾曲したランプから飛び出し、空中で体勢を立て直して着地しました。その後、スラスターを使ってサイバートラックを飛び越えました。未来には空飛ぶ車があることが証明されたのです。
[画像: イーロン・マスク氏のXへの投稿、10月15日:「未来には空飛ぶ車があることが証明された」と、ロードスターが駐車されたテスラ車列を飛び越える動画のフレームと共に投稿。48Kリプライ、133Kリポスト、834Kいいね、78Mビュー。]
デモンストレーションは「強風のため」2週間延期されていました(Elon Musk on X)。そこで私たちは疑問に思いました。もしパイロット席に言語モデルが座っていたら、あの風の中で車はどうなるだろうか?
そこで私たちは、飛行するロードスターの物理シミュレーターを中心にRL環境を構築し、LLMに操縦を任せ、風を強くしました。最新の最良モデルのいくつかを飛ばしてみました。DeepSeek V4.1 Flash、MetaのMuse Spark Open、ReflectionのBeam 1.0、NVIDIAのNemotron 3.5 Super VL、TypeSafeのJev 1.14、そしてOpenAIのGPT-6 Astraです。
リアルタイムで決定を求められたこれらのモデルは、ほぼ全てのフライトでクラッシュしました。ほとんどのモデルは回答に1〜6秒かかりますが、車は0.2秒ごとに新しいアクションを必要とします。モデルがいくらでも考える時間を与えられるように世界を一時停止しても、嵐の中ではRLで訓練された4Bモデルに敗れました。
嵐、風速33 m/s:DeepSeekは考える時間を無制限に与えられても、傾いて着地し、車体で地面に衝突します。RLで訓練された私たちの4Bは水平に着地します。
TL;DR
- 4つのエアスラスター、突風、そして公開デモの2つのスタント(ランプフリップとキックフリップ)を備えた、飛行するロードスターの物理シミュレーターを中心にRL環境を構築しました。LLMは車が動き続ける間に0.2秒ごとに1つのコマンドで操縦します。
- 最新のオープンモデルはリアルタイムでは操縦できません。 DeepSeek V4.1 Flash、Nemotron 3.5 Super、Muse Spark Open、Beam 1.0は決定ごとに1〜6秒かかり、キックフリップの着地率は0%、ランプフリップの着地率は3%以下です。GPT-6 Astraも時間内では0%の着地率です。
- RLによる訓練後学習で、4Bモデルが最高のパイロットになりました。 約13ドルで訓練されたQwen3-4Bは0.09秒で応答し、リアルタイムでキックフリップの90%を着地させます。世界を一時停止してモデルに考えさせる場合、最良のオープンモデルであるDeepSeek V4.1 Flashは87%、他のオープンモデルは58%から62%を着地させます。GPT-6 Astraでさえ74%しか着地できません。
- 全てオープンソースであり、GPUなしで独自のモデルを飛ばすことができます(試してみる)。
[画像: 嵐の中でのキックフリップ、モデルごとに384回のホールドアウトフライト。オープン円は考える時間を無制限にした実行結果。リアルタイムでは、DeepSeek、GPT-6 Astra、Muse、Nemotron、Beamは0%を着地させ、RL訓練された4Bは90%を着地させる。]
嵐の中でのキックフリップ、モデルごとに384回のホールドアウトフライト。オープン円は考える時間を無制限にした実行結果。リアルタイムでは、DeepSeek、GPT-6 Astra、Muse、Nemotron、Beamは0%を着地させ、RL訓練された4Bは90%を着地させる。
モデルが車をどのように飛ばすかをご覧ください。 スタント、風のレベル、モデルを選択すると、ホールドアウトされたシーンで同じフライトをリプレイできます。フルページでは、0.2秒ごとのパイロットの決定、モデルが見たテレメトリ、各応答にかかった時間も表示されます。
RL環境:風の中のテスラ・ロードスターを飛ばす #
4つのエアスラスターが車体を持ち上げ、逆さまの時は地面に押し付ける
車体は剛体で、長さ4.5m、乾燥重量2,000kg、500Hzでシミュレートされます。揚力は車の床の四隅にある4つのコールドガススラスターから得られます。各スラスターは12kNの推力を持ち、圧縮空気タンク(フライトあたり110〜170kg)から供給されます。スラスターは床からまっすぐ噴射されます。左側のペアが強く噴射されれば車体はロールし、前方のペアが強く噴射されればピッチします。
車体が逆さまの時、同じスラスターが地面に向かって押し付け、これが両方のスタントを難しくしています。
平らに、あるいは横向きに落下する車は、より多くの風を受ける
車は通常、前方を向いて移動するように設計されています。平らに落下したり、横から風を受けたりすると、空気に対する面積が5〜9倍になり、風に大きく流されます。地面近くでは風は弱く、平均風速に突風が加わります。各フライトでは、ランダムな方向からの平均風速が、3つのバンドのいずれかで与えられます。ライト(最大14 m/s)、ゲイル(14〜24 m/s)、またはストーム(24〜33 m/s)です。
ホイールは4mの落下に耐えられるが、ルーフは地面に触れてはならない
車体は、4つのスプリング付きホイール、または車体で地面に接触する可能性があります。クラッシュとみなされるのは以下の条件です:
公開デモからの2つのスタント:ランプフリップとサイバートラック越えのキックフリップ
ランプフリップでは、ランプが湾曲し、車体はデッキを逆さまの状態で10〜14m上昇し、その後、体勢を立て直して着地する必要があります。キックフリップでは、車体は時速50〜94kmで進入し、駐車されたサイバートラックを飛び越え、完全に360度回転して着地します。
フライトが成功するのは、車体が14mの道路上に4輪すべてで、ほぼ水平(約20度以内)で、回転が止まり、クラッシュせずに着地した場合のみです。全てのタスクで、速度、タンク内の空気量、風と突風、ランプのサイズまたはトラックの位置がランダム化されます。ホールドアウトされたタスクは、どのモデルも訓練されていないシードを使用します。
モデルが見るもの、そして返すもの
各フライトの開始時に、モデルにはブリーフィングが与えられます。車体、クラッシュルール、そして送信できる5つのコマンド、そしてタスクが説明されます。以下は、ホールドアウトされたストームフライトのタスク部分のブリーフィングです:
その後、シミュレーション時間の0.2秒ごとに、モデルは1行のテレメトリを受け取り、JSONオブジェクトを1つ返します。以下は、そのフライトの1.2秒後、トラックの上空で逆さまになっていた時の、訓練されたQwen 4Bモデルが見たテレメトリの行です:
モデルは0.15秒で {"mode": "rotate", "axis": "roll", "to": 360.0, "lift": 1.0} と応答し、ロールを継続させました。フライト全体は19回の応答で完了しました:
| 時間 | テレメトリが表示したもの | モデルの応答 | 応答時間 |
| 0.0 s | 道路上、トラックまで25.7m(1.1秒で到達) | climb 7 m/s | 0.09 s |
| 0.2 to 0.4 s | 上昇中、0.5m、次に1.2m | climb 再び7 m/s | 0.09 s |
| 0.6 s | 高さ2.3m、トラックまで11.8m(0.5秒で到達) | rotate ロール360°、リフト1.0 | 0.15 s |
| 0.8 to 1.6 s | トラックを越えてロール中:21°、95°、182°、267°、335° | 同じrotate、5回 | 0.15 s |
| 1.8 s | 高さ6.7mで直立、360°ロール完了、トラック16m後方 | land | 0.08 s |
| 2.0 to 3.4 s | 降下中、その後2輪が接地 | land、さらに8回 | 0.08 s |
| 3.6 s | 4輪が道路上に接地、中央線から3m | coast | 0.05 s |
各行のトラック部分には、車体がトラックに到達するまでの時間と、現在の速度での通過時間も示されているため、モデルは自分で割り算をする必要がありません。このポストの全てのLLMは同じ行を見ており、手書きのパイロットも同じ数値を読み取ります。
5つのコマンドは coast(全スラスターオフ)、climb(指定された垂直速度で水平を維持)、hold(指定されたロールとピッチを維持)、rotate(指定された軸を中心に合計角度まで回転、停止時にブレーキ)、land(水平にしてソフトに着地)です。モデルは各応答で、数値と共に1つのコマンドを選択します。フライトコンピューターは、次の応答が来るまで、毎秒50回のスラストを4つのスラスターそれぞれに変換します。
車はモデルが考えている間も止まらない
モデルが応答に2秒かかった場合、車体は古いコマンドで0.2秒間隔を10回飛行してから新しいコマンドが引き継がれます。応答時間は最初から最後まで計測します。最初の決定のみは、離陸前の計画のように、時間計測されません。
0.2秒という時間を選んだのは、キックフリップのロールが約1秒かかり、適切なタイミングの数十分の数秒以内に開始する必要があるためです。決定間に1秒の間隔があると、モデルであれスクリプトであれ、パイロットはタイミングを合わせることができません。判断力と速度を分離するために、シミュレーターを一時停止し、各応答が到着するまで待機させる方法でも各モデルを飛行させました。これにより、モデルはいくらでも考える時間が与えられます。
報酬の半分はクリーンな着地のため
RLの報酬は0から1までです。高さ、トラックのクリア、回転、接地品質に対して部分的なクレジットが与えられ、成功した着地には0.4、クリーンな終了(ソフトで、空気が残っており、中央に接地)には0.1が与えられます。
手書きのパイロットは、両方のスタントが飛行可能であることを示している
何も訓練する前に、これらの5つのコマンドで両方のスタントが飛行可能であることを確認したかったのです。そこで、手書きのパイロットを作成しました。数十行のif-thenルールで、同じテレメトリを読み取り、同じ0.2秒インターフェースを通じてコマンドを送信します。例えばキックフリップでは、トラックまで1.1秒の距離があるときに上昇を開始し、車体がトラックの屋根の高さ1.4mに達したらロールを開始し、横方向のドリフトに対して傾きを調整し、車体がトラックを通過したら着地します。
手書きのパイロットは即座に応答し、LLMと同じ入力を受け取ります。ライトウィンドでのランプフリップは全て着地させ、ライトウィンドでのキックフリップは98%着地させますが、ストームでのキックフリップは61%しか着地しません。本稿ではこれを「スクリプトパイロット」と呼びます。
ライトウィンドで両方のスタントを飛行するスクリプトパイロット。
最新のオープンモデルはリアルタイムでは飛行できない #
4つのオープンモデル(DeepSeek V4.1 Flash、Muse Spark Open、Nemotron 3.5 Super、Beam 1.0)、ストームでのGPT-6 Astra、そしてメニューからコマンドを選択するのではなくJSONを記述する高速決定モデルであるJev 1.14を飛行させました。全てのモデルは、訓練されたパイロットと同じホールドアウトフライトを飛行します。ライトウィンドとゲイルでは各スタント192回、ストームでは384回です。全ての実行は温度0、各モデルのデフォルトの推論設定を使用します。オープンモデルはOpenRouter経由で呼び出し、Nemotron、Muse、Beamはそれぞれ1つのプロバイダーに固定しました。
考える時間があれば、モデルは良い判断をする
シミュレーターが各応答を待つ場合、4つのオープンモデルはライトウィンドでキックフリップをうまく飛行させます。DeepSeek V4.1 Flashは98%、Muse、Nemotron、Beamは72%から82%を着地させます。
風が強くなると、それでも難しくなります。ストームでは、DeepSeekは87%、Museは62%、Nemotronは60%、Beamは58%に低下します。GPT-6 Astraはストームキックフリップの74%を着地させます。
実行中の時計では、キックフリップの0%を着地させる
車が動いている状態では、全ての4つのオープンモデルはキックフリップを0%着地させます。中央値の決定時間は1〜6秒なので、典型的なコマンドは必要とされる時間の5〜29インターバル後に到着します。リアルタイム実行では、16回のフライトが並列で実行されるため、応答はさらに遅くなりました(DeepSeekの中央値は2〜3秒)。
GPT-6 Astraは決定ごとに約2秒かかり、768回のストームフライトをリアルタイムで1つも着地させません。同じ時計で、訓練された4Bはストームキックフリップの90%を着地させます。
DeepSeek V4.1 Flashの同じフライト、2回。左側はシミュレーターが各応答を待つ場合で、車は着地します。右側は時計が動き続け、応答が遅れて到着し、車はクラッシュします。
速く応答しても解決しない
最初のラウンドでは、推論をオフにしてDeepSeekは0.3秒で応答しましたが、判断は悪くなり、MuseとBeamは低負荷でも決定ごとに約2秒かかりました。Jevは約0.17秒で応答し、時計に間に合う速さですが、ストームキックフリップのライブではわずか2%しか着地しません。パイロットは速く応答し、良い判断をする必要があります。
[画像: 中央値決定時間対ストームキックフリップ成功率。JevとRL訓練された4Bは両方とも0.2秒以内に応答し、4Bのみがほとんどのフライトを着地させる(90%)。]
中央値決定時間対ストームキックフリップ成功率。JevとRL訓練された4Bは両方とも0.2秒以内に応答し、4Bのみがほとんどのフライトを着地させる(90%)。
車体は10〜14mの高さでデッキを離れ、簡単な計画で十分です:体勢を立て直し、風に対して傾き、ブレーキをかけて着地します。シミュレーターを一時停止すると、大規模モデルはこれを飛行させます。Museは88%〜97%、DeepSeekは約80%、GPT-6 Astraは384回のストームフライト中383回を着地させます。
時計が動いている状態では、どれも3%を超えません。最初のコマンドは通常、体勢を立て直すロールですが、これは正しいです。しかし、落下は2秒未満で完了し、次の応答は車体が既に地面に衝突した後に到着します。
リアルタイムでのランプフリップ。DeepSeekの最初のコマンド、体勢を立て直すロールは正しいですが、次の応答は車体が地面に衝突した後に到着します。右側では、訓練された4Bは0.2秒ごとに応答して着地します。
| ランプフリップ、着地率 | ライトウィンド | ゲイル | ストーム |
| Qwen3-4B, 未訓練(リアルタイム) | 100% | 99% | 85% |
| Muse Spark Open, 考える時間無制限 | 97% | 92% | 88% |
| DeepSeek V4.1 Flash, 考える時間無制限 | 82% | 78% | 79% |
| Beam 1.0, 考える時間無制限 | 72% | 72% | 68% |
| Nemotron 3.5 Super VL, 考える時間無制限 | 67% | 56% | 50% |
| DeepSeek V4.1 Flash, リアルタイム | 1% | 2% | 3% |
Muse、Beam、Nemotronはリアルタイムで1%以下を着地させます。
未訓練のQwen3-4Bは0.07秒で応答し、ランプフリップの85%〜100%を着地させますが、キックフリップは一度も着地しません。Jevと同様に、時計に間に合う速さです。Jevと異なり、これは訓練可能なモデルなので、ここから始めました。
Qwen3-4Bパイロットの訓練後学習 #
Qwen3-4B-Instruct-2507をベースに、ランク64のLoRA(ベースモデルは凍結したまま訓練される小さな追加重み)を使用しました。訓練コードはオープンソースRLライブラリのSkyRLです。最終モデルの訓練には約4 GPU時間、または13ドルかかりました。
ウォームスタート、その後60ステップのRL
訓練は2段階で構成されます:
- ウォームスタート(2時間20分): 着地したフライトでの教師ありファインチューニング。スタントごとに64回のスクリプトライトウィンドフライト、さらにゲイルとストームのキックフリップ350回(DeepSeek V4.1 Flashがシミュレーター一時停止中に訓練シードで着地させたもの)。損失はパイロットの応答のみに適用し、1エポック訓練します。ほとんどの時間はオプティマイザーの状態をGPUから移動させるのに費やされるため、モデルはGPUメモリに収まります。
- RL(1時間35分): GRPOは同じタスクを数回飛行させ、モデルをグループ平均を上回る試みに向かわせます。60ステップの各ステップで、3つの風レベル全てで16タスク(各8フライト)を飛行させます。0.2秒ごとの決定は1回の会話ターンであり、報酬はフライト全体に対して与えられます。トレーナーはvLLMサーバーとGPUを共有し、モデルを飛行させます。
5ステップごとにチェックポイントを保存し、個別の検証シードのみを使用して1つを選択し、その後ホールドアウトシードを1回飛行させます。このレシピ自体は、検証シードでスコアリングされた多くの実験ラウンドから生まれ、テストシードは今回の最終実行のために確保しておきました。
RL訓練された4Bがストームキックフリップをリアルタイムで着地させる様子。
このセクションの残りは、そのレシピに至るまでの経緯です。
なぜRLだけではキックフリップを学べなかったのか
最初の実行、未訓練モデルからのRLは、10ステップでランプフリップを習得しました。キックフリップの報酬は0.07から始まり、そこに留まりました。68回のキックフリップ決定のうち、66回はロールであり、22回の最初の移動のうち21回は車輪がまだ地面にあるt=0でロールを開始し、車体がルーフから転倒しました。
グループの全8フライトは同じようにクラッシュし、同じ報酬を得ました。GRPOはグループ内のサンプルを比較して学習するため、全てが同じ場合、学習するものがありません。
訓練前後での同じライトウィンドフライト。未訓練のQwen3-4Bは車輪が地面にある状態でロールを開始し、ルーフから転倒します。模倣とRLの後、まず上昇してからロールします。
安価な修正を2つ試しました。まず、ブリーフィングに「道路上でロールすると車体が転倒する」という一文を追加しました。最初の動きは最大リフトでのロールになりましたが、それでもルーフから転倒しました。
次に、練習フライトの半分を、スクリプトパイロットが最初の部分(ロボティクスから借用した逆カリキュラム)を飛行させた後から開始しました。訓練の成功率は約70%に上昇しましたが、ホールドアウトの成功率はt=0からゼロのままでした。なぜなら、モデルはスクリプトパイロットが開始したフリップを完了することしか学ばなかったからです。
ウォームスタートは2人の教師を使用し、それぞれが最も得意な風で飛行した
ウォームスタートがうまくいった方法であり、ほとんどのLLM RLレシピは anyway で始まります。難しいのは、模倣するものを選択することでした。なぜなら、私たちが持っていたパイロットはどちらも、全ての風でうまく飛行できなかったからです:
- スクリプトパイロットはライトウィンドではうまく飛行しますが、ストームでは性能が低下します(ストームキックフリップの61%)。
- 考える時間無制限のDeepSeekはストームではうまく飛行しますが、決定ごとに約1秒かかり、リアルタイムで車を飛ばすには遅すぎます。
そのため、ウォームスタートはスクリプトパイロットのライトウィンドフライトと、DeepSeekのゲイルおよびストームでの着地フライトをコピーします。それ自体で、ウォームスタートは既にライトウィンド、ゲイル、ストームのホールドアウトキックフリップの97%、93%、84%を着地させており、ストームではDeepSeekに近いですが、ストームでは劣ります。
RLは教師が教えたものをさらに向上させる
RLはウォームスタートがコピーしたものから開始し、教師が弱かった場所で練習します。訓練ミックスの2つの選択肢は、失敗したフライトを読んだことから生まれました:
- ストームは2倍カウント。 ストームは報酬を獲得するのが最も難しい場所なので、訓練ミックスにはライトまたはゲイルの2倍のストームフライトが含まれます。
- 遅いアプローチを練習する。 より前のモデルは、ライトウィンドで1種類のフライト、つまり遅い車(14〜16 m/s)でトラックまで約3秒の距離がある場合にDeepSeekに敗れました。それは常に同じタイミング(約1.8秒後)で
landを送信し、トラックに着地しました。同じフライトで、DeepSeekはテレメトリがトラックを通過したと示すまで高度を維持し、その後着地しました。最終実行では、訓練キックフリップの半分はこれらの遅く、遠いトラックのケースであり、RLは待つことを学ぶ必要があります。
RL訓練されたQwen3-4Bは、風が強くなるほどリードが大きくなる #
キックフリップ。 着地したホールドアウトテストフライトの割合(着地数は括弧内)。ライトウィンドとゲイルではフライトごとに192回、ストームでは384回です。各行は同じタスクを飛行します。
| パイロット | ライトウィンド | ゲイル | ストーム |
| スクリプトパイロット(手書きルール、即時決定) | 98% (188) | 83% (160) | 61% (233) |
| DeepSeek V4.1 Flash, リアルタイム | 0% (0) | 0% (0) | 0% (0) |
| DeepSeek V4.1 Flash, 考える時間無制限 | 98% (189) | 90% (172) | 87% (334) |
| Qwen3-4B, 未訓練(リアルタイム) | 0% (0) | 0% (0) | 0% (0) |
| Qwen3-4B, 模倣のみ後:教師のフライトでファインチューニング、RLなし | 97% (187) | 93% (179) | 84% (322) |
| Qwen3-4B, 模倣 + RL後(リアルタイム) | 96% (185) | 96% (184) | 90% (347) |
訓練されたパイロットは0.09秒で応答します(vLLMで提供、一度に1フライト)、0.2秒の間隔内に収まるため、コマンドが遅れて到着することはありません。シミュレーターがリアルタイムで実行されるか、パイロットを待つかに関わらず、全てのフライトは同じように終了します。
RLの部分はストームで現れます。模倣のみの後と同じモデルはストームフライト384回中322回を着地させ、RL後では347回を着地させます。フライトごとに、26のストームタスクはRL後にのみ着地し、1つはRLなしでのみ着地します(厳密なペアテスト、p < 0.000001)。ライトウィンドとゲイルではウォームスタートは既に近かったため、RLは数フライト程度しか改善しませんでした。
考える時間無制限のDeepSeekと比較して、同じタスクでのフライトごとの比較:
- ゲイル: 13フライトのみ4Bが着地、1フライトのみDeepSeek(厳密なペアテスト、p = 0.002)。
- ストーム: 29対16(p = 0.07)。4Bが先行していますが、p値は0.05の閾値を上回っているため、ストームでのリードは有意とはみなしません。
- ライトウィンド: 2対6(p = 0.29)。DeepSeekが数フライト優れており、スクリプトパイロットも同様です(188対185)。
考える時間無制限のGPT-6 Astraと比較して、全384回のストームキックフリップで、4Bは明らかに先行しています。347回対Astraの286回、つまり21%多いです。70回は4Bのみで着地し、9回はAstraのみで着地します(厳密なペアテスト、p < 0.001)。ストームランプフリップでは、Astraがわずかに先行し、8フライト対1フライト(p = 0.04)です。
RLの実行は変動します。同じレシピを再実行すると、96回の検証ストームフライト中85〜92回を着地させ、保持した実行はそれらの中で最良のものでした。再実行でも、DeepSeekと同程度に多くのストームキックフリップを着地させる可能性が高いです。
ランプフリップ。 キックフリップ表と同じテストセットとサイズです。
| パイロット | ライトウィンド | ゲイル | ストーム |
| スクリプトパイロット(手書きルール、即時決定) | 100% (192) | 100% (192) | 96% (368) |
| DeepSeek V4.1 Flash, リアルタイム | 1% (2) | 2% (3) | 3% (11) |
| DeepSeek V4.1 Flash, 考える時間無制限 | 82% (157) | 78% (149) | 79% (304) |
| Muse Spark Open, 考える時間無制限 | 97% (186) | 92% (176) | 88% (336) |
| Qwen3-4B, 未訓練(リアルタイム) | 100% (192) | 99% (190) | 85% (325) |
| Qwen3-4B, 模倣のみ後:教師のフライトでファインチューニング、RLなし | 100% (192) | 100% (192) | 96% (369) |
| Qwen3-4B, 模倣 + RL後(リアルタイム) | 100% (192) | 100% (192) | 98% (376) |
ランプフリップでは、模倣がほとんどの作業を行います。模倣のみの後、4Bは既にスクリプトパイロットとほぼ同じように飛行しており、RLが少し上乗せされます。7回のストームランプはRL後にのみ着地し、RLなしではゼロです(p = 0.02)。また、スクリプトパイロットが失敗する場所で8回着地し、その逆はありません。
風が強くなるほど、4Bのリードは大きくなる
[画像: スクリプトパイロット、考える時間無制限のDeepSeek、RL訓練された4Bの風レベルごとのキックフリップ成功率。]
スクリプトパイロット、考える時間無制限のDeepSeek、RL訓練された4Bの風レベルごとのキックフリップ成功率。
スクリプトパイロットはライトウィンドではほぼ完璧ですが、ストームでは98%から61%へと急激に低下します。DeepSeekは98%から87%へと持ちこたえますが、決定ごとに約1秒かかります。
訓練された4Bは96%から90%に低下します。ライトウィンドでは両方の教師にわずかに劣りますが、風が強くなると両方を上回ります。風レベルで教師を選択したことが、その大部分を達成させました。ウォームスタート単独ではストームで84%を着地させ、RLはそれを90%に引き上げます。
同じストームフライト、スクリプトパイロット(左)とRL訓練された4B(右)が飛行した様子。スクリプトパイロットは車輪が接地する前に車体が地面に接触しますが、4Bは車輪で着地します。
失敗したフライトも異なります。ストームでは、DeepSeekの失敗した50回のフライトのうち34回は、車輪が接地する前に車体が地面に接触して終わります。訓練された4Bの37回のうち23回は、14mの道路からわずかに外れた水平な着地で終わります。
着地したストームフライトの中で、4BのフライトはDeepSeekのものよりわずかに短く(中央値3.6秒対3.9秒)、タンク内の空気も多く残っています(18%対24%)。そのため、車体を安定させるためのスラストが残っています。短いフライトを直接報酬として与えていません。報酬はソフトで中央に接地し、空気が残っている着地に支払われ、RLは短いフライトを独自に見つけました。
車体が降下中にどれだけ傾くか、同じストームフライトでのDeepSeek対訓練された4B。DeepSeekは車体が地面に接触する際、まだ約20°風に向かって傾いています。
学んだ教訓 #
1. シミュレーターは現実的なシナリオを捉える必要がある
全てのモデルを同じフライトで2回スコアリングしましたが、順位が逆転しました。シミュレーターを一時停止した場合、DeepSeek V4.1 Flashはテストした中で最高のキックフリップパイロットでした。車が動いている状態では、何も着地させませんでした。
ほとんどのLLMベンチマークは、私たちのポーズ実行のように、モデルが応答に十分な時間をかけられるようにしています。もしあなたのモデルが、車両や音声エージェントのように、世界が動き続ける間にアクションを起こす必要がある場合、決定にかかる時間はスコアの一部となるため、その速度とパフォーマンスを測定してください。
2. DeepSeekは、トークンあたりのパラメータ数が少ないながらも、より大きなモデルを上回った
考える時間無制限の場合、DeepSeek V4.1 Flashはテストした他の全てのオープンモデルを大幅に上回りました。ライトウィンドで98%、ストームで87%のキックフリップを着地させ、他は72%〜82%、58%〜62%でした。それは、出力トークンあたりわずか16Bのパラメータしか使用しません。これはNemotron 3.5 Super(120B中12B)を除くグループの中で最も少なく、Muse Spark Open(816B中42B)やBeam 1.0(501B中23B)よりもはるかに少ないです。最高のパイロットはさらに小さく、RL後の密な4Bモデルでした。この狭いタスクでは、モデルがどのように訓練されたかが、トークンあたりのパラメータ数よりも重要でした。
3. RLは教師を超えて4Bモデルを向上させた
ウォームスタートは、それぞれ異なる風の設定で優れた2人の教師をコピーしました。RLの後、同じホールドアウトフライトで、4Bモデルはストームでスクリプトパイロットを30ポイント上回り、ゲイルではDeepSeekを上回り、ストームではわずかに先行しています。ライトウィンドではどちらの教師も既にほぼ完璧だったため、それらを上回ることはありませんでした。
模倣は4Bを教師のレベルまで引き上げ、実際の目標に対するRLは改善の余地がある場所でそれを超えさせました。ストームでは、ウォームスタート単独よりも384回のフライトで25回多く着地し、逆方向に行ったのはわずか1フライトでした。
4. GRPOは難しい決定で差が出る試行を必要とする
最初の実行が失敗したのは、見落としやすい理由からです。GRPOは同じタスクの試行グループを比較します。8つの試行が全て同じようにクラッシュすると、全て同じ報酬を得てしまい、モデルは何も学ぶことができません。フライトの途中から練習を開始すると、訓練成功率は70%に上昇しましたが、ホールドアウト成功率はゼロのままでした。なぜなら、モデルは難しい部分である最初の動きを練習しなかったからです。短いウォームスタートは、試行をその決定で異ならせることでこれを修正しました。
この研究で示されていないこと #
明らかに、これは実際の車を運転することについては何も示していません。実際の車は従来のコントローラーを使用し、私たちのスクリプトパイロットでさえ即座に決定しますが、LLMはそうではありません。
また、ロボット工学チームがこのパイロットを構築する方法でもありません。FigureのHelixのような階層システムは、200Hzで動作する80Mパラメータのポリシーの上に、7〜9Hzで7Bのビジョン言語モデルを実行します。大規模モデルが何をするかを決定し、小規模ポリシーがそれを毎秒200回モーターコマンドに変換します。私たちのスタックは同じ2つのレイヤーを持ち、LLMの下で50Hzのフライトコンピューターが姿勢と垂直速度を維持しますが、私たちの高速レイヤーはスクリプト化されており、決定は行いません。
私たちは、言語モデルが時計に対してその呼び出しを行えるかどうかを知りたかったため、時間制約のある唯一の決定、つまりロールを開始するタイミングを意図的に言語モデルに委ねました。シミュレーターで古典的なコントローラーポリシー(例えば、小さなネットワークを持つPPO)を訓練したわけではなく、それはほぼ全てを着地させると予想されます。
RL環境とそこに含まれる全ての車両パラメータは私たちの独自の仮定であり、2つのスタントを持つ1つの環境です。ホールドアウトとは、同じ2つのスタントの未知のシード(風、速度、ランプとトラックの位置)を意味し、新しいスタントではありません。DeepSeekのストームフライトはウォームスタートの一部であったため、ストームでは4Bは学習対象となったモデルと比較されます。
RL訓練にSkyPilotを使用する #
最終モデルの訓練には約4 GPU時間(ウォームスタート2時間20分、RL 1時間35分)、約13ドル(H100あたり約3.39ドル)かかりました。レシピを見つけるにはさらに多くの実行が必要でした。各訓練実行と各評価を同時に最大6つまでSkyPilot管理ジョブとして実行し、SkyPilotがそれぞれに空きGPUを見つけました。クラスターノードが実行中に故障した場合、SkyPilotは停止したジョブを報告し、他のノードで再起動しました。
トレーニング、ロールアウト、評価を1つのジョブグループとして並行実行
RL実行は同時に3つのことを行います。モデルを更新し、最新の重みでロールアウトを生成し、チェックポイントをスコアリングします。SkyPilotのジョブグループは、これらを1つの管理ジョブとして起動し、各部分が独自のハードウェアで実行されます:
- トレーナーはH100上でGRPOを実行し、各ステップで新しいLoRA重みを共有ボリュームに書き込み、推論サーバーと共有します。
- 推論サーバーは別のH100上でvLLMを実行し、それらの重みでロールアウトを生成します。
- 評価ウォッチャーは、新しいチェックポイントごとに評価を開始します。各評価は独自のGPUを取得し、トレーニングと並行して実行され、さらに1つのタスクとして同じジョブグループに参加します。
[画像: 1つのジョブ、全て同時に実行:トレーナー、推論サーバー、評価ウォッチャー、そしてステップ5の評価(動的とマークされている)。]
1つのジョブ、全て同時に実行:トレーナー、推論サーバー、評価ウォッチャー、そしてステップ5の評価(動的とマークされている)。
このポストの数値は、別々のトレーニングと評価ジョブとして実行されたのと同じレシピ実行から来ています。ジョブグループバージョンは、リポジトリ内のtrain_eval.yamlです。各評価について、vLLMはチェックポイントを提供し、tools/pilot_bench.pyはOpenAI互換API経由でそれを飛行させます。これはベンチマークの他の全てのモデルと同じコードパスです。
試してみる #
SkyPilotはオープンソース(pip install skypilot)であり、上記の全てがそれ上で動作します。RL環境、プロンプト、SkyPilotファイルは、SkyPilotリポジトリのflying-roadster-rl例にあります。
独自のモデルを飛ばす。 ベンチマークは、OpenAI互換のエンドポイントに接続し、デフォルトでSkyPilot Tokensを使用します。これはDeepSeek V4.1 Flash、Muse Spark Openなどのオープンモデルを提供します。そこでアカウントを作成し、APIキーを取得し、リポジトリをクローンして、cd llm/flying-roadster-rl に移動し、以下を実行します:
python pilot_bench.py --model gpt-6-astra --realtime
モデルに考える時間無制限を与えるには --realtime をドロップします。--endpoint openrouter は代わりに $OPENROUTER_API_KEY を使用します。ローカルサーバーまたは他のOpenAI互換APIの場合は、--base-url(およびキーが別の変数にある場合は--api-key-env)を渡します。ローカルサーバーはキーを必要としません。
独自のパイロットを訓練し、チェックポイントが着地次第評価するには、ジョブグループを起動します。2つの無料H100と共有ボリュームを備えたKubernetesクラスター、およびS3バケットが必要です:
# Train and evaluate in parallel
skypilot job run llm/flying-roadster-rl/train_eval.yaml
共有ボリュームがない場合、train.yaml と eval.yaml はトレーニングと評価を別々のジョブとして実行します。
質問がある場合や、追加すべきベースラインがある場合は、リポジトリでイシューを開いてください。独自のタスクでモデルの訓練後学習の支援が必要な場合は、私たちに相談してください。
[2] タイトル: Geist Serif
URL: https://vercel.com/blog/introducing-geist-serif
本文:
Geist Serifの紹介
Geistは、開発者が日々の作業を行うエディターやターミナル向けに作られた、モノスペースフォントとして始まりました。そこから製品インターフェース向けのGeist Sans、そして初期のコンピュータ画面のグリッドにインスパイアされたGeist Pixelへと発展しました。
本日、ファミリーに新しいメンバーを追加します:Geist Serif。
[画像: Geist Serif ポスター][画像: Geist Serif ポスター]
Geist Serif ポスター
Geist Serifは、Geist Sans、Geist Mono、Geist Pixelと同じ基盤の上に構築された、コントラストの高いディスプレイセリフ体です。細く、鋸歯状のセリフとシャープなヘアラインを持ち、現代のデバイスの高密度スクリーン上でも、物理世界でも、力強くメッセージを伝えるために描かれました。
見出しへのリンクをコピー同じシステム、新しい声
Vercelでは、製品にはGeist Sansを使用しています。しかし、見出しには、ドロップダウンメニューから選んだ見知らぬものではなく、同じシステムに属する、もう一つの声が欲しかったのです。
多くのテクノロジーブランドは、個性を回復するためにクリーンなサンセリフ体から離れ、ヴィンテージコンピュータ広告から借用しています。Geist Serifは異なる道を辿ります。ファッション、エディトリアルデザイン、雑誌の見出しへと向かいます。『ローリング・ストーン』や『ハーパーズ・バザー』の背後にいるアーティストたちへのオマージュです。
最初から、各Geistファミリーはタイポグラフィの歴史の一章を読み取ってきました。スイスデザイン運動、初期のターミナルとDOSコンピューティング、そして現在はエディトリアルプリントです。
見出しへのリンクをコピーまずディスプレイから
Geist SerifはEvil Rabbitによるスケッチセットから始まり、その後Andrés Brigantiが拡張しました。最初の文字は既に、Victor SerifやStanleyのような書体の精神で、表現力豊かなセリフを示していました。
[画像: Geist Serifの初期スケッチ][画像: Geist Serifの初期スケッチ]
Geist Serifの初期スケッチ
Mark Davisが描画を引き継いだ際、私たちは最初のリリースを、ファミリー全体の作業が続く間、見出し、ポスター、その他の大きなサイズ向けのディスプレイフェイスとしました。印刷物は常に細いヘアラインやシャープなセリフを保持するのに苦労してきましたが、今日のディスプレイは高いレベルの詳細を処理できます。私たちは、新しいフェイスが最新のスクリーンを最大限に活用できるようにしたかったので、全ての縦画を50%細くし、サイドベアリングをタイトにしてコントラストを最大限に引き出しました。
各セリフには片側にウェッジ、もう片側にカーブがあり、プロポーションはクラシックで印刷物でも美しく見えますが、構造は新しく、デジタルデバイスに最適化されています。
私たちは今日のためにのみ作られたものを作成しました。10年前のスクリーン用の過度にブロック状ではなく、物理的なインクのための機械的な妥協で満たされたものでもありません。完璧なポイントのセリフだけです。
[画像]Mark Davis WORDMARKの創設者兼フォントデザイナー
見出しへのリンクをコピー最初のプロトタイプから今日まで
Geist Serifの最初のプロトタイプは2026年4月1日に共有されました。以下は、そのプロトタイプでの「Geist」という単語と、本日出荷されるディスプレイ描画との比較です。
[画像: 点線で示された初期プロトタイプ][画像: 点線で示された初期プロトタイプ]
点線で示された初期プロトタイプ
見出しへのリンクをコピーGeistに歯が生えた
目標は、元の意図を尊重し、文字が互いに重なり合っても、セリフをサンセリフに密接に結びつけることでした。Geist SerifのステムはGeist Sansと一致し、両者は幅と姿勢を共有します。
鋸歯状のセリフと高いコントラストは、Geistにエディトリアルな声を与えます。各文字が描かれるにつれて、「Geistに歯が生えた」というフレーズが繰り返し出てきました。
見出しへのリンクをコピー4つのファミリー、1つのxハイト
Geist SerifはGeist Sansと同じキャップハイトとxハイトを使用しているため、1行も動かすことなく、どのGeistレイアウトにもドロップインできます。Sans、Mono、Pixel、Serifを同じ文に混ぜても、全ての単語のサイズは同じに見えます。
| メトリック | Geist Sans | Geist Serif |
|---|---|---|
| UPM | 1000 | 1000 |
| キャップハイト | 710 | 710 |
| xハイト | 530 | 530 |
| アセンダー | 710 | 750 |
| ディセンダー | -150 | -200 |
見出しへのリンクをコピー4つのバリアント、1つの軸
Geist Pixelと同様に、Geist Serifは、フォント内の全てのドットの形状(iやjのドット、句読点を含む)を切り替えるバリアブル軸を備えています。この軸はElement Shape (ELSH)と呼ばれ、4つのバリアントを提供します:丸いドットのレギュラー(デフォルト)、スクエア、トライアングル(Vercelロゴへの敬意)、ハートです。
各バリアントは、独自の静的ファイルとしても出荷されます。バリアントフォントを使用する場合、font-variation-settings でバリアントを選択します:
見出しへのリンクをコピー手作業でクラフト
7月にはフォントに227グリフがありました。現在は894あり、352のラテン文字スクリプト言語をカバーしています。52,000以上のカーニングペアを処理してスペーシングを調整しました。一部のディテールは非常に小さいです。例えば、gの目は正確に7°傾いています。
見出しへのリンクをコピー仕様概要
Geist Serifは以下を同梱しています:
-
1つのウェイト(レギュラー)
-
4つのバリアント(レギュラー、スクエア、トライアングル、ハート)
-
894グリフ
-
5つのスタイリスティックセット(
ss01〜ss05) -
352のサポート言語
見出しへのリンクをコピーはじめに
Geist Serifは、ファミリーの他のフォントと同じパッケージで出荷されます:
npm i geist
エクスポートとCSS変数:
-
GeistSerif(バリアブル、全形状):--font-geist-serif -
GeistSerifRegular:--font-geist-serif-regular -
GeistSerifSquare:--font-geist-serif-square -
GeistSerifTriangle:--font-geist-serif-triangle -
GeistSerifHeart:--font-geist-serif-heart
それぞれに独自の入口があるため、使用するフォントファイルのみが出荷されます。例えば、layout.tsxでGeistSerifRegularを使用する場合:
import { GeistSerifRegular } from 'geist/font/serif/regular';
export default function RootLayout({ children }) {
return (
<html lang="en" className={GeistSerifRegular.variable}>
<body>{children}</body>
</html>
);
}
フォントファイルをダウンロードし、全てのスタイリスティックセットをテストし、各グリフをvercel.com/fontで確認することもできます。
見出しへのリンクをコピー次に何が?
レギュラーは最初にリリースされるスタイルであり、ファミリーの残りは既に進行中です。私たちはこれを構築しながら将来のバージョンをテストしているので、このリリースは始まりに過ぎません。
見出しへのリンクをコピーThinからBlackまでのウェイト
バリアブルフォントはThin(100)からBlack(900)まで範囲があります。今週のプルーフでは、Blackのgは私たちがずっと見てしまう文字です。
見出しへのリンクをコピーテキストフェイスに向けて
テキストバージョンを探求するために、私たちはストローク、それらが交差する場所を含むものを測定し、ディスプレイのアウトラインを太くするファウンドリツールを構築しました。これはアウトラインを直接編集するため、実際の単語を設定してどのストロークに重みが必要かを確認できます。
見出しへのリンクをコピーイタリック体、ルールごとに構築
Pythonで完全に生成されたイタリック体も開発中です。既存のイタリック体を起こして、ローマン体と比較しました。角度を取り除くと、残りの違いが明確になり、それらをテストおよび改訂できるルールに変換しました。このイタリック体は最終バージョンではありませんが、グリフをコードで分解することは、限界をより速く見つけるのに役立ちます。
見出しへのリンクをコピーより多くのスクリプトとGoogle Fonts
キリル文字のサポートはGeist SansおよびGeist Monoと一致するように計画されており、Geist Serifはリリース後にGoogle Fontsでも利用可能になります。
見出しへのリンクをコピー一つのファミリー
Geist Sans、Geist Mono、Geist Pixel、そしてGeist Serifにより、このファミリーはUIテキストやコードから表現力豊かなディスプレイタイプまでをカバーし、4つ全てが互いに調和します。
Geist Serifをダウンロードして、構築を開始してください。
Geist Serifを可能にしてくれた全ての人に感謝します。
これは、舞台裏の素晴らしいチームなしでは不可能でした。
この旅を私と共に始め、全ての基盤となった最初のバージョンを描いてくれたAndrés Brigantiに多大な感謝を。そして、拡張されたグリフセットとバリアブル軸から最後のカーニングペアまで、執拗な職人技でゴールまで導いてくれたMark Davisに感謝します。また、ポスターデザインを担当したPatrick McDonaldとMarijana Pavlinić、モーションと信じられないほどの魔法を担当したLuis Gutierrez Rico、パッケージの出荷とランディングページを細部まで再構築したChristopher Kindl、そして全てをまとめた調整と技術サポートを担当したZahra Jabiniにも感謝します。これは真のチームワークであり、皆さんと共にこれを構築できたことを感謝しています。