跳至主要内容
返回文章列表
约 4 分钟阅读

如何理解深度学习中的框架

从模型架构、训练流程和工具封装三个层面,理解什么是深度学习框架,以及用框架跑任务意味着什么。

在学习深度学习时,“模型架构”和“训练框架”经常一起出现,但它们描述的对象并不相同。模型架构关注模型内部如何组织,训练框架关注模型如何被开发、训练和运行。

模型架构:模型内部怎么搭

模型架构指模型内部各个模块的设计和组织方式,回答的是:

模型由哪些模块组成?这些模块如何连接和协作?

例如,一个 Transformer 模型可能由以下模块组成:

输入
 → Embedding
 → 多头注意力
 → 前馈网络
 → 残差连接与归一化
 → 输出层

这里描述的是模型本身的结构设计,也就是各个模块怎样组合成一个可以完成任务的模型。

训练框架:模型怎么被训练

训练框架是一套用于开发、训练、验证和保存深度学习模型的工具与运行机制,回答的是:

如何加载数据?如何计算损失?如何反向传播?如何更新参数?如何验证和保存模型?

一次典型的训练流程可以表示为:

加载数据
 → 前向计算
 → 计算损失
 → 反向传播
 → 更新参数
 → 验证模型
 → 保存模型

因此,训练框架组织的不只是模型结构,还包括数据、计算、优化和实验管理等环节。

以 PyTorch 为例

使用 PyTorch 时,通常从导入它提供的模块开始:

import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader

PyTorch 已经提供了许多可以直接复用的能力:

  • DatasetDataLoader:加载和组织数据
  • nn.Module:定义模型模块
  • nn.Linearnn.Conv2d:使用现成的网络层
  • nn.CrossEntropyLoss:计算损失函数
  • torch.autograd:自动计算梯度
  • torch.optim:更新模型参数
  • torch.cuda:使用 GPU

最基本的训练循环大致如下:

for x, y in dataloader:
    pred = model(x)              # 前向传播
    loss = loss_fn(pred, y)      # 计算损失

    optimizer.zero_grad()
    loss.backward()              # 反向传播
    optimizer.step()             # 更新参数

如果框架中没有需要的模块,也可以自己编写,再和 PyTorch 的其他组件组合起来:

class MyLayer(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(128, 64)

    def forward(self, x):
        return self.linear(x)

这就是在 PyTorch 提供的基础能力和规则之上,搭建自己的模型与训练流程。

框架不只是“零件仓库”

把框架理解成一组现成零件是一个很好的开始,但框架通常还会规定一套接口和运行规则。

例如在 PyTorch 中:

  • 模型通常继承 nn.Module
  • 模型的计算过程写在 forward
  • 参数通过自动求导获得梯度
  • 优化器负责更新参数
  • 数据通过 DatasetDataLoader 组织

这些约定让不同模块能够协同工作,也让框架可以接管 GPU 加速、自动求导、混合精度和分布式训练等底层工作。因此,框架既提供“零件”,也提供连接和运行这些零件的机制。

不同框架处于不同层次

深度学习工具并不一定处于同一层级,可以粗略地表示为:

PyTorch

Transformers、DeepSpeed、Lightning、ms-swift

自己的模型、数据和训练任务

PyTorch 更偏底层,提供张量计算、自动求导、网络层和优化器等基础能力。

如果这里的 SWIFT 指大模型训练中的 ms-swift,它通常建立在 PyTorch、Transformers 等基础工具之上,进一步封装模型微调、数据处理、训练配置、验证、保存和分布式训练等流程。它和 PyTorch 都可以被称为框架,但关注的层次不同。

“用某某框架跑任务”是什么意思

“用某某框架跑我们的任务”,核心意思是:

复用框架已经提供的能力,遵循它的接口和运行规则,组合已有模块,并按需补充自定义逻辑,从而完成任务。

也就是说,我们不必重复实现:

  • 数据加载
  • 训练循环
  • 反向传播
  • 参数更新
  • 验证和模型保存

如果框架没有完全满足需求,仍然可以自己编写数据处理、模型模块或损失函数,再把它们接入框架。使用框架并不意味着只能使用现成代码,而是在已有基础设施上完成自己的任务。

总结

可以用建筑来类比:

  • 模型架构:建筑的结构设计,决定柱子、梁和楼板如何连接
  • 训练框架:提供材料、工具、施工规范和施工流程
  • 训练任务:要建造的具体建筑
  • 自定义代码:针对特殊需求设计的新部件

因此:

模型架构是模型内部的结构组织方式;训练框架是完成模型开发和训练任务的基础设施与运行规则。用框架跑任务,就是站在已有能力之上完成工作,避免重复造轮子,同时保留根据需求扩展的自由。