# Ascend MC2 ## 使用前提 仅限于版本标识为`CANN 8.0.RC2`和`Ascend HDK 24.1.RC2`及其后续所有迭代版本的系统环境。 若在非指定版本中尝试采用该配置,可能触发系统级的异常行为,包括但不限于运行时错误。 ## 问题分析 在开启了TP和SP的大模型训练场景下,存在matmul计算和all-reduce操作的强依赖关系(不开启SP),或存在matmul计算和all_gather/reduce_scatter操作的强依赖关系(开启SP)。当模型参数量较大时,此处通信量和计算量都较大,在串行执行时,会引入较长的等待闲置时间。 ## 解决方案 针对存在强依赖关系的matmul计算和通信操作,昇腾自研MC2解决方案。 MC2通过融合算子的方式将matmul计算和集合通信操作进行融合,将较大的计算和通信任务切分成了较小的计算子任务和通信子任务,并通过流水的方式使得通信子任务和计算子任务可以互相掩盖,从而减少等待和闲置时间,提高利用率。 ## 解决思路: MindSpeed在python脚本侧将原本串行的matmul和all_gather/reduce_scatter操作通过MC2融合算子接口进行了融合。 具体实现参见[link](../../mindspeed/core/tensor_parallel/ascend_turbo/mc2_linears_seq_parallel.py)。 MC2算子接口参见[link](https://www.hiascend.com/document/detail/zh/Pytorch/60RC1/apiref/apilist/ptaoplist_000449.html)。 ## 使用场景 当开启了TP和SP时,建议开启MC2进一步优化。模型权重冻结和模型权重不冻结两个场景均支持。 ### 说明 可以通过设置`requires_grad`属性为`False`来实现权重冻结。 ```python # 举例1:冻结所有参数 for param in model.parameters(): param.requires_grad = False ``` ```python # 举例2:除了output_layer,冻结所有ColumnParallelLinear和RowParallelLinear from megatron.core.tensor_parallel.layers import ColumnParallelLinear, RowParallelLinear for name, module in model.named_modules(): if ('output_layer' not in name and (isinstance(module, ColumnParallelLinear) or isinstance(module, RowParallelLinear))): for param in module.parameters(): param.requires_grad = False ``` ## 使用方法 设置--use-ascend-mc2即可使能MC2算子。 **同时需要确保开启**`--sequence-parallel`。 ## 使用效果 在开启TP和SP的训练场景下,使用MC2可以减少内存开销并提高计算效率。 ## 注意事项 1. MoE模型暂不支持开启MC2。 2. 暂不兼容计算通信并行 CoC 特性 --use-ascend-coc 。 3. 该特性不支持在 Atlas 900 A3 硬件上使用。