持续更新中
- 吞吐:
大模型吞吐量的计算需要综合考虑模型的计算需求、硬件性能、系统架构以及软件优化等多个方面(计算量、硬件性能、并行策略、内存限制、通信开销、模型结构、软件优化、数据加载等)可能没有一个简单的公式,而是需要具体问题具体分析,结合实测和理论估算。
吞吐计算公式: B a t c h s i z e ∗ 设备数 单步时间( s / 步) \frac{Batch size * 设备数}{单步时间(s/步)} 单步时间(s/步)Batchsize∗设备数
训练吞吐:单位时间内处理的token数(token/s)(包含前向传播,反向传播,梯度同步等)
推理吞吐:单位时间完成的请求数或生成的token数(请求/s,token/s)
- FLOPs
- FLOPs(浮点运算次数)Floating Point Operations :完成一次计算任务所需的浮点运算(加法乘法等)的总次数
- FLOPS(每秒浮点运算次数)Floating Point Operations Per Second:硬件每秒能执行的浮点运算次数,是衡量计算设备性能的指标;
- FLOPs是计算量,FLOPS是算力;
- DDP(Distributed Data Parallel):
是 PyTorch 中用于多 GPU 训练的核心并行技术,旨在通过高效的数据并行策略加速模型训练,尤其适合大规模深度学习任务。通过多进程和 Ring-AllReduce 通信实现了高扩展性和低通信开销。其核心优势包括:
- 模型复制:每个gpu有一个完整的模型;支持单机多卡,多机多卡。
- 数据分片:数据均匀分配到GPU,每个GPU处理不同的数据子集;多进程(每个gpu一个进程)。
- 梯度同步:通过高效的通信协议Ring-AllReduce同步梯度,确保所有模型副本的参数一致。
实现:
初始化进程组
设置分布式训练环境,指定通信后端(如 NCCL)和进程间通信方式
封装模型:
数据加载器DistributedSampler确保gpu加载不同的数据分片
启动多进程:torch.multiprocessing.spawn
- 参数量:
各个模块的参数量:
Multi-head | |
QKV-w | D ∗ ( D n ∗ N ∗ 3 ) D*(D^n*N*3) D∗(Dn∗N∗3) |
QKV-b | ( D n ∗ N ∗ 3 ) ∗ 1 (D^n*N*3)*1 (Dn∗N∗3)∗1 |
dense-w | ( D n ∗ N ) ∗ D (D^n*N)*D (Dn∗N)∗D |
dense-b | ( D n ∗ N ) ∗ 1 (D^n*N)*1 (Dn∗N)∗1 |
FFN | |
dense-w | D ∗ D ′ D*D' D∗D′ |
dense-b | D ′ ∗ 1 D'*1 D′∗1 |
out_dense-w | D ′ ∗ D D'*D D′∗D |
out_dense-b | D ∗ 1 D*1 D∗1 |
LN*2 | |
scale | 1*D |
bias | 1*D |
transformer总参数量: L ∗ ( M H A + F F N ) + 2 ∗ L N L*(MHA + FFN) + 2*LN L∗(MHA+FFN)+2∗LN
位置编码: S e q l e n ∗ D Seqlen*D Seqlen∗D
词典: V o c a b S i z e ∗ D VocabSize*D VocabSize∗D
- 时间复杂度:
MHA 和 FFN是计算复杂度的主要贡献者。
- Attention部分: O ( N 2 ∗ D ) O(N^2*D) O(N2∗D), 序列长度N是计算瓶颈;多头并行计算所以不增加时间复杂度。
- FFN部分: O ( N ∗ D 2 ) O(N*D^2) O(N∗D2),维度D是计算瓶颈
- 总体: L ∗ ( O ( N ∗ D 2 ) + O ( N 2 ∗ D ) ) L*(O(N*D^2) + O(N^2*D)) L∗(O(N∗D2)+O(N2∗D))
Multi-head | 时间复杂度 | |
嵌入层 | 查表操作 | N D ND ND |
QKV映射 | N ∗ D → D*3D N ∗ 3 D N*D\xrightarrow{\text{D*3D}}N*3D N∗DD*3DN∗3D | N D 2 ND^2 ND2 |
attention分数 | N ∗ D → D*N N ∗ N N*D\xrightarrow{\text{D*N}}N*N N∗DD*NN∗N | N 2 D N^2D N2D |
加权和 | N ∗ N → N*D N ∗ D N*N\xrightarrow{\text{N*D}}N*D N∗NN*DN∗D | N 2 D N^2D N2D |
FFN | ||
第一层扩展 | N ∗ D → D*4D N ∗ 4 D N*D\xrightarrow{\text{D*4D}}N*4D N∗DD*4DN∗4D | N D 2 ND^2 ND2 |
第二层压缩 | N ∗ 4 D → 4D*D N ∗ D N*4D\xrightarrow{\text{4D*D}}N*D N∗4D4D*DN∗D | N D 2 ND^2 ND2 |
LayerNorm | ||
均值方差 | N ∗ D N*D N∗D | |
残差连接 | 矩阵加法 | N ∗ D N*D N∗D |
6.DeepSpeed
推理加速
- KV cache:推理时每一步不需要重新计算K,V,将新的输入token与之前序列返回的K,V进行拼接后得到新的K,V(空间换时间);
问题:
- torch如何高效读取数据?