Slide 1

Slide 1 text

1 関数型まつり2025 #fp_matsuri_b 鳥越 貴智 型付きアクターモデルがもたらす 分散シミュレーションの未来 https://github.com/arktwin/arktwin 本スライドは SpeakerDeck (@piyo7) で公開中 関数型まつり公式サイトから スケジュール > fortee個別ページ埋め込み

Slide 2

Slide 2 text

2 自己紹介 研究開発まわりで、分散処理をよく扱っています💪 ● 2012-2016 シミュレーションエンジニア@構造計画研究所 ○ Open MPIで無線通信シミュレータ開発など ● 2016-2019 データ・MLエンジニア@サイバーエージェント ○ Apache Sparkでビックデータ集計・機械学習など ○ 関数型まつり前身のScalaMatsuri 2018で登壇 ● 2019- リサーチャー@トヨタ自動車 ○ Apache Pekkoを用いた分散シミュレーション用 メッセージングフレームワーク「ArkTwin」の研究開発など 鳥越 貴智 takatomo_torigoe @mail.toyota.co.jp GitHub: @piyo7 SpeakerDeck: @piyo7

Slide 3

Slide 3 text

3 本セッションでお話しすること 分散シミュレーション用メッセージングフレームワーク 「ArkTwin」をOSSとして研究開発しています。その経験を元に…… 型付きアクターモデル がもたらす 分散シミュレーション の未来 型付きアクターモデルの基礎と アクター間メッセージングの 設計パターンを紹介 交通流シミュレータ、歩行者シミュレータ ドライビングシミュレータ、VR、など 異種シミュレータを複数接続して分散実行 する仕組みを紹介

Slide 4

Slide 4 text

4 分散シミュレーションのデモ例 会場ではデモ動画を流します!

Slide 5

Slide 5 text

5 分散シミュレーションのためのArkTwin 色んなシミュレータ・VRを汎用的に接続するためArkTwin Center・Edgeを開発 gRPC REST API シミュレータ・VRは オンラインゲームのように 別拠点からもネット越しに通信可 シミュレータ・VRごとに異なる 時間粒度や座標系を変換する サイドカー シミュレータ・VRが抱える エージェントの時空情報を Pub/Subするブローカー

Slide 6

Slide 6 text

6 ArkTwinはOSSとして開発中! https://github.com/arktwin/arktwin Star ⭐ お待ちしてます! \コントリビュート大歓迎/ 主な開発言語はScala 安心のApacheライセンス

Slide 7

Slide 7 text

7 色んなシミュレータ・VRを繋いで 分散シミュレーションするために ArkTwinを開発しています! ↓ ところで分散処理って何が難しいんだっけ?

Slide 8

Slide 8 text

8 分散処理の勘所 関数型プログラミングのカンファレンス 「関数型まつり」を開催します! 関数型: 2 …… 関数型プログラミングはメジャーな言語・ フレームワークに取り入れられ、…… たとえば 関数型まつり宣伝文の ワードカウントを MapReduceで 行うことを考えると…… 関数型: 1 …… 関数型: 3 …… 関数型: 2 関数型: 1 …… 左図は Hadoop: The Definitive Guide Figure 2-4 引用 タスク依存をどういったプログラミングパターンで制御するか、が分散処理の勘所 並列 処理 タスク依存あり (Mapが全て終わらないとShuffleできない) Map Shuffle

Slide 9

Slide 9 text

9 各プログラミングパターンのタスク依存制御 プログラミングパターン タスク依存の制御ポイント ハマりどころ Mutual Execution (Mutex, Synchronizedなど) ロックの取得・解放 デッドロックを起こしやすい Future Futureの合成やawait ネストのフラット化が難しい MPI プロセス間通信 通信元・先のプロセスを 明確に管理する必要あり Reactive 依存データの更新 メモ化などの最適化が難しい MapReduce Shuffleや外部出力 Map処理の負荷が不均一だと 並列性能が悪くなる 個人的な実装経験を元に整理してみると…… 「アクター間メッセージ」でタスク依存を制御するアクターモデルがピッタリかも どれも帯に短し襷に長しな場合…… 抽象度 低 高

Slide 10

Slide 10 text

10 Apache Pekkoとは ● Scala言語で開発されたアクターモデルライブラリ ○ Scala APIのほか、Java APIあり ○ Erlang言語の影響が強い ● ビッグテックでも利用事例多数なAkkaからフォークしたOSS ○ Akkaが2022年に有償ライセンスBSLへ切り替わったため、コミュニティがフォーク ○ その後すばやくApache Incubator入り ○ 公開前のArkTwinもAkkaに依存していたが、Pekkoへ移行 ● 発音は「ペッコ」が一般的っぽい?(YouTubeの解説動画などで確認) https://www.apache.org/logos/

Slide 11

Slide 11 text

11 型付きアクターモデルとは(Pekko準拠) 様々な形式の数値を受信して、累計値を求めるアクターを例に…… メールボックス 他アクターから非同期で受信したメッセージを溜めるキュー(基本は先入れ先出し) 受信可能なメッセージの型は静的に型検査可(上記の場合はStringとIntのUnion型) 状態 非スレッドセーフ変数を状態として扱える(アクター実行ごとにシングルスレッド割当) ビヘイビア メールボックスから取り出したメッセージ内容に応じて、 どう状態を変え、どう他アクターに影響(送信・生成など)を与えるかの振る舞いを関数定義 アクターモデルは、このアクターを基本単位としてシステムを組むことでスケール

Slide 12

Slide 12 text

12 アクター間メッセージングの基本パターン ① Fire and Forget ② Request-Response ③ Request-Response with   ask from outside an Actor Pekkoを利用しているArkTwinの設計を例に、具体的なメッセージングパターンを紹介 図はPekko公式サイトより引用 https://pekko.apache.org/docs/pekko/1.1/typed/interaction-patterns.html 非同期でメッセージ投げつける 相手が受信できたかは気にしない シンプルが故に高性能 リクエストに自身の参照を返送先として含め 非同期でレスポンスを返してもらう レスポンスは待たず次のメッセージ処理に移る アクター外からリクエストする際は Futureで受け取り可

Slide 13

Slide 13 text

13 パターン:不特定のアクターに設定を動的配布 やりたいこと REST API「Put /config」で動的に更新された設定情報を 不特定多数のアクターに配布して各々で設定更新したい 考えどころ どうやって配布先のアクターの参照を知るか? (アクター生成時の引数として渡す方法もあるが、生成順の依存が発生) ポイント Pekkoのアクターシステムが用意している アクターディスカバリのための専用アクターReceptionistを利用

Slide 14

Slide 14 text

14 パターン:複数アクターのレスポンスを合成 やりたいこと REST API「Post /_query」のリクエストに応じて複数アクターに問い合わせ それらのレスポンスを合成して返したい 考えどころ リクエストごとに複数レスポンス待ちやタイムアウト処理をするにあたり いかにブロッキングすることなくセッション管理するか? ポイント セッションごとに子アクターを生成・破棄 (アクターは気軽に生成・破棄してOK)

Slide 15

Slide 15 text

15 パターン:ストリームの統計を元に定期最適化 やりたいこと カリング(各シミュレータから見える近傍のエージェントを動的に絞り込み) をエージェント情報のPub/Subに組み込みたい 考えどころ エージェント情報のストリームを止めることなく、統計情報を収集して カリングのためのルーティングテーブルを定期的に最適化するか? ポイント Pub/Subとは別に統計情報収集&ルーティングテーブル更新の支流を作る 交 通 流 ︵ 広 域 ︶ カリング 見える範囲に絞り込み 車 載 カ メ ラ ︵ 狭 域 ︶

Slide 16

Slide 16 text

16 まとめ ● 分散シミュレーション用メッセージングフレームワーク「ArkTwin」を実例として 型付きアクターモデルの基礎とアクター間メッセージングの設計パターンを紹介 ● 本セッションを「いいね!」と感じたら GitHub Star ⭐ 貰えるとめっちゃ嬉しいです ○ https://github.com/arktwin/arktwin ● ArkTwinのOSS利用・開発に興味ある方・組織は、お気軽にご連絡ください! ○ https://github.com/arktwin/arktwin/discussions ○ [email protected]