大模型相关算子
系列文章
大模型算子
基本知识框架
什么是“算子”
算子(Operator)是实现某种数学运算的最小程序单元。
在大模型中,“算子”就是你写的 matmul、conv2d、softmax、layernorm 等操作在底层的真正执行者。
举个例子,你写的 PyTorch 代码:
output = torch.nn.functional.softmax(x, dim=-1) |
实际上调用的底层是:
- PyTorch 封装的 softmax算子
- 底层可能是 C++/CUDA 编写的高效实现
- 运行时会调用:
aten::softmax→ libtorch → CUDA kernel
算子的基本分类
| 类型 | 示例 | 特点与挑战 |
|---|---|---|
| 线性算子 | matmul、linear、conv | 算力占比最高,需要高度优化 |
| 归一化算子 | batchnorm、layernorm | 对内存访问、并发要求高 |
| 激活函数 | ReLU、GELU、Sigmoid | 简单但频繁,需向量化 |
| 注意力算子 | softmax、mask、scaled dot product | 大模型专属,性能瓶颈所在 |
| 高阶结构算子 | transformer、MoE、RNNCell | 组合算子,框架可自动融合优化 |
与框架的关系
框架(PyTorch、TF、MindSpore)主要负责:
| 模块 | 功能 |
|---|---|
| 前端API | 提供用户调用接口,如 nn.Linear、torch.matmul |
| 中间表示(IR) | 如 PyTorch 的 TorchScript / XLA、TF 的 GraphDef |
| 算子注册库 | 每个算子在 CPU/GPU/NPU 等平台上的实现 |
| 执行器/调度器 | 根据平台调度最优算子,支持自动混合精度、算子融合等 |
举例:
PyTorch API |
大模型中重要的“关键算子”
大模型训练/推理中,主要耗时/算力集中在以下算子:
| 模块 | 关键算子 |
|---|---|
| Embedding | embedding lookup, layernorm |
| Attention | matmul, softmax, masking, scaled dot |
| MLP层 | matmul, gelu, dropout |
| 输出层 | matmul, softmax |
算子优化方式
| 优化手段 | 简介 | 示例 |
|---|---|---|
| 算子融合 | 多个简单算子合并为一个复杂内核 | layernorm+gelu |
| 内存布局优化 | 改变张量内存排列方式,提高访存效率 | NCHW → NHWC |
| 低精度优化 | 使用 FP16 / BF16 / INT8 等混合精度计算 | NVIDIA Tensor Core |
| 编译器优化 | 使用 XLA、TensorRT、Ascend C 等编译执行 | HuggingFace + TensorRT |
| 异构调度 | CPU/GPU/NPU 之间的算子自动分配 | MindSpore、TVM |
基本上一个大模型的训练(推理)过程的每一条指令流程就是:
你写的代码 |
算子如何链接代码与硬件
以LayerNorm为例,
