meta-pytorch/monarch

GitHub: meta-pytorch/monarch

一个基于可扩展 actor 模型的 PyTorch 分布式编程框架,提供容错、RDMA 传输和分布式 tensor 能力。

Stars: 1058 | Forks: 163

# Monarch 🦋 **Monarch** 是一个基于可扩展 actor 消息传递的 PyTorch 分布式编程框架。它提供: 1. 具备可扩展消息传递功能的远程 actor:Actor 被分组到称为 mesh 的集合中,并且消息可以广播给所有成员。 2. 通过 supervision tree 实现容错:Actor 和进程形成一棵树,故障会沿树向上传播,提供良好的默认错误行为,并支持细粒度的故障恢复。 3. 点对点 RDMA 传输:在进程中低成本注册任何 GPU 或 CPU 内存,支持基于 libibverbs 的单边传输。 4. 分布式 tensor:Actor 可以处理跨进程分片的 tensor 对象。 Monarch 代码通过简单的 Python API 以命令式方式描述如何创建进程和 actor: ``` from monarch.actor import Actor, endpoint, this_host # spawn 8 个 trainer 进程,每个 gpu 一个 training_procs = this_host().spawn_procs({"gpus": 8}) # 定义要在每个进程上运行的 actor class Trainer(Actor): @endpoint def train(self, step: int): ... # 创建 trainers trainers = training_procs.spawn("trainers", Trainer) # 告诉所有 trainers 执行一个 step fut = trainers.train.call(step=0) # 等待所有 trainers 完成 fut.get() ``` [Monarch 概念简介](https://meta-pytorch.org/monarch/generated/examples/getting_started.html) 提供了有关如何使用这些功能的介绍。 ## 📖 文档 请通过[此链接](https://meta-pytorch.org/monarch/)查看 Monarch 的托管文档。 ## 安装说明 ### 从预构建的 Wheel 安装 Monarch 提供了预构建的 wheel,无论你安装了什么版本的 PyTorch 都可以使用。你可以使用 `pip` 或 `uv` 获取它们: - **使用 PIP**: - 稳定版:`pip install torchmonarch` - 每日构建版:`pip install --pre torchmonarch` - 指定版本:`pip install torchmonarch==v0.6.0.dev20260526` - **使用 UV** - 注意,你也可以直接使用 `uv pip install ...` 并匹配上述 pip 命令;但下面的命令能正确地将 monarch 添加到你的 UV 项目中。 - 稳定版:`uv add torchmonarch` - 每日构建版:`uv add --prerelease=allow torchmonarch` - 指定版本:`uv add torchmonarch==v0.6.0.dev20260526` ### 从源码构建并安装 **注意**:从源码构建需要额外的系统依赖。这些依赖仅在**构建时**需要,在运行时不需要。 Monarch 使用 `uv` 进行快速、可靠的 Python 包管理。如果你还没有安装 `uv`: ``` # 安装 uv curl -LsSf https://astral.sh/uv/install.sh | sh # 或者在 macOS 上 brew install uv ``` **配置 PyTorch Index**:默认情况下,Monarch 会使用来自 `pytorch-cu132` index (CUDA 13.2) 的 PyTorch 进行构建。要使用不同的 CUDA 版本: - 编辑 `pyproject.toml` 中的 `[tool.uv.sources]`,使其指向不同的 index(例如 `pytorch-cu130` 或 `pytorch-cpu`) - 或者在运行 uv 时使用 `--extra-index-url`: uv sync --extra-index-url https://download.pytorch.org/whl/cu130 #### 了解 Tensor Engine Monarch 包含[分布式 tensor](https://meta-pytorch.org/monarch/generated/examples/getting_started.html#distributed-tensors)和 [RDMA](https://meta-pytorch.org/monarch/generated/examples/getting_started.html#point-to-point-rdma) API。Tensor engine 可以在任何平台上构建,包括仅限 CPU 的主机和 macOS;特定于 GPU 的组件(NCCL、RDMA、rdmaxcel)作为上层依赖,仅可在安装了 CUDA 或 ROCm 工具链的 Linux 环境下构建。如果你想要一个更轻量级的 Monarch 版本(仅包含 actor,无 torch 依赖),请设置 `USE_TENSOR_ENGINE=0`。 默认情况下,Monarch 在构建时会启用 tensor_engine。如果要构建不包含它的版本: ``` USE_TENSOR_ENGINE=0 uv sync ``` **注意**:构建不包含 tensor_engine 的版本意味着你将无法使用分布式 tensor 或 RDMA API。使用 tensor_engine 需要 Torch,且最新的稳定版 Torch 与最新的带版本号的 torchmonarch 保持 ABI 兼容。 **选择 GPU 平台**:`MONARCH_GPU_PLATFORM` 环境变量控制构建时链接哪些 GPU 库。它接受以下值: - `cuda` — 基于 CUDA 构建 (NCCL + RDMA)。 - `rocm` — 基于 ROCm 构建。 - `none` — 即使在安装了 CUDA 或 ROCm 的主机上,也强制使用仅支持 CPU 的 tensor engine。 如果不设置该变量,系统会自动检测当前存在的工具链。如果同时安装了 CUDA 和 ROCm,则必须显式设置此变量;当你想在支持 GPU 的主机上使用 CPU tensor engine 时,`none` 是显式禁用的选项。 ``` # 强制使用仅 CPU 的 tensor engine(无需 CUDA/ROCm/RDMA 库) MONARCH_GPU_PLATFORM=none uv sync # 在同时拥有 ROCm 的主机上强制使用 CUDA MONARCH_GPU_PLATFORM=cuda uv sync ``` #### 各平台构建依赖 ##### 在 Fedora 发行版上 ``` # 安装 nightly rust toolchain curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup toolchain install nightly rustup default nightly # 安装 non-python 依赖 sudo dnf install -y cmake ninja-build protobuf-compiler libunwind # 为您的机器安装正确的 cuda 和 cuda-toolkit 版本 sudo dnf install cuda-toolkit-13-2 cuda-13-2 # 安装 clang-devel、nccl-devel 和 libstdc++-static sudo dnf install clang-devel libnccl-devel libstdc++-static # 安装 RDMA 库(tensor_engine 构建需要) sudo dnf install -y libibverbs rdma-core libmlx5 libibverbs-devel rdma-core-devel # Clone 并 sync 依赖 git clone https://github.com/meta-pytorch/monarch.git cd monarch # 以开发模式安装所有依赖 uv sync # 或者在不使用 tensor_engine 的情况下安装 USE_TENSOR_ENGINE=0 uv sync # 验证安装 uv run python -c "from monarch import actor; print('Monarch installed successfully')" # 重新构建(例如,在更改 Rust 代码后) USE_TENSOR_ENGINE=0 uv pip install -e . ``` ##### 在 Ubuntu 发行版上 ``` # 安装 nightly rust toolchain curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env rustup toolchain install nightly rustup default nightly # 安装 Ubuntu 特定的系统依赖 sudo apt install -y cmake ninja-build protobuf-compiler libunwind-dev clang # 将 clang 设置为默认的 C/C++ 编译器 export CC=clang export CXX=clang++ # 为您的机器安装正确的 cuda 和 cuda-toolkit 版本 sudo apt install -y cuda-toolkit-13-2 cuda-13-2 # 安装 RDMA 库(tensor_engine 构建需要) sudo apt install -y rdma-core libibverbs1 libmlx5-1 libibverbs-dev # Clone 并 sync 依赖 git clone https://github.com/meta-pytorch/monarch.git cd monarch # 以开发模式安装所有依赖 uv sync # 或者在不使用 tensor_engine(仅 CPU)的情况下安装 USE_TENSOR_ENGINE=0 uv sync # 验证安装 uv run python -c "from monarch import actor; print('Monarch installed successfully')" # 重新构建(例如,在更改 Rust 代码后) USE_TENSOR_ENGINE=0 uv pip install -e . ``` ##### 在非 CUDA 机器上 你也可以在非 CUDA 机器(例如 macOS 笔记本电脑)上构建 Monarch 以供仅限 CPU 的环境使用。Tensor engine 本身可以在 CPU 上运行;只是会跳过特定于 GPU 的部分(NCCL、RDMA、rdmaxcel)。自动检测机制会处理未安装 CUDA 或 ROCm 的主机。如果你的主机确实安装了 GPU 工具链,但你仍然希望使用 CPU tensor engine,请设置 `MONARCH_GPU_PLATFORM=none`。 ``` # 安装 nightly rust toolchain curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup toolchain install nightly rustup default nightly # Clone 并 sync 依赖 git clone https://github.com/meta-pytorch/monarch.git cd monarch # 构建 CPU tensor engine(自动检测无 GPU) uv sync # 或者,完全跳过 tensor engine(仅 actors,无需 torch) USE_TENSOR_ENGINE=0 uv sync # 验证安装 uv run python -c "from monarch import actor; print('Monarch installed successfully')" ``` #### 替代方案:使用 pip 如果你更喜欢使用 pip 而不是 uv: ``` # 在安装系统依赖之后(见上文) # 安装构建依赖 # 构建并安装 Monarch pip install . # 或者用于开发 pip install -e . # 不使用 tensor_engine USE_TENSOR_ENGINE=0 pip install -e . ``` ### 从源码构建 Docker 镜像 要构建一个捆绑了你从源码构建的 Monarch 的 Docker 镜像(例如,为了在 Kubernetes 集群上运行 Monarch),请先构建一个 wheel,然后基于该 wheel 构建镜像。这会一并应用对 Rust 和 Python 代码的更改。 ``` # 确保为 python 3.12 进行构建,因为 pytorch 基础镜像使用该 python 版本 uv python pin 3.12 # 构建二进制分发包,输出到 "dist/" 目录。 # --no-build-isolation 允许使用已缓存的 rust 构建,这可以加快后续的 # 迭代。 uv build --no-build-isolation --wheel # 使用 docker: # 使用您构建的 monarch 构建并标记 docker 镜像。您可以根据需要更新 # PYTORCH_TAG 以使用不同的基础镜像。 # 使用 nightly dockerfile 是因为它会使用您已经构建好的包, # 而不是从 PyPI 下载。wheels 通过名为 "monarch-wheels" 的 # 构建上下文提供,Dockerfile 会从中进行复制。 docker build -f Dockerfile.nightly \ -t $USER/monarch:local-tag \ --build-arg PYTORCH_TAG=2.12.0.dev20260224-cuda12.8-cudnn9-runtime \ --build-context monarch-wheels=dist \ . # Push 以便 kubernetes cluster 可以使用它。 # 可以 (a) Push 到 container registry,以便您的 cluster 可以访问它。 # 根据您的上传速度和 container 的大小,可能会比较慢。 docker push $USER/monarch:latest # 或者 (b) 如果您有一个完全本地的 kubernetes cluster,您可以将其更改为 # manifest 中的 imagePullPolicy: Never,它将在本地使用该镜像。这是 # 最快的迭代速度。 # 使用 podman + kind: # 相同的构建命令,将 "docker" 替换为 "podman" # 将镜像保存到归档文件 podman save localhost/$USER/monarch:local-tag -o /tmp/monarch-image # 然后 Push 到您的 kind cluster 进行本地开发: KIND_EXPERIMENTAL_PROVIDER=podman kind load image-archive /tmp/monarch-image -n monarch-cluster ``` 然后,将你的部署指向新镜像。确保在前面添加你用于 docker login 的镜像仓库地址(如 `ghcr.io` 或 `docker.io`),并且你首先已经推送了该镜像。 ## 运行示例 查看 `examples/` 目录,获取有关如何使用 Monarch API 的演示。 随着功能的稳定和不断完善,我们将添加更多示例! ## 运行测试 我们同时提供 Rust 和 Python 单元测试。Rust 测试使用 `cargo-nextest` 运行,而 Python 测试使用 `pytest` 运行。 ### Rust 测试 **重要提示:** Monarch 的 Rust 代码使用 PyO3 与 Python 进行交互,这意味着 Rust 二进制文件需要链接到 Python 库。在运行 Rust 测试之前,你需要激活一个 Python 环境(conda、venv 或 uv): ``` # 如果使用 uv(推荐) uv sync # This creates and activates a virtual environment uv run cargo nextest run # Run tests within the uv environment # 或者如果使用 conda conda activate monarchenv cargo nextest run # 或者如果使用 venv source .venv/bin/activate cargo nextest run ``` 如果没有激活的 Python 环境,你将会遇到如下 Python 链接错误: ``` error: could not find native static library `python3.12`, perhaps an -L flag is missing? ``` **安装 cargo-nextest:** ``` # 我们使用 cargo-nextest 来运行我们的测试,因为它们在每个测试之间 # 提供了强大的进程隔离。 # 这里我们从源码安装它,但您也可以使用此处描述的预编译二进制文件: # https://nexte.st/docs/installation/pre-built-binaries/ cargo install cargo-nextest --locked ``` cargo-nextest 支持 "cargo test" 的所有过滤标志。 ### Python 测试 ``` # 安装测试依赖(如果尚未通过 uv sync 安装) uv sync --extra test # 使用 uv 运行单元测试 uv run pytest python/tests/ -v -m "not oss_skip" # 或者如果使用 pip pip install -e '.[test]' pytest python/tests/ -v -m "not oss_skip" ``` ## 禁用不稳定的 CI 测试 如果某个测试在 OSS CI 中持续失败,并且需要在不修改代码的情况下暂时禁用,请在本仓库中创建一个 GitHub issue,标题格式如下: ``` DISABLED ``` 在每次 CI 运行开始时,`scripts/fetch_disabled_tests.py` 会获取所有标题以 `DISABLED ` 开头的未关闭的 issue,并跳过指定的测试。 关闭该 issue 将会在下次运行时重新启用该测试。 **命名格式:** - **Rust (cargo nextest):** 使用在 nextest 输出中显示的确切测试名称:` `,例如 `DISABLED hyperactor proc::tests::test_child_lifecycle` - **Python (pytest):** 使用测试函数名称,例如 `DISABLED test_my_function` ### 在本地覆盖跳过规则 要运行当前通过 GitHub issue 禁用的测试,你可以在运行 `scripts/fetch_disabled_tests.py` 之前创建相关文件以覆盖获取到的跳过列表。该脚本不会覆盖已经存在的文件: - **`disabled_tests.txt`** — 控制要跳过哪些 Python 测试。创建此文件时,仅需写入你想跳过的测试(或将其留空以跳过所有测试)。 - **`.config/nextest-filter.txt`** — 控制要跳过哪些 Rust 测试。在此处编写 nextest 过滤表达式(例如,使用 `all()` 运行所有测试,或使用 `not (test(some_test))` 仅跳过特定测试)。 例如,要在本地运行所有测试而不受未关闭的 issue 影响: ``` echo -n "" > disabled_tests.txt echo "all()" > .config/nextest-filter.txt uv run python scripts/fetch_disabled_tests.py # will skip both writes uv run pytest python/tests/ -v -m "not oss_skip" ``` ## 许可证 Monarch 采用 BSD-3 许可证,详情请见 [LICENSE](LICENSE) 文件。
标签:Vectored Exception Handling, 凭据扫描, 可视化界面, 请求拦截, 逆向工具, 通知系统