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

AMI System基礎 2025

Geson Anko
January 27, 2025
27

AMI System基礎 2025

Geson Anko

January 27, 2025
Tweet

Transcript

  1. 1 目次 1. AMI System 1. Systemの背景と目的 2. AMI Systemとは

    3. 動作システムの概要 4. 主な機能 5. 主要なシステムコンポーネント 1. Threads 2. Interaction 3. Trainer 4. Data 5. Model 6. その他 7. システムの全体像 2. 非同期システムの安全設計 1.非同期処理とは 2.メリット・デメリット 3.メモリ安全性と排他制御 4.書き込み可能権限 3. 実装において 1.Pythonで非同期処理をするために 2.Thread Controller 3.深層モデル 4.学習データ 4. 参考文献
  2. 4 AMI Systemとは • 深層モデルの学習と推論を同時並行して行うシステム • 深層モデルの二つのフェーズを同時に実行 • それを行うために… •

    マルチスレッド化 • 深層モデルのパラメータ同期 • データの受け渡し • その他 logging, 制御 • などを行うシステム
  3. 動作システムの概要 • 制御・推論・学習を並行処理(マルチスレッド化) フラグ・命令 起動 推論 学習 制御 • 停止・再開

    • 終了 • 状態保存 • VRChatと インタラクション • 学習データ収集 観測取得 行動生成 データ収集 • 深層モデルの パラメータ更新 if 学習データが 溜まったら 学習実行 モデル同期 移動 深層 モデル 学習 データ 同期 フラグ・命令
  4. 6 主な機能 • 安全かつ高速な非同期学習・推論 • リアルタイム性が求められる推論を止めない工夫 • モデルパラメータの同期 • データの受け渡し

    • 共有オブジェクトの書き込み権限の制限によるスレッドセーフ化 • Web APIによる外部からのシステム制御 • 一時停止、再開、終了、状態保存 • 時間加速・減速 などなど…
  5. 7 主要なシステムコンポーネント • Threadsモジュール • 並行処理、制御 • Interactionモジュール • 環境とAgentの相互作用

    • Modelモジュール • 深層モデルの取り扱い • ※PyTorch非依存化するよ • Dataモジュール • 学習データの収集処理 • ※再設計するよ • Trainerモジュール • 学習処理の取り決め • Schedulersモジュール • Checkpointingモジュール • Timeモジュール • 可変時間進行 • Consoleモジュール • 外部からのシステム操作 • Launch関数 • 起動処理を行う関数
  6. 8 Threadsモジュール • スレッドクラスを実装 • 制御、推論、学習スレッド • スレッド制御・イベントハンドリング • ThreadController

    • Pause, Resume • Shutdown • ThreadHandler • Pause完了フラグ • 制御スレッドへの例外通知 • ExceptionFlag, Notifier 起動 推論 学習 制御 • 停止・再開 • 終了 • 状態保存 フラグ・命令 Pause・例外
  7. 推論スレッド 9 Interactionモジュール • 環境(Environment)とAgentの関わりを記述 • Environment: 観測を出力し、行動を入力する。 → 実世界とのやりとり

    • Agent: 観測を入力し、行動を出力する。(※学習用の経験データも集める) → 機械知能の意思決定処理 • Environmentの子コンポーネント • Sensor: 観測を取得する処理を記述 • Actuator: 行動を作用させる処理を記述 • IntervalAdjustor: • 観測・行動ループの間隔を一定に保つ • Ex: 10fpsで動作など Interaction Environment Agent 観測 行動 Sensor Actuator
  8. 10 Trainerモジュール • 学習処理の枠組みを記述 • 学習可能フラグの管理 • 学習データが一定数溜まったら、 など •

    学習後のモデル同期処理の実行 • 実際の学習処理は機械学習バックエン ド(PyTorchなど)に依存 推論 スレッド 学習スレッド Trainer if 学習データが 溜まったら 学習実行 モデル同期 移動 深層 モデル 学習 データ 同期
  9. 11 Dataモジュール • 学習データの収集処理を記述 • DataCollector • 推論スレッドで経験データを収集 • Agentクラス内部で使用

    • DataUser • 学習スレッドへデータを受け渡し • Trainerクラスで使用 • DataBuffer • データを溜めておく場所 • Collector, Userの内部で使用 推論 スレッド 学習 スレッド 移動 学習 データ Data Collector Data User Buffer
  10. 12 Modelモジュール • 推論モデル、学習モデルを定義 • モデル同期の枠組みを提供 • 同期処理はTrainerから呼び出し • 推論モデル

    • Agent内部で使用 • 学習モデル • Trainer内部で使用 • 実装は機械学習バックエンド(PyTorchなど) に依存 推論 スレッド 学習 スレッド パラメータ 同期 学習 モデル 推論 モデル
  11. 13 その他のモジュール • Schedulers • 任意のステップ・時間ごとにログ処理を発火 • Checkpointing • チェックポイント(状態)保存処理の実行

    • Time • AMI System内部の時間の管理 • 時間の加減速・一時停止・再開などを行う • 加速した実験を可能に
  12. 14 その他のモジュール • Console • AMI Systemを外部 から操作する API を提供

    • 制御スレッドで用いられる。 • CLI による System Consoleも提供する。 • Launch関数 • System起動の処理を記述する。
  13. 18 非同期処理とは • あるタスクを実行中に、別なタスクを実行する。 • Ex1. UIは動いていて欲しいけど、裏では実処理を回したい。 • Ex2. サーバーからのレスポンスを待っている間、別の処理をしたい。

    タスクA タスクB タスクC 結果 結果 結果 全体の進行 非同期処理の場合 同期処理の場合 全体の進行 タスクB 結果 タスクA 結果 タスクC 結果 ※スレッド ≒ タスク。同時実行されるタスクのこと
  14. 19 非同期処理のメリット・デメリット • メリット • 上手く処理を組めれば、マシンパワーをフル活用できる • UIなどのずっと動いていて欲しい処理を作れる • デメリット

    • プログラムが複雑になる。全体が見通しにくい • デバッグが難しい。(タイミングなどが重要になったり…) • メモリ安全性問題が発生する(後述)
  15. 20 メモリ安全性と排他制御 • 安全性問題 同じメモリに複数のスレッドから同時に書き込めてしまう。 • どっちの値になるかわからない • 壊れるかもしれない。 •

    メモリを読み取り中に消されるかもしれない • 排他制御 同じメモリ領域への同時アクセスを制限する。 • Lock: スレッドが一度ロックを獲得すると、それ以後のロック獲得 の試みはロックが解放されるまでブロック。 • 実際に使うのは RLockだけどね • 他にも “Condition”, ”Event”, “Barrier”, “Semaphore” などがある。 スレッドA スレッドB メモリ どっちの値??? 同時に書き込む! 1:要求 スレッドA 解放 スレッドB 獲得 2:要求 待機 獲得
  16. 21 書き込み可能権限と読み取り専用オブジェクト • 書き込み可能権 全てのオブジェクトはたかだか1つのスレッドが書き込み可能である。 スレッド間で共有されたオブジェクトに対して考える。 書き込み可能権限 排他制御をしても、複数のスレッドから同じオブジェクトを変更する処理は、 オブジェクトの状態を追えなくなるので危険。 •

    オブジェクトはただ一つのスレッドから書き込みされる。 • 権限のないスレッドは、読み取りのみ可能である。 オブジェクトは書き込み可能なスレッドが生成し、 読み取り専用オブジェクトとして他のスレッドへ共有することが多い ただ、権限は移動できる。(Queueや Pipeなどで) スレッドA スレッドB Object Read/Write Read only
  17. 23 Pythonで非同期処理を行うために • “threading” モジュール ”target”に関数を指定、”args”を引数に与えて、 “start”メソッドで開始 メモリはスレッド間で共有される → 基本どんなオブジェクトも共有可能

    ※ Global Interpreter Lock (GIL) で本当に同時に動くスレッドは一つのみ… → 性能向上のために使えない。(ただしI/O系は良い) ※ Python 3.13以降でGILは解除可能に。 • 他にも ”multiprocessing”, “asyncio” などがある。 ”concurrent.futures” モジュールは更に高レベルのAPIを提供
  18. 24 Thread Controller • 権限構造 • ThreadController ← 制御スレッドのみが参照可能 •

    制御命令の変化を行える。 • Read / Write • ControllerStatus ← その他スレッドで参照可能 • 制御命令の参照のみ可能 • Read only.
  19. 25 深層モデルのパラメータ同期 • スレッド間でのモデル共有 • 二つのモデルを配置し、学習スレッドで更新後 に推論スレッドに同期 • 推論用モデルは学習されたモデルが、推論モー ドで渡される

    • 権限構造 • 推論スレッド:(Read only) • 学習スレッド:(Writable) • 同期方式:参照スイッチング • 推論処理を止めない高速同期 • 制約:モデルは内部状態を持てない 推論 スレッド 学習 スレッド 旧モデル 新モデル 新モデル 旧モデル 入れ替え パラメータコピー
  20. 27 参考文献 • ソーシャルVR空間に適用可能な好奇心ベースの自律機械 知能 https://www.jstage.jst.go.jp/article/vconf/2024/0/2024_19/_article/-char/ja • Lockオブジェクト https://docs.python.org/ja/3.11/library/threading.html#lock-objects •

    スレッドベースの並列処理 https://docs.python.org/ja/3.11/library/threading.html#module-threading • 所有権とは?(参考:Rustのより厳密な所有権システム) https://doc.rust-jp.rs/book-ja/ch04-01-what-is-ownership.html