跳到内容

IPC 引擎

IPC 权重传输引擎使用 CUDA IPC(进程间通信)句柄,直接在同一节点和同一 GPU 上的训练器与推理工作进程之间共享 GPU 内存。这避免了任何数据拷贝,使其成为在主机上同时部署训练和推理任务时的高效选择。

何时使用 IPC

  • 同一 GPU 上进行训练和推理(同置部署)
  • 希望通过原地(in-place)共享张量来最小化内存开销

工作原理

  1. 训练器为每个权重创建 CUDA 张量,并使用 torch.multiprocessing.reductions.reduce_tensor 生成 IPC 句柄。
  2. IPC 句柄通过 Ray.remote()HTTP POST 发送至推理引擎。
  3. 推理工作进程从句柄重建张量,直接读取训练器的 GPU 内存。

警告

IPC 句柄涉及发送序列化的 Python 对象。使用 HTTP 传输时,必须在服务器和客户端上均设置 VLLM_ALLOW_INSECURE_SERIALIZATION=1。这是因为 IPC 句柄在 HTTP 传输前会被进行 pickle 处理并进行 base64 编码。

初始化

IPC 后端在两侧均无需初始化。init_transfer_engine 调用对于 IPC 而言是一个空操作(no-op)。

发送权重

IPC 支持两种传输模式来交付这些句柄:

Ray 模式

当 vLLM 作为 Ray Actor 运行时使用

from vllm.distributed.weight_transfer.ipc_engine import (
    IPCTrainerSendWeightsArgs,
    IPCWeightTransferEngine,
)

trainer_args = IPCTrainerSendWeightsArgs(
    mode="ray",
    llm_handle=llm_actor_handle,
)

IPCWeightTransferEngine.trainer_send_weights(
    iterator=model.named_parameters(),
    trainer_args=trainer_args,
)

在 Ray 模式下,引擎通过 Ray 的序列化机制直接调用 llm_handle.update_weights.remote(...) 并传递 IPC 句柄。

HTTP 模式

当 vLLM 作为 HTTP 服务器运行时使用

trainer_args = IPCTrainerSendWeightsArgs(
    mode="http",
    url="https://:8000",
)

IPCWeightTransferEngine.trainer_send_weights(
    iterator=model.named_parameters(),
    trainer_args=trainer_args,
)

在 HTTP 模式下,IPC 句柄会被 pickle、进行 base64 编码,并作为 JSON 发送到 /update_weights 端点。

请参阅 IPCTrainerSendWeightsArgs 获取完整的可配置字段列表。

示例