Upgrade to Pro — share decks privately, control downloads, hide ads and more …

eBPFを用いたAIネットワーク監視システム論文の実装 / eBPF Japan Meetup #4

eBPFを用いたAIネットワーク監視システム論文の実装 / eBPF Japan Meetup #4

Tweet

More Decks by Yuuki Tsubouchi (yuuk1)

Other Decks in Programming

Transcript

  1. @yuuk1t / Yuuki Tsubouchi Ph.D. eBPFを 用 いたAIネットワーク 監視システム論 文

    の実装 eBPF Japan Meetup #4 2025/05/30 さくらインターネット株式会社 さくらインターネット研究所
  2. ௶಺ ༎थ / yuuk1 さくらインターネット研究所 京都 大 学博 士 (情報学)

    https://yuuk.io/ 主な研究開発分野 AI for SRE SREͷݚڀऀ ςϨϝτϦʔγεςϜʢϞχλϦϯάɾΦϒβʔόϏϦςΟͳͲʣ 4೥ͿΓʹeBPF΍Γ·ͨ͠ 2
  3. : K. Liu, et al., “R-Pingmesh: A Service-Aware RoCE Network

    Monitoring and Diagnostic System”, SIGCOMM, 2024. IUUQTEPJPSH R-Pingmesh: A Service-Aware RoCE Network Monitoring and Diagnostic System Kefei Liu, Zhuo Jiang, Jiao Zhang, Shixian Guo, Xuan Zhang, Yangyang Bai, Yongbin Dong, Feng Luo, Zhang Zhang, Lei Wang, Xiang Shi, Haohan Xu, Yang Bai, Dongyang Song, Haoran Wei, Bo Li, Yongchen Pan, Tian Pan, Tao Huang ACM SIGCOMM 2024 ๺ژ༣ిେֶ ࢵۚࢁ࣮ݧࣨ %PVZJO7JTJPO$P -UE ஶऀ ॴଐ ձٞ ද୊ URL リファレンス論 文 の書誌情報 [Liu+,SIGCOMM24] 3
  4. アジェンダ 1. R-Pingmeshの紹介 (10分) 2. R-Pingmesh 設計と実装(10分) 3. AIコーディング所感(4分 時間なければカット)

    4. まとめ(1分) 4 • 研究者として、論 文 の知を実装する貢献があることを 示 したい • 本 日 の 文 脈では、eBPFはあくまで「部品」であるが、「部品」とし ての使い 方 がおもしろいので共有したい • Work In Progress
  5. AIインフラ 分散深層学習基盤 • 「学習」ワークロードには 大 量の 高 性能GPUによる「分散学習」が必要。 • 「分散学習」は勾配計算結果をGPU間で同期するための集合通信が必要。

    高 速でロスレスなインターコネクト ネットワークが必要 1. R-Pingmeshͷ঺հ さくらインターネットは 高火力 PHYなどの GPUサービスを提供 RDMA (In fi niband / RoCE) 6
  6. 分散学習は、単 一 故障に 非 常に敏感で、全体に波及しやすい(バレル効果) AIインフラの信頼性 [Liu+,SIGCOMM24] 8 ネットワークの問題か?切り分けが難しい ‣

    アプリログには集合通信ライブラリ(NCCL)が”error code 12”がみえるが… ‣ 原因は、ホスト側の問題(GPUダウン・ハング・メモリ不 足 ・NCCL誤設定)であ ることも ‣ フラッピングRNIC・スイッチポート / 損傷または経年劣化したファイバ / 誤設定 1. R-Pingmeshͷ঺հ
  7. R-Pingmesh RNIC to RNICのアクティブプルービングによるRoCEネットワーク監視 11 ③ 継続的なプルービン グによるRTT・パケッ トロスの常時計測 ②RoCEパケットに

    よるプルービング ① サービストラフィッ クとは独 立 したRNIC 単位のプルービング Cluster Monitoring 1. R-Pingmeshͷ঺հ
  8. R-Pingmeshのうれしさ ネットワーク障害の対応優先度を評価できる 13 ༏ઌ౓ ରԠ ݕग़ 1 ཁଈ࣌ରԠ ੑೳϝτϦΫεྼԽͷᮢ஋௒ա 

    $MVTUFS.POJUPSJOH4FSWJDF5SBDJOH ʹΑΔݕग़ 1 ଈ࣌ରԠ͢Δ͔ཁ൑அ ੑೳϝτϦΫεྼԽͷᮢ஋ະຬ  $MVTUFS.POJUPSJOH4FSWJDF5SBDJOH ʹΑΔݕग़ 1 αʔϏεӨڹͳ͠ɻҟৗ ػثͷཁ෼཭ɾमཧ $MVTUFS.POJUPSJOHͷΈʹΑΔݕग़ 学習ジョブの学習率や平均 NWスループットなどを監視 1. R-Pingmeshͷ঺հ これはまさにSREのアプローチ
  9. R-Pingmeshのうれしさ その他 • RNICの組み合わせ数の削減 • フルメッシュプルーピングはToR内でのみに限定し、ToR間は 式(1)に従っ てランダムにプルービングする • Tracerouteの経路データと突き合わせて、単純な投票メカニズムで異常なリ

    ンクと異常スイッチの特定する 14 𝑘 ͸શͯͷ5P3·ͨ͗ϦϯΫΛΧόʔ͢ΔͨΊͷ UVQMFͷݸ਺ɻ 𝑁 ͸5P3·ͨ͗ύεͷ਺ɻ 𝑃 ͸&$.1ʹج͍ͮͯ 𝑘 ݸͷλϓϧ͕ 𝑁 ݸύεΛΧ όʔͰ͖Δ֬཰ɻ 1. R-Pingmeshͷ঺հ ຊ ೔ ͸ ε Ω ο ϓ
  10. R-Pingmeshのシステム全体像 16 <-JV 4*($0..>'JHVSF31JOHNFTI'SBNFXPSLΛجʹվมͯ͠ܝࡌ 1. Agentが登録処理 2. ControllerからPinglistが届く 3. PinglistからProberがプルー

    ブを送信 4. RTTなどを記録しAnalyzerへ 1. eBPFでサービスジョブの通 信の5-tupleを監視 2. 専 用 のPinglistへ追加 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ
  11. yuuki/rpingmeshの技術スタック 17 • 言 語:Go • RoCE通信:libibverbs • eBPF Kprobe,

    cillium/ebpf • 要素間通信:gRPC • Registry: Rqlite • 計装:OpenTelemetry 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ
  12. • ローカルのRNICごとに、Responder 用 のgoroutineを起動 • ProberはPinglistから対象を選び、あえて逐次的にProbe送信 • (ratelimitパッケージで対象ごとのレート制限) • Responderは他のProbeから並

    行 して受信するので並 行 処理が必要 • Queue Pair(ソケットのようなもの)をProberとResponderごとに作成 Cluster Monitoringの実装 RoCE通信の多対多Ping 20 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ
  13. • GPU Direct RDMAでは、CPUを介さず転送される => カーネルのeBPFは使えないはず? • 接続開始点と終了点についてはカーネルで実 行 されるため、それらをトレース

    • modify_qp と destory_qp を kprobe でフックし、5タプル <src_gid, dst_gid, src_qpn, dst_qpn, src_udp_port> を取得する • GID(IPv6アドレス)の取得は構造体の深い読み取りが必要になる Service Tracingの実装 21 TUSVDUJC@RQ TUSVDUJC@EFWJDF TUSVDUJC@QPSU@EBUB<> JC@HJE@UBCMF@FOUSZ VOJPOJC@HJE TUSVDUJC@HJE@UBCMF SBX<>@@V 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ
  14. Service Tracing実装上の問題点 CO-RE(Compile Once - Run Everywhere)を使いにくい • ビルドインされていないカーネルモジュールはBTFつきでコンパイルされて いないことがある(Nvidia

    Mellanoxなど) • BTF有効で再コンパイルし、モジュールを要リロード 22 ˞IUUQTMPSFLFSOFMPSHCQGHJU!CSZDFLBIMFDPN 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ ˞ • BTFがvmlinuxには含まれないので、分割BTFを使う • 分割BTFの最 小 化(bpftool — base_btf gen min_core_bpf)は未サポート
  15. 苦労話 Ib verbs(UD型)はユーザー管理資源が多い 23 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ ߲໨ #4%ιέοτ JCWFSCT

    ઀ଓϞσϧ ιέοτੜ੒ˠCJOE ˠ 6%1઀ଓෆཁʗ5$1DPOOFDU 1SPUFDUJPO%PNBJOʢ1%ʣɾ$PNQMFUJPO2VFVF ʢ$2ʣɾ2VFVF1BJSʢ21ʣΛੜ੒ Ѽઌࢦఆ TFOEUP TPDL CVG MFO   TPDLBEES ֤Ѽઌ͝ͱʹ"EESFTT)BOEMFʢ")ʣΛ࡞੒͠ɺ TFOE@XSBIͱTFOE@XSSFNPUF@RQOͰࢦఆ ૹड৴ ݺͼग़͠ TFOE SFDW ɺTFOEUP  SFDWGSPN JCW@QPTU@TFOE ʗJCW@QPTU@SFDW Ͱ8PSL 3FRVFTUΛ౤ߘ ϝϞϦ؅ཧ ΧʔωϧόοϑΝܦ༝ ϢʔβۭؒόοϑΝʢ.3ʣΛJCW@SFH@NS Ͱొ࿥ ׬ྃ௨஌ ϒϩοΩϯάʗϊϯϒϩοΩϯάʗ TFMFDUʗFQPMM $2ΛϙʔϦϯάʢJCW@QPMM@DR ʣ·ͨ͸Πϕϯτۦ ಈͰ௨஌ ৴པੑɾॱং 5$1͸৴པɾॱংอূɺ6%1͸ඇ อূ 6%ʢ6OSFMJBCMFʣͳͷͰύέοτϩε΍ॱংೖସ ͋ΓɻΞϓϦଆͰ੍ޚ͕ඞཁ
  16. 苦労話 Ib verbsサンプルコードが少ない 24 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ • libibverbsに付属する ud_pingpong.c

    (900 行 弱)あたりを読む • 1対1通信でリソース競合などが起きない前提のコード • 多対多通信するものはないか? • NVidiaのnccl(集合通信lib)はあるが、通信種別がUDではなくRC ˞IUUQTHJUIVCDPNMJOVYSENBSENBDPSFCMPCNBTUFSMJCJCWFSCTFYBNQMFTVE@QJOHQPOHD ˞
  17. 苦労話 Ib verbs難しい問題 25 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ GIDとしてIPv4-mapped Addressで通信するときの問題 •

    通常、カーネルがRoCEパケットの冒頭に40バイト(IPv6ヘッダ)挿 入 • IPv4-mappedだと前半20バイト0、後半20バイト分IPv4ヘッダを挿 入 • 仕様には書いてないはず? • カーネルのコードに書いてある… ˞ IUUQTFMJYJSCPPUMJODPNMJOVYWTPVSDFJODMVEFSENBJC@WFSCTI- ˞ struct ib_grh ibgrh; struct { /* The IB spec states that if it's IPv4, the header * is located in the last 20 bytes of the header. */ u8 reserved[20]; struct iphdr roce4grh; };
  18. 苦労話 ACKパケットのロスト問題 26 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ • 問題: バッファ上書きによるACKパケット化けが発 生

    • 並 行 に動く受信呼び出し処理が受信バッファの同じアドレスを参照していた • 解決: 長 い受信バッファをスロット分割 • 受信要求キュー(WR)ごとに独 立 したN x (バッファサイズ)のバッファを 用 意 • 受信要求キューID (WRID)にスロット番号をいれることでトレース可能に ʜ 4MPU 4MPU 4MPU 3FDW#V ff FS 4MPU
  19. 使 用 したAIコーディングツール 基本はCursorを使 用 28 3. AIίʔσΟϯάॴײ Ϟσϧ໊ ࢖͍ํ΍ॴײ

    $MBVEF4POOFU ॳظ࣮૷΍ϦϑΝΫλϦϯάʹ࢖༻ɻ (FNJOJ1SP1SFWJFX ίʔυϕʔε͕େ͖͘ͳ͔ͬͯΒৗ༻ɻίετͱ଎౓ɺੑೳόϥ ϯε͕ྑ͍͕͓͠Ό΂ΓͰઆ໌จ͕௕͍ɻ 0QFO"*P ෳࡶͳσόοά࣌ʹଞͷϞσϧʹ͸ͳ͍ಎ࡯Λఏڙͯ͘͠ΕΔɻ ඇৗʹߴֹͳͷͰͧ͜͜ͱ͍͏ͱ͖ʹɻ $MBVEF4POOFU ϦϦʔε͞Ε͔ͯΒৗ༻ɻ ίʔυͷ࣭͕΄͔ΑΓߴ͘ɺ3VMFT΁ͷ௥ैੑ΋ߴ͍ɻ (FNJOJ'MBTI 'SFFNPEFMͳͷͰ؆୯ͳจॻ΍ϝοηʔδੜ੒ͳͲ 4FMFDUJOH.PEFMTIUUQTEPDTDVSTPSDPNHVJEFTTFMFDUJOHNPEFMT
  20. AIコーディングの 手 順 • 論 文 を全 文 読ませて、実装するための設計書を作るよう指 示

    した • その際に、使いたい技術スタック(Go 言 語、gRPC、Rqliteなど)は指 示 した • できあがった設計書を読み込ませて、コンポーネント(agent, controller)ご との 大 きな粒度で実装するように指 示 した • それっぽいものができあがるが、低レイヤ部分や複雑なロジックは 大 幅に簡略 化されてしまった • 動かない部分を発 見 し、逐次AIに指 示 してロジックの追加やデバッグを 行 った 29 3. AIίʔσΟϯάॴײ ˞IUUQTHJUIVCDPNZVVLJSQJOHNFTICMPCNBJODVSTPSSVMFTEFTJHONED ˞
  21. AIコーディング 良かったところ 実装や問題解決速度は明らかに向上する • スコープが 十 分 小 さいタスクではyuuk1がやるより圧倒的に早く質も 十

    分 • Controllerは 一 般的なWebアプリに近いので特に直すことも少なかった • RqliteのようなややニッチなDBでも、ドキュメントを渡せば 十 分 • 複雑なデバッグへ対応できることがある • ログ(zerolog.Trace/.Debug)の追加をしてくれ、そのログo3/o4-mini に渡すとyuuk1になかった原因分析と解決策を提案 30 3. AIίʔσΟϯάॴײ
  22. AIコーディング 悪かったところ 予想外の省略や決め打ちによるバグの発 生 • 初期実装では、簡略化されていることに気づかず、あとでバグの温床になった • 初期実装でも、タスクを 十 分スコープを

    小 さくして指 示 者がコードを認知できるよ うにする訓練が必要そう • 勝 手 にロジックを変えられていたり、簡略されることがある • タスクついでのリファクタはしてくれず、アドホックにコード追加しがち • 単 一 責任原則に従ってリファクタしてくれと 言 えば、 一 定レベルではやってくれる • 意味のないテストコードが量産されることもある • 構造体オブジェクトを作成し、そのフィールド値をチェックするだけ 31 3. AIίʔσΟϯάॴײ
  23. eBPFのコーディング • 深く構造体にアクセスするロジックは、デバッグ時に実装を勝 手 に省略しがち • GIDの読み取りを諦めてしまう • 初期実装では、関連する構造体定義を渡せばそれっぽくは書いてくれる •

    C bpfコードからBpftraceスクリプトへの変換時に、C 言 語の知識が混在してコ ンパイルエラーが多発する • bpftrace(8) Manual Page(4000+ 行 )を渡しても同じ • もっと単純なデバッグ 用 スクリプトなら問題なかった 32 3. AIίʔσΟϯάॴײ
  24. 自 律型ツール(Devin/Codex/OpenHands/…) 実 行 環境の 用 意が難しいソフトウェアには不向き • RDMAやeBPF Kprobeなどはサンドボックス環境で実

    行 するのが難しい • Software RoCEなどはあるのでVMでがんばればできるかも • テストがまともに書けないため、AIが試 行 錯誤できない • 結局リバートすることになる 34 3. AIίʔσΟϯάॴײ
  25. まとめ • RNIC単位でメッシュ状にPingを打ち合うRoCEネットワーク監視システムR- Pingmeshを実装している • eBPFは実際にサービス使 用 中の通信を検出するために使う • 一

    般には、トレーシングの結果を直接に計測値として収集することが多い • AIコーディングは、Webアプリ以外のソフトウェアでも有 用 と感じた。 • 特に論 文 実装では、論 文 を読み込ませ、すぐに実装に移れる • AIが 自 律的に動作検証を 行 えない状況では、Vibe Codingまでは不可 4. ·ͱΊ 36 ʢ࿦จςΩετ΋͋Δ͠ɺ"*΋͋Δ͠ɺQJOH౤͛Δ͚ͩ ͔ͩΒ؆୯Ͱ͸ʂʁͦ͏ࢥ͍ͬͯͨ࣌ظ΋͋Γ·ͨ͠ʣ
  26. RTTの計測 方 法 RTT = ネットワークRTT + Prober処理遅延 + Responder処理遅延

    42 ProberとResponder間の時 刻ずれを考慮する NW RTT = (⑤-②) - (④-③) Prober Delay = (⑥-①) - (⑤-②) ACK2(④を含む) を送信 HWλΠϜ ελϯϓ Responder Delay = ④-③ 要点:同 一 ホスト上でのみ 時刻を差分計算する 2. R-Pingmesh ઃܭͱ࣮૷ͷ঺հ