Slide 1

Slide 1 text

RustとWebGPUで実現する アバター描画システムの 刷新とコスト削減 株式会社グリー シニアリードエンジニア 橋本順之

Slide 2

Slide 2 text

橋本順之 株式会社グリー シニアリードエンジニア 2013年3月にグリー株式会社(現:グリーホールディングス株式会 社)に入社、前職は画像処理のハードウェアエンジニア。現在に至 るまでインフラストラクチャ部に所属し、NoSQL・KVSのサーバー の開発や運用を専門とする。 社内KVSであるFlareの開発を経て、Webゲーム開発を経験。 『アナザーエデン 時空を超える猫』のDynamoDBの調整に機械学習 を導入後、機械学習のOSSやプロジェクトに参加。 2

Slide 3

Slide 3 text

目次 ● 背景 ○ プロダクト:モンプラ ○ WebGPUに置き換えたアバターシステム ● 課題 ○ なぜGPUインスタンスをやめたい? ○ WebGPUに置き換え? ● CPU化 ○ 従来型のリファクタリング ○ AIでのリファクタリング:失敗と成功 ● まとめ 3

Slide 4

Slide 4 text

背景 ● ● ● ● 『モンスタープラネット』(通称:モンプラ) ○ 2010年リリース 3Dアバターをサポート MascotCapsule(2001〜)をベース(独自システム) C++/Cg言語:GPUレンダリング Rust + WebGPUのシステムで置換 CPUレンダリングでコスト削減 (GeminiとClaude Codeで2026/03に開発) 4

Slide 5

Slide 5 text

どうやってアバターをレンダリング? ポリゴン テクスチャ 座標変換 アニメ化 影作成 画像 GIF 画像 ボーン C++ / Cg(シェーダー) OpenGL XWindow Linux サーバー 5

Slide 6

Slide 6 text

なんでRustとWebGPU? : 開発の容易性 C++ / Cg OpenGL XWindow Linux サーバー 動作確認が面倒 MacやWindowsで 動かない。 VMでも動かない。 OpenGL・C++はデバッグ難 Rust / WGSL WebGPU Mac/Windows/Linux/ブラウザ 動作確認が簡単 ブラウザでの動作保証 エラーチェック ⭕ ※WebGPUはVulkan, Metal, Direct3Dを基盤とするGPUのAPI 6

Slide 7

Slide 7 text

課題:高いし、動かなくなってきた ● GPUレンダリング ○ NVIDIAのCgというシェーダー言語(古い技術) ■ 2012年のバージョンが最後 ● 課題 ○ ○ 最新のGPUインスタンスは割高。 ■ CPUインスタンス ● m6a.2xlarge(8vCPU, 32GB ) ● 0.44$/h ■ GPUインスタンス ● g5.2xlarge(8vCPU, 32GB, VRAM 24GB ) ● 1.75$/h 最新のGPU(RTX [234]0xx やT4)では動かない ■ A100やH100では動くが。 GPUインスタンスは 4倍高い サービスの継続性に支障 7

Slide 8

Slide 8 text

CPU化:従来型のリファクタリングの失敗 ● 従来型のリファクタリング(生成AI以前) ○ リファクタリング対象のコード:テストがない。 動く状態を保ちながら少しずつ改変<ー失敗 ○ ○ Cg言語とGLSL言語を同居<ー失敗 固定シェーダー的なグローバルの状態のあるOpenGL<ー古い ○ ● 置き換えは ことごとく失敗 失敗例 ○ ○ ○ OSMesa:(CPUで動かすヘッドレスのOpenGL) ■ Cgのランタイムがうごかない。 ■ Cgのランタイムはソースコードがない。 Cg言語をGLSL言語に変換して動作 ■ CgのランタイムはGLSLをサポートとあるが動かない。 CgのランタイムをOpenGLのフレームワークに置換 ■ セグフォがでるがエラーメッセージが不十分(デバッグできない。) ■ OpenGL:mesaのソースコードレベルの解析が必要。 8

Slide 9

Slide 9 text

CPU化:生成AI丸投げによる失敗 ● 生成AI(Claude Code)に丸投げ ○ ○ ● 生成AI ■ ソースコードを読ませて、アーキテクチャ分析 ■ Cg言語からGLSLやWebGPUへの置き換え うまくいかない原因 ■ 一気にコードを生成しすぎ。(認知的過負荷) ● AIは適当な四角形を出し始める。 ■ デバッグできない。 ■ 検証するポイントを指定できてない。 中身がわかっていそうでも 一括生成は失敗 デバッグできない 失敗例 ○ ○ C++/Cgのコードを分析して、C++/WebGPUに変更せよ! ■ セグフォ多発、単色の画像の出力。 ■ GDBデバッグできない。(もともと生成AI以前もデバッグできなかった。) C++/Cgのコードを分析して、Rust/WebGPUに変更せよ! ■ 単色の画像がでたり、四角い箱がでてきた。 9

Slide 10

Slide 10 text

CPU化:生成AIによるレビューの壁打、開発計画作成 ● 開発計画の立案:生成AI(Gemini)と壁打ち ○ ○ ○ AI(Gemini)と壁打ち:自分の開発計画に自信がない 段階的な開発 ■ AIが開発の方法のレビュー TDDが鍵 ■ じっくり計画 段階的開発&TDD ■ 数学的な座標変換、アセットのパーサー、WGSLのコード ■ ゲートキーパーを置く(モジュールごとにデバッグ) ■ タスクを分割:開発精度が向上 Rustで開発:セグフォ対策 ● 開発(Claude Code) ○ ○ ○ Claude Codeで開発、キャラの輪郭がでた。(画像でデバッグ) 人間が画像をみて、AIにフィードバック ■ キャラが後ろ向いている(座標軸の向きの問題) ■ 黄色い肌のいろが濁っている(透過処理の問題) ■ パーツがキャラの本体から離れている。(ボーンの処理の問題) 本番環境から画像を収集してフィードバック 10

Slide 11

Slide 11 text

その後:本番導入へ ● サポートセンター(入稿)やStaging環境での評価 ○ ○ ○ ○ 背景の透過処理の問題 モーションファイルがない場合のスキップ処理の問題 リクエストを落とす(リクエストハンドラとワーカー分離) 長時間稼働の問題:アセットのキャッシュがFULLでデッドロック ● 本番導入 ○ ○ GPUインスタンスをCPUインスタンスにできた。 ■ メモリも削減できた。 費用は5分の1になった ■ GPU(1.75$/h)ー>CPU(0.38$/h) ● 旧:g5.2xlarge(8vCPU, Memory 32GB ) ● 新:c6a.2xlarge(8vCPU, Memory 16GB ) 11

Slide 12

Slide 12 text

まとめ ● 生成AI活用によるシステムの置き換え ○ ○ ○ レガシーシステム(C++/Cg/OpenGL・GPUレンダリング) 現代的なシステム(Rust/WebGPU・CPUレンダリング) 費用は5分の1 ● 従来型のリファクタリングの失敗 ● AI開発失敗パターン ○ 生成AIに分析から実装まで丸投げ、デバッグできない。 ● AI開発成功パターン ○ ○ ○ ○ 認知負荷をさげるために開発計画をAIと立案 ■ 開発計画(Gemini)と実際の開発(Claude)のAIを分離 一気に開発させず、タスクを分離 デバッグ可能なマイルストーン デバッグしやすい言語(Rust)を選択 ■ C++・OpenGLのセグフォのデバッグは困難 12

Slide 13

Slide 13 text

ご清聴ありがとうございました 13

Slide 14

Slide 14 text

No content