Colossal-AI 全景概述:统一大规模分布式训练系统与 Booster 工作流实战指南
导读
本文以 Colossal-AI 官方文档《Colossal-AI Overview》为骨架,系统讲解这套统一大规模模型训练系统的设计定位、核心训练工具与并行能力矩阵,并深入展开其推荐的"四步"通用使用流程(配置 → 启动 → 注入 → 训练/评测)。通过结合本仓库源码,读者将掌握 colossalai.launch 系列启动 API、Booster 组件注入机制、各类 Plugin(数据并行/ZeRO/Gemini/混合并行等)的适用场景,以及如何在真实示例项目中从零跑通一个基于 Booster 的完整训练任务。
一、为什么需要 Colossal-AI:从"单卡训练"走向"规模化训练"
随着深度学习模型体量的持续增长,训练范式必须发生转变。以纯单机单卡、无并行、无优化的传统训练方式去支撑大模型,无论是在时间成本还是硬件成本上都难以为继。当模型参数量达到数十亿甚至千亿规模、训练数据集也随之膨胀时,如何高效且经济地完成训练成为核心挑战,而答案正是分布式并行训练与系统级优化手段的组合。
Colossal-AI 正是为此设计的一套统一训练系统:它把训练大型 AI 模型所需的各种"技能"与工具集合到同一个框架之内,让使用者不必在多套互相割裂的开源组件之间自行拼装。根据 concepts/colossalai_overview.md 的定位,这套技能集合可以分为两类:
- 通用训练工具:例如混合精度训练(mixed precision training)、梯度累积(gradient accumulation)等所有训练任务都会用到的常规能力;
- 系统级并行能力:包括数据并行(data parallel)、张量并行(tensor parallel)与流水线并行(pipeline parallel)等多种并行范式。在此基础上,框架还针对张量并行优化了多种不同维度的分布式矩阵乘算法,并提供多种流水线并行实现以支持模型跨节点高效扩展;更进阶的**异构卸载(offloading)**等特性也在后续文档中有详细讲解。
关于各类并行范式的概念性说明(数据并行、张量并行、流水线并行、序列并行、ZeRO 优化器级并行、异构系统并行),可进一步阅读同目录下的 paradigms_of_parallelism.md,本文后续会结合该文档简述其与 Overview 中能力矩阵的对应关系。
二、四种并行的基本盘:Overview 背后承载的并行能力矩阵
Overview 明确承诺"提供数据、张量与流水线并行"并"针对不同维度分布式矩阵乘做优化",下面用仓库文档 paradigms_of_parallelism.md 中的要点,把这张能力底牌展开,便于读者建立全局图景:
- 数据并行(Data Parallel):最通用的一种并行。数据集被切分为多个分片分发给各设备,等价于沿 batch 维度并行。每个设备持有一份完整模型副本,在各自的数据分片上训练;反向传播后通过 all-reduce 同步梯度,保证各设备参数一致。
- 张量并行(Tensor Parallel,层内并行):把一个张量沿某一维度切成 N 份、每台设备只持有 1/N,同时通过额外的通信(如 all-gather 拼接部分结果)保证计算图语义正确。以矩阵乘法 C = AB 为例:将 B 沿列维切为 [B0 B1 ... Bn] 分发到各设备,各设备并行计算得到部分结果 [AB0 AB1 ... ABn] 后再 all-gather 拼接——这正是 Overview 中"以不同多维分布式矩阵乘算法优化张量并行"的抽象基础。Colossal-AI 在张量并行上提供 1D、2D、2.5D、3D 多种方法。
- 流水线并行(Pipeline Parallel,层间并行):模型按层切分为若干 chunk 分给不同设备。前向时每台设备把中间激活传给下一阶段,反向时把输入梯度回传给上一阶段,从而让多设备并行计算、提升吞吐。其代价是会产生一定的 bubble 时间(部分设备处于等待,计算资源空闲)。
- 序列并行与异构系统并行:前者沿序列维度切分(如 Megatron SP、DeepSpeed-Ulysses 的 all-to-all 方案、Ring Attention);后者则利用 CPU 内存乃至 NVMe 磁盘,把暂时不用的张量卸载回去,从而在单机上容纳超大模型——对应 Overview 中提到的"offloading"进阶特性。
说明:以上能力矩阵在旧版 API(
colossalai.legacy)中由parallel_context等机制编排;而在当前新版 API 中,这些并行能力被统一抽象进 Plugin + Booster 框架(见下文第五节),具体 Plugin 的对应实现位于 colossalai/booster/plugin。
三、通用使用流程:四步跑通一个 Colossal-AI 训练任务
Overview 文档强调,Colossal-AI 的设计目标之一是易用且对用户代码低侵入(non-intrusive)——尽量让用户原有的模型、优化器代码保持原样,由框架负责注入并行与优化能力。为此,官方给出了一套简洁的通用工作流,共四步:
- 准备配置文件:在配置文件中声明你希望启用的特性和对应参数;
- 初始化分布式后端:调用
colossalai.launch完成分布式环境初始化; - 注入训练特性:通过
colossalai.booster(即Booster)把并行/精度等特性注入到训练组件(如 model、optimizer)中; - 运行训练与测试:执行正常的训练循环与评测。
需要说明的是,在当前版本中,launch 与 Booster 都提供了面向新 API 的入口(位于 colossalai/initialize.py 与 colossalai/booster/booster.py),并在大量教程示例中使用;而旧版 API 的对应实现保留在 colossalai/legacy/initialize.py 中以兼容历史代码。下文以新 API 为准展开。
3.1 第 1 步:确定配置形态
在新 API 下,"配置"不再是一份必须显式传入的 Python 配置文件,而是体现为 launch 的入参 + Booster 的构造参数(plugin、mixed_precision、device)这两个层次。也就是说,用户只需把"想要的特性"声明式地表达出来,例如:
- 想用哪种启动方式(多机手动 / SLURM / OpenMPI / torchrun);
- 想用哪种并行与显存策略(
TorchDDPPlugin/LowLevelZeroPlugin/GeminiPlugin/HybridParallelPlugin等); - 想用哪种混合精度(
fp16/bf16/fp16_apex/fp8等)。
旧版文档中"独立 config 文件 + Config 解析"的形态在 legacy 中仍可找到对应,例如 colossalai/legacy/initialize.py 中 launch 的 config 参数即同时接受 str / Path / Config / Dict。对初学者而言,直接对照教程示例中的命令行参数与 Booster 构造写法是最快上手路径(见第五节示例)。
3.2 第 2 步:初始化分布式环境——colossalai.launch
Overview 要求通过 colossalai.launch 初始化分布式后端。查看当前源码 colossalai/initialize.py,新 API 的 launch 函数签名与关键行为如下:
def launch(
rank: int,
world_size: int,
host: str,
port: int,
backend: str = "nccl",
local_rank: int = None,
seed: int = 1024,
verbose: bool = True,
):
其内部执行的关键步骤(源码可验证):
- 进程组初始化:根据
host中是否含冒号自动区分 IPv4/IPv6,拼出tcp://{host}:{port}或tcp://[{host}]:{port}的 init_method,随后调用torch.distributed.init_process_group(...); - 设备设置:
backend实际由当前加速器(accelerator)决定(默认取cur_accelerator.communication_backend),并调用cur_accelerator.set_device(local_rank);当local_rank为None时由框架自动推算默认设备序号; - 随机种子统一:调用
set_seed(seed),默认种子为 1024,保证各进程可复现; - 额外环境优化:模块在导入时会设置
CUDA_DEVICE_MAX_CONNECTIONS=1(源码文件头注释说明这是为了保证通信与计算重叠时 kernel 在 GPU 上的启动顺序与 CPU 一致),并尝试开启torch._dynamo.config.optimize_ddp(当 world_size > 1 时); - 日志输出:
verbose=True(默认)时在 rank 0 打印初始化成功信息。
针对不同的集群调度环境,框架还提供了三种便捷包装,自动从环境变量读取 rank/world_size,用户只需提供 host 与 port:
| 函数 | 适用场景 | 读取的环境变量 |
|---|---|---|
launch_from_slurm |
SLURM 调度器 | SLURM 相关环境变量 |
launch_from_openmpi |
OpenMPI 启动器 | OpenMPI 相关环境变量 |
launch_from_torch |
torchrun / torch.distributed.launch |
RANK、LOCAL_RANK、WORLD_SIZE、MASTER_ADDR、MASTER_PORT |
这三种包装的实现同样在 colossalai/initialize.py,其中 launch_from_torch 会显式读取 PyTorch 标准环境变量并回填给 launch。这意味着在绝大多数场景下,你甚至不需要手写 rank/world_size——直接使用 colossalai.launch_from_torch() 再配合 torchrun 启动即可。
此外,colossalai/cli/launcher/run.py 展示了 colossalai run 这一 CLI 启动多进程的整体逻辑:若给定 hostfile 则解析后多机启动;否则给定 hosts 则多机启动;都没有则在当前节点启动——多机场景可以通过 hostfile 文件(可参考 applications/Colossal-LLaMA/hostfile.example 的写法)来声明节点列表。
3.3 第 3 步:注入特性——Booster
这是 Overview 中"non-intrusive"设计理念的核心承载者。Booster 位于 colossalai/booster/booster.py,其 docstring 中给出了精炼的使用伪代码,核心构造参数为:
Booster(
device=None, # 训练设备;若不使用 Plugin 或 Plugin 不托管设备时生效
mixed_precision=None, # 'fp16' / 'fp16_apex' / 'bf16' / 'fp8' 字符串,或 MixedPrecision 实例
plugin=None, # Plugin 实例,用于注入并行/显存策略
)
mixed_precision 与 plugin 之间存在优先级约定(源码 booster.py 中通过 plugin.control_device()、plugin.control_precision() 判断):
- 若 Plugin 托管了 device,则传入的
device参数被忽略并给出 warning; - 若 Plugin 托管了 precision,则传入的
mixed_precision被忽略并给出 warning; - 若均不托管,
mixed_precision为字符串时走mixed_precision_factory(...)使用默认 AMP 参数,为MixedPrecision实例时按用户自定义参数生效。
真正"注入"动作发生在 booster.boost(...) 方法(booster.py)中,它一次性接收并返回五个组件:
model, optimizer, criterion, dataloader, lr_scheduler = booster.boost(
model, optimizer, criterion, dataloader, lr_scheduler
)
内部执行顺序(源码可验证)为:先由 plugin.configure(...) 完成模型切分/并行化与 DataLoader 的准备 → 再在 Plugin 不托管设备时用 accelerator.configure_model 移动设备 → 最后在不冲突前提下用 mixed_precision.configure(...) 完成精度改造。改造完成后:
- 训练循环中反向传播请统一走
booster.backward(loss, optimizer)(内部调用optimizer.backward(loss)),这是梯度规约/状态切分策略得以生效的前提; - 若使用流水线并行 Plugin,前向/反向需通过
booster.execute_pipeline(data_iter, model, criterion, optimizer, ...)驱动,不能再用loss.backward()的传统写法(源码对此有明确告警,见 booster.py)。
Booster 还围绕注入后的组件提供了完整配套能力,例如:
booster.save_model(...)/booster.load_model(...):统一断点保存与恢复,支持分片(shard)检查点(通过 colossalai/checkpoint_io 实现);booster.no_sync(...):上下文管理器,用于在 DDP / Low-Level ZeRO-1 下关闭梯度同步以配合梯度累积;booster.enable_lora(...):基于 Hugging Face PEFT 的 LoRA 微调注入(需额外安装 peft,并依赖 Plugin 的support_lora()能力)。
3.4 第 4 步:运行训练与测试
完成上述注入后,训练与测试就是一段标准 PyTorch 风格的循环:取 batch → 前向 → booster.backward → optimizer.step() → optimizer.zero_grad() → 周期性地 booster.save_model 保存检查点并在测试集上评测。Overview 指出这套完整流程会在"basic tutorials"章节逐步展开,仓库中对应的可直接运行教程位于 examples/tutorial/new_api,下文第五节给出一个端到端的真实示例。
四、Plugin 全景:Booster 背后可选的并行/显存策略
Overview 中罗列的并行与显存优化能力,在新 API 中全部收敛为"选择哪个 Plugin"这一个动作。查看 colossalai/booster/plugin/init.py 可知仓库当前导出的 Plugin 集合为:
| Plugin | 核心定位(结合源码名与文档推断) | 典型场景 |
|---|---|---|
TorchDDPPlugin |
包装 torch.nn.parallel.DistributedDataParallel,纯数据并行 |
单机/多机数据并行、入门与 CI 测试 |
TorchFSDPPlugin |
包装 PyTorch FSDP(torch.__version__ >= 1.12.0 时导出) |
需要 PyTorch 官方分片数据并行的场景 |
LowLevelZeroPlugin |
低层 ZeRO-1/2 等分片策略实现 | 中大规模模型训练、参数规模超过单卡显存的场景 |
GeminiPlugin |
异构(GPU-CPU-NVMe)显存管理 + ZeRO 的"双子星"方案 | 单机/小规模集群容纳超大模型、offloading 需求 |
HybridParallelPlugin |
数据 + 张量 + 流水线 + 序列并行等混合并行 | 大规模 Transformer/LLM 的跨节点高效训练 |
MoeHybridParallelPlugin |
MoE(混合专家)模型的混合并行 | 如 DeepSeek/Mixtral 等含专家并行的大模型 |
其中:
- ZeRO(零冗余优化器) 对应 Overview 中"显存优化"能力,按三个层级消除冗余:Level 1 切分优化器状态、Level 2 进一步切分 32 位梯度、Level 3 连 16 位模型参数也一并切分(细节见 paradigms_of_parallelism.md);
- Gemini 对应 Overview 中"offloading / 异构系统"能力,其实现位于 colossalai/zero/gemini,低层 ZeRO 实现位于 colossalai/zero/low_level;
- 混合并行与 MoE 混合并行相关实现见 colossalai/booster/plugin/hybrid_parallel_plugin.py 与 moe_hybrid_parallel_plugin.py。
实际工程中 LLM 训练常使用 HybridParallelPlugin(内部组合 TP/PP/DP/ZeRO/序列并行),其可配置的完整参数体系可查阅该文件的类定义与构造参数。
五、从 Overview 到可运行代码:一个真实工作流示例
Overview 中"四步工作流"不是空谈——仓库中的 CIFAR-10 教程就是它的直接落地。阅读 examples/tutorial/new_api/cifar_resnet/train.py,可以看到上述四个步骤如何映射为真实代码(为聚焦流程,下面做了结构化摘编,完整逻辑请直接查看该文件):
import colossalai
from colossalai.accelerator import get_accelerator
from colossalai.booster import Booster
from colossalai.booster.plugin import LowLevelZeroPlugin, TorchDDPPlugin
from colossalai.cluster import DistCoordinator
from colossalai.nn.optimizer import HybridAdam
# ---- 初始化分布式后端(第 2 步)----
colossalai.launch_from_torch() # 从 torchrun 环境变量读取 rank/world_size
coordinator = DistCoordinator()
# ---- 准备插件与 Booster(第 3 步:注入训练特性)----
plugin = TorchDDPPlugin() # 命令行 -p 可选 torch_ddp / torch_ddp_fp16 / low_level_zero
booster = Booster(plugin=plugin)
# 以 plugin 托管的方式构建 DataLoader
train_dataloader = plugin.prepare_dataloader(train_dataset, batch_size=batch_size, shuffle=True, drop_last=True)
# 模型 / 优化器 / 损失
model = build_resnet()
optimizer = HybridAdam(model.parameters(), lr=LEARNING_RATE)
criterion = nn.CrossEntropyLoss()
# 注入:model、optimizer、criterion、dataloader 被 Booster 接管
model, optimizer, criterion, train_dataloader, _ = booster.boost(
model, optimizer, criterion, train_dataloader
)
# ---- 运行训练(第 4 步)----
for images, labels in train_dataloader:
images, labels = images.cuda(), labels.cuda()
outputs = model(images)
loss = criterion(outputs, labels)
booster.backward(loss, optimizer) # 注意:使用 booster.backward 而非 loss.backward()
optimizer.step()
optimizer.zero_grad()
值得注意的细节(均可由源码验证):
DistCoordinator位于 colossalai/cluster/dist_coordinator.py,配合coordinator.is_master()控制日志/进度条只在主进程打印,避免多进程刷屏;HybridAdam是 Colossal-AI 提供的优化器实现(见 colossalai/nn/optimizer),在分布式切分/混合精度场景下与 Booster 协同更佳;- 教程通过命令行
-p参数在torch_ddp/torch_ddp_fp16/low_level_zero之间切换(train.py),配合-r/-c/-i参数实现断点续训——直观展示了"换一个 Plugin 即可切换并行/精度策略"的低侵入特性; - 启动方式遵循 Overview 第 2 步,例如用
torchrun --nproc_per_node=N train.py -p torch_ddp之类的命令即可拉起 N 个进程(具体命令参考该教程 README)。
同一目录下的 cifar_vit 与 glue_bert 教程则展示了在 ViT、BERT 等不同模型上复用同一套 Booster 流程的方式,可进一步印证工作流的通用性。
六、未来演进方向与社区协作
Overview 明确指出,Colossal-AI 将持续扩充训练技能库,规划中的新方向包括(但不限于):
- 分布式算子优化(optimization of distributed operations);
- 异构系统训练优化(optimization of training on heterogenous system);
- 新增训练工具,在保持模型性能的前提下减小显存占用、加速训练(implementation of training utilities to reduce model size and speed up training while preserving model performance);
- 既有并行方法的扩展(expansion of existing parallelism methods)。
对应到当前仓库的代码结构,这些方向其实已有不少落地:例如 colossalai/auto_parallel 下的自动并行与切分求解器对应方向 1 与 4;colossalai/zero/gemini 与 offload 相关模块对应方向 2 与 3;colossalai/shardformer 面向主流 HF 模型的"一键并行化"对应方向 4。
若你有关于未来特性的想法,可到项目的 Discussion/Forum 板块发帖讨论,仓库欢迎社区的 idea 与贡献;参与开发的流程性要求可参考 CONTRIBUTING.md。
七、小结:一套骨架,四大要点
- 定位:Colossal-AI 是一套统一的深度学习大规模训练系统,将混合精度、梯度累积等常规工具与数据/张量/流水线/异构并行等系统能力整合在单一框架内;
- 工作流:配置特性 →
colossalai.launch(或launch_from_torch等包装)初始化分布式环境 → 用Booster+ Plugin 注入并行与精度 → 常规训练循环即可运行; - 低侵入:用户的 model/optimizer/criterion/dataloader 由
booster.boost()统一接管,反向传播统一走booster.backward;选择不同 Plugin(TorchDDPPlugin、LowLevelZeroPlugin、GeminiPlugin、HybridParallelPlugin等)即可无痛切换并行/显存策略; - 可验证:以上全部结论均可在本仓库源码中直接验证,建议结合 basic tutorials 教程目录 亲手跑一遍,形成对这套工作流的直观认识。更多并行范式的概念细节与论文出处,可继续阅读 concepts/paradigms_of_parallelism.md 与 concepts/distributed_training.md。
本文依据仓库内的 concepts/colossalai_overview.md 撰写,文中所涉函数签名、Plugin 清单与代码行为均可在 colossalai/initialize.py、colossalai/booster/booster.py、colossalai/booster/plugin 及 examples/tutorial/new_api/cifar_resnet/train.py 等文件中核对。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00