# MA: FeaturesManager@classmethoddefapply_features_patches(cls, args):
patch_managers = []
for feature in cls.FEATURES_LIST:
ifnot feature.is_need_apply(args) or feature.patches_applied:
continue
feature.register_patches(feature.patch_manager, args)
feature.patches_applied = Trueif feature.patch_manager notin patch_managers:
patch_managers.append(feature.patch_manager)
for patch_manager in patch_managers:
patch_manager.apply_patches()
apply_features_pre_patches 同构(使用 pre_patches_applied 标志与 pre_register_patches)。两阶段入口下:MA 入口应用 MA 特性并置位;MindSpeed 入口再次 apply 时 MA 特性被跳过,仅应用新追加的 MindSpeed 特性,避免向补丁注册表重复注册(set_patch_func 对重复替换会抛 RuntimeError)。
(3)分层移除与 repatch
# MA: FeaturesManager(全量语义:复位所有标志,移除清单涉及的全部补丁管理器)@classmethoddefremove_patches(cls):
for feature in cls.FEATURES_LIST:
feature.pre_patches_applied = False
feature.patches_applied = Falsefor patch_manager in {feature.patch_manager for feature in cls.FEATURES_LIST}:
patch_manager.remove_patches()
# MindSpeed: MindSpeedFeaturesManager(分层语义:仅移除 MindSpeed 层)@classmethoddefremove_patches(cls):
from mindspeed.patch_utils import MindSpeedPatchesManager
for feature in cls.FEATURES_LIST:
if feature.patch_manager is MindSpeedPatchesManager:
feature.pre_patches_applied = False
feature.patches_applied = False
MindSpeedPatchesManager.remove_patches()
MA 特性在 MA features_manager/__init__.py 注册;MindSpeed 特性在 MindSpeed features_manager/__init__.py 经 add_feature 追加(传入列表)。验收:全仓库对 FEATURES_LIST 的整体替换仅存于 MA 默认安装
约束说明:须在 MA 默认清单安装之后调用(任意 megatron_adaptor.features_manager 子模块导入即完成安装);同一进程内重复追加同一特性会导致重复注册,调用方需保证幂等(MindSpeed 侧仅在包 __init__ 中调用一次)。
调用参考代码:
from megatron_adaptor.features_manager.features_manager import FeaturesManager
# 追加单个特性
FeaturesManager.add_feature(MyFeature())
# 追加特性列表
FeaturesManager.add_feature([MyFeature(), AnotherFeature()])
assertany(isinstance(f, MyFeature) for f in FeaturesManager.FEATURES_LIST)
[RFC]: 统一特性管理(MA/MindSpeed 双端 FEATURES_LIST 合并)整体方案设计
状态 (Status): Implemented
作者 (Authors): TBD
创建日期 (Created): 2026-08-11
更新日期 (Updated): 2026-08-12
相关 Issue/PR: 无
1. 概述
1.1 简介
本方案将当前分别位于 MegatronAdaptor(MA,Megatron 适配器)与 MindSpeed 两套
FEATURES_LIST的特性管理(Features Manager,特性管理组件)统一为 MAFeaturesManager上的单一特性清单:MindSpeed 不再维护独立的特性清单与补丁应用覆写,而是把自身特性(含 MindSpeed 独有的特性参数)以追加方式注册进 MA 的特性管理体系;补丁归属仍按层级隔离(MA 特性 → MAPatchesManager,MindSpeed 特性 →MindSpeedPatchesManager)。本文档描述:双端现状问题、统一后的总体架构与执行流程、技术选型、核心机制(补丁管理器路由、增量应用、分层移除)、两侧具体改动明细、接口设计与风险分析。
1.2 动机
FeaturesManager与 MindSpeed 的MindSpeedFeaturesManager各自持有FEATURES_LIST(子类以同名类属性遮蔽父类列表),参数注册、参数校验、补丁应用、补丁移除等生命周期管理需要在两侧各维护一份,特性迁移(MA 架构拆分自 MindSpeed)时同一特性在两处重复实现。ProfilerDefaultFeature、ProfileFeature、NPUDeterministicFeature、NPUDataDumpFeature四个 functional 特性在 MA 与 MindSpeed 各有一份(MA 版由 MindSpeed 迁出);NpuEnhancementFeature与 MAMegatronBasicFeature各自向megatron.training.arguments.parse_args/validate_args注册一层 wrapper。parse_args上叠加两层 wrapper(MA 层 + MindSpeed 层),两层分别遍历各自清单向同一个 ArgumentParser 注册特性参数。megatron parser 使用默认conflict_handler='error',四个重复特性注册的同名参数(--profile-level、--npu-datadump、--npu-deterministic等)会触发argparse.ArgumentError。get_mindspeed_args各自解析一次命令行,MA 入口得到的 args 命名空间缺少 MindSpeed 特性参数,参数语义被入口顺序隐式割裂;且两侧各持有一个模块级_MINDSPEED_ARGS缓存,MindSpeed 代码(如patch_features)与 MA 内部代码各调一次会得到两个内容相同但彼此独立的 Namespace,repatch()若在兜底路径修改其中一个,另一个感知不到。1.3 目标
Goals
FeaturesManager.FEATURES_LIST成为唯一清单,MindSpeed 特性以追加(add_features)方式注册进同一清单。--optimization-level)统一经由FeaturesManager的注册/校验流程生效。PatchesManager,MindSpeed 特性补丁注册到MindSpeedPatchesManager,保留"移除 MindSpeed 层可恢复 MA 层"的语义。repatch()语义不变。tests_extend/unit_tests/mindspeed/test_third_party_feature_override.py全部断言继续通过)。args_utils.py改为从 MA 重导出,两侧共用同一 parser 与同一_MINDSPEED_ARGS缓存,消除双缓存不一致隐患。Non-Goals
NpuEnhancementFeature中与 MAMegatronBasicFeature重复的其他补丁注册(_compile_dependencies、get_device_wrapper、get_device_arch_version等,保持现有双层叠加、MindSpeed 层生效的现状)。from mindspeed.args_utils import ...的调用点(归一经 MindSpeed 模块重导出实现,调用面零改动)。PatchesManager(保持 staticmethod 封闭形态)与Patch的行为语义;MindSpeedMindSpeedPatchesManager保持独立实现,仅导入复用 MA 的Patch类。import mindspeed.megatron_adaptor的用户接入方式。mindspeed/arguments.py中的参数注册主体,仅适配其引用的基础特性清单。2. 用例分析
2.1 特性注册与应用场景
import megatron_adaptor自动安装并应用 MA 内置 7 个特性PatchesManagerimport mindspeed.megatron_adaptor后 MA 特性与 MindSpeed 特性全部生效the patch of xxx exist !重复注册异常;MindSpeed 特性补丁全部位于MindSpeedPatchesManagerFEATURES_LIST)+ 替换特性实例test_third_party_feature_override.py全部断言通过;MA 清单与 MA 补丁注册表不受影响repatch(args)移除 MindSpeed 层补丁并按新 args 重新应用2.2 参数注册与校验场景
parse_args路径argparse.ArgumentError;--profile-level、--npu-datadump、--optimization-level等均可用validate_args路径yaml_arguments.validate_yaml路径MegatronBasicFeature直接注册,基于统一清单执行一次完整校验(同时修复 MA standalone yaml 模式的校验缺口)TransformerConfig.__post_init__路径mindspeed.args_utils.get_mindspeed_args(重导出自 MA)_MINDSPEED_ARGS缓存mindspeed/arguments.pyprocess_args基础特性清单注册conflict_handler='resolve'容忍与统一清单的重复2.3 DFX 要求
repatch、第三方继承契约行为等价;MindSpeedFeaturesManager符号与继承关系保留argparse.ArgumentError缺陷风险3. 方案设计
3.1 总体方案
编号执行流程:
mindspeed/__init__.py导入megatron_adaptor,MA 包__init__安装内置特性清单并执行 MA 入口patch_features();is_need_apply的 MA 特性经其patch_manager注册并应用补丁,同时置位各特性的应用状态标志;mindspeed/megatron_adaptor.py导入触发mindspeed.features_manager.__init__,将 MindSpeed 特性追加到同一清单;get_mindspeed_args()以完整清单注册参数并解析 CLI;MindSpeedPatchesManager注册并应用;parse_args/validate_args或 yaml 入口validate_yaml时,仅由 MAMegatronBasicFeature注册的单层 wrapper 基于统一清单完成参数注册与三段式校验(覆盖 CLI 与 yaml 两个入口);MindSpeed 层仅保留参数打印薄 wrapper。3.2 技术选型
FEATURES_LIST落在 MAFeaturesManager;每个特性经patch_manager属性声明补丁归属;apply 以"已应用"标志跳过重复patch_features自动执行,由 MindSpeed 入口一次性组装全量清单并应用import megatron_adaptor的任何子模块导入都会先执行其包__init__,无法在常规导入顺序内完成抑制,需向 MA 引入环境变量/配置开关;且改变import mindspeed的即时补丁行为,波及面大MindSpeedFeaturesManager.FEATURES_LIST,另加同步 API选型理由:方案 A 以最小机制变更(特性级补丁管理器路由 + 应用状态标志)达成单一清单目标,完整保留现有两阶段入口、repatch 分层移除与第三方继承契约,风险可控、可离线验证。
3.3 功能与性能设计
3.3.1 组件职责
FeaturesManageradd_feature兼容单个特性或列表)、按特性路由的 pre/main 补丁应用、参数注册与三段式校验、全量移除MindSpeedFeaturesManagerFeaturesManager的兼容薄子类:不再持有独立清单、不再覆写 apply;仅覆写remove_patches为 MindSpeed 层范围移除MindSpeedFeature(MA 基类)patch_manager属性(默认 MAPatchesManager)与应用状态标志MindSpeedFeature(MindSpeed 子类)patch_manager→MindSpeedPatchesManager;保留 parser 辅助方法PatchesManagerMindSpeedPatchesManagerpatches_info注册表;删除本地重复的Patch类,改为导入复用 MA 的Patchmegatron_adaptor.utils.args_utilsget_mindspeed_args)、全量参数获取(get_full_args,ContextVar 缓存优先)、未知参数归集;不变mindspeed.args_utilsadd_args/parser_unknown_args/get_mindspeed_args/get_full_args/set_full_args全部自 MA 重导出,不再持有本地实现与本地_MINDSPEED_ARGS缓存3.3.2 核心机制
(1)按特性路由补丁管理器
# MA: megatron_adaptor/features_manager/mindspeed_feature.py class MindSpeedFeature: @property def patch_manager(self): from megatron_adaptor.patches.patch_manager import PatchesManager return PatchesManager # MindSpeed: mindspeed/features_manager/feature.py class MindSpeedFeature(MAFeature): @property def patch_manager(self): from mindspeed.patch_utils import MindSpeedPatchesManager return MindSpeedPatchesManager特性实现签名不变(
register_patches(self, patch_manager, args)等仍接收管理器参数),由管理器传入feature.patch_manager,既有全部特性实现零改动。(2)增量应用与应用状态标志
# MA: FeaturesManager @classmethod def apply_features_patches(cls, args): patch_managers = [] for feature in cls.FEATURES_LIST: if not feature.is_need_apply(args) or feature.patches_applied: continue feature.register_patches(feature.patch_manager, args) feature.patches_applied = True if feature.patch_manager not in patch_managers: patch_managers.append(feature.patch_manager) for patch_manager in patch_managers: patch_manager.apply_patches()apply_features_pre_patches同构(使用pre_patches_applied标志与pre_register_patches)。两阶段入口下:MA 入口应用 MA 特性并置位;MindSpeed 入口再次 apply 时 MA 特性被跳过,仅应用新追加的 MindSpeed 特性,避免向补丁注册表重复注册(set_patch_func对重复替换会抛RuntimeError)。(3)分层移除与 repatch
# MA: FeaturesManager(全量语义:复位所有标志,移除清单涉及的全部补丁管理器) @classmethod def remove_patches(cls): for feature in cls.FEATURES_LIST: feature.pre_patches_applied = False feature.patches_applied = False for patch_manager in {feature.patch_manager for feature in cls.FEATURES_LIST}: patch_manager.remove_patches() # MindSpeed: MindSpeedFeaturesManager(分层语义:仅移除 MindSpeed 层) @classmethod def remove_patches(cls): from mindspeed.patch_utils import MindSpeedPatchesManager for feature in cls.FEATURES_LIST: if feature.patch_manager is MindSpeedPatchesManager: feature.pre_patches_applied = False feature.patches_applied = False MindSpeedPatchesManager.remove_patches()repatch(args)调用MindSpeedFeaturesManager.remove_patches()后重新 apply:MA 特性标志未复位 → 跳过;MindSpeed 特性标志复位 → 按新 args 重新注册应用。与现状语义一致。3.3.3 适配项明细
MA 侧改动
megatron_adaptor/features_manager/mindspeed_feature.py__init__新增pre_patches_applied/patches_applied标志;新增patch_manager属性(默认 MAPatchesManager)megatron_adaptor/features_manager/features_manager.pyadd_feature归一为兼容单个特性或列表入参(删除原add_features);apply_features_pre_patches/apply_features_patches改为按特性路由 + 已应用跳过的增量应用;remove_patches()改为复位全部标志并移除清单涉及的全部补丁管理器;add_feature/set_features_list末尾调用reset_mindspeed_args()使参数缓存失效(惰性导入,无循环依赖)megatron_adaptor/utils/args_utils.pyreset_mindspeed_args():清单变更后将_MINDSPEED_ARGS置 None,使下一次get_mindspeed_args()按最新清单重新解析;顺带删除未使用的_GLOBAL_ARGS导入(F401)megatron_adaptor/features_manager/megatron/megatron_basic.pymegatron.training.yaml_arguments.validate_yaml注册validate_args_wrapper:yaml 路径的特性校验归 MA 层所有(统一清单校验覆盖全部入口),并修复 MA standalone yaml 模式不校验特性参数的缺口megatron_adaptor/patches/patch_manager.py、features_manager/__init__.py、入口MindSpeed 侧改动
mindspeed/features_manager/feature.pypatch_manager属性 →MindSpeedPatchesManagermindspeed/features_manager/features_manager.pyFEATURES_LIST = []遮蔽与 apply 覆写;仅保留remove_patches覆写(MindSpeed 层范围移除 + 复位 MS 特性标志)mindspeed/features_manager/__init__.pycreate_features_list()移除 4 个重复 functional 特性;set_default_features_list()由set_features_list(整体替换)改为FeaturesManager.add_feature(...)(追加,入参为列表);模块级基础清单FEATURES_LIST移除ProfilerDefaultFeature条目(其余 5 项保留,供遗留mindspeed/arguments.py使用)mindspeed/features_manager/functional/{profile,profiler_default,npu_datadump,npu_deterministic}.pyfeatures_manager/__init__.py引用;其底层实现模块mindspeed/functional/**不在本次范围)mindspeed/patch_utils.pyPatch类定义(约 90 行),改为from megatron_adaptor.patches.patch_manager import Patch复用;MindSpeedPatchesManager保持独立 staticmethod 实现与独立注册表(不继承 MAPatchesManager);保留is_megatron_training_available。管理器主体与 MA 逐字相同的约 50 行为有意保留的隔离设计:注册表必须独立,继承复用需 classmethod 分发,存在子类静默共享注册表与实现被覆写的风险,经评估后否决,接受该冻结重复mindspeed/features_manager/npu_enhancement/npu_enhancement.py_register_non_mcore_patches不再向megatron.training.arguments.parse_args/validate_args注册 MindSpeed 的参数注册/校验 wrapper;validate_args与validate_yaml均改注册"仅打印"薄 wrapper;yaml 校验 wrapper 由 MA 层注册,MindSpeed 不再跨层代注册;保留两处_print_args注册(4 个对称的 MindSpeed 自有注册)mindspeed/core/megatron_basic/arguments_basic.pyextra_args_provider_decorator/parse_args_wrapper/validate_args_wrapper);新增print_after_validate_wrapper(内层校验完成后调用_print_args("arguments", args, True));文件仅保留 MindSpeed 特有的打印与 TransformerConfig 类 wrappermindspeed/megatron_adaptor.pyrepatch不变)mindspeed/args_utils.pyadd_args/parser_unknown_args/get_mindspeed_args/get_full_args本地实现与本地_MINDSPEED_ARGS缓存,全部自megatron_adaptor.utils.args_utils重导出(并顺带重导出set_full_args)。全仓 38+ 个from mindspeed.args_utils import ...调用点零改动。两处细微行为变化(均可接受):①兜底日志文案与频次跟随 MA 实现(use megatron_adaptor arguments、LOG.warning非 once 语义);②parser description 显示MegatronAdaptor Arguments(仅外观)3.3.4 参数解析与校验横切流程(统一后挂点)
megatron.training.arguments.parse_argsMegatronBasicFeature)FeaturesManager.register_features_args(parser):统一清单全量特性参数注册一次megatron.training.arguments.validate_argsmegatron.training.arguments._print_argsafter_validate=True时打印),不变megatron.training.yaml_arguments.validate_yamlMegatronBasicFeature直接注册validate_args_wrapper做统一清单三段式校验一次(先注册在内层),MindSpeed 叠加打印 wrapperTransformerConfig.__post_init__等NpuEnhancementFeature)get_mindspeed_args_MINDSPEED_ARGS缓存;任意入口解析均含全部特性参数面;MindSpeed 侧顺带获得 ContextVar 缓存能力3.4 安全隐私与 DFX 设计
MindSpeedFeaturesManager符号、继承关系与第三方子类用法保留;两阶段入口与 repatch 行为等价;第三方契约测试无需修改features_manager/__init__.py+ MindSpeedfeatures_manager/__init__.py追加);新增特性不再需要双份注册argparse.ArgumentError;增量应用标志防止补丁重复注册异常test_third_party_feature_override.py覆盖第三方契约3.5 编程与调用设计
3.5.1 编程模型基本设计
register_patches/pre_register_patches的入参使用补丁管理器;归属由基类patch_manager属性决定。验收:既有全部特性实现零改动features_manager/__init__.py注册;MindSpeed 特性在 MindSpeedfeatures_manager/__init__.py经add_feature追加(传入列表)。验收:全仓库对FEATURES_LIST的整体替换仅存于 MA 默认安装validate_args等可能接收完整 args 或TransformerConfig实例;新增校验逻辑须用getattr防御。验收:新增 MA 特性校验在 post_init 路径不抛属性异常FeaturesManager.FEATURES_LIST。验收:代码评审约束3.5.2 接口定义与设计
3.5.2.1
MindSpeedFeature.patch_managerFeaturesManager应用阶段路由。@property def patch_manager(self): ...PatchesManager;MindSpeed 子类返回MindSpeedPatchesManager;第三方可覆写)。ImportError)。register_patch/apply_patches/remove_patches接口的类;不得返回实例级可变对象。from megatron_adaptor.features_manager.mindspeed_feature import MindSpeedFeature class MyFeature(MindSpeedFeature): def register_patches(self, patch_manager, args): patch_manager.register_patch("some.module.func", my_replacement) assert MyFeature("my-feature").patch_manager is not None3.5.2.2
FeaturesManager.add_featuremegatron_adaptor.features_manager后可用。@classmethod def add_feature(cls, feature: Union[MindSpeedFeature, List[MindSpeedFeature]]) -> None: ...cls.FEATURES_LIST)。AttributeError显性化。megatron_adaptor.features_manager子模块导入即完成安装);同一进程内重复追加同一特性会导致重复注册,调用方需保证幂等(MindSpeed 侧仅在包__init__中调用一次)。from megatron_adaptor.features_manager.features_manager import FeaturesManager # 追加单个特性 FeaturesManager.add_feature(MyFeature()) # 追加特性列表 FeaturesManager.add_feature([MyFeature(), AnotherFeature()]) assert any(isinstance(f, MyFeature) for f in FeaturesManager.FEATURES_LIST)3.5.2.3
FeaturesManager.apply_features_patches(语义更新)is_need_apply(args)的特性经其patch_manager注册补丁并应用;已应用特性跳过。apply_features_pre_patches同构。@classmethod def apply_features_patches(cls, args) -> None: ...register_patches内部异常原样抛出;对同一特性重复调用不会触发补丁重复注册异常(标志跳过)。repatch前须先调用对应层级的remove_patches复位标志。from argparse import Namespace from megatron_adaptor.features_manager.features_manager import FeaturesManager FeaturesManager.apply_features_patches(Namespace(optimization_level=2)) FeaturesManager.apply_features_patches(Namespace(optimization_level=2)) # 第二次全跳过,无异常3.5.2.4
MindSpeedFeaturesManager.remove_patches(分层语义)MindSpeedPatchesManager)并复位 MindSpeed 特性的应用标志,MA 层补丁与其标志不受影响;repatch依赖该语义。@classmethod def remove_patches(cls) -> None: ...FeaturesManager.remove_patches(全量移除清单涉及的所有管理器)语义不同,MindSpeed 侧 repatch 必须使用本方法。from mindspeed.features_manager.features_manager import MindSpeedFeaturesManager MindSpeedFeaturesManager.remove_patches() # 仅 MindSpeed 层被移除,MA 层实现恢复可见3.5.3 编程手册设计
不新增文档文件;实施时同步更新既有文档中的注册入口描述:MindSpeed
docs/zh/user-guide/feature_development.md(特性注册到统一清单、MindSpeed 侧追加方式)与 MAdocs/introduction.md(清单共享说明)。4. 缺点和风险
TransformerConfig.__post_init__校验路径FeaturesManager.remove_patches全量复位、MindSpeedFeaturesManager.remove_patches按归属复位;以 repatch 相关测试验证--optimization-level等新注册参数,导致 MindSpeed 特性is_need_apply覆写版(直接属性访问)抛AttributeErroradd_feature/set_features_list末尾调用reset_mindspeed_args()使缓存失效,MindSpeed 入口以完整清单重新解析(生命周期内清空一次、重新解析一次,训练期全部命中缓存)MindSpeedFeaturesManager子类与第三方自带FEATURES_LIST的用法;运行test_third_party_feature_override.py验证mindspeed/features_manager/__init__.py引用;随本次改动同步更新引用并删除mindspeed/arguments.py基础清单与统一清单重复注册conflict_handler='resolve'容忍重复;基础清单收窄后重复面更小validate_args路径参数打印依赖 MindSpeed 薄 wrapper 与_print_args补丁的三参签名_print_args补丁注册;薄 wrapper 在内层校验完成后以after_validate=True调用打印Patch后,remove_patch的恢复扫描会额外跳过模块名含megatron_adaptor的模块megatron_adaptor.*为目标的补丁注册;对megatron.*/mindspeed.*目标补丁的移除行为两版一致--help类报错的 description 展示,无功能影响,已在适配项明细注明mindspeed.args_utils或 monkeypatch 其符号mindspeed.args_utils模块与其公开符号全部保留(重导出实现),from mindspeed.args_utils import get_full_args等用法不受影响;已核实 MindSpeed 测试无针对args_utils的 monkeypatch