部署分布式推理服务
AIStudio 推理服务功能支持部署需要跨多个容器协同工作才能运行的超大规模模型。此模式称为分布式推理。平台通过自动配置必要的环境变量,简化了分布式环境的搭建。本文详细描述了如何启用、配置和使用分布式推理模式。
适用场景
当满足以下条件时,应考虑使用分布式推理模式:
- 模型规模巨大:单个模型的大小(参数量、中间激活等)超过了单个实例规格所能提供的资源限制(特别是 GPU 显存),即使该规格包含多张 GPU 卡。
- 需要跨容器并行:为了达到性能目标,需要将模型的计算(如通过 Tensor Parallelism)分散到多个协同工作的容器中。
- 框架支持:您使用的推理框架(例如 SGLang, vLLM TP, DeepSpeed-Inference, Hugging Face Accelerate 等)明确支持多节点/多进程分布式推理。
现已支持基于 Pytorch DDP 的分布式推理服务部署。
工作原理与核心概念
与常规部署(每个实例是一个独立的容器副本)不同,在分布式推理模式下:
- 实例由多 Worker 组成:您创建的单个推理服务实例 由多个 Worker 容器组成。
- 协同工作单元:单个实例的所有 Worker 容器作为一个整体,协同工作来加载和运行一个大模型(例如,使用 Tensor Parallelism 技术),共同处理推理任务。它们并非独立运行的副本,而是必须同时在线、互相通信的协同单元。
- 平台协调通信:平台负责为属于同一个分布式实例的所有 Worker 容器注入必要的环境变量(详见下文),使它们能够互相发现、确定各自的角色(Rank),并初始化它们之间的网络通信。
基本流程
在 AIStudio 中部署分布式推理服务,主要步骤如下:
主要流程请参考 创建推理服务 文档。在创建页面中进行以下关键配置:
- Step 0 推理服务类型:启用 分布式推理。
- 配置 Worker 数量:紧接着,您需要设定两个关键数量:
- 实例数量:希望运行多少个独立的、用于负载均衡的分布式推理组。每个组都是一个完整的、可以独立处理请求的单元。
- 单实例包含 Worker 数:指定构成一个分布式推理组(即一个实例)的 Worker 容器数量。这个值将决定平台为该实例注入的
WORLD_SIZE
环境变量的值。
注意
这两个值的设定对资源消耗和分布式通信至关重要,请务必理解其含义。
- Step 1 选择算力资源与规格:您选择的规格将应用于该分布式实例内的每一个 Worker 容器。
- Step 2 配置服务与镜像:选择必须支持分布式推理的镜像,并配置启动命令以利用平台注入的环境变量。
- 后续步骤:按需配置存储、网络等。
平台自动协调:平台为每个分布式实例创建指定数量的 Worker 容器。为了让这些 Worker 能够互相发现并建立通信,平台为每个 Worker 容器注入必要的环境变量(见下节)。
启动命令执行:您在 Step 2 配置的启动命令将在每一个 Worker 容器内执行。该命令必须使用平台注入的环境变量来初始化分布式推理框架,并确保所有 Worker 参与到同一个分布式任务中。
服务运行与访问:一旦一个分布式实例内的所有 Worker 容器成功启动并建立协同,该实例即可处理请求。负载均衡发生在配置的多个分布式实例之间。
平台注入的环境变量
平台自动为组成同一个分布式实例的所有 Worker 容器注入以下关键环境变量,供您的启动命令和推理框架用于初始化分布式通信和任务分配:
WORLD_SIZE
:当前单个分布式实例包含的 Worker 容器总数。这通常对应分布式框架中的nnodes
或类似的总节点/进程数参数。其值等于您在创建时设置的“单实例包含 Worker 数”。RANK
:当前 Worker 容器的唯一 ID,从0
到WORLD_SIZE - 1
。这用于区分不同的 Worker,通常对应框架中的node-rank
、process_id
或类似参数。MASTER_ADDR
:分布式实例中 Rank 0 Worker 容器的网络地址(IP 或主机名)。这通常用于所有 Worker 初始化分布式通信(例如,通过torch.distributed.init_process_group
或类似机制)时指定主节点地址。MASTER_PORT
:平台为分布式通信预留的一个端口号(通常是固定的,例如29500
或30000
,请根据实际情况确认或在启动命令中指定)。Worker 使用此端口与 Master 建立连接。
配置启动命令与推理框架
您的启动命令的核心任务是调用支持分布式的推理框架,并将平台注入的环境变量传递给框架所需的参数。
SGLang 示例
以下示例展示了如何在启动命令中使用平台注入的环境变量来启动 SGLang 的分布式服务:
#!/bin/bash
# 定义模型和其他本地参数
MODEL_NAME="your-large-model"
MODEL_PATH="/mnt/models/your-large-model" # 确保此路径已挂载共享存储
SERVE_PORT=8000 # 容器内监听端口
TP_PER_WORKER=2 # 假设每个 Worker 容器使用 2 卡进行 Tensor Parallelism
# 打印平台注入的环境变量 (用于调试)
echo "--- Distributed Env Variables ---"
echo "Instance composed of $WORLD_SIZE workers." # 当前实例的总 Worker 容器数量
echo "This is worker Rank: $RANK" # 当前 Worker 容器的 ID (0 到 WORLD_SIZE-1)
echo "Master worker address: $MASTER_ADDR" # 主 Worker 地址,用于初始化通信
echo "-------------------------------"
# 启动 SGLang 分布式服务
# 注意 --nnodes, --node-rank, --dist-init-addr 如何使用环境变量
python3 -m sglang.launch_server \
--model-path $MODEL_PATH \
--served-model-name $MODEL_NAME \
--tp $TP_PER_WORKER \
--nnodes $WORLD_SIZE \
--node-rank $RANK \
--dist-init-addr "$MASTER_ADDR:30000" \ # 使用 Master 地址和指定/约定的端口
--port $SERVE_PORT \
--host 0.0.0.0 \
--log-level info \
--trust-remote-code # 如果模型需要
# 其他框架 (如 DeepSpeed, Accelerate, vLLM TP) 会有不同的启动脚本和参数名称,
# 但核心思想一致:利用 $WORLD_SIZE, $RANK, $MASTER_ADDR 来配置分布式设置。
重要
- 您选择的推理镜像必须包含所需的分布式推理框架及其依赖。
- 启动命令需要根据您使用的具体框架进行调整。请参考框架的官方文档了解其分布式启动参数。
- 用于分布式通信的端口(如示例中的
30000
)需要在所有 Worker 间保持一致,并确保未被服务本身监听的端口(如SERVE_PORT=8000
)或其他进程占用。
资源、扩缩容与负载均衡
- 资源计算:单个分布式实例消耗的总资源等于 (单实例包含 Worker 数) x (每个 Worker 的规格)。请确保您的资源池配额充足。
- 扩缩容:通过调整实例数量 来实现。增加实例数量会创建更多组完整的、由多个 Worker 组成的分布式推理单元。减少实例数量则会删除整个分布式推理组(及其所有 Worker 容器)。
- 负载均衡:平台提供的负载均衡发生在配置的多个独立的分布式实例之间。请求会被路由到其中一个健康的分布式实例(该实例内的所有 Worker 必须都正常运行才能被视为健康)。
注意事项
- 镜像兼容性:确保您的容器镜像包含运行分布式推理所需的所有库、驱动程序以及您选择的推理框架。
- 代码/框架适配:推理服务的代码逻辑或所使用的框架必须为分布式环境设计,能够正确初始化并利用多 Worker 进行协同计算。
- 调试:排查分布式推理问题可能更为复杂,通常需要查看多个 Worker 容器的日志(特别是 Rank 0 和出现错误的 Rank 的日志)来定位根本原因。
对比推理部署模式
常规部署 (默认):标准模式,每个服务实例对应一个独立的容器。适用于大多数模型。当服务需要多个实例时,平台会创建多个这样完全相同的、独立运行的容器副本,自动在这些独立的实例(容器副本)之间进行负载均衡。
- 负载均衡与扩缩容:平台会自动在这些独立的实例(容器副本)之间进行负载均衡。您可以通过调整实例数量来水平扩展或缩减服务的总处理能力。
- 说明:每个推理服务实例对应一个独立的容器。当服务需要多个实例时,平台会创建多个这样完全相同的、独立运行的容器副本。
- 负载均衡与扩缩容:平台会自动在这些独立的实例(容器副本)之间进行负载均衡。您可以通过调整实例数量来水平扩展或缩减服务的总处理能力。
- 资源:您在后续步骤中选择的实例规格(如 CPU、内存、GPU 数量)将应用于每一个独立的实例容器。
- 适用场景:适用于绝大多数模型,只要模型及其运行所需的资源能够容纳在单个实例规格所定义的容器限制内。
分布式推理:适用于单个容器无法承载的超大模型。此时,一个服务实例由多个协同工作的 Worker 容器组成。您仍然可以创建多个这样的分布式实例(每个实例都包含其自己的一组 Worker 容器)。平台会在这些完整的分布式实例之间进行负载均衡。扩缩容通过调整分布式实例的数量(增加或减少由多个 Worker 组成的完整实例组)来实现。如需使用此模式,请务必参考详细文档:部署分布式推理服务 以了解其配置要求和使用方法。
- 说明:此模式专为超大规模模型设计,这些模型需要多个容器协同工作才能完成单次推理请求。选择此模式后,您创建的单个推理服务实例将由多个 Worker 容器组成。单个实例的所有 Worker 容器作为一个整体,共同加载模型(例如,使用 Tensor Parallelism)并处理推理任务。它们并非独立副本,而是协同单元。
- 平台协调:平台负责为组成同一个分布式实例的所有 Worker 容器注入必要的环境变量(例如
MASTER_ADDR
,RANK
,WORLD_SIZE
)。您的推理代码需要利用这些变量来初始化 Worker 间的通信和协调。bash# 示例:启动命令在每个 Worker 容器内执行,可直接使用平台注入的环境变量 echo "Instance composed of $WORLD_SIZE workers." # 当前实例的总 Worker 容器数量 echo "This is worker Rank: $RANK" # 当前 Worker 容器的 ID (0 到 WORLD_SIZE-1) echo "Master worker address: $MASTER_ADDR" # 主 Worker 地址,用于初始化通信 # 使用环境变量启动分布式推理框架 (例如 SGLang) python3 -m sglang.launch_server \ # ... 其他模型和路径参数 ... --nnodes $WORLD_SIZE --node-rank $RANK \ --dist-init-addr "$MASTER_ADDR:30000" \ # ... 其他框架特定参数 ...
- 资源:您选择的Worker 规格将应用于该分布式实例内的每一个 Worker 容器。单个分布式实例的总资源是
WORLD_SIZE
(Worker 数量)乘以单个 Worker 的规格。 - 负载均衡与扩缩容:您仍然可以创建多个这样的分布式实例(每个实例都包含其自己的一组 Worker 容器)。平台会在这些完整的分布式实例之间进行负载均衡。扩缩容通过调整分布式实例的数量(增加或减少由多个 Worker 组成的完整实例组)来实现。
- 适用场景:适用于单个模型过大,无法放入单个容器的资源限制(特别是 GPU 显存),或者需要跨容器并行计算以满足性能需求的场景。前提是您的推理框架(如 SGLang, DeepSpeed-Inference, vLLM TP 等)和代码必须支持这种多容器(多进程)分布式推理模式。