From 17da96658f0b53a7e9b5932e64ced69a334f035c Mon Sep 17 00:00:00 2001 From: Marck <35858256+GoMarck@users.noreply.github.com> Date: Wed, 25 Mar 2026 16:40:30 +0800 Subject: [PATCH] [ModelLoader][Feature] Add rfork support for fast model loading (#7392) ### What this PR does / why we need it? Support an new load format: RFORK For implementation details of this feature, please refer to #7441 ### Does this PR introduce _any_ user-facing change? add an new options for load-format: rfork e.g. ```bash vllm serve /workspace/models/Qwen3-8B --load-format rfork ``` ### How was this patch tested? - vLLM version: v0.17.0 - vLLM main: https://github.com/vllm-project/vllm/commit/4034c3d32e30d01639459edd3ab486f56993876d Signed-off-by: Marck <1412354149@qq.com> --- .../feature_guide/images/rfork_flowchart.jpg | Bin 0 -> 164198 bytes docs/source/user_guide/feature_guide/index.md | 1 + docs/source/user_guide/feature_guide/rfork.md | 125 +++++ examples/rfork/rfork_planner.py | 509 ++++++++++++++++++ vllm_ascend/__init__.py | 2 + vllm_ascend/model_loader/rfork/__init__.py | 20 + .../model_loader/rfork/rfork_loader.py | 188 +++++++ .../model_loader/rfork/rfork_worker.py | 119 ++++ .../model_loader/rfork/seed_protocol.py | 208 +++++++ vllm_ascend/model_loader/rfork/seed_server.py | 126 +++++ .../model_loader/rfork/transfer_backend.py | 212 ++++++++ 11 files changed, 1510 insertions(+) create mode 100644 docs/source/user_guide/feature_guide/images/rfork_flowchart.jpg create mode 100644 docs/source/user_guide/feature_guide/rfork.md create mode 100644 examples/rfork/rfork_planner.py create mode 100644 vllm_ascend/model_loader/rfork/__init__.py create mode 100644 vllm_ascend/model_loader/rfork/rfork_loader.py create mode 100644 vllm_ascend/model_loader/rfork/rfork_worker.py create mode 100644 vllm_ascend/model_loader/rfork/seed_protocol.py create mode 100644 vllm_ascend/model_loader/rfork/seed_server.py create mode 100644 vllm_ascend/model_loader/rfork/transfer_backend.py diff --git a/docs/source/user_guide/feature_guide/images/rfork_flowchart.jpg b/docs/source/user_guide/feature_guide/images/rfork_flowchart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4d8316c06fd0a191f86a3c71ec10b738479ac3d GIT binary patch literal 164198 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

O>`)%pQ*0gNa-8$ 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℞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 L|9XuO{hj<@Om_?a literal 0 HcmV?d00001 diff --git a/docs/source/user_guide/feature_guide/index.md b/docs/source/user_guide/feature_guide/index.md index e31e0e39..60dc4795 100644 --- a/docs/source/user_guide/feature_guide/index.md +++ b/docs/source/user_guide/feature_guide/index.md @@ -13,6 +13,7 @@ structured_output lora eplb_swift_balancer netloader +rfork Multi_Token_Prediction dynamic_batch epd_disaggregation diff --git a/docs/source/user_guide/feature_guide/rfork.md b/docs/source/user_guide/feature_guide/rfork.md new file mode 100644 index 00000000..35e4af2d --- /dev/null +++ b/docs/source/user_guide/feature_guide/rfork.md @@ -0,0 +1,125 @@ +# RFork Guide + +This guide explains how to use **RFork** as a model-loader plugin in **vLLM Ascend**. + +--- + +## Overview + +RFork is a warm-start weight loading path for vLLM Ascend. Instead of always reading model weights from storage, a new instance can request a compatible **seed** instance from an external planner, then pull weights directly from that seed through `YuanRong TransferEngine`. + +The RFork loading flow in the current implementation is: + +1. vLLM starts with `--load-format rfork`. +2. RFork builds a **seed key** from the model identity and deployment topology. +3. RFork asks the planner for an available seed matching that key. +4. If a seed is returned, the new instance initializes the model structure on its local NPU, registers local weight memory, fetches the remote transfer-engine metadata from the seed, and performs batch weight transfer into local parameter buffers. +5. If no seed is available, or any step fails, RFork cleans up and falls back to the default loader. +6. After the instance finishes loading, it starts a local seed service and periodically reports heartbeat to the planner, so later instances can reuse it. + +## Flowchart + +![rfork flowchart](./images/rfork_flowchart.jpg) + +## Application Scenarios + +- **Scale-out after a first successful load**: The first instance may still load from storage, but later instances with the same deployment identity can reuse it as a seed and shorten startup time. +- **Elastic serving clusters**: Because RFork asks a planner for available seeds, it fits clusters where instances are created and reclaimed dynamically. +- **Topology-sensitive deployments**: RFork encodes `kv_role`, `node_rank`, `tp_rank`, and optional `draft` role into the seed key, so only topology-compatible instances are matched together. + +--- + +## Usage + +To enable RFork, pass `--load-format rfork` and provide RFork settings through `--model-loader-extra-config` as a JSON string. + +### RFork Prerequisites + +- Install the runtime dependency `YuanRong TransferEngine` on every RFork instance. +- Run a planner service that implements the RFork seed protocol. A simple mock planner script is provided at [`rfork_planner.py`](../../../../examples/rfork/rfork_planner.py). + +### Configuration Fields + +| Field Name | Type | Description | Allowed Values / Notes | +|------------|------|-------------|------------------------| +| **model_url** | String | Logical model identifier used to build the RFork seed key. | Required for RFork transfer. Instances that should share seeds must use the same value. | +| **model_deploy_strategy_name** | String | Deployment strategy identifier used together with `model_url` to build the seed key. | Required for RFork transfer. Instances that should share seeds must use the same value. | +| **rfork_scheduler_url** | String | Base URL of the planner service used for seed allocation, release, and heartbeat. | Required for planner-based matching. Example: `http://127.0.0.1:1223`. | +| **rfork_seed_timeout_sec** | Number | Timeout for waiting until the local seed HTTP service becomes healthy after startup. | Optional. Default: `30`. Must be greater than `0`. | +| **rfork_seed_key_separator** | String | Separator used when building the RFork seed key string. | Optional. Default: `$`. Keep the same value across compatible instances. | + +### How RFork Matches Seeds + +RFork does not match instances by `model_url` alone. The local seed key is composed from: + +- `model_url` +- `model_deploy_strategy_name` +- disaggregation mode derived from `kv_transfer_config.kv_role` or `kv_both` +- `node_rank` +- `tp_rank` +- optional `draft` suffix when the worker runs as a draft model + +This means two instances must agree on both model identity and deployment topology before the planner will treat them as interchangeable seeds. + +--- + +## Example Commands & Placeholders + +> Replace parts in `` `<...>` `` before running. + +### 1. Install YuanRong TransferEngine + +```shell +pip install openyuanrong-transfer-engine +``` + +### 2. Start the Planner + +A simple planner implementation is provided at [`rfork_planner.py`](../../../../examples/rfork/rfork_planner.py). + +```shell +python rfork_planner.py \ + --host 0.0.0.0 \ + --port `` +``` + +### 3. Start vLLM Instances + +Use the same RFork startup command for both the first instance and later instances in the same deployment. + +For the first instance, the planner usually has no compatible seed yet, so RFork falls back to the default loader. After loading finishes, that instance starts its local seed service and reports itself to the planner. + +For later instances, if the planner can allocate a compatible seed, RFork will try to transfer weights from the existing seed instance before falling back to the default loader. + +```shell +export RFORK_CONFIG='{ + "model_url": "``", + "model_deploy_strategy_name": "``", + "rfork_scheduler_url": "http://``:``" +}' + +vllm serve `` \ + --tensor-parallel-size 1 \ + --served-model-name `` \ + --port `` \ + --load-format rfork \ + --model-loader-extra-config "${RFORK_CONFIG}" +``` + +### Placeholder Descriptions + +- ``: Model path or model identifier passed to `vllm serve`. +- ``: Service name exposed by vLLM. +- ``: IP address or hostname of the RFork planner. +- ``: Listening port of the RFork planner. +- ``: Stable model identity string used to build the RFork seed key. +- ``: Stable deployment-strategy name used to build the RFork seed key. +- ``: Serving port of the vLLM instance being started. + +--- + +## Note & Caveats + +- RFork requires `YuanRong TransferEngine` at runtime. If the package is missing, RFork cannot initialize the transfer backend. +- If RFORK is used, **each worker process** must bind a listening port. That port is assigned randomly. +- The example [`rfork_planner.py`](../../../../examples/rfork/rfork_planner.py) is only a simple mock implementation. If you need stronger scheduling, capacity management, or production-grade availability behavior, implement your own planner based on the RFork seed protocol. diff --git a/examples/rfork/rfork_planner.py b/examples/rfork/rfork_planner.py new file mode 100644 index 00000000..5d920bee --- /dev/null +++ b/examples/rfork/rfork_planner.py @@ -0,0 +1,509 @@ +# +# Copyright (c) 2026 Huawei Technologies Co., Ltd. All Rights Reserved. +# Copyright 2023 The vLLM team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# This file is a part of the vllm-ascend project. +# +""" +Standalone rfork planner mock server used by vLLM rfork seed protocol tests. + +Usage: + python examples/rfork/rfork_planner.py --host 0.0.0.0 --port 1223 +""" + +from __future__ import annotations + +import argparse +import os +import threading +import time +import uuid +from collections import defaultdict +from collections.abc import Callable, Iterable, Mapping +from contextlib import asynccontextmanager +from dataclasses import dataclass + +from fastapi import APIRouter, FastAPI, Request, Response, status + + +@dataclass(frozen=True) +class Settings: + host: str = "0.0.0.0" + port: int = 1223 + heartbeat_ttl_sec: int = 60 + heartbeat_sweep_sec: int = 5 + default_resource_points: int = 1 + alloc_policy: str = "fifo" + + def __post_init__(self) -> None: + if self.port <= 0: + raise ValueError("port must be > 0") + if self.heartbeat_ttl_sec <= 0: + raise ValueError("heartbeat_ttl_sec must be > 0") + if self.heartbeat_sweep_sec <= 0: + raise ValueError("heartbeat_sweep_sec must be > 0") + if self.default_resource_points <= 0: + raise ValueError("default_resource_points must be > 0") + if self.alloc_policy not in {"fifo", "lru"}: + raise ValueError("alloc_policy must be one of: fifo, lru") + + @staticmethod + def from_env() -> Settings: + return Settings( + host=os.getenv("RFORK_MOCK_HOST", "0.0.0.0"), + port=int(os.getenv("RFORK_MOCK_PORT", "1223")), + heartbeat_ttl_sec=int(os.getenv("RFORK_MOCK_HEARTBEAT_TTL_SEC", "60")), + heartbeat_sweep_sec=int(os.getenv("RFORK_MOCK_HEARTBEAT_SWEEP_SEC", "5")), + default_resource_points=int(os.getenv("RFORK_MOCK_DEFAULT_RESOURCE_POINTS", "1")), + alloc_policy=os.getenv("RFORK_MOCK_ALLOC_POLICY", "fifo").lower(), + ) + + +@dataclass +class SeedRecord: + seed_key: str + seed_ip: str + seed_port: int + seed_rank: int + last_heartbeat_ts: float + resource_total: int + resource_used: int = 0 + + @property + def identity(self) -> str: + return f"{self.seed_ip}:{self.seed_port}:{self.seed_rank}" + + @property + def available_points(self) -> int: + return max(self.resource_total - self.resource_used, 0) + + +@dataclass +class LeaseRecord: + user_id: str + seed_key: str + seed_identity: str + allocated_points: int + leased_at: float + + +class Scheduler: + def __init__(self, alloc_policy: str = "fifo") -> None: + if alloc_policy not in {"fifo", "lru"}: + raise ValueError(f"unsupported alloc policy: {alloc_policy}") + self.alloc_policy = alloc_policy + + def choose_seed(self, seeds: Iterable[SeedRecord]) -> SeedRecord | None: + candidates = [seed for seed in seeds if seed.available_points > 0] + if not candidates: + return None + + if self.alloc_policy == "fifo": + return min(candidates, key=lambda s: (s.last_heartbeat_ts, s.identity)) + + return max(candidates, key=lambda s: (s.last_heartbeat_ts, s.identity)) + + +class Store: + def __init__( + self, + *, + heartbeat_ttl_sec: int, + default_resource_points: int, + scheduler: Scheduler, + time_fn: Callable[[], float] | None = None, + ) -> None: + self._lock = threading.RLock() + self._seeds: dict[str, SeedRecord] = {} + self._seeds_by_key: dict[str, set[str]] = defaultdict(set) + self._leases: dict[str, LeaseRecord] = {} + self._heartbeat_ttl_sec = heartbeat_ttl_sec + self._default_resource_points = default_resource_points + self._scheduler = scheduler + self._time = time_fn or time.time + + @staticmethod + def _seed_identity(seed_ip: str, seed_port: int, seed_rank: int) -> str: + return f"{seed_ip}:{seed_port}:{seed_rank}" + + def add_seed( + self, + *, + seed_key: str, + seed_ip: str, + seed_port: int, + seed_rank: int, + resource_total: int | None = None, + ) -> SeedRecord: + identity = self._seed_identity(seed_ip, seed_port, seed_rank) + now = self._time() + total = self._default_resource_points if resource_total is None else max(resource_total, 1) + + with self._lock: + current = self._seeds.get(identity) + if current is None: + current = SeedRecord( + seed_key=seed_key, + seed_ip=seed_ip, + seed_port=seed_port, + seed_rank=seed_rank, + last_heartbeat_ts=now, + resource_total=total, + resource_used=0, + ) + self._seeds[identity] = current + self._seeds_by_key[seed_key].add(identity) + return current + + if current.seed_key != seed_key: + self._seeds_by_key[current.seed_key].discard(identity) + self._seeds_by_key[seed_key].add(identity) + current.seed_key = seed_key + current.last_heartbeat_ts = now + if resource_total is not None: + current.resource_total = max(resource_total, 1) + if current.resource_used > current.resource_total: + current.resource_used = current.resource_total + return current + + def get_seed(self, *, seed_key: str) -> tuple[SeedRecord, LeaseRecord] | None: + with self._lock: + self.gc_stale_seeds_locked() + seed_identities = self._seeds_by_key.get(seed_key, set()) + seeds = [self._seeds[sid] for sid in seed_identities if sid in self._seeds] + selected = self._scheduler.choose_seed(seeds) + if selected is None: + return None + + selected.resource_used += 1 + user_id = uuid.uuid4().hex + lease = LeaseRecord( + user_id=user_id, + seed_key=seed_key, + seed_identity=selected.identity, + allocated_points=1, + leased_at=self._time(), + ) + self._leases[user_id] = lease + return selected, lease + + def put_seed(self, *, seed_ip: str, seed_port: int, seed_rank: int, user_id: str) -> bool: + identity = self._seed_identity(seed_ip, seed_port, seed_rank) + with self._lock: + lease = self._leases.get(user_id) + if lease is None: + return False + if lease.seed_identity != identity: + return False + + seed = self._seeds.get(identity) + if seed is not None: + seed.resource_used = max(0, seed.resource_used - lease.allocated_points) + del self._leases[user_id] + return True + + def gc_stale_seeds(self) -> int: + with self._lock: + return self.gc_stale_seeds_locked() + + def gc_stale_seeds_locked(self) -> int: + now = self._time() + stale_ids = [ + sid for sid, seed in self._seeds.items() if (now - seed.last_heartbeat_ts) > self._heartbeat_ttl_sec + ] + if not stale_ids: + return 0 + + stale_set = set(stale_ids) + for sid in stale_ids: + seed = self._seeds.pop(sid) + self._seeds_by_key[seed.seed_key].discard(sid) + if not self._seeds_by_key[seed.seed_key]: + del self._seeds_by_key[seed.seed_key] + + lease_ids = [uid for uid, lease in self._leases.items() if lease.seed_identity in stale_set] + for uid in lease_ids: + del self._leases[uid] + + return len(stale_ids) + + def debug_snapshot(self) -> dict[str, object]: + with self._lock: + return { + "seed_count": len(self._seeds), + "lease_count": len(self._leases), + "seeds": { + sid: { + "seed_key": s.seed_key, + "resource_total": s.resource_total, + "resource_used": s.resource_used, + "last_heartbeat_ts": s.last_heartbeat_ts, + } + for sid, s in self._seeds.items() + }, + "leases": { + uid: { + "seed_identity": lease.seed_identity, + "seed_key": lease.seed_key, + "allocated_points": lease.allocated_points, + } + for uid, lease in self._leases.items() + }, + } + + +class HeartbeatGc: + def __init__(self, store: Store, sweep_interval_sec: int) -> None: + self._store = store + self._sweep_interval_sec = max(sweep_interval_sec, 1) + self._stop = threading.Event() + self._thread: threading.Thread | None = None + + def start(self) -> None: + if self._thread is not None and self._thread.is_alive(): + return + self._stop.clear() + self._thread = threading.Thread(target=self._run, name="rfork-heartbeat-gc", daemon=True) + self._thread.start() + + def stop(self) -> None: + self._stop.set() + if self._thread is not None: + self._thread.join(timeout=2) + + def _run(self) -> None: + while not self._stop.is_set(): + self._store.gc_stale_seeds() + time.sleep(self._sweep_interval_sec) + + +class HeaderError(ValueError): + pass + + +@dataclass(frozen=True) +class AddSeedHeaders: + seed_key: str + seed_ip: str + seed_port: int + seed_rank: int + seed_refcnt: int + + +@dataclass(frozen=True) +class GetSeedHeaders: + seed_key: str + + +@dataclass(frozen=True) +class PutSeedHeaders: + seed_ip: str + seed_port: int + seed_rank: int + user_id: str + + +def _required(headers: Mapping[str, str], key: str) -> str: + value = headers.get(key) + if value is None or value == "": + raise HeaderError(f"missing required header: {key}") + return value + + +def _parse_int(value: str, key: str, *, minimum: int = 0) -> int: + try: + parsed = int(value) + except ValueError as exc: + raise HeaderError(f"invalid integer header {key}: {value}") from exc + if parsed < minimum: + raise HeaderError(f"header {key} must be >= {minimum}, got {parsed}") + return parsed + + +def parse_add_seed_headers(headers: Mapping[str, str]) -> AddSeedHeaders: + return AddSeedHeaders( + seed_key=_required(headers, "SEED_KEY"), + seed_ip=_required(headers, "SEED_IP"), + seed_port=_parse_int(_required(headers, "SEED_PORT"), "SEED_PORT", minimum=1), + seed_rank=_parse_int(_required(headers, "SEED_RANK"), "SEED_RANK", minimum=0), + seed_refcnt=_parse_int(_required(headers, "SEED_REFCNT"), "SEED_REFCNT", minimum=0), + ) + + +def parse_get_seed_headers(headers: Mapping[str, str]) -> GetSeedHeaders: + return GetSeedHeaders(seed_key=_required(headers, "SEED_KEY")) + + +def parse_put_seed_headers(headers: Mapping[str, str]) -> PutSeedHeaders: + return PutSeedHeaders( + seed_ip=_required(headers, "SEED_IP"), + seed_port=_parse_int(_required(headers, "SEED_PORT"), "SEED_PORT", minimum=1), + seed_rank=_parse_int(_required(headers, "SEED_RANK"), "SEED_RANK", minimum=0), + user_id=_required(headers, "USER_ID"), + ) + + +def build_router(store: Store): + router = APIRouter() + + @router.post("/add_seed") + def add_seed(request: Request) -> Response: + try: + parsed = parse_add_seed_headers(request.headers) + except HeaderError as err: + return Response(content=str(err), status_code=status.HTTP_400_BAD_REQUEST) + + store.add_seed( + seed_key=parsed.seed_key, + seed_ip=parsed.seed_ip, + seed_port=parsed.seed_port, + seed_rank=parsed.seed_rank, + # vLLM currently sends SEED_REFCNT=0 as heartbeat metadata. + # Capacity is controlled by planner config, not by this field. + resource_total=None, + ) + return Response(status_code=status.HTTP_200_OK) + + @router.get("/get_seed") + def get_seed(request: Request) -> Response: + try: + parsed = parse_get_seed_headers(request.headers) + except HeaderError as err: + return Response(content=str(err), status_code=status.HTTP_400_BAD_REQUEST) + + result = store.get_seed(seed_key=parsed.seed_key) + if result is None: + return Response(content="no available seed", status_code=status.HTTP_404_NOT_FOUND) + + seed, lease = result + response = Response(status_code=status.HTTP_200_OK) + response.headers["SEED_IP"] = seed.seed_ip + response.headers["SEED_PORT"] = str(seed.seed_port) + response.headers["SEED_RANK"] = str(seed.seed_rank) + response.headers["USER_ID"] = lease.user_id + return response + + @router.post("/put_seed") + def put_seed(request: Request) -> Response: + try: + parsed = parse_put_seed_headers(request.headers) + except HeaderError as err: + return Response(content=str(err), status_code=status.HTTP_400_BAD_REQUEST) + + released = store.put_seed( + seed_ip=parsed.seed_ip, + seed_port=parsed.seed_port, + seed_rank=parsed.seed_rank, + user_id=parsed.user_id, + ) + if not released: + return Response(content="lease not found", status_code=status.HTTP_404_NOT_FOUND) + + return Response(status_code=status.HTTP_200_OK) + + @router.get("/healthz") + def healthz() -> dict[str, str]: + return {"status": "ok"} + + @router.get("/debug/snapshot") + def debug_snapshot() -> dict[str, object]: + return store.debug_snapshot() + + return router + + +def create_app(settings: Settings): + scheduler = Scheduler(settings.alloc_policy) + store = Store( + heartbeat_ttl_sec=settings.heartbeat_ttl_sec, + default_resource_points=settings.default_resource_points, + scheduler=scheduler, + ) + gc_runner = HeartbeatGc(store, settings.heartbeat_sweep_sec) + + @asynccontextmanager + async def lifespan(_: FastAPI): + gc_runner.start() + try: + yield + finally: + gc_runner.stop() + + app = FastAPI(title="rfork planner mock", version="0.1.0", lifespan=lifespan) + app.include_router(build_router(store)) + + app.state.settings = settings + app.state.store = store + app.state.gc_runner = gc_runner + return app + + +def _build_arg_parser() -> argparse.ArgumentParser: + defaults = Settings.from_env() + parser = argparse.ArgumentParser(description="Standalone rfork planner server") + parser.add_argument("--host", default=defaults.host, help="bind host (default: env RFORK_MOCK_HOST or 0.0.0.0)") + parser.add_argument( + "--port", + type=int, + default=defaults.port, + help="bind port (default: env RFORK_MOCK_PORT or 1223)", + ) + parser.add_argument( + "--heartbeat-ttl-sec", + type=int, + default=defaults.heartbeat_ttl_sec, + help="seed heartbeat ttl in seconds (default: env RFORK_MOCK_HEARTBEAT_TTL_SEC or 60)", + ) + parser.add_argument( + "--heartbeat-sweep-sec", + type=int, + default=defaults.heartbeat_sweep_sec, + help="gc sweep interval in seconds (default: env RFORK_MOCK_HEARTBEAT_SWEEP_SEC or 5)", + ) + parser.add_argument( + "--default-resource-points", + type=int, + default=defaults.default_resource_points, + help="default seed capacity points (default: env RFORK_MOCK_DEFAULT_RESOURCE_POINTS or 1)", + ) + parser.add_argument( + "--alloc-policy", + choices=["fifo", "lru"], + default=defaults.alloc_policy, + help="seed allocation policy (default: env RFORK_MOCK_ALLOC_POLICY or fifo)", + ) + return parser + + +def main() -> None: + parser = _build_arg_parser() + args = parser.parse_args() + settings = Settings( + host=args.host, + port=args.port, + heartbeat_ttl_sec=args.heartbeat_ttl_sec, + heartbeat_sweep_sec=args.heartbeat_sweep_sec, + default_resource_points=args.default_resource_points, + alloc_policy=args.alloc_policy, + ) + app = create_app(settings) + try: + import uvicorn + except ModuleNotFoundError as exc: + raise SystemExit("missing dependency: uvicorn. Install it with: python -m pip install uvicorn") from exc + uvicorn.run(app, host=settings.host, port=settings.port) + + +if __name__ == "__main__": + main() diff --git a/vllm_ascend/__init__.py b/vllm_ascend/__init__.py index 26e22a5d..c5b7d1b0 100644 --- a/vllm_ascend/__init__.py +++ b/vllm_ascend/__init__.py @@ -30,8 +30,10 @@ def register_connector(): def register_model_loader(): from .model_loader.netloader import register_netloader + from .model_loader.rfork import register_rforkloader register_netloader() + register_rforkloader() def register_service_profiling(): diff --git a/vllm_ascend/model_loader/rfork/__init__.py b/vllm_ascend/model_loader/rfork/__init__.py new file mode 100644 index 00000000..3fe013f0 --- /dev/null +++ b/vllm_ascend/model_loader/rfork/__init__.py @@ -0,0 +1,20 @@ +# +# Copyright (c) 2026 Huawei Technologies Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +def register_rforkloader() -> None: + """Register the RFork model loader plugin.""" + from .rfork_loader import RForkModelLoader # noqa: F401 diff --git a/vllm_ascend/model_loader/rfork/rfork_loader.py b/vllm_ascend/model_loader/rfork/rfork_loader.py new file mode 100644 index 00000000..8c94ca43 --- /dev/null +++ b/vllm_ascend/model_loader/rfork/rfork_loader.py @@ -0,0 +1,188 @@ +# +# Copyright (c) 2026 Huawei Technologies Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import gc +import time + +import torch +import torch.nn as nn +from torch.nn import Module +from vllm.config import ModelConfig, VllmConfig +from vllm.config.load import LoadConfig +from vllm.distributed import get_tensor_model_parallel_rank +from vllm.logger import logger +from vllm.model_executor.model_loader import register_model_loader +from vllm.model_executor.model_loader.base_loader import BaseModelLoader +from vllm.model_executor.model_loader.utils import ( + initialize_model, + process_weights_after_loading, +) +from vllm.utils.torch_utils import set_default_torch_dtype + +from vllm_ascend.model_loader.rfork.rfork_worker import RForkWorker + + +@register_model_loader("rfork") +class RForkModelLoader(BaseModelLoader): + def __init__(self, load_config: LoadConfig): + super().__init__(load_config) + config = load_config.model_loader_extra_config + if not isinstance(config, dict): + raise RuntimeError("RFork requires --model-loader-extra-config to be a JSON object.") + + def _get_extra_config(key: str, default: str = "") -> str: + value = config.get(key) + return value if isinstance(value, str) and value else default + + def _get_extra_config_float(key: str, default: float) -> float: + value = config.get(key) + parsed_value = default + if isinstance(value, (int, float)): + parsed_value = float(value) + elif isinstance(value, str) and value: + try: + parsed_value = float(value) + except ValueError: + return default + + if parsed_value <= 0: + return default + + return parsed_value + + self.model_url = _get_extra_config("model_url", "") + self.model_deploy_strategy_name = _get_extra_config("model_deploy_strategy_name", "") + self.scheduler_url = _get_extra_config("rfork_scheduler_url", "") + self.seed_timeout_sec = _get_extra_config_float("rfork_seed_timeout_sec", 5.0) + self.seed_key_separator = _get_extra_config("rfork_seed_key_separator", "$") + + logger.info( + "Initializing rfork with config: " + "MODEL_URL=%s, MODEL_DEPLOY_STRATEGY_NAME=%s, " + "SCHEDULER_URL=%s, SEED_TIMEOUT_SEC=%s, " + "SEED_KEY_SEPARATOR=%s", + self.model_url, + self.model_deploy_strategy_name, + self.scheduler_url, + self.seed_timeout_sec, + self.seed_key_separator, + ) + + def download_model(self, model_config: ModelConfig) -> None: + raise NotImplementedError + + def load_weights(self, model: nn.Module, model_config: ModelConfig) -> None: + raise NotImplementedError + + def _ensure_rfork_worker(self, vllm_config: VllmConfig) -> RForkWorker: + rfork_worker = getattr(self.load_config, "rfork_worker", None) + if rfork_worker is None: + kv_transfer_config = vllm_config.kv_transfer_config + disaggregation_mode = "kv_both" if kv_transfer_config is None else str(kv_transfer_config.kv_role) + is_draft_model = ( + getattr(vllm_config.model_config, "runner_type", None) == "draft" + or getattr(vllm_config.scheduler_config, "runner_type", None) == "draft" + ) + device_id = torch.distributed.get_rank() + self.load_config.rfork_worker = RForkWorker( + disaggregation_mode=disaggregation_mode, + node_rank=vllm_config.parallel_config.node_rank, + tp_rank=get_tensor_model_parallel_rank(), + device_id=device_id, + scheduler_url=self.scheduler_url, + model_url=self.model_url, + model_deploy_strategy_name=self.model_deploy_strategy_name, + seed_timeout_sec=self.seed_timeout_sec, + seed_key_separator=self.seed_key_separator, + is_draft_model=is_draft_model, + ) + logger.info("RFork worker initialized, load_format=rfork") + rfork_worker = self.load_config.rfork_worker + return rfork_worker + + def load_model( + self, + vllm_config: VllmConfig, + model_config: ModelConfig, + prefix: str = "", + ) -> Module | None: + device_config = vllm_config.device_config + load_config = self.load_config + load_device = device_config.device if load_config.device is None else load_config.device + target_device = torch.device(load_device) + + with set_default_torch_dtype(model_config.dtype): + need_del = False + rfork_worker = self._ensure_rfork_worker(vllm_config) + try: + if not rfork_worker.is_seed_available(): + raise RuntimeError("seed is not available.") + + with target_device: + model = initialize_model( + vllm_config=vllm_config, + model_config=model_config, + prefix=prefix, + ) + need_del = True + + weight_load_start_time = time.time() + if not rfork_worker.pre_transfer(model): + raise RuntimeError("pre_transfer failed.") + if not rfork_worker.transfer(model): + raise RuntimeError("transfer failed.") + if not rfork_worker.post_transfer(): + raise RuntimeError("post_transfer failed.") + logger.info( + "Loading model weights took %.2f seconds", + time.time() - weight_load_start_time, + ) + + rfork_worker.start_seed_service(model) + process_weights_after_loading(model, model_config, target_device) + + return model.eval() + except Exception as e: + logger.warning(f"RFork transfer failed: {e}, clean up and fall back to default loader") + + rfork_worker.post_transfer() + + if need_del: + del model + gc.collect() + torch.npu.empty_cache() + for _ in range(3): + gc.collect() + torch.npu.empty_cache() + + self.load_config.load_format = "auto" + self.load_config.model_loader_extra_config = {} + + from vllm.model_executor.model_loader import get_model + + model = get_model( + vllm_config=vllm_config, + model_config=model_config, + prefix=prefix, + ) + try: + rfork_worker.start_seed_service(model) + except Exception as e: + logger.warning( + "Fallback model loaded, but start_seed_service failed: %s", + e, + ) + return model diff --git a/vllm_ascend/model_loader/rfork/rfork_worker.py b/vllm_ascend/model_loader/rfork/rfork_worker.py new file mode 100644 index 00000000..b342f667 --- /dev/null +++ b/vllm_ascend/model_loader/rfork/rfork_worker.py @@ -0,0 +1,119 @@ +# +# Copyright (c) 2026 Huawei Technologies Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import threading + +from vllm.logger import logger + +from vllm_ascend.model_loader.rfork.seed_protocol import RForkSeedProtocol +from vllm_ascend.model_loader.rfork.seed_server import start_rfork_server +from vllm_ascend.model_loader.rfork.transfer_backend import ( + RForkTransferBackend, +) + + +class RForkWorker: + def __init__( + self, + disaggregation_mode: str, + node_rank: int, + tp_rank: int, + device_id: int, + scheduler_url: str, + model_url: str, + model_deploy_strategy_name: str, + seed_timeout_sec: float = 30.0, + seed_key_separator: str = "$", + is_draft_model: bool = False, + ): + self.device_id = device_id + self.rfork_seed = None + self.transfer_backend = RForkTransferBackend() + self.ready_to_start_seed_service = False + self.seed_service_started = False + self.seed_timeout_sec = seed_timeout_sec + self.seed_protocol = RForkSeedProtocol( + disaggregation_mode=disaggregation_mode, + node_rank=node_rank, + tp_rank=tp_rank, + scheduler_url=scheduler_url, + model_url=model_url, + model_deploy_strategy_name=model_deploy_strategy_name, + seed_key_separator=seed_key_separator, + is_draft_worker=is_draft_model, + ) + + def is_seed_available(self) -> bool: + self.rfork_seed = self.seed_protocol.get_seed() + return self.rfork_seed is not None + + def pre_transfer(self, model) -> bool: + try: + assert self.transfer_backend.is_initialized(), "transfer_backend is not initialized, cannot pre_transfer." + result = self.transfer_backend.register_memory_region(model) + self.ready_to_start_seed_service = result + return result + except AssertionError as e: + logger.exception("Pre-transfer failed: %s", e) + return False + + def transfer(self, model) -> bool: + try: + assert self.transfer_backend.is_initialized(), "transfer_backend is not initialized, cannot transfer." + assert self.rfork_seed is not None, "rfork seed is None, cannot transfer." + return self.transfer_backend.recv_from_source( + model=model, + seed_instance_ip=self.rfork_seed["seed_ip"], + seed_instance_service_port=self.rfork_seed["seed_port"], + local_seed_key=self.seed_protocol.get_local_seed_key(), + ) + except AssertionError as e: + logger.exception("Transfer failed: %s", e) + return False + + def post_transfer(self): + if self.rfork_seed is None: + logger.info("rfork seed is None, no need to release.") + return True + self.seed_protocol.release_seed(self.rfork_seed) + return True + + def start_seed_service(self, model): + if self.seed_service_started: + logger.info("Seed service already started, skipping.") + return + + if not self.ready_to_start_seed_service: + if not self.pre_transfer(model): + return + + port = start_rfork_server( + self.seed_protocol.get_local_seed_key(), + ( + self.transfer_backend.rfork_transfer_engine_session_id, + self.transfer_backend.rfork_transfer_engine_weights_info_dict, + ), + health_timeout_sec=self.seed_timeout_sec, + ) + if port > 0: + self.rfork_heartbeat_thread = threading.Thread( + target=self.seed_protocol.report_seed, + args=(port,), + daemon=True, + name="RForkHeartbeat", + ) + self.rfork_heartbeat_thread.start() + self.seed_service_started = True diff --git a/vllm_ascend/model_loader/rfork/seed_protocol.py b/vllm_ascend/model_loader/rfork/seed_protocol.py new file mode 100644 index 00000000..7e50100d --- /dev/null +++ b/vllm_ascend/model_loader/rfork/seed_protocol.py @@ -0,0 +1,208 @@ +# +# Copyright (c) 2026 Huawei Technologies Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import time +from urllib.error import HTTPError + +import requests +from vllm.logger import logger +from vllm.utils.network_utils import get_ip + +REQUEST_TIMEOUT_SEC = 10.0 +HEARTBEAT_LOG_EVERY_N = 4 + + +def get_local_seed_key( + disaggregation_mode: str, + node_rank: int, + tp_rank: int, + model_url: str, + model_deploy_strategy_name: str, + seed_key_separator: str = "$", + is_draft_worker: bool = False, +) -> str: + if not model_url or not model_deploy_strategy_name: + raise RuntimeError( + "RFork seed key is not set. Ensure model_loader_extra_config contains " + "`model_url` and `model_deploy_strategy_name`." + ) + + seed_key = f"{model_url}{seed_key_separator}{model_deploy_strategy_name}" + key_suffix = f"{disaggregation_mode}{seed_key_separator}{node_rank}{seed_key_separator}{tp_rank}" + if is_draft_worker: + key_suffix += f"{seed_key_separator}draft" + return f"{seed_key}{seed_key_separator}{key_suffix}" + + +class RForkSeedProtocol: + def __init__( + self, + *, + disaggregation_mode: str, + node_rank: int, + tp_rank: int, + scheduler_url: str, + model_url: str, + model_deploy_strategy_name: str, + seed_key_separator: str = "$", + is_draft_worker: bool = False, + ): + self.disaggregation_mode = disaggregation_mode + self.node_rank = node_rank + self.tp_rank = tp_rank + self.scheduler_url = scheduler_url + self.model_url = model_url + self.model_deploy_strategy_name = model_deploy_strategy_name + self.seed_key_separator = seed_key_separator + self.is_draft_worker = is_draft_worker + + self._local_seed_key = get_local_seed_key( + disaggregation_mode=self.disaggregation_mode, + node_rank=self.node_rank, + tp_rank=self.tp_rank, + model_url=self.model_url, + model_deploy_strategy_name=self.model_deploy_strategy_name, + seed_key_separator=self.seed_key_separator, + is_draft_worker=self.is_draft_worker, + ) + + def get_local_seed_key(self) -> str: + return self._local_seed_key + + @staticmethod + def _request_timeout_sec() -> float: + return REQUEST_TIMEOUT_SEC + + def _ensure_scheduler_url_set(self) -> None: + if not self.scheduler_url: + raise RuntimeError("rfork_scheduler_url is not set. Cannot interact with the scheduler.") + + def get_seed(self): + try: + self._ensure_scheduler_url_set() + response = requests.get( + f"{self.scheduler_url}/get_seed", + headers={ + "SEED_KEY": self.get_local_seed_key(), + }, + timeout=self._request_timeout_sec(), + ) + if response.status_code != 200: + raise RuntimeError(f"Failed to get seed from the planner, {response.status_code}") + + seed_ip = response.headers.get("SEED_IP") + seed_port = response.headers.get("SEED_PORT") + user_id = response.headers.get("USER_ID") + seed_rank = response.headers.get("SEED_RANK") + logger.debug( + "seed_ip: %s, seed_port: %s, user_id: %s, seed_rank: %s", + seed_ip, + seed_port, + user_id, + seed_rank, + ) + return { + "seed_ip": seed_ip, + "seed_port": seed_port, + "user_id": user_id, + "seed_rank": seed_rank, + } + + except RuntimeError as e: + logger.warning("get_seed from planner RuntimeError: %s", e) + return None + except HTTPError as e: + logger.exception("get_seed from planner HTTPError: %s", e) + return None + except Exception as e: + logger.exception("get_seed from planner Exception: %s", e) + return None + + def release_seed(self, seed) -> bool: + try: + self._ensure_scheduler_url_set() + user_id = seed["user_id"] + seed_ip = seed["seed_ip"] + seed_port = str(seed["seed_port"]) + seed_rank = str(seed["seed_rank"]) + + response = requests.post( + f"{self.scheduler_url}/put_seed", + headers={ + "SEED_IP": seed_ip, + "SEED_PORT": seed_port, + "USER_ID": user_id, + "SEED_RANK": seed_rank, + }, + timeout=self._request_timeout_sec(), + ) + + if response.status_code != 200: + raise RuntimeError(f"Failed to release seed to the planner, {response.status_code}") + return True + except RuntimeError as e: + logger.exception("release_seed to planner RuntimeError: %s", e) + return False + except HTTPError as e: + logger.exception("release_seed to planner HTTPError: %s", e) + return False + except Exception as e: + logger.exception("release_seed to planner Exception: %s", e) + return False + + def report_seed(self, port: int, sleep_interval: int = 30): + heartbeat_idx = 0 + log_every_n = HEARTBEAT_LOG_EVERY_N + try: + self._ensure_scheduler_url_set() + seed_ip = get_ip() + seed_key = self.get_local_seed_key() + except Exception as e: + logger.exception("report_seed setup Exception: %s", e) + return + + while True: + heartbeat_idx += 1 + result = False + try: + response = requests.post( + f"{self.scheduler_url}/add_seed", + headers={ + "SEED_KEY": seed_key, + "SEED_IP": seed_ip, + "SEED_PORT": str(port), + "SEED_RANK": str(self.tp_rank), + "SEED_REFCNT": str(0), + }, + timeout=self._request_timeout_sec(), + ) + if response.status_code == 200: + result = True + except HTTPError as e: + logger.exception("report_seed to planner HTTPError: %s", e) + except Exception as e: + logger.exception("report_seed to planner Exception: %s", e) + + # Keep heartbeat frequency unchanged, but reduce log noise. + # Always print failures immediately; print success once every N times. + if (not result) or (heartbeat_idx % log_every_n == 0): + logger.info( + "[rfork_heartbeat] report seed to planner result: %s (%d/%d)", + result, + heartbeat_idx % log_every_n if heartbeat_idx % log_every_n != 0 else log_every_n, + log_every_n, + ) + time.sleep(sleep_interval) diff --git a/vllm_ascend/model_loader/rfork/seed_server.py b/vllm_ascend/model_loader/rfork/seed_server.py new file mode 100644 index 00000000..99d90e90 --- /dev/null +++ b/vllm_ascend/model_loader/rfork/seed_server.py @@ -0,0 +1,126 @@ +# +# Copyright (c) 2026 Huawei Technologies Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import queue +import socket +import threading +import time +from http import HTTPStatus + +import requests +import uvicorn +from fastapi import FastAPI +from fastapi.responses import Response +from vllm.logger import logger + + +def start_fastapi_server( + port_queue: queue.Queue[int], + local_seed_key, + info, +): + logger.info("[RFork Seed] Preparing socket with dynamic port...") + + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.bind(("0.0.0.0", 0)) + _, port = sock.getsockname() + logger.info("[RFork Seed] Assigned dynamic port: %s", port) + + app = FastAPI() + + @app.get("/get_rfork_transfer_engine_info") + def get_rfork_transfer_engine_info(seed_key: str): + if seed_key == local_seed_key: + return {"rfork_transfer_engine_info": info} + return {"rfork_transfer_engine_info": None} + + @app.get("/rfork_fetch_seed") + def rfork_fetch_seed(): + return {"status": "ok"} + + @app.get("/health_check_with_key") + def health_check_with_key(seed_key: str): + if seed_key == local_seed_key: + return Response(status_code=HTTPStatus.OK) + return Response(status_code=HTTPStatus.BAD_REQUEST) + + config = uvicorn.Config(app, host=None, port=None, log_level="warning") + server = uvicorn.Server(config) + + try: + port_queue.put(port) + except Exception as e: + logger.error("[RFork Seed] Failed to send port via queue: %s", e) + sock.close() + return + + logger.info("[RFork Seed] FastAPI server starting on port %s...", port) + server.run(sockets=[sock]) + sock.close() + + +def start_rfork_server(local_seed_key, rfork_transfer_engine_info, health_timeout_sec: float = 30.0) -> int: + port_queue: queue.Queue[int] = queue.Queue() + process = threading.Thread( + target=start_fastapi_server, + args=(port_queue, local_seed_key, rfork_transfer_engine_info), + daemon=True, + ) + process.start() + + try: + port = port_queue.get(timeout=15) + if port == -1: + raise RuntimeError("Child process failed to start server") + except Exception as e: + logger.error("[RFork Seed] start server error: %s", e) + return -1 + + deadline = time.time() + health_timeout_sec + healthy = False + retry_count = 0 + last_error = None + while time.time() < deadline: + time.sleep(0.01) + url = f"http://127.0.0.1:{port}/health_check_with_key" + try: + response = requests.get( + url, + params={"seed_key": local_seed_key}, + timeout=10, + ) + if response.status_code == 200: + healthy = True + break + last_error = f"unexpected status code {response.status_code} from health check" + except Exception as e: + last_error = str(e) + retry_count += 1 + if healthy: + if retry_count > 1: + logger.info( + "[RFork Seed] health check passed after %d retries for port %s", + retry_count - 1, + port, + ) + return port + logger.error( + "[RFork Seed] health check timed out after %.1fs for port %s, last error: %s", + health_timeout_sec, + port, + last_error, + ) + return -1 diff --git a/vllm_ascend/model_loader/rfork/transfer_backend.py b/vllm_ascend/model_loader/rfork/transfer_backend.py new file mode 100644 index 00000000..afb60b75 --- /dev/null +++ b/vllm_ascend/model_loader/rfork/transfer_backend.py @@ -0,0 +1,212 @@ +# +# Copyright (c) 2026 Huawei Technologies Co., Ltd. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import time +from typing import Any + +import requests +import torch +from vllm.logger import logger +from vllm.utils.network_utils import get_ip, get_open_port, join_host_port + + +class RForkTransferBackend: + def __init__(self): + self.rfork_transfer_engine: Any | None = None + self.rfork_transfer_engine_session_id = None + self.rfork_transfer_engine_weights_info_dict = None + self.registered_weight_blocks = [] + self._is_initialized = False + self.init_transfer_engine() + + def init_transfer_engine(self): + try: + from yr.datasystem import TransferEngine # type: ignore[import-not-found] + except ImportError as e: + raise ImportError("Please install @yuanrong-datasystem/transfer_engine first.") from e + + transfer_engine = TransferEngine() + local_hostname = join_host_port(get_ip(), get_open_port()) + ret = transfer_engine.initialize(local_hostname, "ascend", f"npu:{torch.npu.current_device()}") + if ret.is_error(): + raise RuntimeError( + "TransferEngine initialization failed: " + f"initialize({local_hostname}, ascend" + f"npu:{int(torch.npu.current_device())}) -> {ret.to_string()}" + ) + + self.rfork_transfer_engine = transfer_engine + self.rfork_transfer_engine_session_id = local_hostname + self._is_initialized = True + + def is_initialized(self) -> bool: + return self._is_initialized + + def _get_transfer_engine(self) -> Any: + if self.rfork_transfer_engine is None: + raise RuntimeError("TransferEngine is not initialized.") + return self.rfork_transfer_engine + + def register_memory_region(self, model): + transfer_engine = self._get_transfer_engine() + start_reg_mr_tic = time.time() + + weight_mr_dict = {} + weight_addr_set = set() + for name, weight in model.named_parameters(): + weight_mr_dict[name] = ( + weight.data_ptr(), + weight.numel(), + weight.element_size(), + ) + weight_addr_set.add(weight.data_ptr()) + + memory_snapshot = torch.npu.memory.memory_snapshot() + weight_blocks_for_reg_mr = [] + for segment in memory_snapshot: + current_weight_block = None + for block in segment.get("blocks", []): + address = block.get("address", -1) + size = block.get("size", -1) + state = block.get("state", "") + if address < 0 or size < 0 or state == "": + continue + if state == "active_allocated" and address in weight_addr_set: + if current_weight_block is None: + current_weight_block = (address, size) + elif current_weight_block[0] + current_weight_block[1] == address: + current_weight_block = ( + current_weight_block[0], + current_weight_block[1] + size, + ) + else: + weight_blocks_for_reg_mr.append(current_weight_block) + current_weight_block = (address, size) + if current_weight_block is not None: + weight_blocks_for_reg_mr.append(current_weight_block) + + addresses, sizes = zip(*weight_blocks_for_reg_mr) if weight_blocks_for_reg_mr else ((), ()) + ret = transfer_engine.batch_register_memory(addresses, sizes) + if ret.is_error(): + logger.error( + "batch_register_memory failed for %d blocks, ret: %s", + len(weight_blocks_for_reg_mr), + ret.to_string(), + ) + return False + + self.rfork_transfer_engine_weights_info_dict = weight_mr_dict + self.registered_weight_blocks = weight_blocks_for_reg_mr + + logger.info( + "register_memory_region time: %.4fs", + time.time() - start_reg_mr_tic, + ) + return True + + def unregister_memory_region(self) -> bool: + transfer_engine = self._get_transfer_engine() + start_unreg_mr_tic = time.time() + ret = transfer_engine.batch_unregister_memory([address for address, _ in self.registered_weight_blocks]) + if ret.is_error(): + logger.error( + "batch_unregister_memory failed for %d blocks, ret: %s", + len(self.registered_weight_blocks), + ret.to_string(), + ) + return False + self.rfork_transfer_engine_weights_info_dict = None + self.registered_weight_blocks = [] + logger.info( + "unregister_memory_region time: %.4fs", + time.time() - start_unreg_mr_tic, + ) + return True + + def recv_from_source( + self, + model, + seed_instance_ip, + seed_instance_service_port, + local_seed_key, + ): + transfer_engine = self._get_transfer_engine() + seed_url = f"http://{seed_instance_ip}:{seed_instance_service_port}" + seed_session_id, seed_weight_info = get_remote_instance_transfer_engine_info(seed_url, local_seed_key) + if seed_session_id is None or seed_weight_info is None: + logger.error("Cannot get transfer engine session or weight info.") + return False + + seed_ptr_list = [] + client_ptr_list = [] + client_len_list = [] + for name, tensor in model.named_parameters(): + weight_info = seed_weight_info.get(name, None) + if weight_info is None: + logger.error("Cannot find weight info for %s.", name) + return False + + seed_ptr, seed_len, seed_size = weight_info + if seed_len != tensor.numel() or seed_size != tensor.element_size(): + logger.error( + "Weight info mismatch for %s, expected (%s, %s), got (%s, %s)", + name, + seed_len, + seed_size, + tensor.numel(), + tensor.element_size(), + ) + return False + + seed_ptr_list.append(seed_ptr) + client_ptr_list.append(tensor.data_ptr()) + client_len_list.append(tensor.numel() * tensor.element_size()) + + start_transfer_tic = time.time() + ret = transfer_engine.batch_transfer_sync_read( + seed_session_id, + client_ptr_list, + seed_ptr_list, + client_len_list, + ) + if ret.is_error(): + logger.error("Failed to transfer weights from remote instance, ret=%s", ret.to_string()) + return False + + logger.info("transfer weights time: %.4fs", time.time() - start_transfer_tic) + return True + + +def get_remote_instance_transfer_engine_info(seed_url: str, local_seed_key: str): + try: + response = requests.get( + f"{seed_url}/get_rfork_transfer_engine_info", + params={"seed_key": local_seed_key}, + ) + if response.status_code != 200: + logger.error("request.get failed: %s", response.status_code) + return None, None + + data = response.json() + info = data.get("rfork_transfer_engine_info", None) + if info is not None and isinstance(info, list) and len(info) == 2: + return info[0], info[1] + + logger.error("Failed to get `rfork_transfer_engine_info` in response.") + return None, None + except Exception as e: + logger.error("Exception: %s", e) + return None, None