From 54bf5b885c4304ebda888411b3975b8a70f5e2ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Tue, 5 Aug 2025 19:16:18 +0800 Subject: [PATCH 01/21] =?UTF-8?q?mindio=20=E7=A7=BB=E9=99=A4wrapper?= =?UTF-8?q?=E5=86=85=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/optimizer/distrib_optimizer.py | 27 +++++++++++++------ .../high_availability/high_availability.py | 10 +++---- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/mindspeed_llm/core/optimizer/distrib_optimizer.py b/mindspeed_llm/core/optimizer/distrib_optimizer.py index a8e731a86..bf7fbfd8d 100644 --- a/mindspeed_llm/core/optimizer/distrib_optimizer.py +++ b/mindspeed_llm/core/optimizer/distrib_optimizer.py @@ -13,7 +13,7 @@ from megatron.core.optimizer.grad_scaler import MegatronGradScaler from megatron.core.optimizer import OptimizerConfig from megatron.core.optimizer.optimizer import MixedPrecisionOptimizer from megatron.core.distributed.param_and_grad_buffer import partition_buckets -from mindspeed.optimizer.distrib_optimizer import reuse_fp32_param_distrib_optimizer_init_wrapper +from mindspeed.core.memory.reuse_param.adaptor import reuse_fp32_param_distrib_optimizer_init_wrapper from megatron.core.optimizer.cpu_offloading import HybridDeviceOptimizer from megatron.core.transformer.module import MegatronModule from megatron.core.config_logger import has_config_logger_enabled, log_config_to_disk @@ -172,7 +172,10 @@ def get_parameter_state_dp_zero_with_high_availability_wrapper(func): # gather buffer res buffer_res_full_shard = [] for shard_main_param_res_buffer in self.shard_main_param_res_buffers: - if global_rank == save_rank: + if self.disable_gloo_group and global_rank == save_rank: + recv_tensors = [torch.empty(shard_main_param_res_buffer.numel(), dtype=torch.float16, device="cpu") + for _ in range(len(save_rank_list))] + elif global_rank == save_rank: recv_tensors = [torch.empty((shard_main_param_res_buffer.numel(),), dtype=torch.float16, device="cpu") for _ in range(len(save_rank_list))] else: @@ -182,12 +185,20 @@ def get_parameter_state_dp_zero_with_high_availability_wrapper(func): send_tensor_bf16_view = torch.tensor(send_tensor.data.untyped_storage(), dtype=torch.bfloat16, device=send_tensor.device) send_tensor_bf16_view.copy_(shard_main_param_res_buffer.detach().cpu()) # gather支持fp16 - torch.distributed.gather( - send_tensor, - recv_tensors, - save_rank, - save_group_gloo, - ) + if self.disable_gloo_group: + from mindspeed.utils import _gather_hccl + _gather_hccl( + send_tensor, + recv_tensors, + self.data_parallel_group + ) + else: + torch.distributed.gather( + send_tensor, + recv_tensors, + save_rank, + save_group_gloo, + ) if global_rank == save_rank: res = [] for i in range(len(save_rank_list)): diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index 25da2b188..d7453f083 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -65,16 +65,14 @@ class HighAvailabilityFeature(MindSpeedFeature): patch_manager.register_patch('megatron.core.pipeline_parallel.schedules.get_forward_backward_func', high_availability_get_forward_backward_func_wrapper) if args.reuse_fp32_param: - from mindspeed.optimizer.optimizer import mixed_precision_optimizer_step, reuse_fp32_param_init_wrapper, \ - optimizer_config_init_wrapper - patch_manager.register_patch('megatron.core.optimizer.optimizer.MixedPrecisionOptimizer.step', - mixed_precision_optimizer_step) + from mindspeed.core.memory.reuse_param.adaptor import reuse_fp32_param_init_wrapper, optimizer_config_init_wrapper patch_manager.register_patch('megatron.core.optimizer.optimizer.Float16OptimizerWithFloat16Params.__init__', reuse_fp32_param_init_wrapper) patch_manager.register_patch('megatron.core.optimizer.optimizer_config.OptimizerConfig.__init__', optimizer_config_init_wrapper) - patch_manager.register_patch('megatron.core.optimizer.distrib_optimizer.DistributedOptimizer.__init__', - distributed_optimizer_init_for_reuse_fp32_wrapper) + if not getattr(args, 'enable_zero3', False): + patch_manager.register_patch('megatron.core.optimizer.distrib_optimizer.DistributedOptimizer.__init__', + distributed_optimizer_init_for_reuse_fp32_wrapper) patch_manager.register_patch('mindio_ttp.adaptor.TTPReplicaOptimizer.get_parameter_state_dp_zero_for_ttp', get_parameter_state_dp_zero_with_high_availability_wrapper) if args.enable_worker_reboot: -- Gitee From 8d6d4b7080f2aa5e475b4c1d6fda45c5502c3455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Wed, 6 Aug 2025 11:32:01 +0800 Subject: [PATCH 02/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features_manager/high_availability/high_availability.py | 5 ++--- mindspeed_llm/training/training.py | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index d7453f083..179512bdf 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -70,9 +70,8 @@ class HighAvailabilityFeature(MindSpeedFeature): reuse_fp32_param_init_wrapper) patch_manager.register_patch('megatron.core.optimizer.optimizer_config.OptimizerConfig.__init__', optimizer_config_init_wrapper) - if not getattr(args, 'enable_zero3', False): - patch_manager.register_patch('megatron.core.optimizer.distrib_optimizer.DistributedOptimizer.__init__', - distributed_optimizer_init_for_reuse_fp32_wrapper) + patch_manager.register_patch('megatron.core.optimizer.distrib_optimizer.DistributedOptimizer.__init__', + distributed_optimizer_init_for_reuse_fp32_wrapper) patch_manager.register_patch('mindio_ttp.adaptor.TTPReplicaOptimizer.get_parameter_state_dp_zero_for_ttp', get_parameter_state_dp_zero_with_high_availability_wrapper) if args.enable_worker_reboot: diff --git a/mindspeed_llm/training/training.py b/mindspeed_llm/training/training.py index c12dd9e7f..f2f55a599 100644 --- a/mindspeed_llm/training/training.py +++ b/mindspeed_llm/training/training.py @@ -757,6 +757,10 @@ def train(forward_step_func, model, optimizer, opt_param_scheduler, if is_profile_enabled(): prof.step() + if args.enable_high_availability: + from mindio_ttp.framework_ttp import tft_pause_train + tft_pause_train(iteration) + if is_profile_enabled(): prof.stop() -- Gitee From 4a9a3d3ceba7cf89c7f1fdb28116f8be95618190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Wed, 6 Aug 2025 14:45:26 +0800 Subject: [PATCH 03/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/distributed/param_and_grad_buffer.py | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/mindspeed_llm/core/distributed/param_and_grad_buffer.py b/mindspeed_llm/core/distributed/param_and_grad_buffer.py index 448e94a0f..dec23a996 100644 --- a/mindspeed_llm/core/distributed/param_and_grad_buffer.py +++ b/mindspeed_llm/core/distributed/param_and_grad_buffer.py @@ -44,7 +44,8 @@ def start_param_sync(self, force_sync: bool = False): group=self.intra_distributed_optimizer_instance_group_for_tft() ) local_data_view = shard_buffer( - bucket.param_data, self.intra_distributed_optimizer_instance_size_for_tft + bucket.param_data, torch.distributed.get_world_size( + group=self.intra_distributed_optimizer_instance_group_for_tft()) )[instance_rank] handle = dist_all_gather_func( bucket.param_data, @@ -71,22 +72,8 @@ def param_and_grad_bucket_group_init_wrapper(fn): is_expert_parallel |= not getattr(param, 'allreduce', True) from mindio_ttp.adaptor import (ttp_get_dp_cp_replica_group, ttp_get_dp_ep_replica_group) if self.ddp_config.use_distributed_optimizer: - if not is_expert_parallel: - self.intra_distributed_optimizer_instance_group_for_tft = ttp_get_dp_cp_replica_group - self.intra_distributed_optimizer_instance_size_for_tft = torch.distributed.get_world_size( - group=ttp_get_dp_cp_replica_group() - ) - self.intra_distributed_optimizer_instance_rank_for_tft = torch.distributed.get_rank( - group=ttp_get_dp_cp_replica_group() - ) - else: - self.intra_distributed_optimizer_instance_group_for_tft = ttp_get_dp_ep_replica_group - self.intra_distributed_optimizer_instance_size_for_tft = torch.distributed.get_world_size( - group=ttp_get_dp_ep_replica_group() - ) - self.intra_distributed_optimizer_instance_rank_for_tft = torch.distributed.get_rank( - group=ttp_get_dp_ep_replica_group() - ) + self.intra_distributed_optimizer_instance_group_for_tft = ttp_get_dp_cp_replica_group \ + if not is_expert_parallel else ttp_get_dp_ep_replica_group return return wrapper -- Gitee From 3fcef3828da83b399ba25988b427be00cf219877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 7 Aug 2025 20:14:55 +0800 Subject: [PATCH 04/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../high_availability/high_availability.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index 179512bdf..e75dcd47b 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -1,5 +1,6 @@ from argparse import ArgumentParser from mindspeed.features_manager.feature import MindSpeedFeature +from functools import wraps class HighAvailabilityFeature(MindSpeedFeature): @@ -33,6 +34,14 @@ class HighAvailabilityFeature(MindSpeedFeature): if args.swap_optimizer and args.enable_high_availability: raise AssertionError('switch of the high availability feature is unsupported') + def pre_register_patches(self, patch_manager, args): + from mindspeed_llm.features_manager.high_availability.communication_patch import communication_wrapper + for communication in ['barrier', 'all_reduce', '_all_gather_base', 'broadcast', 'all_gather_into_tensor']: + patch_manager.register_patch('torch.distributed.distributed_c10d.' + communication, + communication_wrapper) + from mindspeed.features_manager import ReuseFP32Param + ReuseFP32Param.register_patches = skip_reuse_register_patches(ReuseFP32Param.register_patches, args) + def register_patches(self, patch_manager, args): from .initialize_patch import setup_model_and_optimizer_wrapper, initialize_distributed_wrapper from mindspeed_llm.core import (start_grad_sync_wrapper, distributed_data_parallel_init_wrapper, @@ -82,6 +91,13 @@ class HighAvailabilityFeature(MindSpeedFeature): patch_manager.register_patch('torch.distributed.distributed_c10d.new_group', new_group_wrapper) +def skip_reuse_register_patches(fn, argument): + @wraps(fn) + def wrapper(self, *args, **kwargs): + if not argument.enable_high_availability: + fn(self, *args, **kwargs) + return wrapper + class HighAvailabilityCommFeature(MindSpeedFeature): def __init__(self): -- Gitee From a925bd753809511e1a50759586afd8220bbea189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Fri, 8 Aug 2025 14:16:41 +0800 Subject: [PATCH 05/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mindspeed_llm/training/arguments.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mindspeed_llm/training/arguments.py b/mindspeed_llm/training/arguments.py index 3bb66e4ed..fa83db1a3 100644 --- a/mindspeed_llm/training/arguments.py +++ b/mindspeed_llm/training/arguments.py @@ -1292,7 +1292,6 @@ def _add_dummy_args_v2(args): args.return_document_ids = False args.attention_mask_on_cpu = False args.output_layer_slice_num = 1 - args.enable_high_availability = False args.use_fused_mlp = False -- Gitee From 4b8d600e5ea1a75d824fd2afffc1738a70d8ae1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Mon, 11 Aug 2025 09:41:49 +0800 Subject: [PATCH 06/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/distributed/param_and_grad_buffer.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mindspeed_llm/core/distributed/param_and_grad_buffer.py b/mindspeed_llm/core/distributed/param_and_grad_buffer.py index dec23a996..cb548c77d 100644 --- a/mindspeed_llm/core/distributed/param_and_grad_buffer.py +++ b/mindspeed_llm/core/distributed/param_and_grad_buffer.py @@ -38,19 +38,20 @@ def start_param_sync(self, force_sync: bool = False): async_op = self.ddp_config.overlap_param_gather and not force_sync self.param_gather_handle = [] # Coalesce communication kernels across buckets in the bucket group. - + instance_group = self.intra_distributed_optimizer_instance_group_for_tft() + instance_rank = torch.distributed.get_rank( + group=instance_group + ) + instance_size = torch.distributed.get_world_size( + group=instance_group) for bucket in self.buckets: - instance_rank = torch.distributed.get_rank( - group=self.intra_distributed_optimizer_instance_group_for_tft() - ) local_data_view = shard_buffer( - bucket.param_data, torch.distributed.get_world_size( - group=self.intra_distributed_optimizer_instance_group_for_tft()) + bucket.param_data, instance_size )[instance_rank] handle = dist_all_gather_func( bucket.param_data, local_data_view, - group=self.intra_distributed_optimizer_instance_group_for_tft(), + group=instance_group, async_op=async_op, ) self.param_gather_handle.append(handle) -- Gitee From c405bfba68f6feb2f1957249387fb6d862423e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Mon, 11 Aug 2025 11:40:57 +0800 Subject: [PATCH 07/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features_manager/high_availability/high_availability.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index e75dcd47b..513b34296 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -1,6 +1,6 @@ +from functools import wraps from argparse import ArgumentParser from mindspeed.features_manager.feature import MindSpeedFeature -from functools import wraps class HighAvailabilityFeature(MindSpeedFeature): @@ -91,6 +91,7 @@ class HighAvailabilityFeature(MindSpeedFeature): patch_manager.register_patch('torch.distributed.distributed_c10d.new_group', new_group_wrapper) + def skip_reuse_register_patches(fn, argument): @wraps(fn) def wrapper(self, *args, **kwargs): -- Gitee From 679734322d626bc4e9327b123629d22948d7aad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Mon, 11 Aug 2025 15:30:31 +0800 Subject: [PATCH 08/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../high_availability/communication_patch.py | 10 ++++++++- .../high_availability/high_availability.py | 22 ++----------------- mindspeed_llm/tasks/megatron_adaptor.py | 6 ++--- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/mindspeed_llm/features_manager/high_availability/communication_patch.py b/mindspeed_llm/features_manager/high_availability/communication_patch.py index 0b6ae429f..2a2026a19 100644 --- a/mindspeed_llm/features_manager/high_availability/communication_patch.py +++ b/mindspeed_llm/features_manager/high_availability/communication_patch.py @@ -1,5 +1,4 @@ from functools import wraps -import torch def communication_wrapper(fn): @@ -17,6 +16,7 @@ def communication_wrapper(fn): def new_group_wrapper(fn): @wraps(fn) def wrapper(*args, **kwargs): + import torch backend = kwargs.get('backend', None) from mindio_ttp.adaptor import tft_is_arf_reboot_node if tft_is_arf_reboot_node() and isinstance(backend, str) and 'gloo' in backend: @@ -27,3 +27,11 @@ def new_group_wrapper(fn): res = fn(*args, **kwargs) return res return wrapper + + +def skip_reuse_register_patches(fn, argument): + @wraps(fn) + def wrapper(self, *args, **kwargs): + if not argument.enable_high_availability: + fn(self, *args, **kwargs) + return wrapper diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index 513b34296..cb6f37368 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -35,7 +35,8 @@ class HighAvailabilityFeature(MindSpeedFeature): raise AssertionError('switch of the high availability feature is unsupported') def pre_register_patches(self, patch_manager, args): - from mindspeed_llm.features_manager.high_availability.communication_patch import communication_wrapper + from mindspeed_llm.features_manager.high_availability.communication_patch import ( + communication_wrapper, skip_reuse_register_patches) for communication in ['barrier', 'all_reduce', '_all_gather_base', 'broadcast', 'all_gather_into_tensor']: patch_manager.register_patch('torch.distributed.distributed_c10d.' + communication, communication_wrapper) @@ -90,22 +91,3 @@ class HighAvailabilityFeature(MindSpeedFeature): build_train_valid_test_data_iterators_wrapper) patch_manager.register_patch('torch.distributed.distributed_c10d.new_group', new_group_wrapper) - - -def skip_reuse_register_patches(fn, argument): - @wraps(fn) - def wrapper(self, *args, **kwargs): - if not argument.enable_high_availability: - fn(self, *args, **kwargs) - return wrapper - - -class HighAvailabilityCommFeature(MindSpeedFeature): - def __init__(self): - super(HighAvailabilityCommFeature, self).__init__(feature_name='high-availability-comm', optimization_level=0) - - def pre_patch(self, patch_manager, args): - from mindspeed_llm.features_manager.high_availability.communication_patch import communication_wrapper - for communication in ['barrier', 'all_reduce', '_all_gather_base', 'broadcast', 'all_gather_into_tensor']: - patch_manager.register_patch('torch.distributed.distributed_c10d.' + communication, - communication_wrapper) diff --git a/mindspeed_llm/tasks/megatron_adaptor.py b/mindspeed_llm/tasks/megatron_adaptor.py index 170b42765..6a7763fe2 100644 --- a/mindspeed_llm/tasks/megatron_adaptor.py +++ b/mindspeed_llm/tasks/megatron_adaptor.py @@ -126,10 +126,10 @@ class MegatronAdaptation: from mindspeed.patch_utils import MindSpeedPatchesManager from mindspeed.features_manager.megatron_basic.requirements_basic import RequirementsBasicFeature from mindspeed.features_manager.megatron_basic.transformer_engine_basic import TransformerEngineBasicFeature - from mindspeed_llm.features_manager.high_availability.high_availability import HighAvailabilityCommFeature + from mindspeed_llm.features_manager.high_availability.high_availability import HighAvailabilityFeature requirements = RequirementsBasicFeature() te_feature = TransformerEngineBasicFeature() - high_availability_comm_patch = HighAvailabilityCommFeature() + high_availability_comm_patch = HighAvailabilityFeature() # For torch >= 2.2.0 torch.compile = torch.jit.script @@ -147,7 +147,7 @@ class MegatronAdaptation: requirements.apex_adaptation(MindSpeedPatchesManager, _get_dummy_args()) requirements.torch_adaptation(MindSpeedPatchesManager, _get_dummy_args()) te_feature.pre_register_patches(MindSpeedPatchesManager, _get_dummy_args()) - high_availability_comm_patch.pre_patch(MindSpeedPatchesManager, _get_dummy_args()) + high_availability_comm_patch.pre_register_patches(MindSpeedPatchesManager, _get_dummy_args()) MindSpeedPatchesManager.apply_patches() @classmethod -- Gitee From 747a59cb3eced12fc51770ff8d7e30446416073f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Wed, 13 Aug 2025 17:22:23 +0800 Subject: [PATCH 09/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mindspeed_llm/features_manager/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mindspeed_llm/features_manager/__init__.py b/mindspeed_llm/features_manager/__init__.py index f5b7f292b..14d149ea8 100644 --- a/mindspeed_llm/features_manager/__init__.py +++ b/mindspeed_llm/features_manager/__init__.py @@ -115,6 +115,7 @@ def add_llm_features(features_list: List[MindSpeedFeature]): LuLoraFeature(), MambaModel(), LanguageModelEmbeddingFeature(), + HighAvailabilityFeature(), ]) -- Gitee From 04ba195a95cdf06d0a411e31cd2a13c462d9af8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Wed, 13 Aug 2025 17:42:31 +0800 Subject: [PATCH 10/21] =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mindspeed_llm/features_manager/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mindspeed_llm/features_manager/__init__.py b/mindspeed_llm/features_manager/__init__.py index 14d149ea8..f4a9b97e2 100644 --- a/mindspeed_llm/features_manager/__init__.py +++ b/mindspeed_llm/features_manager/__init__.py @@ -115,7 +115,6 @@ def add_llm_features(features_list: List[MindSpeedFeature]): LuLoraFeature(), MambaModel(), LanguageModelEmbeddingFeature(), - HighAvailabilityFeature(), ]) @@ -251,6 +250,12 @@ def add_disable_gloo_group_feature(features_list: List[MindSpeedFeature]): ]) +def add_high_availability_feature(features_list: List[MindSpeedFeature]): + features_list.extend([ + HighAvailabilityFeature() + ]) + + def create_features_list(): features_list = [] add_megatron_basic_features(features_list) @@ -271,6 +276,7 @@ def create_features_list(): add_optimizer_features(features_list) add_swap_optimizer_feature(features_list) add_disable_gloo_group_feature(features_list) + add_high_availability_feature(features_list) return features_list -- Gitee From f0964a65576641db918afcc0eb7aabb0a21449b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 14:38:20 +0800 Subject: [PATCH 11/21] =?UTF-8?q?mindio=20=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../high_availability/communication_patch.py | 8 ------- .../high_availability/high_availability.py | 10 ++++++--- .../high_availability_helper.py | 21 +++++++++++++++++++ mindspeed_llm/tasks/megatron_adaptor_v2.py | 3 +++ 4 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 mindspeed_llm/features_manager/high_availability/high_availability_helper.py diff --git a/mindspeed_llm/features_manager/high_availability/communication_patch.py b/mindspeed_llm/features_manager/high_availability/communication_patch.py index 2a2026a19..47f807adb 100644 --- a/mindspeed_llm/features_manager/high_availability/communication_patch.py +++ b/mindspeed_llm/features_manager/high_availability/communication_patch.py @@ -27,11 +27,3 @@ def new_group_wrapper(fn): res = fn(*args, **kwargs) return res return wrapper - - -def skip_reuse_register_patches(fn, argument): - @wraps(fn) - def wrapper(self, *args, **kwargs): - if not argument.enable_high_availability: - fn(self, *args, **kwargs) - return wrapper diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index cb6f37368..0e1972b5e 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -1,4 +1,3 @@ -from functools import wraps from argparse import ArgumentParser from mindspeed.features_manager.feature import MindSpeedFeature @@ -19,6 +18,11 @@ class HighAvailabilityFeature(MindSpeedFeature): group.add_argument('--distributed-optimizer-no-replica', action='store_true', help='high availability feature, repair from ckpt and disable replica optimizer') + def pre_validate_args(self, args): + from .high_availability_helper import get_env_args + get_env_args(args) + print(args.enable_high_availability) + def validate_args(self, args): if args.enable_high_availability: try: @@ -35,8 +39,8 @@ class HighAvailabilityFeature(MindSpeedFeature): raise AssertionError('switch of the high availability feature is unsupported') def pre_register_patches(self, patch_manager, args): - from mindspeed_llm.features_manager.high_availability.communication_patch import ( - communication_wrapper, skip_reuse_register_patches) + from .communication_patch import communication_wrapper + from .high_availability_helper import skip_reuse_register_patches for communication in ['barrier', 'all_reduce', '_all_gather_base', 'broadcast', 'all_gather_into_tensor']: patch_manager.register_patch('torch.distributed.distributed_c10d.' + communication, communication_wrapper) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability_helper.py b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py new file mode 100644 index 000000000..8c53d6e9c --- /dev/null +++ b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py @@ -0,0 +1,21 @@ +import os +from functools import wraps + + +def get_env_args(args): + env = os.getenv('HIGH_AVAILABILITY', '') + if env.lower() in ('dump', 'recover', 'retry'): + args.enable_high_availability = True + if env.lower() == 'recover': + args.enable_hbmfault_repair = True + if env.lower() == 'retry': + args.enable_worker_reboot = True + return args + + +def skip_reuse_register_patches(fn, argument): + @wraps(fn) + def wrapper(self, *args, **kwargs): + if not argument.enable_high_availability: + fn(self, *args, **kwargs) + return wrapper diff --git a/mindspeed_llm/tasks/megatron_adaptor_v2.py b/mindspeed_llm/tasks/megatron_adaptor_v2.py index 1598e71d9..0c9ee6864 100644 --- a/mindspeed_llm/tasks/megatron_adaptor_v2.py +++ b/mindspeed_llm/tasks/megatron_adaptor_v2.py @@ -56,6 +56,9 @@ class FeatureAdaptor: from mindspeed_llm.training.arguments import process_args_v2 parser = argparse.ArgumentParser(description='MindSpeed-LLM Arguments', allow_abbrev=False) _args, unknown = process_args_v2(parser).parse_known_args() + from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args + get_env_args(_args) + print(_args.enable_high_availability) parser_unknown_args(_args, unknown) return _args -- Gitee From badbd0021be962f6130735b9c01ebbcfb717f76e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 14:49:52 +0800 Subject: [PATCH 12/21] =?UTF-8?q?mindio=20=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features_manager/high_availability/high_availability.py | 1 - mindspeed_llm/tasks/megatron_adaptor_v2.py | 1 - 2 files changed, 2 deletions(-) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index 0e1972b5e..c1a73692a 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -21,7 +21,6 @@ class HighAvailabilityFeature(MindSpeedFeature): def pre_validate_args(self, args): from .high_availability_helper import get_env_args get_env_args(args) - print(args.enable_high_availability) def validate_args(self, args): if args.enable_high_availability: diff --git a/mindspeed_llm/tasks/megatron_adaptor_v2.py b/mindspeed_llm/tasks/megatron_adaptor_v2.py index 0c9ee6864..ac31b4857 100644 --- a/mindspeed_llm/tasks/megatron_adaptor_v2.py +++ b/mindspeed_llm/tasks/megatron_adaptor_v2.py @@ -58,7 +58,6 @@ class FeatureAdaptor: _args, unknown = process_args_v2(parser).parse_known_args() from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args get_env_args(_args) - print(_args.enable_high_availability) parser_unknown_args(_args, unknown) return _args -- Gitee From 0f0ca5b3bb187fcadc41401ce20ed95f2ac767f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 14:59:54 +0800 Subject: [PATCH 13/21] =?UTF-8?q?mindio=20=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../high_availability/high_availability_helper.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability_helper.py b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py index 8c53d6e9c..b15264def 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability_helper.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py @@ -4,6 +4,7 @@ from functools import wraps def get_env_args(args): env = os.getenv('HIGH_AVAILABILITY', '') + print(repr(env.lower())) if env.lower() in ('dump', 'recover', 'retry'): args.enable_high_availability = True if env.lower() == 'recover': -- Gitee From 95913ca7f3b32dcec66c34dfccb35b7cb7f03772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 15:04:16 +0800 Subject: [PATCH 14/21] =?UTF-8?q?mindio=20=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../high_availability/high_availability_helper.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability_helper.py b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py index b15264def..e7f1519c9 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability_helper.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py @@ -4,13 +4,12 @@ from functools import wraps def get_env_args(args): env = os.getenv('HIGH_AVAILABILITY', '') - print(repr(env.lower())) if env.lower() in ('dump', 'recover', 'retry'): args.enable_high_availability = True if env.lower() == 'recover': - args.enable_hbmfault_repair = True - if env.lower() == 'retry': args.enable_worker_reboot = True + if env.lower() == 'retry': + args.enable_hbmfault_repair = True return args -- Gitee From 53b47adf5a583ccfedb9b5c40ec4104a96e6ff85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 15:31:22 +0800 Subject: [PATCH 15/21] =?UTF-8?q?mindio=20=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pytorch/features/high_availability.md | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/pytorch/features/high_availability.md diff --git a/docs/pytorch/features/high_availability.md b/docs/pytorch/features/high_availability.md new file mode 100644 index 000000000..29ee21694 --- /dev/null +++ b/docs/pytorch/features/high_availability.md @@ -0,0 +1,78 @@ +## 昇腾高可用性 + +### 一、特性介绍 + +分布式优化器的思想是通过将优化器状态均匀地分布在数据并行组中来节省内存。基于该思想,MindIO设计了将数据并行组切分成两个副本数据并行组的方案,副本优化器将优化器状态均匀分布在副本数据并行组,实现优化器状态均有备份。结合华为自研的高可用框架,可实现以下功能: + +#### 1.TTP临终遗言功能: + +在训练过程中发生故障后,校验优化器中间状态数据的完整性和一致性,生成一次临终Checkpoint数据,恢复训练时能够通过该CheckPoint恢复到故障前一刻的状态,减少故障造成的训练迭代损失。 + +#### 2.UCE Step级重计算功能: + +昇腾芯片支持NPU卡内存发生UCE故障(内存不可修复)的实时检测,检测到UCE故障后,基于优化器状态副本机制并完成故障卡的在线修复并继续训练,减少训练损失。 + + +### 二、使用说明: + +#### **0.使用约束**: + +由于原理限制,为了保证故障发生后,有完整的优化器状态数据,需要在ptd切分时保障Data Parallel Size大于1,在使用MoE特性时还要求稠密层与稀疏层的Data Parallel Size均大于1,在使用长序列并行特性时还要求dp_cp_size大于1。 + +详见:[MindIO TTP 约束限制-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindiottp/mindiotft005.html) + +#### 1.环境准备 + +MindIO的功能以whl包的形式提供 + +mindio_ttp下载地址:[MindIO TTP 下载软件包-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindioacp/mindioacp009.html) + +由于本特性对片上内存占用会有一定增加,推荐千卡及以上的大规模集群使用本特性,减少故障引起的机时损失。 + +#### 2.启动脚本中添加启动参数: + +`--enable-high-availability` # 使能开启高可用功能的总开关,并使能TTP临终遗言功能,保存checkpoint时要求全局至少存在一份完整的优化器数据; + +`--enable-hbmfault-repair` # 使能进行片上内存故障,Step级重计算功能的开关;本功能将在线进行worker级修复,修复时要求全局至少存在一个故障卡的副本卡。 + +`--enable-worker-reboot` # 使能空中加油功能,配合支持相关功能的 MindX DL 组件共同使能后,在发生一般性故障时,进行进程级重启修复,继续训练。本功能会将故障卡所在节点进行重启,修复时要求未故障节点中至少存在一份完整的优化器数据。 + +`--distributed-optimizer-no-replica` # 不使用副本优化器而使用CKPT文件进行重计算和空中加油修复,需要在故障时存在CKPT文件。 + +#### 3.启动脚本中添加环境变量: + +为避免在结合mindx使用时需配置多个组件的开关,添加环境变量 + +`export HIGH_AVAILABILITY=dump` 启用 `--enable-high-availability` + +`export HIGH_AVAILABILITY=retry` 启用 `--enable-high-availability` `--enable-hbmfault-repair` + +`export HIGH_AVAILABILITY=recover` 启用 `--enable-high-availability` `--enable-worker-reboot` + +### 三、原理说明 + +megatron原生的分布式优化器数据流及工作原理如下图: + +![输入图片说明](https://foruda.gitee.com/images/1720662898713744437/9f9003a6_14290444.png "屏幕截图") + +副本优化器通过设计优化器参数均匀分布在副本DP组,完成优化器状态的备份,从而为TTP/UCE功能提供机制支持: + +![输入图片说明](https://foruda.gitee.com/images/1720665330348419594/4aa04703_14290444.png "屏幕截图") + +副本优化器相比分布式优化器会有内存占用增加,相对占用如下: + +| | Non-distributed optim | Distributed optim | Replica optim | +|----------------------------------|-----------------------|-------------------|---------------| +| fp16/bf16 param, fp16/bf16 grads | 20 | 4 + 16/d | 4 + 32/d | +| fp16/bf16 param, fp32 grads | 18 | 6 + 12/d | 6 + 24/d | + + + +### 四、MindIO TTP 项目介绍 + +MindIO TTP 架构 + +![输入图片说明](https://foruda.gitee.com/images/1720665374547748248/3224f998_14290444.png "屏幕截图") + +MindIO TTP 项目官网地址: +[MindIO TTP 项目介绍-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindiottp/mindiotft001.html) \ No newline at end of file -- Gitee From b99ccce197f4ad5ab05ab91503a2b1b622ac6b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 16:11:35 +0800 Subject: [PATCH 16/21] =?UTF-8?q?mindio=20=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pytorch/features/high_availability.md | 6 +++--- .../high_availability/3224f998_14290444.png | Bin 0 -> 25868 bytes .../high_availability/4aa04703_14290444.png | Bin 0 -> 69022 bytes .../high_availability/9f9003a6_14290444.png | Bin 0 -> 45777 bytes 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 sources/images/high_availability/3224f998_14290444.png create mode 100644 sources/images/high_availability/4aa04703_14290444.png create mode 100644 sources/images/high_availability/9f9003a6_14290444.png diff --git a/docs/pytorch/features/high_availability.md b/docs/pytorch/features/high_availability.md index 29ee21694..40c93453d 100644 --- a/docs/pytorch/features/high_availability.md +++ b/docs/pytorch/features/high_availability.md @@ -53,11 +53,11 @@ mindio_ttp下载地址:[MindIO TTP 下载软件包-昇腾社区](https://www.h megatron原生的分布式优化器数据流及工作原理如下图: -![输入图片说明](https://foruda.gitee.com/images/1720662898713744437/9f9003a6_14290444.png "屏幕截图") +![输入图片说明](https://gitee.com/ascend/MindSpeed-LLM/tree/master/sources/images/high_availability/9f9003a6_14290444.png "屏幕截图") 副本优化器通过设计优化器参数均匀分布在副本DP组,完成优化器状态的备份,从而为TTP/UCE功能提供机制支持: -![输入图片说明](https://foruda.gitee.com/images/1720665330348419594/4aa04703_14290444.png "屏幕截图") +![输入图片说明](https://gitee.com/ascend/MindSpeed-LLM/tree/master/sources/images/high_availability/4aa04703_14290444.png "屏幕截图") 副本优化器相比分布式优化器会有内存占用增加,相对占用如下: @@ -72,7 +72,7 @@ megatron原生的分布式优化器数据流及工作原理如下图: MindIO TTP 架构 -![输入图片说明](https://foruda.gitee.com/images/1720665374547748248/3224f998_14290444.png "屏幕截图") +![输入图片说明](https://gitee.com/ascend/MindSpeed-LLM/tree/master/sources/images/high_availability/3224f998_14290444.png "屏幕截图") MindIO TTP 项目官网地址: [MindIO TTP 项目介绍-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindiottp/mindiotft001.html) \ No newline at end of file diff --git a/sources/images/high_availability/3224f998_14290444.png b/sources/images/high_availability/3224f998_14290444.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8aaff5e5456b518da1e4461ef8533664acab8f GIT binary patch literal 25868 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ୂ$)^{#*eq2W3d{a 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 D6v!X| literal 0 HcmV?d00001 diff --git a/sources/images/high_availability/9f9003a6_14290444.png b/sources/images/high_availability/9f9003a6_14290444.png new file mode 100644 index 0000000000000000000000000000000000000000..2dfbd3b0cf8f0b8601a05bc1d6985a50b2046cc8 GIT binary patch literal 45777 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%0Da&n_NFg505Kj+jPEm8bMmMQrC#OocF0 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 literal 0 HcmV?d00001 -- Gitee From a9baba930c2ae9a90489d42711380f3c9a09e30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 16:20:11 +0800 Subject: [PATCH 17/21] =?UTF-8?q?mindio=20=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pytorch/features/high_availability.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/pytorch/features/high_availability.md b/docs/pytorch/features/high_availability.md index 40c93453d..c92322b5d 100644 --- a/docs/pytorch/features/high_availability.md +++ b/docs/pytorch/features/high_availability.md @@ -53,11 +53,11 @@ mindio_ttp下载地址:[MindIO TTP 下载软件包-昇腾社区](https://www.h megatron原生的分布式优化器数据流及工作原理如下图: -![输入图片说明](https://gitee.com/ascend/MindSpeed-LLM/tree/master/sources/images/high_availability/9f9003a6_14290444.png "屏幕截图") +输入图片说明 副本优化器通过设计优化器参数均匀分布在副本DP组,完成优化器状态的备份,从而为TTP/UCE功能提供机制支持: -![输入图片说明](https://gitee.com/ascend/MindSpeed-LLM/tree/master/sources/images/high_availability/4aa04703_14290444.png "屏幕截图") +输入图片说明 副本优化器相比分布式优化器会有内存占用增加,相对占用如下: @@ -72,7 +72,7 @@ megatron原生的分布式优化器数据流及工作原理如下图: MindIO TTP 架构 -![输入图片说明](https://gitee.com/ascend/MindSpeed-LLM/tree/master/sources/images/high_availability/3224f998_14290444.png "屏幕截图") +输入图片说明 MindIO TTP 项目官网地址: [MindIO TTP 项目介绍-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindiottp/mindiotft001.html) \ No newline at end of file -- Gitee From da03ae50ac715b4a5ad6a2ab6993b545a7368c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 18:24:21 +0800 Subject: [PATCH 18/21] =?UTF-8?q?mindio=20=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features_manager/high_availability/communication_patch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mindspeed_llm/features_manager/high_availability/communication_patch.py b/mindspeed_llm/features_manager/high_availability/communication_patch.py index 47f807adb..0b6ae429f 100644 --- a/mindspeed_llm/features_manager/high_availability/communication_patch.py +++ b/mindspeed_llm/features_manager/high_availability/communication_patch.py @@ -1,4 +1,5 @@ from functools import wraps +import torch def communication_wrapper(fn): @@ -16,7 +17,6 @@ def communication_wrapper(fn): def new_group_wrapper(fn): @wraps(fn) def wrapper(*args, **kwargs): - import torch backend = kwargs.get('backend', None) from mindio_ttp.adaptor import tft_is_arf_reboot_node if tft_is_arf_reboot_node() and isinstance(backend, str) and 'gloo' in backend: -- Gitee From 53ff8e55509c2f909eada1fdf6937a73326ab8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Thu, 14 Aug 2025 20:47:40 +0800 Subject: [PATCH 19/21] =?UTF-8?q?mindio=20=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pytorch/features/high_availability.md | 66 +++++++----------- .../high_availability/high_availability.py | 2 +- .../high_availability_helper.py | 5 ++ mindspeed_llm/tasks/megatron_adaptor_v2.py | 2 +- .../high_availability/3224f998_14290444.png | Bin 25868 -> 0 bytes ..._14290444.png => grad_buffer_sharding.png} | Bin ...703_14290444.png => replica_optimizer.png} | Bin 7 files changed, 33 insertions(+), 42 deletions(-) delete mode 100644 sources/images/high_availability/3224f998_14290444.png rename sources/images/high_availability/{9f9003a6_14290444.png => grad_buffer_sharding.png} (100%) rename sources/images/high_availability/{4aa04703_14290444.png => replica_optimizer.png} (100%) diff --git a/docs/pytorch/features/high_availability.md b/docs/pytorch/features/high_availability.md index c92322b5d..6a521494a 100644 --- a/docs/pytorch/features/high_availability.md +++ b/docs/pytorch/features/high_availability.md @@ -1,35 +1,43 @@ -## 昇腾高可用性 +# 昇腾高可用性 -### 一、特性介绍 +## 使用场景 -分布式优化器的思想是通过将优化器状态均匀地分布在数据并行组中来节省内存。基于该思想,MindIO设计了将数据并行组切分成两个副本数据并行组的方案,副本优化器将优化器状态均匀分布在副本数据并行组,实现优化器状态均有备份。结合华为自研的高可用框架,可实现以下功能: +分布式优化器的思想是通过将优化器状态均匀地分布在数据并行组中来节省内存。基于该思想,MindIO设计了将数据并行组切分成两个副本数据并行组的方案,副本优化器将优化器状态均匀分布在副本数据并行组,实现优化器状态均有备份。由于本特性对片上内存占用会有一定增加,推荐千卡及以上的大规模集群使用本特性,减少故障引起的机时损失。结合华为自研的高可用框架,可实现以下功能: -#### 1.TTP临终遗言功能: +### TTP临终遗言功能 在训练过程中发生故障后,校验优化器中间状态数据的完整性和一致性,生成一次临终Checkpoint数据,恢复训练时能够通过该CheckPoint恢复到故障前一刻的状态,减少故障造成的训练迭代损失。 -#### 2.UCE Step级重计算功能: +### UCE Step级重计算功能 昇腾芯片支持NPU卡内存发生UCE故障(内存不可修复)的实时检测,检测到UCE故障后,基于优化器状态副本机制并完成故障卡的在线修复并继续训练,减少训练损失。 +### 原理说明 -### 二、使用说明: +megatron原生的分布式优化器数据流及工作原理如下图: -#### **0.使用约束**: +输入图片说明 -由于原理限制,为了保证故障发生后,有完整的优化器状态数据,需要在ptd切分时保障Data Parallel Size大于1,在使用MoE特性时还要求稠密层与稀疏层的Data Parallel Size均大于1,在使用长序列并行特性时还要求dp_cp_size大于1。 +副本优化器通过设计优化器参数均匀分布在副本DP组,完成优化器状态的备份,从而为TTP/UCE功能提供机制支持: -详见:[MindIO TTP 约束限制-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindiottp/mindiotft005.html) +输入图片说明 -#### 1.环境准备 +副本优化器相比分布式优化器会有内存占用增加,相对占用如下: + +| | Non-distributed optim | Distributed optim | Replica optim | +|----------------------------------|-----------------------|-------------------|---------------| +| fp16/bf16 param, fp16/bf16 grads | 20 | 4 + 16/d | 4 + 32/d | +| fp16/bf16 param, fp32 grads | 18 | 6 + 12/d | 6 + 24/d | + +## 使用说明 + +### 环境准备 MindIO的功能以whl包的形式提供 mindio_ttp下载地址:[MindIO TTP 下载软件包-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindioacp/mindioacp009.html) -由于本特性对片上内存占用会有一定增加,推荐千卡及以上的大规模集群使用本特性,减少故障引起的机时损失。 - -#### 2.启动脚本中添加启动参数: +### 启动脚本中添加启动参数 `--enable-high-availability` # 使能开启高可用功能的总开关,并使能TTP临终遗言功能,保存checkpoint时要求全局至少存在一份完整的优化器数据; @@ -39,9 +47,9 @@ mindio_ttp下载地址:[MindIO TTP 下载软件包-昇腾社区](https://www.h `--distributed-optimizer-no-replica` # 不使用副本优化器而使用CKPT文件进行重计算和空中加油修复,需要在故障时存在CKPT文件。 -#### 3.启动脚本中添加环境变量: +### 启动脚本中添加环境变量 -为避免在结合mindx使用时需配置多个组件的开关,添加环境变量 +为避免在结合mindx使用时需配置多个组件的开关,添加环境变量,环境变量优先级高于args,设置环境变量会被优先使用。 `export HIGH_AVAILABILITY=dump` 启用 `--enable-high-availability` @@ -49,30 +57,8 @@ mindio_ttp下载地址:[MindIO TTP 下载软件包-昇腾社区](https://www.h `export HIGH_AVAILABILITY=recover` 启用 `--enable-high-availability` `--enable-worker-reboot` -### 三、原理说明 - -megatron原生的分布式优化器数据流及工作原理如下图: - -输入图片说明 +## 使用约束 -副本优化器通过设计优化器参数均匀分布在副本DP组,完成优化器状态的备份,从而为TTP/UCE功能提供机制支持: - -输入图片说明 - -副本优化器相比分布式优化器会有内存占用增加,相对占用如下: - -| | Non-distributed optim | Distributed optim | Replica optim | -|----------------------------------|-----------------------|-------------------|---------------| -| fp16/bf16 param, fp16/bf16 grads | 20 | 4 + 16/d | 4 + 32/d | -| fp16/bf16 param, fp32 grads | 18 | 6 + 12/d | 6 + 24/d | - - - -### 四、MindIO TTP 项目介绍 - -MindIO TTP 架构 - -输入图片说明 +由于原理限制,为了保证故障发生后,有完整的优化器状态数据,需要在ptd切分时保障Data Parallel Size大于1,在使用MoE特性时还要求稠密层与稀疏层的Data Parallel Size均大于1,在使用长序列并行特性时还要求dp_cp_size大于1。 -MindIO TTP 项目官网地址: -[MindIO TTP 项目介绍-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindiottp/mindiotft001.html) \ No newline at end of file +详见:[MindIO TTP 约束限制-昇腾社区](https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/ref/mindiottp/mindiotft005.html) \ No newline at end of file diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index c1a73692a..1567cd799 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -40,10 +40,10 @@ class HighAvailabilityFeature(MindSpeedFeature): def pre_register_patches(self, patch_manager, args): from .communication_patch import communication_wrapper from .high_availability_helper import skip_reuse_register_patches + from mindspeed.features_manager import ReuseFP32Param for communication in ['barrier', 'all_reduce', '_all_gather_base', 'broadcast', 'all_gather_into_tensor']: patch_manager.register_patch('torch.distributed.distributed_c10d.' + communication, communication_wrapper) - from mindspeed.features_manager import ReuseFP32Param ReuseFP32Param.register_patches = skip_reuse_register_patches(ReuseFP32Param.register_patches, args) def register_patches(self, patch_manager, args): diff --git a/mindspeed_llm/features_manager/high_availability/high_availability_helper.py b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py index e7f1519c9..eb1d3a5cf 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability_helper.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability_helper.py @@ -1,10 +1,15 @@ import os +import warnings from functools import wraps def get_env_args(args): env = os.getenv('HIGH_AVAILABILITY', '') if env.lower() in ('dump', 'recover', 'retry'): + if not getattr(args, 'enable_high_availability', False): + warnings.warn( + "HIGH_AVAILABILITY environment variables enabled and args.enable_high_availability inactive" + ) args.enable_high_availability = True if env.lower() == 'recover': args.enable_worker_reboot = True diff --git a/mindspeed_llm/tasks/megatron_adaptor_v2.py b/mindspeed_llm/tasks/megatron_adaptor_v2.py index ac31b4857..7a068c0be 100644 --- a/mindspeed_llm/tasks/megatron_adaptor_v2.py +++ b/mindspeed_llm/tasks/megatron_adaptor_v2.py @@ -54,9 +54,9 @@ class FeatureAdaptor: return cls._args from mindspeed_llm.training.arguments import process_args_v2 + from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args parser = argparse.ArgumentParser(description='MindSpeed-LLM Arguments', allow_abbrev=False) _args, unknown = process_args_v2(parser).parse_known_args() - from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args get_env_args(_args) parser_unknown_args(_args, unknown) return _args diff --git a/sources/images/high_availability/3224f998_14290444.png b/sources/images/high_availability/3224f998_14290444.png deleted file mode 100644 index 4c8aaff5e5456b518da1e4461ef8533664acab8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25868 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 Date: Fri, 15 Aug 2025 15:08:52 +0800 Subject: [PATCH 20/21] =?UTF-8?q?mindio=20=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../features_manager/high_availability/high_availability.py | 2 +- mindspeed_llm/tasks/megatron_adaptor_v2.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mindspeed_llm/features_manager/high_availability/high_availability.py b/mindspeed_llm/features_manager/high_availability/high_availability.py index 1567cd799..c1a73692a 100644 --- a/mindspeed_llm/features_manager/high_availability/high_availability.py +++ b/mindspeed_llm/features_manager/high_availability/high_availability.py @@ -40,10 +40,10 @@ class HighAvailabilityFeature(MindSpeedFeature): def pre_register_patches(self, patch_manager, args): from .communication_patch import communication_wrapper from .high_availability_helper import skip_reuse_register_patches - from mindspeed.features_manager import ReuseFP32Param for communication in ['barrier', 'all_reduce', '_all_gather_base', 'broadcast', 'all_gather_into_tensor']: patch_manager.register_patch('torch.distributed.distributed_c10d.' + communication, communication_wrapper) + from mindspeed.features_manager import ReuseFP32Param ReuseFP32Param.register_patches = skip_reuse_register_patches(ReuseFP32Param.register_patches, args) def register_patches(self, patch_manager, args): diff --git a/mindspeed_llm/tasks/megatron_adaptor_v2.py b/mindspeed_llm/tasks/megatron_adaptor_v2.py index 7a068c0be..ac31b4857 100644 --- a/mindspeed_llm/tasks/megatron_adaptor_v2.py +++ b/mindspeed_llm/tasks/megatron_adaptor_v2.py @@ -54,9 +54,9 @@ class FeatureAdaptor: return cls._args from mindspeed_llm.training.arguments import process_args_v2 - from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args parser = argparse.ArgumentParser(description='MindSpeed-LLM Arguments', allow_abbrev=False) _args, unknown = process_args_v2(parser).parse_known_args() + from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args get_env_args(_args) parser_unknown_args(_args, unknown) return _args -- Gitee From 067c0c9e79a860ec4ada4065a95696428cc197dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=AD=90=E8=B0=A6?= Date: Fri, 15 Aug 2025 15:41:32 +0800 Subject: [PATCH 21/21] =?UTF-8?q?mindio=20=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mindspeed_llm/tasks/megatron_adaptor_v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mindspeed_llm/tasks/megatron_adaptor_v2.py b/mindspeed_llm/tasks/megatron_adaptor_v2.py index ac31b4857..7a068c0be 100644 --- a/mindspeed_llm/tasks/megatron_adaptor_v2.py +++ b/mindspeed_llm/tasks/megatron_adaptor_v2.py @@ -54,9 +54,9 @@ class FeatureAdaptor: return cls._args from mindspeed_llm.training.arguments import process_args_v2 + from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args parser = argparse.ArgumentParser(description='MindSpeed-LLM Arguments', allow_abbrev=False) _args, unknown = process_args_v2(parser).parse_known_args() - from mindspeed_llm.features_manager.high_availability.high_availability_helper import get_env_args get_env_args(_args) parser_unknown_args(_args, unknown) return _args -- Gitee