世界を動かす技術を、日本語で。

PyTorch Monarchの翻訳は「PyTorch Monarch」となります。特定の製品名や技術用語はそのまま使用されることが一般的です。

概要

  • Monarch は分散型PyTorchワークフローを単一コントローラで簡素化する新フレームワーク
  • プログラマは Python的な記述 でクラスタ全体をローカルのように制御可能
  • メッシュAPI分散テンソルRDMA転送 などを提供
  • 障害回復 や高度な分散処理も直感的に実装可能
  • PyTorch・RLフレームワーク との統合事例も紹介

Monarch: 単一コントローラによる分散PyTorchワークフロー

  • 機械学習ワークフローの 非同期性・動的性・障害対応 の複雑化
  • 従来のPyTorchは HPC型マルチコントローラ(SPMD) モデル依存
  • 各ノードがローカルな状態のみで判断するため、 実装が困難
  • 単一コントローラモデル への転換で、分散プログラミングを容易化
  • Pythonのクラス・関数・ループ・タスク・Future で分散アルゴリズムを表現可能

Monarchの主な特徴

  • クラスタを配列のように操作

    • ホスト、プロセス、アクターを メッシュ として管理
    • メッシュやそのスライスに対し シンプルなAPI で操作
    • 分散・ベクトル化はMonarchが自動で処理
  • 進化的な障害処理

    • コードは障害が無い前提で記述可能
    • 障害発生時はデフォルトでプログラム全体を停止(例外未処理時と同様)
    • 必要に応じて細粒度な障害回復を追加可能(Pythonの例外ハンドリング)
  • 制御とデータの分離

    • コントロールプレーン (メッセージ)と データプレーン (RDMA転送)を分割
    • GPU間で直接メモリ転送を実現
  • ローカルのような分散テンソル

    • PyTorchとシームレス統合
    • テンソル演算はローカル風だが、裏側で大規模クラスタ全体に分散

プログラミングモデルとAPI

  • プロセスメッシュ・アクターメッシュ

    • リソースを多次元配列(メッシュ)として管理
    • NumPyやPyTorchの配列プログラミング感覚で操作
    • 例:1GPU=1プロセス、アクターを各プロセスに配置
    • ローカル開発時も同じAPIで動作
  • 高度API:テンソルエンジン・RDMAバッファ

    • クラスタ全体を1台のマシンのように扱う分散テンソル
    • RDMAバッファAPIで高スループットなデータ転送

コード例

  • シンプルなアクターの例

    from monarch.actor import Actor, endpoint, this_host
    procs = this_host().spawn_procs({"gpus": 8})
    class Example(Actor):
        @endpoint
        def say_hello(self, txt):
            return f"hello {txt}"
    actors = procs.spawn("actors", Example)
    hello_future = actors.say_hello.call("world")
    print(hello_future.get())
    
    • 8GPU上でアクターを生成、コントローラが制御
  • メッシュのスライス操作

    • メッシュを部分的に操作し、異なるメソッドを呼び分け
    • 例:gpus=0~3でhello、gpus=4~7でbye
  • 障害回復の例

    • Pythonのtry-exceptでリモート例外も自然にハンドリング

Monarchのバックエンド構成

  • Pythonフロントエンド :PyTorchやJupyterとの統合容易
  • Rustバックエンド :高性能・スケーラブルな実装
  • hyperactor :低レベル分散アクターシステム
  • hyperactor_mesh :大規模メッシュ向けベクトル化アクター
  • スケーラブルメッセージング
    • マルチキャストツリーとマルチパートメッセージで効率化
    • コントロールプレーンとデータプレーンの分離で高速化

事例紹介

強化学習(Reinforcement Learning, RL)

  • RLは 大規模分散ワークフロー の典型例

  • 生成器・トレーナー・推論・報酬パイプラインを メッシュ で表現

  • オーケストレーションは通常のPythonスクリプトとして記述

  • RDMAによる直接データ転送 で効率的なパイプライン構築

  • VERL Volcano Engine Reinforcement Learning (VERL)

    • MonarchとVERLを統合し、Qwen-2.5-7B数理モデルを大規模GPUクラスタで学習
    • Megatron-LMで16〜2048GPUまでスケール、安定動作・数値的なパリティを実証
    • 今後、VERL向けMonarch統合のOSS化を予定
  • TorchForge

    • MonarchネイティブなPyTorch RLフレームワーク
    • 研究者が擬似コード感覚でアルゴリズムを表現可能

このように Monarch は、分散機械学習ワークフローの複雑性を大幅に低減し、今後のAIアプリケーション開発の基盤となることが期待される。

Hackerたちの意見

どうやらPyTorchの酸化が始まったみたい。

MonarchはPythonベースのフロントエンドと、Rustで実装されたバックエンドに分かれてるね。それ以外は、かなり面白いプロジェクトに見える。

これは新しいプロジェクトだよね?既存のものの酸化じゃなくて。

複数の情報源によると、これはPyTorchの周りの実験的なフレームワークで、置き換えではないらしい。人々はまだstd::shared_ptrを使ってメモリリークのある循環グラフを楽しめるみたい。完全に関数型言語でドライバーを再構築しないのは残念だね。

じゃあ、Beowulfってことか。

これってRayに似てるのかな?

Rayに対してこれのユースケースが気になるな。PyTorchやテンソルの抽象化との統合がより密接なのかな?

同じこと考えた!特に最近のコラボレーションがあったからね。

Daskもあるよ。分散したpandasやnumpyの操作ができるんだ。ただ、もともとは従来のHPCシステムのために開発されたもので、GPUコンピューティングのサポートは限られてるみたい。

かっこいい!基本的には2008年のFortranコア配列だね。

それとも2006年のHadoop?でも、MapReduceやFortranを書く必要がないから、たぶんずっと使いやすいと思う。

自分でもシングルコントローラーのPyTorch拡張を作ったんだけど、まだノード間通信には対応してないんだ。Monarchがどんなふうにパフォーマンスを向上させるか比較するのが面白いと思った。Monarchは全ノード間でコードを共有するためにcloudpickleも使ってるみたいで、これが一度のセットアップコストでいろんなノードが効率よく作業を実行する唯一の方法だと思う。シングルコントローラーからメッセージを送るファンアウトがすごく面白いと思ったから、コントローラーがボトルネックになることはあまりないんじゃないかな、同期操作を除いて。パフォーマンスが落ちるかもしれない要素として、カスタムカーネルがサポートされてるかどうか気になるな。あと、異なるアクターが関数を呼び出すときの通信の制御の粒度はどれくらいなんだろう。全体的に、このプロジェクトがすごく好きで、マルチコントローラーのセットアップで使われるのを見たいな。[1] https://github.com/alyxya/mycelya-torch

パフォーマンスが落ちるかもしれないことについてなんだけど、カスタムカーネルがサポートされてるか気になるな。リモートワーカーの初期化にちょっと変更が必要になるかもしれないけど、基本的には必要なカーネルやシステムコードを組み込むことができるよ。

これってJaxよりも明らかにパワーが劣るね。Jaxは強力なコンパイラがついてて、ノード間通信の最適化をしてくれるから。

いや、違うコントローラーパラダイムに焦点を当ててるよ。JaxはマルチコントローラーのSPMDに集中してるけど、これはシングルコントローラーのセットアップに焦点を当ててる。どちらにもそれぞれの利点があって、シングルコントローラーは一般的に理解しやすいし、マルチコントローラーは特定のデータフローに対して最適だよね。両方のコントロールパラダイムの面白いミックスもあるし。

これによって、単一ホストのボトルネックを避けられるし、メッセージ転送のためにメッシュ全体を分散クラスターとして効果的に使えるんだよね。(ここにスケーラビリティの数字を引用して。)もしこれを直せる人がここを見てたらいいけど。

面白いね。これはTinkerみたいなサービスとは違うレイヤーを狙ってるみたい。Monarchはインフラの基本部分を提供して、Tinkerはマネージドなファインチューニングサービスだよね。Monarchの上にTinkerみたいなものを作れる人いるかな?

うん、今はその上にhttps://pytorch.org/blog/introducing-torchforge/みたいなものがあるよ。

いいプロジェクトだね。いくつか質問があるんだけど。 - これはopenMPIに似てるの? - メッシュはどうやって構築されるの?同じホストにいる必要があるのかな?