local query/key/x/qr
-> extract local ori_kv
-> all-gather left window halo
-> stage1_compress_with_halo(local_x, halo_x)
-> all-gather local compressed slots
-> select_and_pad to global compressed KV
-> local Stage-2 attention
-> output local shard
ratio=4 需要两套 Stage-1:
main compressor:
parent.compressor
indexer compressor:
parent.indexer.compressor
DeepSeek V4 CSA + CP 迁移到 HP:困难点深度分析
执行摘要
迁移范围明确:需要将
csa.py+csa_context_parallel.py迁移到 HP,提供完整的 CP + CSA 能力。deepseek_v4_hybrid_attention.py(顶层 MLA 投影封装)保留在 MF,不迁移。本期总代码范围:2147 行(
csa.py1652 +csa_context_parallel.py495)。核心结论:
DSv4HybridSelfAttention保留在 MF 后,Q/KV 投影、顶层 RoPE、output projection、MultiLatentAttention基类都不进入 HP 范围。Compressor、CSAIndexer、CompressedSparseAttention、host-side top-k/index 构建、fused/naive sparse attention、Indexer Loss、CP halo + select-and-pad。npu_lightning_indexer_v2、npu_sparse_attn_shared_kv、npu_sparse_lightning_indexer_grad_kl_loss_v2仍是NotImplementedError,完整 fused CSA 首期应以 HP 的 MindSpore/platform 路径为主。dsa.py不是独立迁移目标文件,但csa.py直接依赖其中的 Hadamard rotation、Indexer Loss autoscaler 和 fused loss wrapper;这些依赖必须以“最小依赖迁移/抽取”的方式进入 HP,否则csa.py无法独立落地。推荐策略:在 HP 中新增 DeepSeek V4 CSA 模块,保留 MF 顶层 HybridAttention 作为调用方;先完成 MindSpore 兼容的 HP CSA + CP,随后再按 HP 平台抽象程度推进 Torch 化。预计 4-6 周(1-2 人) 完成可用版本;若同时要求 Torch fused op parity 和全量 DistributedOp 规则,预计 6-8 周。
1. 明确边界:迁移什么,不迁移什么
1.1 迁移到 HP 的内容
csa.pyCompressor、CSAIndexer、CompressedSparseAttention、索引构建、naive sparse attention、fused op 调用、Indexer Loss 接入ratio=0/4/128,支持 fused/naive 路径csa_context_parallel.py迁移后的 HP 对外应暴露:
from hyper_parallel.models.deepseek_v4.csa import ( Compressor, CompressorSubmodules, CSAIndexer, CSAIndexerSubmodules, CompressedSparseAttention, CompressedSparseAttentionSubmodules, ) from hyper_parallel.core.context_parallel.deepseek_v4_context_parallel import ( DeepSeekV4CPConfig, patch_deepseek_v4_compressed_sparse_attention_forward, )1.2 保留在 MF 的内容
deepseek_v4_hybrid_attention.pyDSv4HybridSelfAttention顶层 MLA 封装MultiLatentAttention继承关系都不属于 HP CSA/CP 范围MF 侧可以有最小接入改动,例如 import 路径从 MF CSA 改为 HP CSA,或把 MF config 转成 HP CSA config;但这个文件不作为迁移目标,不移动到 HP,不要求 HP 重写
DSv4HybridSelfAttention。1.3
dsa.py的特殊定位dsa.py不在用户给定的迁移文件清单中,但csa.py有硬依赖:from mindformers.pynative.transformers.experimental_attention_variant.dsa import ( DSAIndexerLossAutoScaler, FusedDSAIndexerLoss, HadamardRotation, )因此需要在 HP 中处理三个依赖点:
HadamardRotationdsa.pyhyper_parallel/models/deepseek_v4/dsa.pyDSAIndexerLossAutoScalerdsa.pyCompressedSparseAttention训练态 loss 路径迁移FusedDSAIndexerLossdsa.pynpu_sparse_lightning_indexer_grad_kl_loss_v2,需要走 HP custom_ops/platform结论:不迁移整个
dsa.py,但必须迁移csa.py所需的最小 dsa dependency。否则CompressedSparseAttention的 ratio=4 训练态和 indexer loss 不完整。2. 当前代码事实
2.1 MF 侧 CSA 文件结构
mf_pr8311_latest/mindformers/pynative/transformers/experimental_attention_variant/csa.py的核心结构:关键依赖:
配置字段直接访问约 20+ 个,集中在:
2.2 MF 侧 CP 文件结构
csa_context_parallel.py的核心函数:这部分算法本身比
csa.py更适合迁移到 HP,但当前实现仍有 MF 绑定:2.3 HP 侧已有基础
HP 当前已经有 DeepSeek V4 CP 相关基础:
它目前的边界是:patch 一个 MF
CompressedSparseAttentioncell,HP 承接 CP forward。这可以作为 CP 迁移基础,但不等同于已经完成csa.py迁移,因为Compressor、CSAIndexer、CompressedSparseAttention本体仍在 MF。HP 也已经有 custom ops wrapper:
但需要注意:HP 的 PyTorch platform 当前对这三个 DeepSeek V4 fused ops 返回
NotImplementedError;MindSpore platform 下有对应 custom op wrapper 和 C++ binding。因此本期“完整 CSA”不能简单定义为纯 Torch 重写。3. 迁移难点拆解
3.1 困难点一:CSA 本体深度绑定 MF Cell/Spec/Config
csa.py三个核心类都是nn.Cell:class Compressor(nn.Cell): ... class CSAIndexer(nn.Cell): ... class CompressedSparseAttention(nn.Cell): ...构造方式依赖 MF 的动态模块系统:
self.linear_wkv = build_module( submodules.linear_wkv, input_size=config.hidden_size, output_size=proj_out_dim, params_dtype=config.params_dtype, compute_dtype=config.compute_dtype, init_method=config.init_method, bias=False, )迁移到 HP 时不能只复制文件,还要决定:
ModuleSpec/MLATransformerConfig。DeepSeekV4CSAConfig和 submodule factory。推荐做法:
3.2 困难点二:
Compressor不只是 Linear,含 overlap 压缩、APE、RoPE、HadamardCompressor迁移难点:ratio=4overlap 压缩ratio=128non-overlap 压缩self.ape = Parameter(...),需保持参数注册和 state_dict 名称linear_wkv+linear_wgate+ softmax/split/reshape 组合,shape 容错低ApplyRotaryPosEmb(config, for_k_pos_emb=True),迁移后需要 HP 内可调用实现dsa.py依赖这部分如果只做机械复制,最大风险是 CP 边界和位置编码 offset 出错,导致 CP=1 与 CP>1 数值不一致。
3.3 困难点三:
CSAIndexer同时依赖投影、Hadamard、fused Op-1CSAIndexer负责:关键风险:
q_lora_rank、dsa_indexer_n_heads、dsa_indexer_head_dim、dsa_indexer_topk等配置要精确映射。3.4 困难点四:
CompressedSparseAttention是完整 CSA 控制面CompressedSparseAttention不是单个 attention op,它包含:还包含几个容易遗漏的状态:
attn_sinkforce_unfusedtp_size/tp_groupcompress_ratioconfig.csa_compress_ratios[layer_number - 1]得到ori_win_left/cmp_win_left迁移时必须保留这些状态,否则虽然单卡 forward 可能跑通,但训练态、fused path 或 CP path 会缺能力。
3.5 困难点五:CP 两阶段算法需要从“patch MF cell”升级为“HP CSA 原生能力”
HP 现有
deepseek_v4_context_parallel.py已经能 patch MF CSA cell,逻辑上是:新迁移范围要求 HP 拥有
csa.py本体后,目标应变成:也就是说,现有 patch 机制可以作为兼容入口,但最终不应依赖 MF 里的
CompressedSparseAttention类。4. 推荐 HP 落地架构
4.1 目录建议
不建议新增
hybrid_attention.py到 HP,因为顶层 MLA 封装已明确保留在 MF。4.2 MF 与 HP 的调用边界
MF 保留:
HP 提供:
建议接口保持与现有 MF CSA 一致:
def construct(self, query, key, value, attention_mask, x=None, qr=None, actual_seq_len=None): ...需要保持的 shape/layout 约定:
query[S, B, N, D],CSA 边界 seq-firstkey/value[S, B, 1, D]或[S, B, D]x[S, B, hidden_size],compressor 使用qr[S, B, N * D],交还 MF output projection4.3 Config 策略
不应把完整
MLATransformerConfig搬到 HP。建议定义最小配置:@dataclass class DeepSeekV4CSAConfig: hidden_size: int num_attention_heads: int v_head_dim: int q_lora_rank: int qk_pos_emb_head_dim: int csa_compress_ratios: list[int] csa_window_size: int dsa_indexer_n_heads: int dsa_indexer_head_dim: int dsa_indexer_topk: int dsa_indexer_loss_coeff: float | None = None dsa_indexer_use_sparse_loss: bool = False force_unfused_dsa: bool = False params_dtype: object = None compute_dtype: object = None layernorm_epsilon: float = 1e-6 rotary_interleaved: bool = False multi_latent_attention: bool = True num_layers: int = 1 mtp_num_layers: int = 0并提供:
def from_mf_config(config) -> DeepSeekV4CSAConfig: ...这样 MF 顶层可继续使用自己的完整 config,而 HP CSA 只消费 CSA 必需字段。
4.4 Submodule 构建策略
当前
csa.py依赖:建议分两阶段:
ModuleSpec/type,保证迁移低风险submodule factory,逐步去掉对mindformers.parallel_core.utils.spec_utils的直接依赖不建议首期强行重写所有 Linear/Norm 构造,否则会把风险从“迁移 CSA”扩大成“迁移 MF parallel_core 子模块”。
5. 分阶段实施计划
Phase 0:边界冻结与现状补齐(1-2 天)
任务:
deepseek_v4_hybrid_attention.py只做最小接入改动。csa.py对dsa.py的最小依赖清单。deepseek_v4_context_parallel.py哪些函数可直接复用。产出:
DeepSeek V4 CSA migration contract小文档或代码注释。Phase 1:CSA 依赖最小抽取(3-5 天)
任务:
models/deepseek_v4/config.py。models/deepseek_v4/dsa_deps.py或等价文件。HadamardRotation、DSAIndexerLossAutoScaler、FusedDSAIndexerLoss。hyper_parallel.custom_ops.experimental。验收:
dsa.py也能 import HP CSA 依赖。Phase 2:迁移
csa.py本体(8-12 天)任务:
Compressor、CSAIndexer、CompressedSparseAttention移到 HP。unfused_compressed_sparse_attn移到 HP。ModuleSpec/build_module、ApplyRotaryPosEmb、config、dsa deps。construct()签名。ape、attn_sink、linear/norm 子模块命名尽量不变。验收:
ratio=0/4/128单卡 forward 可跑。Phase 3:迁移/整合
csa_context_parallel.py(5-7 天)任务:
build_select_pad_gather_index、build_cmp_cu_seqlens、stage1_compress_with_halo、assemble_window_halo等函数统一到 HP CP 模块。DeepSeekV4CPConfig/DeepSeekV4CPContext。comm.all_gather_into_tensor替换为 HP platform/DeviceMesh 通信。CompressedSparseAttention。actual_seq_len/ packed sequence 的支持或明确首期限制。验收:
Phase 4:MF 顶层接入(3-5 天)
任务:
deepseek_v4_hybrid_attention.py中保持类和文件不迁移,只替换 CSA import/构造路径。from_mf_config()或兼容 config 传递。self.core_attention(...)的调用参数不变。验收:
DSv4HybridSelfAttention不移动、不重写。Phase 5:测试与稳定化(7-10 天)
任务:
test_csa.pytest_naive_csa.pytest_csa_indexer.pytest_csa_context_parallel.pytest_fused_vs_naive_alignment.py验收:
6. 工作量估算
dsa.py最小依赖抽取csa.py本体迁移csa_context_parallel.py迁移/整合如果增加以下要求,工作量会上升:
7. 迁移后调用链
7.1 目标调用链
7.2 CP 路径
ratio=4 需要两套 Stage-1:
这点必须保留,否则 indexer top-k 的 compressed K 空间与 attention 使用的 compressed KV 不一致。
8. 关键风险与缓解
风险 1:把“迁移到 HP”误解为“重写完整 Torch HybridAttention”
影响:
deepseek_v4_hybrid_attention.py。缓解:
csa.py+csa_context_parallel.py。deepseek_v4_hybrid_attention.py只允许最小接入改动。风险 2:
dsa.py依赖被遗漏影响:
csa.pyimport 失败。缓解:
dsa.py是“最小依赖抽取”,不是额外迁移目标。风险 3:Config/ModuleSpec 依赖继续把 HP 绑回 MF
影响:
缓解:
DeepSeekV4CSAConfig和转换函数。风险 4:CP Stage-1 边界错误
影响:
缓解:
build_select_pad_gather_index用例。风险 5:fused op 环境差异
影响:
缓解:
9. 成功标准
功能正确性
工程边界
测试覆盖
10. 最终结论
本次迁移不是“DeepSeek V4 完整 attention 迁移”,而是把 CSA 核心和 CP 算法从 MF 下沉到 HP:
这个边界会显著降低顶层模型迁移风险,但不会让任务变成简单复制文件。真正困难集中在:
csa.py对 MF Cell/Parameter/Config/Spec 的绑定。csa.py对dsa.pyHadamard/Loss 的隐式依赖。推荐按 4-6 周 做 HP MindSpore-compatible CSA + CP 首期交付;Torch fused CSA 和更彻底的平台无关重构作为后续增强,不应混入本期迁移范围。