GitHub Copilotのランタイムをrustに移行

GitHubは、Copilotのランタイム環境全体をTypeScriptからRustへと全面的に書き換えることに成功しました。驚くべきことに、この新しいコードベースの大部分はCopilot自身のAIエージェントによって生成されたものです。この大規模な移行作業にはおよそ3カ月半を要し、当初130,000行と見積もられていたTypeScriptのコードは、最終的に832,378行に及ぶ堅牢なRustコードへと生まれ変わりました。

この重要なランタイム環境は、GitHub Copilot CLI、スタンドアロン版のCopilotアプリケーション、そしてCopilot開発キットの基盤アーキテクチャとして機能しています。さらに、VS Code、Visual Studio、Copilot Studio、そして複数の主要なMicrosoft 365製品における重要な統合機能も支えています。GitHubの経営陣は、過剰なメモリ消費、起動時の煩わしい遅延、そしてCopilotを外部プログラムに直接組み込む際の複雑さを理由に、TypeScript・Node.js・V8エンジンで構成される従来のアーキテクチャを廃止する決断を下しました。

AI支援による大規模な移行作業

エンジニアたちは2026年5月にこの野心的な取り組みに着手しました。しかし、当初の130,000行という見積もりは、すぐに絶望的なほど不正確であることが判明します。開発者たちは移行作業と並行してプロジェクトに継続的に手を加え、他のコンポーネントからのレガシーコードを頻繁にランタイム環境へ移植していました。その結果、プロジェクト全体を通じて実に約430,000行の稼働中TypeScriptコードが翻訳対象となり、最終的にはその約2倍の規模のRustコードベースが誕生しました。

開発チームは、まったく別のバージョンを新規に開発し、その後ユーザーに大規模な一括アップデートを強いるという手法は取りませんでした。代わりに、段階的なアプローチを採用しています。個々のコンポーネントを順次Rustへと丹念に移行し、その変更を直接メインの開発ブランチへコミットしていきました。過酷な14.5週間にわたる期間の中で、GitHubは移行に関連するプルリクエストを128件マージし、35件の安定版リリースを含む135種類ものバージョンをデプロイすることに成功しました。8月21日までに、ランタイム環境の中核部分は100%Rustコードで構成されるに至りました。

なぜRustなのか―パフォーマンス、予測可能性、そして安全性

Rustが戦略的に選ばれた理由は、単なる実行速度の向上にとどまりません。GitHubが切実に求めていたのは、オーバーヘッドが最小限に抑えられ、リソース消費が高い予測可能性を持ち、なおかつ他のアプリケーションのメモリプロセス内でシームレスに動作できるという、比類ない能力を備えたネイティブコンパイル済みの実行コードでした。さらに、Rustが本来備えているメモリ安全性も、説得力のある副次的な理由となりました。Rustコンパイラはコンパイル段階で数多くのメモリ操作エラーを未然に防ぎますが、プログラムを論理的な欠陥やその他の複雑な脆弱性クラスから完全に守れるわけではありません。

個別に行われたパフォーマンスベンチマークでは、従来のアーキテクチャと新しい実装との間の格差が驚くほど際立った結果として現れました。従来は、クライアントのインスタンス化、セッションの起動、単一のモデルクエリの実行、そしてプロセスの終了という一連の流れに、5.25秒もの時間がかかっていました。一方、新しい環境をホストプロセス内で直接起動する場合、必要な時間はわずか55ミリ秒でした。別の負荷テストでは、スループットが1秒あたり7.55件から驚異的な120件の短時間セッションへと跳ね上がっています。ただしGitHubは、これらの印象的な数値はあくまで特定の制御された条件下でのものであり、Copilotのすべての処理において普遍的に16倍の高速化が保証されるわけではないと明確に注意を促しています。

メモリ消費量も劇的に減少しました。10個の同時クライアントを対象とした厳密なテストでは、従来の実装のメモリ使用量が約1383MBにまで膨れ上がっていました。それに対し、独立したプロセスとして動作する新しいRust実装では、わずか247MBで済んでいます。さらに注目すべきは、組み込み型のバリアントがわずか126MBしか消費しなかった点で、これは従来のアーキテクチャと比較して驚異的な91%の削減に相当します。

自律型AIエージェントが果たした重要な役割

この取り組みの膨大な規模は、AIエージェントたちの目まぐるしい活動ぶりを見れば最も明らかになります。公式のプロジェクトログによれば、ツールの実行回数は185万回を超えており、約113万回に及ぶ記録済みの呼び出しのうち、実に61%を下位のAIエージェントが開始したものでした。GitHub CopilotのランタイムをCopilotを使ってRustへ移行する詳しい技術的な内訳は、公式のエンジニアリングブログに掲載されたこちらの記事で確認できます。

主任開発者のStephen Toub氏は、自身が直接携わった作業量をおよそ3週間分の労力だったと見積もっています。膨大な量のコードを手作業で書く代わりに、彼の役割はタスクの境界を丹念に定義すること、AIが生成した解決策を厳密に検証すること、包括的なテストスイートを監督すること、そして不完全あるいは欠陥のある部分を必然的にエージェントへ差し戻して修正させることへとシフトしていきました。

自動化に大きく依存したプロジェクトではあったものの、人為的なミスを完全に免れたわけではありません。9月14日までに、チームは数十件のリグレッション(機能後退)を特定していました。これらの問題には、従来の実装と新しい実装との間に見られる微妙な挙動の相違、複雑な状態管理やオブジェクトのライフタイム管理に関する問題、不完全な関数の翻訳、そして個別のコンポーネント間で発生する重大な境界エラーなどが含まれていました。チームは判明したすべてのリグレッションを迅速に修正し、いくつかの重大な問題については安定版のリリースブランチに混入する前に食い止めることに成功しています。

最終的に、AIの運用に費やされたトークン数はおよそ1,363億トークンに達し、その圧倒的大部分は効率的に再利用されたキャッシュデータに由来するものでした。これらのトークンにかかった費用はおよそ12万ドルにのぼります。しかしGitHubは、この金額はプロジェクト全体のコストを大幅に過小評価していると強調しています。というのも、この数字には、アーキテクチャ設計、パッケージング、検証、そして最終的なコード統合に携わった多数のエンジニアたちによる貴重な人的労働の貢献が含まれていないためです。

Toub氏は、AIエージェントの助けがなければ、これほど巨大で稼働中のシステムを書き直すには専任のエンジニアリングチームが必要となり、1年から2年にも及ぶ継続的な作業を要しただろうと自信を持って断言しています。とはいえ、今回の移行の経験は、現時点における自動化の限界を明確に浮き彫りにしました。エージェントは膨大な量の翻訳作業を処理する点では優れた能力を発揮した一方で、新しい実装が元のシステムの挙動を忠実に保持していることを保証するためには、絶え間ない人間の監督、厳密なエンドツーエンドのテスト、そして独立した検証が不可欠でした。

翻訳元: https://meterpreter.org/github-copilot-runtime-rust-migration/

本記事は meterpreter.org の記事を翻訳・要約したものです。