Featured image of post 深度学习开源框架

深度学习开源框架

DeepSpeed

什么是 DeepSpeed?

DeepSpeed 是一个开源深度学习优化库,专为分布式训练和大规模模型设计。它提供了多种工具和技术,如 ZeRO(零冗余优化器)、混合精度训练和高效的并行策略,帮助开发者在 GPU 上更快、更高效地训练模型。DeepSpeed 的主要目标是降低内存占用并提升训练速度,特别适用于超大型语言模型(LLM)。
deepspeed在深度学习模型软件体系架构中所处的位置是?

alt text

核心功能

  • ZeRO(零冗余优化器):通过分割优化器状态、分梯度和参数,减少内存冗余,支持更大的模型。
  • 混合精度训练:结合 FP16 和 BF16,加速计算并减少内存需求。
  • 分布式训练支持:支持数据并行、模型并行和流水线并行。
  • 高效激活检查点:优化内存使用,允许更大的批量大小。
  • 超大模型支持:能够训练超过千亿参数的模型。

安装 DeepSpeed

在开始使用 DeepSpeed 之前,需要安装它。以下是安装步骤:

  1. 确保环境准备

    • Python 3.6 或更高版本
    • PyTorch(建议最新稳定版)
    • CUDA(与 PyTorch 兼容的版本)
  2. 通过 pip 安装 DeepSpeed

    pip install deepspeed
    
  3. 验证安装: 运行以下命令检查是否成功安装:

    ds_report
    

    这将显示 DeepSpeed 的配置信息和环境兼容性。

集成 DeepSpeed 到 PyTorch

以下是一个简单的例子,展示如何将 DeepSpeed 集成到 PyTorch 训练代码中。

示例代码
import torch
import torch.nn as nn
import deepspeed

# 定义一个简单的模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(10, 10)
        self.fc2 = nn.Linear(10, 2)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 初始化模型和数据
model = SimpleModel()
data = torch.randn(32, 10)  # 批量大小 32,输入维度 10
labels = torch.randint(0, 2, (32,))

# 定义 DeepSpeed 配置
ds_config = {
    "train_batch_size": 32,
    "gradient_accumulation_steps": 1,
    "fp16": {
        "enabled": True  # 启用混合精度训练
    },
    "optimizer": {
        "type": "Adam",
        "params": {
            "lr": 0.001
        }
    }
}

# 初始化 DeepSpeed
model_engine, optimizer, _, _ = deepspeed.initialize(
    model=model,
    model_parameters=model.parameters(),
    config=ds_config
)

# 前向传播和反向传播
outputs = model_engine(data)
loss = nn.CrossEntropyLoss()(outputs, labels)
model_engine.backward(loss)
model_engine.step()
代码说明
  1. 模型定义:这里使用了一个简单的两层全连接神经网络。
  2. DeepSpeed 配置ds_config 是一个字典,指定训练参数,如批量大小、优化器类型和混合精度选项。
  3. 初始化 DeepSpeeddeepspeed.initialize 将模型和优化器包装为 DeepSpeed 引擎。
  4. 训练步骤:使用 model_engine 替代原始 PyTorch 模型进行前向传播、反向传播和参数更新。

配置文件的替代方式

除了在代码中定义 ds_config,你还可以创建一个 JSON 文件(例如 ds_config.json):

{
    "train_batch_size": 32,
    "gradient_accumulation_steps": 1,
    "fp16": {
        "enabled": true
    },
    "optimizer": {
        "type": "Adam",
        "params": {
            "lr": 0.001
        }
    }
}

然后在初始化时加载:

model_engine, optimizer, _, _ = deepspeed.initialize(
    model=model,
    model_parameters=model.parameters(),
    config="ds_config.json"
)

运行分布式训练

要使用多个 GPU 运行训练,只需通过 deepspeed 命令启动脚本:

deepspeed train.py --deepspeed --deepspeed_config ds_config.json

确保你的脚本支持分布式环境(例如,使用 torch.distributed.launch 或 DeepSpeed 的内置分布式支持)。

高级功能:ZeRO 优化

ZeRO 有三个阶段,可以通过配置启用:

  • ZeRO-1:分割优化器状态。
  • ZeRO-2:分割优化器状态和梯度。
  • ZeRO-3:分割优化器状态、梯度和参数。

示例配置:

{
    "zero_optimization": {
        "stage": 2,
        "allgather_partitions": true,
        "reduce_scatter": true
    }
}

注意事项

  • 硬件要求:DeepSpeed 需要 GPU 支持,建议使用 NVIDIA GPU。
  • 调试:如果遇到问题,可以检查 ds_report 输出或启用详细日志("verbose": true)。
  • 文档参考:查看 DeepSpeed 官方文档 获取更多高级用法。

transformers

transformers 库(通常指 Hugging Face 公司开发的库)是目前深度学习,尤其是自然语言处理(NLP)领域中最重要、最核心的库之一

它本身是一个 Python 库,但由于其生态系统极其完整和强大,很多人也视它为一个“框架”。它极大地简化了访问和使用最先进(SOTA)的 Transformer 模型(如 BERT, GPT, T5 等)的复杂度。

以下是 Hugging Face transformers 库的主要特点:


🤖 Hugging Face transformers 的核心特点

1. 庞大且活跃的模型中心 (Model Hub)

这是 transformers 最核心的优势。Hugging Face 运营着一个巨大的模型仓库(Model Hub),任何人都可以上传、下载和分享预训练模型。

  • 海量模型: 截至目前,上面有数十万个预训练模型,涵盖了文本、图像、音频等多种模态。
  • 社区驱动: 不仅有 Google、Meta、OpenAI 等大公司发布的官方模型,还有大量由社区贡献的、针对特定任务或特定语言微调(Fine-tune)过的模型。
  • 版本控制与复现: 所有模型都与代码和分词器(Tokenizer)绑定,可以轻松复现他人的工作。

2. 极佳的易用性 (Ease of Use)

Hugging Face 的 API 设计哲学是“简单”和“一致”。

  • pipeline() 抽象: 这是最简单的入门方式。您只需几行代码,就可以完成一个复杂的NLP任务(如情感分析、问答),而无需关心背后的模型和数据处理流程。
  • AutoModel / AutoTokenizer 您不需要知道某个具体模型(比如 ‘bert-base-uncased’)是 BertModel 还是 RobertaModel。您只需使用 AutoModel.from_pretrained(...),它会自动识别并加载正确的模型架构。
  • 一致的 API: 无论您使用的是 BERT 还是 GPT-2,加载模型 (from_pretrained) 和保存模型 (save_pretrained) 的方法都是完全一样的。

3. 框架互操作性 (Framework Interoperability)

transformers 库并不是要取代已有的深度学习框架,而是构建在它们之上。

  • 无缝切换: 它完美支持 PyTorch, TensorFlowJAX
  • 灵活性: 您可以使用 PyTorch 版本的 transformers 训练一个模型,然后将其保存,再用 TensorFlow 版本的 transformers 加载它,模型权重会自动转换。这为不同技术栈的团队协作提供了巨大便利。

4. 任务导向的抽象 (Task-Oriented Abstraction)

transformers 库围绕“任务”提供了清晰的模型分类。

  • 明确的命名: 当您想做一个分类任务时,您会寻找 ...ForSequenceClassification 结尾的模型(如 BertForSequenceClassification)。
  • 开箱即用: 这些模型已经在基础模型(如 BERT)的顶部添加了适合特定任务的“头部”(Head),例如一个用于分类的全连接层。您加载后只需直接进行微调。

5. 强大且一致的分词 (Tokenization)

文本处理是NLP的第一步。transformers 配套了 tokenizers 库(一个用 Rust 编写的高性能库)。

  • 一致性: 提供了与 AutoModel 对应的 AutoTokenizer,确保您使用的分词器与预训练模型是严格匹配的。
  • 高性能: 分词速度极快,可以并行处理大量文本。

6. 完整的生态系统 (A Complete Ecosystem)

transformers 并不是孤立的,Hugging Face 围绕它构建了一整套工具链:

  • datasets: 用于高效加载和处理大型数据集(TB级别)。
  • evaluate: 用于评估模型性能的指标库。
  • accelerate: 用于简化分布式训练和混合精度训练的工具。
  • diffusers: 专注于扩散模型(如 Stable Diffusion)的库。
最后修改于 Oct 30, 2025 22:17 +0800
使用 Hugo 构建
主题 StackJimmy 设计