OpenAIは、傘下のリアルタイムデータ基盤「Rockset」で数か月にわたり原因不明のクラッシュが発生していた問題について、コアダンプ(クラッシュ時のメモリ情報)を大量に集めて分析する「疫学的」手法で原因を突き止めたと、同社エンジニアリングブログで報告しました。従来は個別のクラッシュを一件ずつ調査していましたが埒が明かず、過去1年分のコアダンプを自動収集・分類するパイプラインを構築したところ、実は性質の異なる2つの不具合が重なっていたことが判明したといいます。1つはオープンソースライブラリ「GNU libunwind」に18年間潜んでいたレース条件(競合状態)のバグ、もう1つはAzure上の特定サーバー1台で起きていたハードウェアの静かな破損でした。同社はlibunwindの修正を本家プロジェクトに還元しており、同様の構成で稼働する他社サービスにも影響がある可能性があるとしています。

ポイント

  • OpenAIが2024年に買収したリアルタイムデータ基盤「Rockset」で、数か月間にわたり間欠的なクラッシュが発生
  • クラッシュはC++関数が破損またはNULLアドレスに”復帰”するという稀な現象で、個別調査では原因を特定できなかった
  • 過去1年分のコアダンプを自動収集・解析するパイプラインを構築し、母集団全体を俯瞰する「疫学的」アプローチに切り替え
  • 分析の結果、見かけ上1つだった問題が、①GNU libunwindの18年前からのレース条件バグと②Azureの特定ホスト1台のハードウェア破損という、無関係な2つの不具合だったと判明
  • OpenAIはRocksetのスタック巻き戻し処理をlibunwindからlibgcc製に切り替えるとともに、libunwind本家プロジェクトへ修正を提供

背景と詳細

Rocksetは2024年にOpenAIが買収したリアルタイムデータシステムで、報道によれば同社内のデータ基盤の一部を担っています。このRocksetで、C++プログラムが実行時に破損したアドレスやNULLアドレスへ処理を戻してしまうという、極めて再現性の低いクラッシュが継続的に発生していました。OpenAIのエンジニアはコントロールされたテスト環境ではこの不具合を再現できず、当初は単一の原因を想定して個別のクラッシュログを人手で調べていましたが、数か月間手がかりをつかめずにいたと報じられています。

転機となったのは、個々のクラッシュを追うのではなく、疫学調査のように「クラッシュ全体の母集団」を対象にデータを集める発想への転換だったとのことです。OpenAIのチームはChatGPTを使って、各コアダンプファイルの先頭部分をダウンロードしてレジスタ情報を抽出し、既知の誤検知を除外するスクリプトを作成し、過去1年間に発生した全クラッシュのコアダンプを自動的に分析するパイプラインを構築しました。

この大規模分析によって、これまで1つの現象として扱われていたクラッシュ群が、実際には性質の異なる2つのクラスタに分かれることが分かりました。1つは、GNU libunwindというオープンソースライブラリに18年間存在し続けていたレース条件で、スタックポインタを更新するアセンブリ命令の実行から、復帰先の命令ポインタが読み込まれるまでのごく短い時間帯(報道によれば約100ピコ秒の間)にシグナルが到着すると、カーネルが処理中のコンテキストを上書きし、復元される命令ポインタが破損するというものでした。もう1つは、Azure上の特定のホスト1台で起きていた、検知されにくい静かなハードウェア破損だったとのことです。

OpenAIはこれを受けて、Rocksetのスタック巻き戻し処理をGNU libunwindからlibgcc由来のアンワインダーに切り替えて回避するとともに、libunwind自体の修正をエンジニアのNathan Bronson氏が本家プロジェクトへアップストリームで提供したと報じられています。libunwindはさまざまなソフトウェアで広く使われているライブラリであるため、例外処理やシグナル処理を大量に行うC++サービスを運用する他の組織にも同様の潜在バグが存在し得るとしています。

なぜ重要か

今回の事例は、AIサービスの裏側を支える地味なインフラ層にも、長年気づかれなかった不具合が潜み得ることを改めて示しています。日本国内でもAIチャットボットやデータ基盤の運用が急速に広がっており、原因不明の障害調査に「個別調査」から「大規模データを俯瞰する」アプローチへ転換する発想は、システム運用に携わるエンジニアにとって参考になりそうです。またlibunwindは業界で広く使われるオープンソースライブラリであるため、同様の構成でサービスを運用している国内企業も無縁ではない可能性があります。生成AIを実務に使ってバグ調査用のスクリプトを書かせたという点も、AI活用の一事例として注目されます。

今後の見通し

OpenAIはすでにlibunwindプロジェクトへ修正を提供したとしており、今後この修正が同ライブラリの正式リリースに取り込まれれば、同様の構成を持つ他のサービスの潜在的なクラッシュリスクも軽減される可能性があります。ただし、修正の反映状況や適用範囲について続報があるかは現時点では分かっておらず、今後の動向を注視する必要がありそうです。