超节点FSDP2训练MOE大模型:GroupedMatmul NZ使能和性能收益分析

背景介绍

在A3超节点512die上,基于某企业的自研框架Xtuner训练Qwen3 235B MOE。本文对FSDP2下,如何使能GroupedMatMul NZ特性进行了深入展开,最终取得整网2+%的性能收益。9月8日Xtuner V1开源后,某企业在H800上进一步优化了性能(TGS 2000=>2100+),我们也需要在昇腾上一直摸高,才能维持住A3超节点的竞争力。

1. 训练中的GMM NZ 技术选型

1.1 矩阵乘相关特殊格式:NZ格式

FRACTAL_NZ是物理内存排布的分形格式,tensor数据格式为NW1H1H0W0,即:整个矩阵被分为(H1W1)个分形,按照column major排布,形状如N字形;每个分形内部有(H0W0)个元素,按照row major排布,形状如z字形。考虑到数据排布格式,将NW1H1H0W0数据格式称为NZ格式。更为常见的是ND数据格式,ND格式tensor可通过Pad、拆分以及转置等操作转换为NZ格式。

NPU矩阵运算会在MTE2搬运过程中,将ND格式输入随路转换成较为亲和的NZ数据格式来参与后续运算,随路数据格式转换会损失一部搬运效率。如果算子接受到的本身就是NZ数据格式,则可以将这部分随路转换的过程给省略掉,从而提高搬运效率,提升性能。

在推理实践中,GroupedMatmul算子接受NZ格式的权重,输出ND格式的激活值,性能优于ND格式权重输入的情形。由于推理只涉及网络前向运算,仅需一次性加载权重并转为NZ格式,在后续的多次推理中,复用NZ格式的权重进行运算即可取得性能增益,无需考虑ND转NZ本身带来的性能开销。

训练包括使用权重参与前向计算和反向更新权重,可能涉及多次ND和NZ格式转换,需要权衡GMM使能NZ的成本和收益。在xtuner框架下Qwen 235B MoE训练中,进入GMM算子运算前,手动将权重转NZ,代码实现如下。

weight = weight + 0
weight = torch_npu.npu_format_cast(weight,29)
out = NpuGMMOp.apply(weight, x, tokens_per_expert)

显然,小算子实现额外增加ND转NZ的transdata算子耗时,结果证明对于给定shape的weight,转NZ带来的性能开销完全抵消使能GroupedMatmul NZ的性能收益,以致性能劣化。

GMM中weight.shape=(128,4096,3072)时, 转NZ的数据搬运量为2sizeof(BF16)12840963072 Bytes,昇腾A3的标称带宽为1.6TB/s,在集群训练带宽利用率达到80%的情况下,耗时为4.578 ms,完全可覆盖GMM NZ的性能收益(参考3.4节中profiling,同shape下GMM NZ耗时从约22ms下降至约20ms)。

1.2 FSDP2框架下的NZ使能方案和收益分析

在FSDP2框架下,MOE权重依次经过内存初始化和分片 --> 各卡加载权重 -->每一层计算前 all gather这一层的所有权重 --> copy_out --> 参与GMM的计算。All gather集合各卡的权重分片,并将完整的权重参数保存在HCCL_BUFFER的临时内存中,随后通过torch::split_sizes_with_copy将完整权重参数copy out至device侧参与运算。ND到NZ格式的权重转换本质上也涉及HBM至device侧的数据搬运,因此融合slice和转NZ操作能避免增加HBM访问压力、减少转NZ耗时。

从计算过程看:

1.每张卡保存的分片内存为ND格式;

2.每一层allgather后,GMM的权重在copyout的过程中转为NZ格式,进行正、反向计算。

3.反向计算完梯度,输出格式为ND,并通过reducescatter操作,将梯度reduce后scatter到各自分片参数所在的卡上。最后,优化器计算阶段,每张卡上的ND参数分片与梯度、优化器一起完成参数更新。 本文的优化过程仅涉及第2步,第1、3步为FSDP2原有流程。

反向梯度的计算过程,如下图所示,假设输出Y,输入激活X,权重W。只有算激活梯度的GMM,会用到参数权重W,可以通过NZ使能进行加速优化。参数梯度的GMM反向计算,性能是没有收益的。

在其他主流框架如megatron中,把权重切分(TP/PP/EP)到每张卡上分别进行前向运算,**没有FSDP2的all gather过程及正反向计算过程的权重和参数更新过程的分片为两块独立内存的情况。**若megatron将本地持有的权重转换为NZ格式保存,需要打通很多计算步骤,例如:

• 需要PTA支持显式ND、NZ格式权重的GMM计算;

• 需要PTA支持NZ格式的内存申请和释放;

• 反向GMM参数梯度输出为ND格式,需要支持ND格式梯度和NZ格式参数的更新。

我们对NZ格式的权重训练做了初步的探索,证明确实此路难通。最后我们依托于FSDP2训练框架,将训练过程中正反向计算用到权重的地方,借助copyout申请的临时内存,将GMM权重转换为了NZ格式并不引入额外的HBM搬入搬出开销;同时还不影响优化器更新、权重加载等原有流程。

2. PTA拦截NZ格式

PTA框架会对NZ这一私有格式进行拦截。为使能GMM NZ,我们有如下尝试,均以失败告终。具体行动及其结果如下:

(1)模型初始化时,为MM/GMM初始化NZ格式的内存。结果:释放内存的时候,NZ格式报错。 (2)加载模型权重后,转为NZ格式。结果:GMM实际入参权重为ND格式。

(3)在all gather后copy out同时,显式转NZ,随后进入GMM前向运算。结果:采集profiling观察到slice算子输出转为能被PTA识别到的FRACTAL_NZ格式,但GMM入参权重依旧保持ND格式;而slice算子与GMM前向运算之前未历经任何运算算子。

2.1 绕过PTA使能NZ

为规避PTA框架的拦截,令sliceNZ算子的输出实质保持NZ格式,但被PTA框架识别为ND格式。

PTA框架对于私有格式把控较为严格,无法显式修改tensor的数据排布格式。只能通过调用数据格式转换算子(transdata)来进行数据格式转换,而调用额外算子又会带来额外的性能损耗。

分析CANN算子,我们发现aclnn_grouped_matmul_weight_nz 这样一个aclnn接口,接受ND格式的权重输入,但是实际将权重视为NZ格式。如果我们可以调用这类NZ算子,就可以绕过框架使能NZ数据格式,这正是我们想要的。

我们将上述需求拆解为两部分

(1)获取实际数据排布为NZ的权重

(2)适配PTA直接调用aclnn_grouped_matmul_weight_nz算子

如上所述,我们在copy_out 的同时,将GMM的权重转换为NZ格式,即调用一个算子(sliceNZ)将权重slice,并转换为NZ格式排布,框架侧使用ND格式的tensor接受权重,再通过调用aclnn_grouped_matmul_weight_nz来使能NZ。

2.2 效果验证

应用如下单算子测试验证权重输出的格式,其中torch_npu.npu_special_slice为sliceNZ融合算子的PTA接口。torch_npu.get_npu_format(b)返回结果为ND,表明该输出成功被PTA框架识别为ND格式。

import torch,torch_npu

end = 8*3072*4096

torch_npu.npu.config.allow_internal_format = True
a = torch.randn((16,end),dtype=torch.bfloat16).npu()
b = torch.empty((128,3072,4096),dtype=torch.bfloat16).npu()

torch_npu.npu_special_slice(a, 1, 0, end, b)
print(torch_npu.get_npu_format(b)) # 结果为ND

采集profiling,发现输出成功转为NZ格式。

整网同样成功使能NZ。

3. sliceNZ算子适配

3.1 算子原型

PTA框架中的copy_out(slice)算子直接调用torch::split_with_sizes_copy接口。对于all gather后的完整权重all_gather_output,FSDP2框架对其dim维度进行切分,all_gather_input_split_sizes指明了切分后的各tensor长度。该函数的输出Listout中,末尾两个tensor对应MoE中gate_proj、up_proj和down_proj模块权重,其中gate_proj和up_proj在out轴做合并,shape为[num_expert,hidden_size,dim*2];down_proj的shape为[num_expert,dim,hidden_size]。

@torch.library.impl(lib, "split_with_sizes_copy", "PrivateUse1")
def split_with_sizes_copy(
    all_gather_output: torch.Tensor,
    all_gather_input_split_sizes: List[int],
    dim: int,
    out: List[torch.Tensor],
) -> None:
    torch.split_with_sizes_copy(
            all_gather_output, all_gather_input_split_sizes, dim=dim, out=out
        )

sliceNZ算子原型如下,函数签名类似slice算子本身,但由按照长度切分改为按照入参tensor self在dim维的开始start和结束end切分索引。该算子还接受入参output,通常是3D tensor(output.shape = [num_expert, n, k]);当专家数为1时,可以是2D tensor。output是一块预分配的内存,将sliceNZ算子切分并转为NZ格式的输出写入output中。output将充当后续GroupedMatmul前向计算的权重。

aclnnSliceNzGetWorkspaceSize(const aclTensor *self, unit64_t dim, unit64_t start, unit64_t end, aclTensor *output)

3.2 PTA接口绑定

基于op-plugin官仓,可为自定义算子绑定PTA接口。

(1)结构化适配

在op_plugin_functions.yaml文件中自定义算子custom字段下添加上述aclnn算子的接口调用,(a!)代表原地修改:

- func: npu_special_slice(Tensor self, int dim, int start, int end, Tensor(a!) output) -> ()
    op_api: [v2.1, newest]
    gen_opapi:
      exec: aclnnSliceNz, self, dim, start, end, output

(2)PTA编包

首先,确定编译使用的PTA分支,此处所需的GroupedMatmul切K轴特性已合并到主线,即v2.6.0及后续版本。其次,依据PTA包中的dockerfile搭建编包容器。最后,执行编译命令,获得.whl格式的PTA安装包。

(3)修改原始slice算子实现

安装上述PTA包后(同时安装包含该aclnn算子的CANN包,CANN包编译安装和应用环境保持一致),即可通过torch_npu.npu_special_slice调用sliceNZ算子。 为了在FSDP2框架中使能sliceNZ,我们的修改逻辑是: •在slice的输出中,找到为GMM weight预分配的内存,从而确定slice切分的索引 •将预分配内存view shape由2D([num_rank, n*k])修改为3D([num_expert, out_feature, in_feature]) •GMM weight调用sliceNZ,其他weight仍用slice算子

@torch.library.impl(lib, "split_with_sizes_copy", "PrivateUse1")
def split_with_sizes_copy(
    all_gather_output: torch.Tensor,
    all_gather_input_split_sizes: List[int],
    dim: int,
    out: List[torch.Tensor],
) -> None:
    # out为切分后的预分配内存 List<Tensor>,长度为6。前四个tensor将用于MatMul,后两个tensor将用于GroupedMatmul
    # 其他算子可能经过slice,通过out[-1]的shape进行筛选
    if len(all_gather_input_split_sizes) > 1 and out[-1].shape[0] * out[-1].shape[1] >= 128 * 4096*1536:
        from special_op import npu_special_slice
        num_rank = out[0].shape[0]
        total_size = sum(all_gather_input_split_sizes)
        weight_1_size = out[-1].shape[1]
        weight_2_size = out[-2].shape[1]

        weight_1_start = total_size - weight_1_size
        weight_2_start = weight_1_start - weight_2_size

        num_exp = 128
        in_dim1, out_dim1 = 1536,4096 # down_proj
        in_dim2, out_dim2 = 4096,3072 # torch.cat((gate_proj,up_proj),dim=1)
        
        out[-1].resize_(num_exp,out_dim1,in_dim1)
        out[-2].resize_(num_exp,out_dim2,in_dim2)
      
        npu_special_slice(all_gather_output, dim, weight_1_start, total_size, out[-1])
        npu_special_slice(all_gather_output, dim, weight_2_start, weight_1_start, out[-2])

        other_tensors = all_gather_output[:, :weight_2_start].view(num_rank, -1)
        torch.split_with_sizes_copy(
                other_tensors, all_gather_input_split_sizes[:-2], dim=dim, out=out[:-2]
        )
        
        return

3.3 512对齐的性能影响

昇腾A2和A3系列芯片上一个cacheLine是512B,通过遍历各个cacheLine的方式读取数据。如果不做对齐,读取512B数据需要访问2个cacheLine,这会直接导致 sliceNZ的性能劣化约30%。

Qwen 235B模型单层的FSDPParamGroup中gate_param和norm_param 切分后,group通信参数量不易被512整除。解决方案为修改fully_shard切分策略,只切分参数量512对齐的linear模块。

3.4 性能收益分析

在Qwen3 235B MoE模型训练中,对于两种shape(参考5.1节)的GMM weight,sliceNZ单算子性能耗时分别在2.7ms和5.2ms左右。 应用sliceNZ前后,slice算子总耗时由1.68s增加至约2.36s,即单步slice NZ转换的性能开销为0.68s。 单步整网共经历750个GMM算子,NZ格式下GMM算子性能提升约7%:总耗时由12.75s下降至11.98s。

94层整网性能从2100tgs提升至2148tgs,即GMM NZ的性能收益提升约2+%。 GMM ND方案整网训练日志(单die):

GMM NZ方案整网训练日志(单die):

4. GMM NZ 前反向使能

PTA中的GMM算子torch_npu.npu_grouped_matmul支持接受NZ格式的权重输入,但没有绑定反向代码实现。GMM的反向也是GMM,前向中对m轴进行切分,反向实现需要支持k轴切分,该特性已合并至PTA的v2.6.0主线分支。

4.1 GMM算子原型

非量化、无偏置场景下,计算公式为

实际x.shape = [m,k],weight.shape = [num_expert,k,n]。

outs = torch_npu.npu_grouped_matmul([x], [weight], group_list = tokens_per_expert, group_type = 0, group_list_type = 1, split_item = 2)[0]

上述代码实际执行的操作,是把X按照m轴切分num_expert个,分别作为单个专家的Matmul输入;按专家进行Matmul。

对于输入

其中第i个分片

与之对应的权重分片为

二者进行matmul的输出为

GroupedMatMul的输出为

4.2 前反向适配

由于torch_npu.npu_grouped_matmul算子不支持反向,需要手动适配GMM反向;而GMM的反向也能通过GroupedMatMul实现,公式推导如下:

在前向重计算时,我们保存了前向权重weight.shape=[num_expert,k,n],和激活值x.shape=[m,k];并接受入参

反向计算激活值梯度和权重梯度的代码实现如下。

# 激活值的梯度
grad_input = torch_npu.npu_grouped_matmul([grad_output], [weight.transpose(1,2)], group_list = tokens_per_expert, group_type = 0, group_list_type = 1, split_item=2)[0]
# 权重的梯度
grad_weight = torch_npu.npu_grouped_matmul([input_tensor.T], [grad_output], bias=None,group_list = tokens_per_expert,split_item=3, group_type=2, group_list_type=1)[0]

显然在计算权重梯度时,要对转置后的X实际切分第二维,即切k轴。 在GMM算子前反向适配中,我们在上下文中保存前向的激活值和梯度,反向入参为

from torch.autograd import Function
import torch_npu
from torch_npu import transfer_to_npu

class NpuGMMOp(Function):
    @staticmethod
    def forward(ctx, weight, x, tokens_per_expert):
        # 假设weight.shape=[k,n],x.shape=[m,k]
        # tokens_per_expert.shape=[num_expert],且torch.sum(tokens_per_expert)=m
        ctx.save_for_backward(weight,x,tokens_per_expert)
        outs = torch_npu.npu_grouped_matmul([x], [weight], group_list = tokens_per_expert, group_type = 0, group_list_type = 1, split_item = 2)[0]
        return outs
    
     @staticmethod
    def backward(ctx, grad_output):
        weight,input_tensor,tokens_per_expert = ctx.saved_tensors
        grad_input = torch_npu.npu_grouped_matmul([grad_output], [weight.transpose(1,2)], group_list = tokens_per_expert, group_type = 0, group_list_type = 1, split_item=2)[0]
        grad_weight = torch_npu.npu_grouped_matmul([input_tensor.T], [grad_output], bias=None, group_list = tokens_per_expert, split_item=3, group_type=2, group_list_type=1)[0]
        return grad_weight, grad_input, None

if __name__ == "__main__":
    # 假设此处已有符合条件的GroupedMatmul入参:weight, x和tokens_per_expert
    out = NpuGMMOp.apply(weight, x, tokens_per_expert)

5. GMM冗余Transpose的消除

使能sliceNZ后,发现总体性能未有明显增益。排查profiling后发现,手动适配PTA前反向过程中,冗余的transpose显著增加性能开销,完全覆盖了GMM NZ的性能提升。接入GMM NZ后,单步训练的transpose算子总耗时从约0.05s上升至1.2s,总耗时占比达2%。

5.1 MoE结构分析

MoE结构包含多个结构相同、权重不共享的前馈网络(专家),第i个专家的输出可以表示为

其中up_proj = nn.Linear(d_model, d_ff),down_proj = nn.Linear(d_ff, d_model)。门控网络gate_proj的shape与up_proj一致,为每个token选择top_k个专家(并将top_k个专家权重归一化)。为充分利用并行矩阵乘的运算效率,将gate_proj和up_proj在d_ff(即out_feature)维度合并。

对于Qwen3 235B MoE模型,专家数num_expert = 128,隐藏层大小d_model = 4096,前馈网络的尺寸为d_ff = 1536。前向训练中历经两次GMM运算,输入权重分别为Concat([gate_proj.weight, up_proj.weight]).shape = (num_experts, d_model, d_ff * 2) = (128, 4096, 3072) 和 down_proj.weight.shape = (num_experts, d_ff, d_model) = (128, 1536, 4096);up_proj和down_proj接收的激活值分别为,X1.shape = (batch_size * seq_len, d_model) ,X2.shape = (batch_size * seq_len, d_ff)。

xtuner框架中对于gmm weight的初始化遵循类似nn.Linear的实现,即对于in_feature-->out_feature的线性映射,入参weight.shape=(out_feature,in_feature),矩阵乘的底层逻辑为x@weightT。但对于torch_npu.npu_grouped_matmul来说(4.1节),第i个专家的实现为x_i@weight_i,因此入参weight.shape=(num_expert, in_feature,out_feature)。在xtuner框架中适配该GMM算子,必须对weight的in轴和out轴进行转置。为避免这一开销,我们选择调整权重初始化和加载逻辑。

5.2 权重加载和切分逻辑修改

采用32机512die集群训练,FSDP2框架首先对专家进行切分,即4张卡共享一个专家。以四张卡为一组,xtuner框架的对于同一层、同一专家的MoE权重加载逻辑为:每张卡均加载down_proj权重;前两张卡仅加载gate_proj权重,后两张卡仅加载up_proj权重。随后四张卡对权重的out_feature均匀切分,如下,0和0’分别代表专家0的gate_proj和up_proj权重。

all_gather时,对gate_proj和up_proj的out_feature进行合并,得到shape为(128,3072,4096)的weight参与GMM前向计算。即对权重的切分与合并均发生在out_feature。 为消除GMM前后的冗余transpose,我们在权重初始化过程中提前对out_feature和in_feature进行转置。

相应地,也需修改权重加载和切分逻辑,否则FSDP2框架将对gate_proj/up_proj的in_feature进行切分,而all_gather仍对gate_proj/up_proj的out_feature进行合并。结果如下,这一定会造成精度问题:

(1)单卡实际加载权重shape为(d_ff,d_model//4)=(1536,1024),和预分配内存shape(d_ff*2,d_model//4)=(3072,1024)不一致;

(2)0卡和1卡只加载gate_proj的in轴前1/4和1/4-1/2,2卡和3卡只加载out_proj的in轴1/2-3/4和最后1/4。即gate_proj和up_proj的权重各损失了一半。

因此,令同一专家组的四张卡均加载相同的gate_proj和up_proj权重,读取时即对out_feature进行合并,随后各卡按编号顺序切分in_feature,确保切分与all_gather 合并均发生在权重的in_feature。in_feature和out_feature转置视图下,修改后单卡加载结果如下。

在xtuner框架的权重读取逻辑中,根据用户指定的FSDP shard参数确定每张卡从hf_keys中读取的MoE权重索引,其中hf_keys为单层所有专家的gate_proj和up_proj权重名List,形如 [...,"model.layer.0.mlp.experts.i.gate_proj.weight","model.layer.0.mlp.experts.i.up_proj.weight",...]。类似地,专家组内部的权重切分索引由start和end变量指定。

总结与展望

自Xtuner V1开源后,我们展开了进一步深入的工作,其中有意义的几件事:

1、通过sliceNZ和GMM NZ前反向使能,成功地在FSDP2上拿到了训练2%的性能收益,维持住了A3超节点相对H800的性能优势;

2、给出GMM NZ使能后消除transpose开销的办法:通过权重加载和切分逻辑适配;

3、走通了PTA接入自定义算子的流程。

相关推荐

大模型---FSDP

大模型---FSDP(持续更新~) (1)FSDP流程 (2)FSDP unit (3)FSDP的overlap (4)Full Shard和Hybrid Shard (5)FSDP1与FSDP2的区别 (6)FSDP 和 DDP、ZeRO、FairScale 的关系

weixin_69884785的博客 358

【免费下载】 TorchTitan项目中的FSDP2技术解析:新一代全分片数据并行方案

在深度学习模型训练领域,数据并行技术是解决大规模模型训练的关键。PyTorch生态中的全分片数据并行(FSDP)技术经过迭代演进,推出了全新的FSDP2版本。本文将深入解析TorchTitan项目中采用的FSDP2技术,帮助开发者理解其设计理念、技术优势和使用方法。 ## FSDP1的局限性 传统的FSDP1实现虽然提供了高效的eager模式执行能力,包括通信分桶和通信/计算重叠等功能,但其核...

gitblog_00448的博客 1399

深入解析CANN算子开发中的数据排布格式:NCHW、NHWC、NC1HWC0、FRACTAL_Z、FRACTAL_NZ详解

数据排布格式(Data Layout Format)定义了张量在内存中的存储顺序和读取方式。在神经网络的不同计算阶段(例如卷积层、全连接层等),数据往往需要以不同的维度进行操作。为了确保在这些操作中能够高效地读取和处理数据,深度学习框架通常会定义特定的排布格式来组织张量。不同的深度学习框架和硬件往往会使用不同的格式。例如,TensorFlow使用NHWC格式,而Caffe则更倾向于使用NCHW格式。

qq_38334677的博客 985

PyTorch tutorials分布式训练:DDP与FSDP2并行计算架构解析

在深度学习模型训练中,随着模型规模和数据量的增长,单GPU已难以满足需求。分布式训练通过多GPU并行计算提升效率,PyTorch提供了DDP(Distributed Data Parallel,分布式数据并行)和FSDP(Fully Sharded Data Parallel,完全分片数据并行)两种核心方案。本文将对比解析DDP与FSDP2的架构原理、使用场景及性能优化策略,帮助用户根据实际需求选...

gitblog_00836的博客 1213

鸿蒙手机卸载内置应用 adb连接

**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**

JJDXBT的博客 3万+

绕过卡巴斯基通过RPC控制lsass注入DLL

参考国外的XPN以及3gstudent大佬的文章: https://blog.youkuaiyun.com/xiangshen1990/article/details/104872566 https://gist.github.com/xpn/93f2b75bf086baf2c388b2ddd50fb5d0 原理:正常的ssp扩展(dll)可以加载到lsass进程中去,比如kerberos验证都是通...

2ed 3525

超节点FSDP2训练MoE大模型昇腾联创设计(下)

为了进一步挖掘 XTuner V1 训练方案的上限,实验室研究团队与华为昇腾技术团队在 Ascend A3 超节点上进行联合优化,充分利用超节点硬件特性,FSDP2首次在Qwen 235B MoE上实现了相比传统3D并行更高的 MFU(Model FLOPS Utilization,模型浮点运算利用率)。在理论算力落后 NVIDIA H800 近 20% 的情况下,最终实现训练吞吐超过 H800 近 5%,MFU 反超 20% 以上。

devascend的博客 1223

智慧楼宇解决方案-全套大合集

智慧楼宇解决方案,楼宇能耗-环境-设备统一管控解决方案。

byte58的博客 2592

FSDP2 原理介绍及与 Megatron/DeepSpeed对比

FSDP2 本质是「去中心化的全分片数据并行框架」,核心是「数据并行为基底 + 自动全量张量分片」,所有GPU地位平等(无主从节点),所有并行逻辑由PyTorch原生分布式通信层(torch.distributed)实现。核心区别:DeepSpeed/Megatron 是独立的第三方框架,需要额外引入依赖;FSDP2 是PyTorch内置模块(),无需额外安装,与PyTorch生态无缝衔接。

cpz454446202的博客 1612

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

MQL5教程 01 MT5有关EA的操作、MetaEditor 工具栏主要功能

weixin_42830015的博客 3991

基于 Langchain 开发一个完整的支持多轮数据分析(直连 mysql 数据,多表综合分析 SQL 取数,数据分析,报表生成)ChatBI 系统(前后端完整实现源代码)

ChatBI系统开发摘要 本文介绍了基于Langchain的多轮数据分析ChatBI系统开发方案。该系统支持MySQL数据库连接,提供多表分析、SQL查询、数据分析和报表生成功能。系统采用前后端分离架构:前端使用React+Ant Design+ECharts实现交互界面;后端基于FastAPI搭建服务,集成Langchain处理自然语言到SQL的转换;核心技术栈还包括SQLAlchemy、Pandas和Matplotlib。 系统核心模块包括: 数据库连接层:使用SQLAlchemy管理MySQL连接 L

AI天才研究院 818

verl FSDP2全面支持:torch分布式团队推荐方案

verl FSDP2全面支持:torch分布式团队推荐方案 【免费下载链接】verl verl: Volcano Engine Reinforcement Learning for LLMs 项目地址: https://gitco...

gitblog_00594的博客 1357

UNet 改进(27):结合SCSE注意力机制的UNet网络实现

本文介绍了一种结合SCSE注意力机制的改进UNet网络架构。该网络在保持UNet经典编码器-解码器结构基础上,通过在每层添加SCSEBlock模块,融合了通道注意力和空间注意力机制。通道注意力通过全局池化和1×1卷积生成通道权重,空间注意力则产生空间权重图,二者相加增强关键特征响应。该设计具有以下优势:1)保持原始UNet的多尺度特征提取能力;2)通过注意力机制提升对重要区域的关注度;3)计算效率高,仅增加少量参数。测试显示网络能保持输入输出分辨率不变,适用于医学图像分割等像素级预测任务。完整代码实现了5层

2401_82355416的博客 415

超节点FSDP2训练MoE大模型昇腾联创设计(上)

2025年9月8日,上海人工智能实验室开源书生大模型新一代训练引擎XTuner V1。XTuner V1 是伴随上海AI实验室“通专融合”技术路线的持续演进,以及书生大模型研发实践而成长起来的新一代训练引擎。相较于传统的 3D 并行训练引擎,XTuner V1 不仅能应对更加复杂的训练场景,还具备更快的训练速度,尤其在超大规模稀疏混合专家(MoE)模型训练中优势显著。

devascend的博客 1753

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

UNet改进(52):轴向+代理注意力让UNet既轻快又精准

本文提出了一种改进的UNet架构,通过引入轴向注意力代理模块增强医学图像分割性能。该模块将二维自注意力分解为行列两个一维注意力操作,结合可学习代理节点进行全局信息聚合,在保持计算效率的同时提升模型对长距离依赖的建模能力。实验表明,该方法在多个医学图像数据集上较传统UNet提升3.2%-5.7%的Dice系数,边界质量显著改善。该方案特别适用于具有方向性结构的医学图像分割任务,如血管、器官等,在计算复杂度和分割精度之间实现了良好平衡。

2501_91516851的博客 328

CANN/asc-devkit数据排布格式详解

数据排布格式(Data Layout Format)是深度学习中对多维Tensor在内存中存储方式的描述。 常见的数据格式包括ND、NHWC和NCHW等,为Tensor的每个轴赋予了特定的业务语义。 除了上述NHWC和NCHW格式外,还存在一些特殊的私有数据格式,如FRACTAL\_NZ(也简称NZ)、NC1HWC0、FRACTAL\_Z、NDC1HWC0、FRACTAL\_Z\_3D等。这些

gitblog_00493的博客 446

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

PyTorch 原生FP8训练进展

float8训练格式是由NVIDIA、ARM和Intel在2022年的一篇论文(https://arxiv.org/abs/2209.05433)中提出的,该论文证明了使用更低精度float8进行训练的可行性,且不会牺牲模型质量。随着NVIDIA Hopper系列等新型GPU的推出,由于原生float8张量核心支持,FP8训练变得可行,有望实现超过2倍的训练吞吐量提升。实现这一承诺面临一些挑战:(i) 在float8中启用核心模型操作如matmul和attention, (ii) 在分布式框架中启用。

zengxiaojian2的博客 1608

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

一文了解AOL算子加速库

为加速大模型算力释放,昇腾提供AOL(Ascend Operator Library)算子加速库,不仅覆盖Softmax、MatMul等基础算子,也包括了大模型结构泛化的Flash Attention等高性能融合算子,开发者可以直接使用昇腾内置的算子加速库使能大模型创新与应用。

m0_71340392的博客 1790

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Apache Beam 新 Committer 入职指南:从 ICLA 到绿色 Merge 按钮的完整流程

本篇技术指南基于仓库中 [contributor-docs/committer-onboarding.md](https://link.gitcode.com/i/46f6ec07011395c47f399750b593d345) 的原始检查单展开,面向新当选的 Apache Beam Committer 以及负责接纳流程的 PMC 成员,系统讲解 ASF 账号验证、GitHub 权限打通、ICL

gitblog_00144的博客 246

突破GPU内存限制:PyTorch FSDP2分布式训练实战指南

在当今深度学习领域,模型规模的爆炸式增长使得单GPU训练变得愈发困难。传统的分布式数据并行(DDP)方法虽然能够加速训练,但在内存使用效率上存在明显瓶颈。PyTorch FSDP2(Fully Sharded Data Parallel)作为革命性的分布式训练技术,通过创新的参数分片和通信优化机制,成功解决了这一挑战。 ## FSDP2核心技术原理深度解析 FSDP2的核心突破在于其智能的内存

gitblog_00683的博客 927

NeMo-RL项目中的FSDP2全量支持方案解析

在深度学习模型训练领域,完全分片数据并行(FSDP)是一种重要的分布式训练技术。NeMo-RL项目作为强化学习框架,目前同时支持FSDP1和FSDP2两种实现路径,但长期目标是完全转向FSDP2路径。 ## 当前技术挑战 项目目前面临的主要技术难点在于:FSDP2路径需要对模型结构做出明确假设才能正确应用。具体来说,FSDP2需要在模块级别进行分片,而如何自动识别适合分片的模块边界是一个关键问...

gitblog_07423的博客 538

大模型训练避坑指南:如何用FSDP2在单机多卡上高效训练百亿参数模型

本文详细介绍了如何利用FSDP2技术在单机多卡环境下高效训练百亿参数大模型。通过解析FSDP2的架构革新、显存优化实战技巧和性能调优策略,帮助开发者避免常见陷阱,提升训练效率。特别针对分布式训练框架中的通信优化和编译加速提供了实用建议,适用于资源受限的中小型团队。

weixin_42522953的博客 424

突破单GPU内存限制:PyTorch FSDP2大规模模型训练的架构革新

在深度学习模型规模指数级增长的今天,单GPU内存已成为制约模型训练的关键瓶颈。PyTorch FSDP2(Fully Sharded Data Parallel)通过参数分片、梯度聚合和计算通信重叠三大核心技术,实现了对传统数据并行范式的革命性突破。本文将深入解析FSDP2在Transformer架构优化、内存管理机制和分布式通信策略方面的技术创新,为百亿参数级模型训练提供工程实践指南。 ##

gitblog_01174的博客 666

【AI系统】昇腾数据布局转换

NHWC 的数据排布方式更适合多核 CPU 运算, NCHW 的数据排布方式更适合 GPU 并行运算。那么接下来让我们了解一下在华为昇腾的 NPU 中,这种特征图的存储方式。截止到 2024 年,华为昇腾在私有格式的数据处理和特殊的数据形态越来越少,主要是得益于 AI 编译器和软件的迭代升级,更加合理地兼容业界主流的算子和数据排布格式。

ZOMI酱 2297

昇腾NPU架构设计 从抽象硬件模型到物理实现

昇腾NPU(Neural Processing Unit)作为华为自研的AI加速器,其架构设计体现了"软件定义硬件"与"硬件加速软件"的双向协同哲学。本文基于我十三年的芯片设计经验,深度解构昇腾达芬奇架构从抽象硬件模型到物理实现的完整技术栈。我们将揭示AI Core内部的Cube计算单元如何通过脉动阵列实现矩阵计算的硬件化,多级存储体系如何打破冯·诺依曼瓶颈,以及指令调度系统如何实现计算与搬运的完美重叠。文章包含一个完整的Ascend C内存管理示例。

LZL_SQ的博客 1429
上一篇: 大规模训练集群性能问题(下降或抖动)分享及性能问题解决方案
下一篇: 基于KTransformers在300I DUO单机部署满血版DeepSeek-R1的实践
鲲鹏昇腾开发者社区
博客等级 码龄1年 26粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值