From b9202b12bcc23959c2c3b9539c363a8f323e23e8 Mon Sep 17 00:00:00 2001 From: huangting4201 <1538303371@qq.com> Date: Fri, 1 Sep 2023 13:24:46 +0800 Subject: [PATCH 1/8] feat(utils/writer.py): support writer add_scalars for writing dict data (#257) * feat(utils/writer.py): support writer add_scalars interface for writing dict data * feat(hybrid_zero_optim.py): change grad_norm_groups list to dict --- .../solver/optimizer/hybrid_zero_optim.py | 35 ++++++++++-------- internlm/train/training_internlm.py | 36 +++++++++++-------- internlm/utils/writer.py | 8 +++++ train.py | 5 ++- 4 files changed, 52 insertions(+), 32 deletions(-) diff --git a/internlm/solver/optimizer/hybrid_zero_optim.py b/internlm/solver/optimizer/hybrid_zero_optim.py index 8bdeccf..63d2bfa 100644 --- a/internlm/solver/optimizer/hybrid_zero_optim.py +++ b/internlm/solver/optimizer/hybrid_zero_optim.py @@ -497,6 +497,7 @@ class HybridZeroOptimizer(BaseOptimizer): grads = [self.padding_grad] params = [self.padding_tensor] + norm = 0 if self._clip_grad_norm > 0: # this norm is before scaling, it will be very large norm = compute_norm( @@ -542,15 +543,15 @@ class HybridZeroOptimizer(BaseOptimizer): self._param_store.clear_grads_of_previous_reduced_params() # compute norm for gradients in the last bucket - total_norms = [] + total_norms = {} for group_id in range(self.num_param_groups): - total_norms.append( - self._compute_norm_with_stage( - group_id=group_id, - last_bucket=True, - last_stage=True, - previous_norm=groups_norms[group_id], - ) + group_name = self.param_groups[group_id]["name"] if "name" in self.param_groups[group_id] else "default" + group_name = f"{group_id}_{group_name}" + total_norms[group_name] = self._compute_norm_with_stage( + group_id=group_id, + last_bucket=True, + last_stage=True, + previous_norm=groups_norms[group_id], ) timer("sync_grad").start() @@ -569,7 +570,7 @@ class HybridZeroOptimizer(BaseOptimizer): # found_inf = self._check_overflow() # Because you may encounter inf when computing norm - if -1 in norms: + if -1 in norms.values(): found_inf = True loss_scale = float(self.loss_scale.item()) # backup @@ -617,15 +618,17 @@ class HybridZeroOptimizer(BaseOptimizer): # unscale and clip grads # get the global norm - global_norm_groups = [] + global_norm_groups = {} if self._clip_grad_norm > 0: - for norm in norms: - global_norm_groups.append(norm**0.5) + for group_name, norm in norms.items(): + global_norm_groups[group_name] = norm**0.5 # the following operations are performed only on the rank to which parameters are assigned. if gpc.config.model.dtype is not torch.float32: - if len(single_grad_partition_groups) != 0: - self._unscale_and_clip_grads(single_grad_partition_groups, global_norm_groups, loss_scale) + if len(single_grad_partition_groups) != 0 and self._clip_grad_norm > 0: + self._unscale_and_clip_grads( + single_grad_partition_groups, list(global_norm_groups.values()), loss_scale + ) # update the parameters timer("step").start() @@ -652,7 +655,9 @@ class HybridZeroOptimizer(BaseOptimizer): # update gradients may not be needed here, because the sync_params function is used in initialization, # so synchronization is maintained - return True, [global_norm / loss_scale for global_norm in global_norm_groups] + for group_name, global_norm in global_norm_groups.items(): + global_norm_groups[group_name] = global_norm / loss_scale + return True, global_norm_groups def broadcast_params(self): handles = [] diff --git a/internlm/train/training_internlm.py b/internlm/train/training_internlm.py index bab56f1..9c2ded0 100644 --- a/internlm/train/training_internlm.py +++ b/internlm/train/training_internlm.py @@ -389,23 +389,31 @@ def record_current_batch_training_metrics( line = "" for key, value in infos.items(): line += f"{key}={value} " - writer.add_scalar(key=key, value=value, step=train_state.step_count) + if isinstance(value, dict): + writer.add_scalars(key=key, value=value, step=train_state.step_count) + else: + writer.add_scalar(key=key, value=value, step=train_state.step_count) if update_panel: + # metrics shown with dashboard panels + panel_metrics = { + "step": batch_count, + "lr": lr, + "num_consumed_tokens": train_state.num_consumed_tokens, + "loss": loss.item(), + "flops": tflops, + "tgs": tk_per_gpu, + "acc": acc_perplex["acc"], + "perplexity": acc_perplex["perplexity"], + "fwd_bwd_time": fwd_bwd_time, + } + for norm_key, norm_value in grad_norm.items(): + panel_metrics[norm_key] = norm_value + logger.info( - line, - extra={ - "step": batch_count, - "lr": lr, - "num_consumed_tokens": train_state.num_consumed_tokens, - "grad_norm": grad_norm, - "loss": loss.item(), - "flops": tflops, - "tgs": tk_per_gpu, - "acc": acc_perplex["acc"], - "perplexity": acc_perplex["perplexity"], - "fwd_bwd_time": fwd_bwd_time, - }, + "{line}", + line=line, + extra=panel_metrics, ) else: logger.info(line) diff --git a/internlm/utils/writer.py b/internlm/utils/writer.py index 0997817..b519b95 100644 --- a/internlm/utils/writer.py +++ b/internlm/utils/writer.py @@ -134,6 +134,14 @@ class Writer: except Exception: traceback.print_exc() + def add_scalars(self, key, value, step): + try: + assert isinstance(value, dict) + if self.enable_tb and self.tb_writer is not None: + self.tb_writer.add_scalars(main_tag=key, tag_scalar_dict=value, global_step=step) + except Exception: + traceback.print_exc() + def add_text(self, key, value, step): try: if self.enable_tb and self.tb_writer is not None: diff --git a/train.py b/train.py index de7cc7c..902f8c0 100644 --- a/train.py +++ b/train.py @@ -6,7 +6,6 @@ import time import traceback from functools import partial -import numpy as np import torch import torch.distributed as dist @@ -236,7 +235,7 @@ def main(args): train_state.step_count += 1 else: train_state.inf_nan_skip_batches += 1 # record the amount of updating parameters unsuccessfully. - if -1 in grad_norm_groups and gpc.is_rank_for_log(): # -1 encodes a specific failure case + if -1 in grad_norm_groups.values() and gpc.is_rank_for_log(): # -1 encodes a specific failure case logger.warning(f"Warning: skip parameter update at step {batch_count}.") send_alert_message( address=gpc.config.alert_address, @@ -257,7 +256,7 @@ def main(args): trainer=trainer, start_time=start_time, loss=loss, - grad_norm=np.array(grad_norm_groups), + grad_norm=grad_norm_groups, metric=metric, update_panel=uniscale_logger is not None, ) From 860de0aa4679d1e7135ded1c03a79b0b815694ba Mon Sep 17 00:00:00 2001 From: Sun Peng Date: Fri, 1 Sep 2023 13:38:01 +0800 Subject: [PATCH 2/8] Feat/add runntime gpu test (#254) * feat: add gpu bench * feat/add allreduce runtime bench --------- Co-authored-by: sunpengsdu --- internlm/core/context/__init__.py | 2 + internlm/core/context/parallel_context.py | 6 + .../core/context/process_group_initializer.py | 55 ++++++ internlm/utils/gputest.py | 163 ++++++++++++++++++ train.py | 3 + 5 files changed, 229 insertions(+) create mode 100644 internlm/utils/gputest.py diff --git a/internlm/core/context/__init__.py b/internlm/core/context/__init__.py index 97021dc..3fc7deb 100644 --- a/internlm/core/context/__init__.py +++ b/internlm/core/context/__init__.py @@ -7,6 +7,7 @@ from .parallel_context import ( from .process_group_initializer import ( Initializer_Data, Initializer_Model, + Initializer_Nettest, Initializer_Pipeline, Initializer_Tensor, Initializer_Zero1, @@ -34,6 +35,7 @@ __all__ = [ "Initializer_Pipeline", "Initializer_Data", "Initializer_Zero1", + "Initializer_Nettest", "ProcessGroupInitializer", "Initializer_Model", "seed", diff --git a/internlm/core/context/parallel_context.py b/internlm/core/context/parallel_context.py index 87d3114..f1de5ad 100644 --- a/internlm/core/context/parallel_context.py +++ b/internlm/core/context/parallel_context.py @@ -143,6 +143,7 @@ class ParallelContext(metaclass=SingletonMeta): self.pipeline_parallel_size = 1 self.tensor_parallel_size = 1 self.zero1_parallel_size = -1 + self.nettest_parallel_size = 1 self.num_processes_on_current_node = -1 self.virtual_pipeline_parallel_size = None self.virtual_pipeline_parallel_rank = None @@ -442,6 +443,9 @@ class ParallelContext(metaclass=SingletonMeta): # instead, it should be calculated based on other parallel config self.data_parallel_size = self.world_size // (self.pipeline_parallel_size * self.tensor_parallel_size) + # the recommended nettest_parallel_size is 32 GPUs + self.nettest_parallel_size = 32 + if self.zero1_parallel_size <= 0: self.zero1_parallel_size = self.data_parallel_size @@ -454,6 +458,7 @@ class ParallelContext(metaclass=SingletonMeta): self.pipeline_parallel_size, self.tensor_parallel_size, self.zero1_parallel_size, + self.nettest_parallel_size, ] # run initialization of different process groups @@ -462,6 +467,7 @@ class ParallelContext(metaclass=SingletonMeta): initializers.append(pgroup_initializer.Initializer_Model(*initializer_args)) initializers.append(pgroup_initializer.Initializer_Tensor(*initializer_args)) initializers.append(pgroup_initializer.Initializer_Zero1(*initializer_args)) + initializers.append(pgroup_initializer.Initializer_Nettest(*initializer_args)) if self.pipeline_parallel_size > 1: initializers.append(pgroup_initializer.Initializer_Pipeline(*initializer_args)) for initializer in initializers: diff --git a/internlm/core/context/process_group_initializer.py b/internlm/core/context/process_group_initializer.py index 56cf16d..facb806 100644 --- a/internlm/core/context/process_group_initializer.py +++ b/internlm/core/context/process_group_initializer.py @@ -3,6 +3,7 @@ # adopted from https://github.com/hpcaitech/ColossalAI/blob/main/colossalai/context +import math from abc import ABC, abstractmethod from enum import Enum @@ -31,6 +32,9 @@ class ParallelMode(Enum): # zero1 parallel ZERO1 = "zero1" + # runntime network test + NETTEST = "nettest" + class ProcessGroupInitializer(ABC): """An object, knowing the parallelism configuration, that initializes parallel groups. @@ -52,6 +56,7 @@ class ProcessGroupInitializer(ABC): pipeline_parallel_size: int, tensor_parallel_size: int, zero1_parallel_size: int, + nettest_parallel_size: int, ): self.rank = rank self.world_size = world_size @@ -59,6 +64,7 @@ class ProcessGroupInitializer(ABC): self.pipeline_parallel_size = pipeline_parallel_size self.tensor_parallel_size = tensor_parallel_size self.zero1_parallel_size = zero1_parallel_size + self.nettest_parallel_size = nettest_parallel_size super().__init__() @abstractmethod @@ -332,3 +338,52 @@ class Initializer_Zero1(ProcessGroupInitializer): ranks_in_group = ranks return local_rank, group_world_size, process_group, cpu_group, ranks_in_group, mode + + +class Initializer_Nettest(ProcessGroupInitializer): + """A ProcessGroupInitializer for network test, especailly for NCCL. + + Args: + rank (int): The rank of current process. + world_size (int): Size of whole communication world. + nettest_parallel_size (int): Size of a network test group. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.num_nettest_group = math.ceil(self.world_size / self.nettest_parallel_size) + + def init_dist_group(self, use_cpu: bool = False): + """Initialize tensor parallel groups, and assign local_ranks and groups to each gpu. + + Returns: + Tuple (local_rank, group_world_size, process_group, ranks_in_group, mode): + A Tensor parallelism's information tuple. + """ + local_rank = None + ranks_in_group = None + process_group = None + cpu_group = None + group_world_size = None + mode = ParallelMode.NETTEST + + for i in range(self.num_nettest_group): + ranks = [] + for j in range(self.nettest_parallel_size): + rank = i * self.nettest_parallel_size + j + if rank < self.world_size: + ranks.append(rank) + group = dist.new_group(ranks) + if use_cpu: + group_cpu = dist.new_group(ranks, backend="gloo") if dist.get_backend() != "gloo" else group + else: + group_cpu = None + + if self.rank in ranks: + local_rank = ranks.index(self.rank) + group_world_size = len(ranks) + process_group = group + cpu_group = group_cpu + ranks_in_group = ranks + + return local_rank, group_world_size, process_group, cpu_group, ranks_in_group, mode diff --git a/internlm/utils/gputest.py b/internlm/utils/gputest.py new file mode 100644 index 0000000..27ae9bd --- /dev/null +++ b/internlm/utils/gputest.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +import math +import socket + +import torch +import torch.distributed as dist +from flash_attn.modules.mha import FlashSelfAttention, SelfAttention +from torch.utils import benchmark + +from internlm.utils.logger import get_logger + +try: + import GPUtil + import psutil +except ImportError: + GPUtil, psutil = None, None + +from internlm.core.context import ParallelMode +from internlm.core.context import global_context as gpc +from internlm.utils.common import get_current_device + +logger = get_logger(__file__) + + +def benchmark_forward( + test_fn, + *inputs, + repeats=100, + amp=True, + amp_dtype=torch.float16, + **kwinputs, +): + """Use Pytorch Benchmark on the forward pass of an arbitrary function.""" + + def amp_wrapper(*inputs, **kwinputs): + with torch.autocast(device_type="cuda", dtype=amp_dtype, enabled=amp): + test_fn(*inputs, **kwinputs) + + bench_timer = benchmark.Timer( + stmt="test_fn_amp(*inputs, **kwinputs)", + globals={"test_fn_amp": amp_wrapper, "inputs": inputs, "kwinputs": kwinputs}, + num_threads=torch.get_num_threads(), + ) + used_time = bench_timer.timeit(repeats) + return used_time.mean + + +def flops(batch, seqlen, headdim, nheads, time_f): + """Compute the flops value of a GPU with give flashattention function""" + + flop = 4 * batch * seqlen**2 * nheads * headdim + return (flop / time_f / 10**12) if not math.isnan(time_f) else 0.0 + + +def get_gpu_temperature(): + """Get current GPU temperature.""" + try: + gpu_id = torch.cuda.current_device() + except AssertionError: + gpu_id = -1 + + if GPUtil is not None and gpu_id >= 0: + gpus = GPUtil.getGPUs() + gpu_temperature = gpus[gpu_id].temperature + else: + gpu_temperature = -1 + + return gpu_temperature + + +def get_cpu_temperature(): + """Get current CPU temperature.""" + + if psutil is not None: + cpu_temperature = psutil.sensors_temperatures()["coretemp"][0].current + else: + cpu_temperature = -1 + + return cpu_temperature + + +def bench_net(): + """Benchmark nccl performance for slow node detection.""" + + if gpc.get_world_size(ParallelMode.GLOBAL) <= 1: + return + + if gpc.is_rank_for_log(): + logger.info("benchmarking network speed ...") + + repeats = 100 + input_data = torch.randn( + 8 * 1024 * 1024, + device=get_current_device(), + dtype=torch.bfloat16, + ) + + def allreduce_fn(inputs): + dist.all_reduce(inputs, op=torch.distributed.ReduceOp.AVG, group=gpc.get_group(ParallelMode.NETTEST)) + + bench_timer = benchmark.Timer( + stmt="test_fn_amp(inputs)", + globals={"test_fn_amp": allreduce_fn, "inputs": input_data}, + num_threads=torch.get_num_threads(), + ) + allreduce_time = bench_timer.timeit(repeats).mean + allreduce_time = allreduce_time * 10**3 + allreduce_time_this = allreduce_time + allreduce_time = torch.Tensor([allreduce_time]).to(device=get_current_device()) + dist.all_reduce(allreduce_time, group=gpc.get_group(ParallelMode.GLOBAL)) + allreduce_time_avg = allreduce_time / gpc.get_world_size(ParallelMode.GLOBAL) + allreduce_time_avg = float(allreduce_time_avg.item()) + + if allreduce_time_this >= allreduce_time_avg * 1.05: + logger.warning( + f"Rank {gpc.get_local_rank(ParallelMode.GLOBAL)} NCCL test is slower than avg, " + f"Hostname {socket.gethostname()}, " + f"allreduce_time {allreduce_time_this:.2f}, avg {allreduce_time_avg:.2f}, " + f"CPU temp {get_cpu_temperature()}, GPU temp { get_gpu_temperature()}" + ) + + +def bench_gpu(use_flash_attn=True): + """Benchmark single GPU performance for slow node detection.""" + + if gpc.is_rank_for_log(): + logger.info("benchmarking gpu speed ...") + + headdim = 64 + dim = 2048 + batch_size, seqlen = 2, 1024 + nheads = dim // headdim + + inner_attn = FlashSelfAttention if use_flash_attn else SelfAttention + inner_attn = inner_attn(causal=True, softmax_scale=None, attention_dropout=0) + + qkv = torch.randn( + batch_size, + seqlen, + 3, + dim // headdim, + headdim, + device=get_current_device(), + dtype=torch.float16, + requires_grad=True, + ) + time_f = benchmark_forward(inner_attn, qkv) + speed = flops(batch_size, seqlen, headdim, nheads, time_f) + speed_this = speed + speed = torch.Tensor([speed]).to(device=get_current_device()) + dist.all_reduce(speed, group=gpc.get_group(ParallelMode.GLOBAL)) + speed_avg = speed / gpc.get_world_size(ParallelMode.GLOBAL) + speed_avg = float(speed_avg.item()) + + if speed_this <= speed_avg * 0.95: + logger.warning( + f"Rank {gpc.get_local_rank(ParallelMode.GLOBAL)} GPU is slower than avg, " + f"Hostname {socket.gethostname()}, " + f"tflops {speed_this:.2f}, avg {speed_avg:.2f}, " + f"CPU temp {get_cpu_temperature()}, GPU temp { get_gpu_temperature()}" + ) diff --git a/train.py b/train.py index 902f8c0..69cdd3c 100644 --- a/train.py +++ b/train.py @@ -35,6 +35,7 @@ from internlm.utils.common import ( parse_args, ) from internlm.utils.evaluation import evaluate_on_val_dls +from internlm.utils.gputest import bench_gpu, bench_net from internlm.utils.logger import get_logger, initialize_uniscale_logger from internlm.utils.megatron_timers import megatron_timer as timer from internlm.utils.model_checkpoint import CheckpointManager @@ -196,6 +197,8 @@ def main(args): for batch_count in range(train_state.batch_count, total_steps): if batch_count % 50 == 0: torch.cuda.empty_cache() + bench_gpu() + bench_net() start_time = time.time() timer("one-batch").start() From 74afbb0c772422ac02c61b836c1d4a6e6bebb5d4 Mon Sep 17 00:00:00 2001 From: huangting4201 <1538303371@qq.com> Date: Fri, 1 Sep 2023 15:46:33 +0800 Subject: [PATCH 3/8] feat(code-docs): add enum_tools in code-docs requirements (#264) Co-authored-by: huangting4201 --- doc/code-docs/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/code-docs/requirements.txt b/doc/code-docs/requirements.txt index 9a4bb3d..8cb9316 100644 --- a/doc/code-docs/requirements.txt +++ b/doc/code-docs/requirements.txt @@ -3,4 +3,5 @@ sphinx-autobuild recommonmark sphinx_rtd_theme sphinx_markdown_tables -autodoc_pydantic==1.9 \ No newline at end of file +autodoc_pydantic==1.9 +enum_tools \ No newline at end of file From 3d091c302d4b9cf47e7d109701d471e83ebbaec4 Mon Sep 17 00:00:00 2001 From: huangting4201 <1538303371@qq.com> Date: Mon, 4 Sep 2023 10:20:06 +0800 Subject: [PATCH 4/8] fix(doc/code-docs): autodoc shown error (#265) * feat(code-docs): test auto doc * feat(code-docs): test auto doc * feat(code-docs): test auto doc * feat(code-docs): test auto doc --- doc/code-docs/requirements.txt | 5 ++++- doc/code-docs/source/conf.py | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/doc/code-docs/requirements.txt b/doc/code-docs/requirements.txt index 8cb9316..8cbfddf 100644 --- a/doc/code-docs/requirements.txt +++ b/doc/code-docs/requirements.txt @@ -4,4 +4,7 @@ recommonmark sphinx_rtd_theme sphinx_markdown_tables autodoc_pydantic==1.9 -enum_tools \ No newline at end of file +enum_tools +numpy +torch +tqdm \ No newline at end of file diff --git a/doc/code-docs/source/conf.py b/doc/code-docs/source/conf.py index 5986f06..4bce035 100644 --- a/doc/code-docs/source/conf.py +++ b/doc/code-docs/source/conf.py @@ -42,6 +42,22 @@ autodoc_pydantic_model_summary_list_order = "bysource" autodoc_pydantic_model_member_order = "bysource" autodoc_pydantic_field_list_validators = False +# Napoleon settings +napoleon_google_docstring = True +napoleon_numpy_docstring = True +napoleon_include_init_with_doc = False +napoleon_include_private_with_doc = False +napoleon_include_special_with_doc = True +napoleon_use_admonition_for_examples = False +napoleon_use_admonition_for_notes = False +napoleon_use_admonition_for_references = False +napoleon_use_ivar = False +napoleon_use_param = True +napoleon_use_rtype = True +napoleon_preprocess_types = False +napoleon_type_aliases = None +napoleon_attr_annotations = True + templates_path = ["_templates"] exclude_patterns = [] @@ -52,11 +68,24 @@ exclude_patterns = [] html_theme = "sphinx_rtd_theme" html_static_path = ["_static"] +# GitHub integration +html_context = { + "display_github": True, + "github_user": "pjlab", + "github_repo": "InternLM", + "github_version": "master", + "conf_py_path": "/doc/code-docs/source/", +} + sys.path.insert(0, os.path.abspath("../../../")) # Prepend module names to class descriptions add_module_names = True -autoclass_content = "init" +autoclass_content = "class" -autodoc_mock_imports = ["apex", "torch"] +autodoc_mock_imports = [ + "apex", + "torch", + "numpy", +] From 5238f15e2d1bc08dc9669f8950f32dd6d2b889c1 Mon Sep 17 00:00:00 2001 From: Shuo Zhang Date: Mon, 4 Sep 2023 23:14:07 +0800 Subject: [PATCH 5/8] fix(eval): no need to check length of valid_dl when using streaming dataset (#274) * fix(eval): StreamingDataset does not have an __len__ method. * fix(eval): StreamingDataset has no len method --- internlm/utils/evaluation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internlm/utils/evaluation.py b/internlm/utils/evaluation.py index 872ef87..2b9a384 100644 --- a/internlm/utils/evaluation.py +++ b/internlm/utils/evaluation.py @@ -136,7 +136,7 @@ def evaluate_on_val_dls( dist.barrier() val_res = val_metric.get_metric() - if verbose and len(val_dl) != 0: + if verbose and (streaming or len(val_dl) != 0): val_loss = val_loss / (val_idx + 1 + 1e-6) infos = { "step": step_count, From 7f61505fa014d909c3382576cef808839ba080be Mon Sep 17 00:00:00 2001 From: Sun Peng Date: Tue, 5 Sep 2023 17:47:50 +0800 Subject: [PATCH 6/8] fix/broadcast should not in commu stream (#276) * fix/brocast should not in commu stream * fix/brocast should not in commu stream --------- Co-authored-by: yingtongxiong <974106207@qq.com> --- internlm/solver/optimizer/hybrid_zero_optim.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/internlm/solver/optimizer/hybrid_zero_optim.py b/internlm/solver/optimizer/hybrid_zero_optim.py index 63d2bfa..700d0dc 100644 --- a/internlm/solver/optimizer/hybrid_zero_optim.py +++ b/internlm/solver/optimizer/hybrid_zero_optim.py @@ -164,9 +164,6 @@ class HybridZeroOptimizer(BaseOptimizer): self._param_bcast_sync_handler = param_bcast_sync_handler if self._overlap_sync_param: assert self._param_bcast_sync_handler is not None - self._broadcast_comm_stream = torch.cuda.Stream() - else: - self._broadcast_comm_stream = torch.cuda.current_stream() # iterate over the param group in the optimizer # partition these param groups for data parallel training @@ -648,8 +645,7 @@ class HybridZeroOptimizer(BaseOptimizer): fp32_param = self._fp32_flat_param_groups_of_current_rank[group_id] fp16_param.data.copy_(fp32_param) - with torch.cuda.stream(self._broadcast_comm_stream): - self.broadcast_params() + self.broadcast_params() timer("step").stop() From b6d909d43e127c441fa0c2a336d4ca5d7f0e9093 Mon Sep 17 00:00:00 2001 From: Season Date: Wed, 6 Sep 2023 15:36:03 +0800 Subject: [PATCH 7/8] docs(*): add documentation and reST files for readthedocs (#272) * add initial reST files for readthedocs * fix typos * docs refine and minor fix * add references for parallel training section * fix reST format * fix reST format * fix reST format * add comments for trainer API * add link to step-by-step quickstart guide * docs(code-docs/source/parallel.rst): add paper link url * docs(code-docs/source/parallel.rst): add paper link url * use MyST to render markdown * docs(code-docs/source/initialize.rst): update model init * add requirements for myst-parser * reuse install and usage markdown * docs(code-docs/source/index.rst): add example and q&a * docs(doc/code-docs/*): docs refine * docs(code-docs/source/parallel.rst): update docs for zero config * docs(code-docs/source/example.rst): fix typos for example.rst * docs(code-docs/source/example.rst): refine docs * docs(code-docs/source/example): update example * docs(code-docs/source/example): delete useless example * docs(code-docs/source/*): fix image display issue * docs(code-docs/source/parallel.rst): add docs for communication overlap * docs(code-docs/source/conf.py): update conf.py * docs(code-docs/source/example): update example 30B demo * docs(code-docs/source/parallel.rst): update pipeline parallel * docs(code-docs/source/parallel.rst): update pipeline parallel * docs(code-docs/source/parallel.rst): update pipeline parallel * docs(code-docs/source/parallel.rst): update pipeline parallel * docs(code-docs/source/parallel.rst): update ZeRO1.5 * docs(code-docs/source/parallel.rst): update ZeRO1.5 * docs(code-docs/source): fix word spelling error --------- Co-authored-by: huangting4201 --- doc/code-docs/requirements.txt | 5 +- doc/code-docs/source/checkpoint.rst | 12 +- doc/code-docs/source/conf.py | 12 +- doc/code-docs/source/example/30B_demo.rst | 203 ++++++++++++++++++ doc/code-docs/source/example/7B_demo.rst | 193 +++++++++++++++++ doc/code-docs/source/example/index.rst | 18 ++ doc/code-docs/source/index.rst | 27 ++- doc/code-docs/source/initialize.rst | 57 ++++- doc/code-docs/source/install.md | 72 +------ doc/code-docs/source/monitor.rst | 18 +- doc/code-docs/source/parallel.rst | 141 +++++++++++- doc/code-docs/source/profiler.rst | 22 +- doc/code-docs/source/qa.rst | 2 + doc/code-docs/source/training.rst | 10 +- doc/code-docs/source/usage.md | 4 + doc/en/install.md | 2 +- doc/en/usage.md | 7 +- doc/imgs/pipeline_schedule.png | Bin 0 -> 257725 bytes doc/imgs/sequence_parallel.png | Bin 0 -> 173844 bytes doc/imgs/tensor_parallel.png | Bin 0 -> 131894 bytes .../core/scheduler/no_pipeline_scheduler.py | 14 +- internlm/core/scheduler/pipeline_scheduler.py | 3 +- internlm/core/trainer.py | 6 + internlm/initialize/initialize_trainer.py | 4 +- internlm/initialize/launch.py | 2 +- internlm/model/modeling_internlm.py | 3 +- internlm/monitor/monitor.py | 8 + internlm/train/training_internlm.py | 20 +- 28 files changed, 755 insertions(+), 110 deletions(-) create mode 100644 doc/code-docs/source/example/30B_demo.rst create mode 100644 doc/code-docs/source/example/7B_demo.rst create mode 100644 doc/code-docs/source/example/index.rst create mode 100644 doc/code-docs/source/qa.rst create mode 100644 doc/code-docs/source/usage.md create mode 100644 doc/imgs/pipeline_schedule.png create mode 100644 doc/imgs/sequence_parallel.png create mode 100644 doc/imgs/tensor_parallel.png diff --git a/doc/code-docs/requirements.txt b/doc/code-docs/requirements.txt index 8cbfddf..604cb2c 100644 --- a/doc/code-docs/requirements.txt +++ b/doc/code-docs/requirements.txt @@ -1,10 +1,11 @@ Sphinx sphinx-autobuild -recommonmark sphinx_rtd_theme sphinx_markdown_tables autodoc_pydantic==1.9 enum_tools numpy torch -tqdm \ No newline at end of file +tqdm +pyecharts +myst-parser \ No newline at end of file diff --git a/doc/code-docs/source/checkpoint.rst b/doc/code-docs/source/checkpoint.rst index 3ceed08..08d4c8f 100644 --- a/doc/code-docs/source/checkpoint.rst +++ b/doc/code-docs/source/checkpoint.rst @@ -1,2 +1,12 @@ Model Checkpointing -=================== \ No newline at end of file +=================== + +InternLM uses ``internlm.utils.model_checkpoint.CheckpointManager`` to manage model checkpointing. In the implementation, +we use ``CheckpointManager.try_save_checkpoint(train_state)`` to checkpoint training states at specific steps. InternLM supports +automatic loading of latest ckpt at startup and automatic model checkpointing at signal quit. + +Checkpointing +------------- + +.. autoclass:: internlm.utils.model_checkpoint.CheckpointManager + :members: diff --git a/doc/code-docs/source/conf.py b/doc/code-docs/source/conf.py index 4bce035..856ffb6 100644 --- a/doc/code-docs/source/conf.py +++ b/doc/code-docs/source/conf.py @@ -12,19 +12,25 @@ import sys project = "InternLM" copyright = "2023, InternLM Team" author = "InternLM Team" -release = "v0.2.0" + +with open("../../../version.txt", "r") as f: + release = f.readline().rstrip() + +master_doc = 'index' + +autodoc_member_order = 'bysource' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ - "recommonmark", "sphinx_rtd_theme", "sphinx.ext.viewcode", "sphinx.ext.autodoc", "sphinxcontrib.autodoc_pydantic", "sphinx.ext.autosectionlabel", "sphinx.ext.napoleon", + "myst_parser", ] pygments_style = "sphinx" @@ -71,7 +77,7 @@ html_static_path = ["_static"] # GitHub integration html_context = { "display_github": True, - "github_user": "pjlab", + "github_user": "InternLM", "github_repo": "InternLM", "github_version": "master", "conf_py_path": "/doc/code-docs/source/", diff --git a/doc/code-docs/source/example/30B_demo.rst b/doc/code-docs/source/example/30B_demo.rst new file mode 100644 index 0000000..98e1915 --- /dev/null +++ b/doc/code-docs/source/example/30B_demo.rst @@ -0,0 +1,203 @@ +30B Demo +================ + +Training Config +---------------- + +30B demo config file example: + +.. code-block:: python + + JOB_NAME = "30b_train" + + SEQ_LEN = 2048 + HIDDEN_SIZE = 6144 + NUM_ATTENTION_HEAD = 48 + MLP_RATIO = 8 / 3 + NUM_LAYER = 60 + VOCAB_SIZE = 103168 + + MODEL_ONLY_FOLDER = "local:llm_ckpts/xxxx" + # Ckpt folder format: + # fs: 'local:/mnt/nfs/XXX' + SAVE_CKPT_FOLDER = "local:llm_ckpts" + LOAD_CKPT_FOLDER = "local:llm_ckpts/49" + + # boto3 Ckpt folder format: + # import os + # BOTO3_IP = os.environ["BOTO3_IP"] # boto3 bucket endpoint + # SAVE_CKPT_FOLDER = f"boto3:s3://model_weights.{BOTO3_IP}/internlm" + # LOAD_CKPT_FOLDER = f"boto3:s3://model_weights.{BOTO3_IP}/internlm/snapshot/1/" + CHECKPOINT_EVERY = 50 + ckpt = dict( + enable_save_ckpt=False, # enable ckpt save. + save_ckpt_folder=SAVE_CKPT_FOLDER, # Path to save training ckpt. + # load_ckpt_folder=LOAD_CKPT_FOLDER, # Ckpt path to resume training(load weights and scheduler/context states). + # load_model_only_folder=MODEL_ONLY_FOLDER, # Path to initialize with given model weights. + load_optimizer=True, # Wheter to load optimizer states when continuing training. + checkpoint_every=CHECKPOINT_EVERY, + async_upload=True, # async ckpt upload. (only work for boto3 ckpt) + async_upload_tmp_folder="/dev/shm/internlm_tmp_ckpt/", # path for temporarily files during asynchronous upload. + snapshot_ckpt_folder="/".join([SAVE_CKPT_FOLDER, "snapshot"]), # directory for snapshot ckpt storage path. + oss_snapshot_freq=int(CHECKPOINT_EVERY / 2), # snapshot ckpt save frequency. + ) + + TRAIN_FOLDER = "/path/to/dataset" + VALID_FOLDER = "/path/to/dataset" + data = dict( + seq_len=SEQ_LEN, + # micro_num means the number of micro_batch contained in one gradient update + micro_num=4, + # packed_length = micro_bsz * SEQ_LEN + micro_bsz=2, + # defaults to the value of micro_num + valid_micro_num=4, + # defaults to 0, means disable evaluate + valid_every=50, + pack_sample_into_one=False, + total_steps=50000, + skip_batches="", + rampup_batch_size="", + # Datasets with less than 50 rows will be discarded + min_length=50, + # train_folder=TRAIN_FOLDER, + # valid_folder=VALID_FOLDER, + ) + + grad_scaler = dict( + fp16=dict( + # the initial loss scale, defaults to 2**16 + initial_scale=2**16, + # the minimum loss scale, defaults to None + min_scale=1, + # the number of steps to increase loss scale when no overflow occurs + growth_interval=1000, + ), + # the multiplication factor for increasing loss scale, defaults to 2 + growth_factor=2, + # the multiplication factor for decreasing loss scale, defaults to 0.5 + backoff_factor=0.5, + # the maximum loss scale, defaults to None + max_scale=2**24, + # the number of overflows before decreasing loss scale, defaults to 2 + hysteresis=2, + ) + + hybrid_zero_optimizer = dict( + # Enable low_level_optimzer overlap_communication + overlap_sync_grad=True, + overlap_sync_param=True, + # bucket size for nccl communication params + reduce_bucket_size=512 * 1024 * 1024, + # grad clipping + clip_grad_norm=1.0, + ) + + loss = dict( + label_smoothing=0, + ) + + adam = dict( + lr=1e-4, + adam_beta1=0.9, + adam_beta2=0.95, + adam_beta2_c=0, + adam_eps=1e-8, + weight_decay=0.01, + ) + + lr_scheduler = dict( + total_steps=data["total_steps"], + init_steps=0, # optimizer_warmup_step + warmup_ratio=0.01, + eta_min=1e-5, + last_epoch=-1, + ) + + beta2_scheduler = dict( + init_beta2=adam["adam_beta2"], + c=adam["adam_beta2_c"], + cur_iter=-1, + ) + + model = dict( + checkpoint=False, # The proportion of layers for activation aheckpointing, the optional value are True/False/[0-1] + num_attention_heads=NUM_ATTENTION_HEAD, + embed_split_hidden=True, + vocab_size=VOCAB_SIZE, + embed_grad_scale=1, + parallel_output=True, + hidden_size=HIDDEN_SIZE, + num_layers=NUM_LAYER, + mlp_ratio=MLP_RATIO, + apply_post_layer_norm=False, + dtype="torch.float16", # Support: "torch.float16", "torch.half", "torch.bfloat16", "torch.float32", "torch.tf32" + norm_type="rmsnorm", + layer_norm_epsilon=1e-5, + use_flash_attn=True, + num_chunks=1, # if num_chunks > 1, interleaved pipeline scheduler is used. + ) + """ + zero1 parallel: + 1. if zero1 <= 0, The size of the zero process group is equal to the size of the dp process group, + so parameters will be divided within the range of dp. + 2. if zero1 == 1, zero is not used, and all dp groups retain the full amount of model parameters. + 3. zero1 > 1 and zero1 <= dp world size, the world size of zero is a subset of dp world size. + For smaller models, it is usually a better choice to split the parameters within nodes with a setting <= 8. + pipeline parallel (dict): + 1. size: int, the size of pipeline parallel. + 2. interleaved_overlap: bool, enable/disable communication overlap when using interleaved pipeline scheduler. + tensor parallel: tensor parallel size, usually the number of GPUs per node. + """ + parallel = dict( + zero1=-1, + tensor=4, + pipeline=dict(size=1, interleaved_overlap=True), + sequence_parallel=False, + ) + + cudnn_deterministic = False + cudnn_benchmark = False + + +Start Training +---------------- + +After completing the data preparation and relevant training configurations, you can start the demo training. +The following example shows how to start distributed training in ``slurm`` environments with 16 GPUs. + +.. code-block:: bash + + srun -p internllm -N 2 -n 16 --ntasks-per-node=8 --gpus-per-task=1 python train.py --config ./configs/30B_sft.py + +Training Results +---------------- + +Taking the configuration of the demo training on two nodes with 16 GPUs on slurm as an example, the training result log is shown below: + +.. code-block:: bash + + 2023-09-06 10:29:26,629 INFO parallel_context.py:508 in set_device -- process rank 10 is bound to host:HOST-10-140-66-20 device: 2 + 2023-09-06 10:29:26,632 INFO parallel_context.py:508 in set_device -- process rank 11 is bound to host:HOST-10-140-66-20 device: 3 + 2023-09-06 10:29:26,634 INFO parallel_context.py:508 in set_device -- process rank 12 is bound to host:HOST-10-140-66-20 device: 4 + 2023-09-06 10:29:26,636 INFO parallel_context.py:508 in set_device -- process rank 9 is bound to host:HOST-10-140-66-20 device: 1 + 2023-09-06 10:29:26,640 INFO parallel_context.py:508 in set_device -- process rank 15 is bound to host:HOST-10-140-66-20 device: 7 + 2023-09-06 10:29:26,639 INFO parallel_context.py:508 in set_device -- process rank 0 is bound to host:HOST-10-140-66-9 device: 0 + 2023-09-06 10:29:26,641 INFO parallel_context.py:508 in set_device -- process rank 2 is bound to host:HOST-10-140-66-9 device: 2 + 2023-09-06 10:29:26,643 INFO parallel_context.py:508 in set_device -- process rank 5 is bound to host:HOST-10-140-66-9 device: 5 + 2023-09-06 10:29:26,645 INFO parallel_context.py:508 in set_device -- process rank 6 is bound to host:HOST-10-140-66-9 device: 6 + 2023-09-06 10:29:26,661 INFO parallel_context.py:508 in set_device -- process rank 13 is bound to host:HOST-10-140-66-20 device: 5 + 2023-09-06 10:29:26,707 INFO parallel_context.py:508 in set_device -- process rank 1 is bound to host:HOST-10-140-66-9 device: 1 + 2023-09-06 10:29:26,826 INFO parallel_context.py:508 in set_device -- process rank 4 is bound to host:HOST-10-140-66-9 device: 4 + 2023-09-06 10:29:26,871 INFO parallel_context.py:508 in set_device -- process rank 7 is bound to host:HOST-10-140-66-9 device: 7 + 2023-09-06 10:29:26,932 INFO parallel_context.py:508 in set_device -- process rank 3 is bound to host:HOST-10-140-66-9 device: 3 + 2023-09-06 10:29:27,156 INFO parallel_context.py:508 in set_device -- process rank 14 is bound to host:HOST-10-140-66-20 device: 6 + 2023-09-06 10:29:27,271 INFO parallel_context.py:508 in set_device -- process rank 8 is bound to host:HOST-10-140-66-20 device: 0 + 2023-09-06 10:29:32,060 INFO launch.py:329 in launch -- Distributed environment is initialized, data parallel size: 4, pipeline parallel size: 1, tensor parallel size: 4 + 2023-09-06 10:30:06,141 INFO hybrid_zero_optim.py:291 in _partition_param_list -- Number of elements on ranks: [1782007296, 1812307968, 1812307968, 1706469888], rank:0 + 2023-09-06T10:30:38.216+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=15224 : tflops=40.00268401421643 step=0 loss=11.548227310180664 tgs (tokens/gpu/second)=227.37 lr=9.779754323328192e-05 loss_scale=65536.0 grad_norm={'0_default': 61.5836932112004} micro_num=4 num_consumed_tokens=65536 inf_nan_skip_batches=0 num_samples_in_batch=18 largest_length=2048 largest_batch=6 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=12.51 acc=0.0 perplexity=104121.5547 acc/en=0.0 acc/cn=0.0 acc/code=0.0 tokens/en=60571 tokens/cn=0 tokens/code=0 loss_from_metric=11.5533 loss/en=11.5533 loss/cn=nan loss/code=nan + 2023-09-06T10:30:46.343+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=15224 : tflops=89.00005814543725 step=1 loss=6.05580997467041 tgs (tokens/gpu/second)=505.86 lr=9.140576474687264e-05 loss_scale=65536.0 grad_norm={'0_default': 27.397946290506887} micro_num=4 num_consumed_tokens=131072 inf_nan_skip_batches=0 num_samples_in_batch=19 largest_length=2048 largest_batch=6 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=7.91 acc=0.0885 perplexity=405.4076 acc/en=0.0885 acc/cn=0.0 acc/code=0.0 tokens/en=60265 tokens/cn=0 tokens/code=0 loss_from_metric=6.0049 loss/en=6.0049 loss/cn=nan loss/code=nan + 2023-09-06T10:30:51.443+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=15224 : tflops=142.5138940898651 step=2 loss=5.054169654846191 tgs (tokens/gpu/second)=810.03 lr=8.14503363531613e-05 loss_scale=65536.0 grad_norm={'0_default': 10.438111430093606} micro_num=4 num_consumed_tokens=196608 inf_nan_skip_batches=0 num_samples_in_batch=17 largest_length=2048 largest_batch=5 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=4.87 acc=0.0715 perplexity=184.2986 acc/en=0.0715 acc/cn=0.0 acc/code=0.0 tokens/en=60244 tokens/cn=0 tokens/code=0 loss_from_metric=5.2166 loss/en=5.2166 loss/cn=nan loss/code=nan + 2023-09-06T10:30:56.509+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=15224 : tflops=143.56131674769466 step=3 loss=4.662276268005371 tgs (tokens/gpu/second)=815.98 lr=6.890576474687264e-05 loss_scale=65536.0 grad_norm={'0_default': 9.15959986316653} micro_num=4 num_consumed_tokens=262144 inf_nan_skip_batches=0 num_samples_in_batch=17 largest_length=2048 largest_batch=5 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=4.83 acc=0.0775 perplexity=102.6568 acc/en=0.0775 acc/cn=0.0 acc/code=0.0 tokens/en=60328 tokens/cn=0 tokens/code=0 loss_from_metric=4.6314 loss/en=4.6314 loss/cn=nan loss/code=nan + 2023-09-06T10:31:01.552+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=15224 : tflops=143.85087291011183 step=4 loss=4.020431041717529 tgs (tokens/gpu/second)=817.63 lr=5.500000000000001e-05 loss_scale=65536.0 grad_norm={'0_default': 6.873464794412589} micro_num=4 num_consumed_tokens=327680 inf_nan_skip_batches=0 num_samples_in_batch=22 largest_length=1893 largest_batch=8 smallest_batch=4 adam_beta2=0.95 fwd_bwd_time=4.82 acc=0.0701 perplexity=69.1167 acc/en=0.0701 acc/cn=0.0 acc/code=0.0 tokens/en=61028 tokens/cn=0 tokens/code=0 loss_from_metric=4.2358 loss/en=4.2358 loss/cn=nan loss/code=nan + 2023-09-06T10:31:06.830+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=15224 : tflops=142.8966468353613 step=5 loss=3.733311891555786 tgs (tokens/gpu/second)=812.2 lr=4.109423525312737e-05 loss_scale=65536.0 grad_norm={'0_default': 5.811005102730085} micro_num=4 num_consumed_tokens=393216 inf_nan_skip_batches=0 num_samples_in_batch=13 largest_length=2048 largest_batch=4 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=4.85 acc=0.0688 perplexity=46.298 acc/en=0.0688 acc/cn=0.0 acc/code=0.0 tokens/en=61004 tokens/cn=0 tokens/code=0 loss_from_metric=3.8351 loss/en=3.8351 loss/cn=nan loss/code=nan \ No newline at end of file diff --git a/doc/code-docs/source/example/7B_demo.rst b/doc/code-docs/source/example/7B_demo.rst new file mode 100644 index 0000000..1e264c4 --- /dev/null +++ b/doc/code-docs/source/example/7B_demo.rst @@ -0,0 +1,193 @@ +7B Demo +================ + +Training Config +---------------- + +7B demo config file example: + +.. code-block:: python + + JOB_NAME = "7b_train" + + SEQ_LEN = 2048 + HIDDEN_SIZE = 4096 + NUM_ATTENTION_HEAD = 32 + MLP_RATIO = 8 / 3 + NUM_LAYER = 32 + VOCAB_SIZE = 103168 + + MODEL_ONLY_FOLDER = "local:llm_ckpts/xxxx" + # Ckpt folder format: + # fs: 'local:/mnt/nfs/XXX' + SAVE_CKPT_FOLDER = "local:llm_ckpts" + LOAD_CKPT_FOLDER = "local:llm_ckpts/49" + + # boto3 Ckpt folder format: + # import os + # BOTO3_IP = os.environ["BOTO3_IP"] # boto3 bucket endpoint + # SAVE_CKPT_FOLDER = f"boto3:s3://model_weights.{BOTO3_IP}/internlm" + # LOAD_CKPT_FOLDER = f"boto3:s3://model_weights.{BOTO3_IP}/internlm/snapshot/1/" + CHECKPOINT_EVERY = 50 + ckpt = dict( + enable_save_ckpt=False, # enable ckpt save. + save_ckpt_folder=SAVE_CKPT_FOLDER, # Path to save training ckpt. + # load_ckpt_folder=LOAD_CKPT_FOLDER, # Ckpt path to resume training(load weights and scheduler/context states). + # load_model_only_folder=MODEL_ONLY_FOLDER, # Path to initialize with given model weights. + load_optimizer=True, # Wheter to load optimizer states when continuing training. + checkpoint_every=CHECKPOINT_EVERY, + async_upload=True, # async ckpt upload. (only work for boto3 ckpt) + async_upload_tmp_folder="/dev/shm/internlm_tmp_ckpt/", # path for temporarily files during asynchronous upload. + snapshot_ckpt_folder="/".join([SAVE_CKPT_FOLDER, "snapshot"]), # directory for snapshot ckpt storage path. + oss_snapshot_freq=int(CHECKPOINT_EVERY / 2), # snapshot ckpt save frequency. + ) + + TRAIN_FOLDER = "/path/to/dataset" + VALID_FOLDER = "/path/to/dataset" + data = dict( + seq_len=SEQ_LEN, + # micro_num means the number of micro_batch contained in one gradient update + micro_num=4, + # packed_length = micro_bsz * SEQ_LEN + micro_bsz=2, + # defaults to the value of micro_num + valid_micro_num=4, + # defaults to 0, means disable evaluate + valid_every=50, + pack_sample_into_one=False, + total_steps=50000, + skip_batches="", + rampup_batch_size="", + # Datasets with less than 50 rows will be discarded + min_length=50, + # train_folder=TRAIN_FOLDER, + # valid_folder=VALID_FOLDER, + ) + + grad_scaler = dict( + fp16=dict( + # the initial loss scale, defaults to 2**16 + initial_scale=2**16, + # the minimum loss scale, defaults to None + min_scale=1, + # the number of steps to increase loss scale when no overflow occurs + growth_interval=1000, + ), + # the multiplication factor for increasing loss scale, defaults to 2 + growth_factor=2, + # the multiplication factor for decreasing loss scale, defaults to 0.5 + backoff_factor=0.5, + # the maximum loss scale, defaults to None + max_scale=2**24, + # the number of overflows before decreasing loss scale, defaults to 2 + hysteresis=2, + ) + + hybrid_zero_optimizer = dict( + # Enable low_level_optimzer overlap_communication + overlap_sync_grad=True, + overlap_sync_param=True, + # bucket size for nccl communication params + reduce_bucket_size=512 * 1024 * 1024, + # grad clipping + clip_grad_norm=1.0, + ) + + loss = dict( + label_smoothing=0, + ) + + adam = dict( + lr=1e-4, + adam_beta1=0.9, + adam_beta2=0.95, + adam_beta2_c=0, + adam_eps=1e-8, + weight_decay=0.01, + ) + + lr_scheduler = dict( + total_steps=data["total_steps"], + init_steps=0, # optimizer_warmup_step + warmup_ratio=0.01, + eta_min=1e-5, + last_epoch=-1, + ) + + beta2_scheduler = dict( + init_beta2=adam["adam_beta2"], + c=adam["adam_beta2_c"], + cur_iter=-1, + ) + + model = dict( + checkpoint=False, # The proportion of layers for activation aheckpointing, the optional value are True/False/[0-1] + num_attention_heads=NUM_ATTENTION_HEAD, + embed_split_hidden=True, + vocab_size=VOCAB_SIZE, + embed_grad_scale=1, + parallel_output=True, + hidden_size=HIDDEN_SIZE, + num_layers=NUM_LAYER, + mlp_ratio=MLP_RATIO, + apply_post_layer_norm=False, + dtype="torch.float16", # Support: "torch.float16", "torch.half", "torch.bfloat16", "torch.float32", "torch.tf32" + norm_type="rmsnorm", + layer_norm_epsilon=1e-5, + use_flash_attn=True, + num_chunks=1, # if num_chunks > 1, interleaved pipeline scheduler is used. + ) + """ + zero1 parallel: + 1. if zero1 <= 0, The size of the zero process group is equal to the size of the dp process group, + so parameters will be divided within the range of dp. + 2. if zero1 == 1, zero is not used, and all dp groups retain the full amount of model parameters. + 3. zero1 > 1 and zero1 <= dp world size, the world size of zero is a subset of dp world size. + For smaller models, it is usually a better choice to split the parameters within nodes with a setting <= 8. + pipeline parallel (dict): + 1. size: int, the size of pipeline parallel. + 2. interleaved_overlap: bool, enable/disable communication overlap when using interleaved pipeline scheduler. + tensor parallel: tensor parallel size, usually the number of GPUs per node. + """ + parallel = dict( + zero1=8, + pipeline=dict(size=1, interleaved_overlap=True), + sequence_parallel=False, + ) + + cudnn_deterministic = False + cudnn_benchmark = False + +Start Training +---------------- + +After completing the data preparation and relevant training configurations, you can start the demo training. +The following example shows how to start distributed training in ``slurm`` environments with 8 GPUs. + +.. code-block:: bash + + srun -p internllm -N 1 -n 8 --ntasks-per-node=8 --gpus-per-task=1 python train.py --config ./configs/7B_sft.py + +Training Results +---------------- + +Taking the configuration of the demo training on a single machine with 8 GPUs on slurm as an example, the training result log is shown below: + +.. code-block:: bash + + 2023-09-05 11:47:44,649 INFO parallel_context.py:508 in set_device -- process rank 4 is bound to host:SH-IDC1-10-140-1-110 device: 4 + 2023-09-05 11:47:44,650 INFO parallel_context.py:508 in set_device -- process rank 3 is bound to host:SH-IDC1-10-140-1-110 device: 3 + 2023-09-05 11:47:44,651 INFO parallel_context.py:508 in set_device -- process rank 6 is bound to host:SH-IDC1-10-140-1-110 device: 6 + 2023-09-05 11:47:44,652 INFO parallel_context.py:508 in set_device -- process rank 7 is bound to host:SH-IDC1-10-140-1-110 device: 7 + 2023-09-05 11:47:44,652 INFO parallel_context.py:508 in set_device -- process rank 5 is bound to host:SH-IDC1-10-140-1-110 device: 5 + 2023-09-05 11:47:44,652 INFO parallel_context.py:508 in set_device -- process rank 1 is bound to host:SH-IDC1-10-140-1-110 device: 1 + 2023-09-05 11:47:44,652 INFO parallel_context.py:508 in set_device -- process rank 2 is bound to host:SH-IDC1-10-140-1-110 device: 2 + 2023-09-05 11:47:44,652 INFO parallel_context.py:508 in set_device -- process rank 0 is bound to host:SH-IDC1-10-140-1-110 device: 0 + 2023-09-05 11:47:51,006 INFO launch.py:354 in launch -- Distributed environment is initialized, data parallel size: 8, pipeline parallel size: 1, tensor parallel size: 1 + 2023-09-05 11:49:09,855 INFO hybrid_zero_optim.py:294 in _partition_param_list -- Number of elements on ranks: [894509056, 944865280, 966909952, 966909952, 966909952, 944865280, 966909952, 670068736], rank:0 + 2023-09-05T11:49:58.225+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=6794 : tflops=63.283263603947816 step=0 loss=11.641494750976562 tgs (tokens/gpu/second)=1424.93 lr=4.0000000000000003e-07 loss_scale=65536.0 grad_norm={'0_default': 66.51907327507652} micro_num=4 num_consumed_tokens=131072 inf_nan_skip_batches=0 num_samples_in_batch=19 largest_length=2048 largest_batch=6 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=6.87 acc=0.0 perplexity=112181.7188 acc/en=0.0 acc/cn=0.0 acc/code=0.0 tokens/en=120836 tokens/cn=0 tokens/code=0 loss_from_metric=11.6279 loss/en=11.6279 loss/cn=nan loss/code=nan + 2023-09-05T11:50:02.553+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=6794 : tflops=171.92140761933035 step=1 loss=11.546792984008789 tgs (tokens/gpu/second)=3871.11 lr=6.000000000000001e-07 loss_scale=65536.0 grad_norm={'0_default': 64.47430144542088} micro_num=4 num_consumed_tokens=262144 inf_nan_skip_batches=0 num_samples_in_batch=16 largest_length=2048 largest_batch=5 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=4.14 acc=0.0 perplexity=103779.1406 acc/en=0.0 acc/cn=0.0 acc/code=0.0 tokens/en=120572 tokens/cn=0 tokens/code=0 loss_from_metric=11.55 loss/en=11.55 loss/cn=nan loss/code=nan + 2023-09-05T11:50:06.504+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=6794 : tflops=186.0565203348341 step=2 loss=11.106071472167969 tgs (tokens/gpu/second)=4189.39 lr=8.000000000000001e-07 loss_scale=65536.0 grad_norm={'0_default': 62.520055376005146} micro_num=4 num_consumed_tokens=393216 inf_nan_skip_batches=0 num_samples_in_batch=16 largest_length=2048 largest_batch=6 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=3.82 acc=0.0001 perplexity=71139.6797 acc/en=0.0001 acc/cn=0.0 acc/code=0.0 tokens/en=122032 tokens/cn=0 tokens/code=0 loss_from_metric=11.1724 loss/en=11.1724 loss/cn=nan loss/code=nan + 2023-09-05T11:50:10.487+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=6794 : tflops=185.48897918112567 step=3 loss=10.444510459899902 tgs (tokens/gpu/second)=4176.61 lr=1.0000000000000002e-06 loss_scale=65536.0 grad_norm={'0_default': 57.91057980979166} micro_num=4 num_consumed_tokens=524288 inf_nan_skip_batches=0 num_samples_in_batch=18 largest_length=2048 largest_batch=6 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=3.83 acc=0.0705 perplexity=39851.1289 acc/en=0.0705 acc/cn=0.0 acc/code=0.0 tokens/en=121125 tokens/cn=0 tokens/code=0 loss_from_metric=10.5929 loss/en=10.5929 loss/cn=nan loss/code=nan + 2023-09-05T11:50:14.476+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=6794 : tflops=185.8751803758398 step=4 loss=9.798665046691895 tgs (tokens/gpu/second)=4185.31 lr=1.2000000000000002e-06 loss_scale=65536.0 grad_norm={'0_default': 48.1136933755285} micro_num=4 num_consumed_tokens=655360 inf_nan_skip_batches=0 num_samples_in_batch=14 largest_length=2048 largest_batch=4 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=3.82 acc=0.076 perplexity=18045.6699 acc/en=0.076 acc/cn=0.0 acc/code=0.0 tokens/en=121365 tokens/cn=0 tokens/code=0 loss_from_metric=9.8007 loss/en=9.8007 loss/cn=nan loss/code=nan + 2023-09-05T11:50:18.442+08:00 INFO [training_internlm.py, line 413, in record_current_batch_training_metrics] - pid=6794 : tflops=185.6236609556878 step=5 loss=9.215429306030273 tgs (tokens/gpu/second)=4179.64 lr=1.4000000000000001e-06 loss_scale=65536.0 grad_norm={'0_default': 36.95489557069029} micro_num=4 num_consumed_tokens=786432 inf_nan_skip_batches=0 num_samples_in_batch=14 largest_length=2048 largest_batch=4 smallest_batch=3 adam_beta2=0.95 fwd_bwd_time=3.82 acc=0.0767 perplexity=8999.0869 acc/en=0.0767 acc/cn=0.0 acc/code=0.0 tokens/en=121223 tokens/cn=0 tokens/code=0 loss_from_metric=9.1049 loss/en=9.1049 loss/cn=nan loss/code=nan diff --git a/doc/code-docs/source/example/index.rst b/doc/code-docs/source/example/index.rst new file mode 100644 index 0000000..5844b0b --- /dev/null +++ b/doc/code-docs/source/example/index.rst @@ -0,0 +1,18 @@ +Training Example +================ + +7B Demo +------------ + +.. toctree:: + :maxdepth: 2 + + 7B_demo + +30B Demo +------------ + +.. toctree:: + :maxdepth: 2 + + 30B_demo diff --git a/doc/code-docs/source/index.rst b/doc/code-docs/source/index.rst index 3011df6..109dfa5 100644 --- a/doc/code-docs/source/index.rst +++ b/doc/code-docs/source/index.rst @@ -3,6 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. + InternLM ======== @@ -14,6 +15,14 @@ Environment Setup install +Quickstart Guide +------------------- + +.. toctree:: + :maxdepth: 2 + + usage + Model Setup ------------------- @@ -39,7 +48,7 @@ Parallel Training parallel Model Checkpointing -------------------- +-------------------- .. toctree:: :maxdepth: 2 @@ -62,6 +71,22 @@ Monitor monitor +Example +------------------- + +.. toctree:: + :maxdepth: 2 + + example/index + +Q&A +------------------- + +.. toctree:: + :maxdepth: 2 + + qa + Indices and tables ================== diff --git a/doc/code-docs/source/initialize.rst b/doc/code-docs/source/initialize.rst index a638c33..257cffe 100644 --- a/doc/code-docs/source/initialize.rst +++ b/doc/code-docs/source/initialize.rst @@ -20,16 +20,71 @@ parser with some builtin arguments, users can add custom parameters to this pars .. autofunction:: internlm.initialize.get_default_parser -.. _InternLM-init: +.. _InternLM-model-init: Model Initialization ------------------------- +.. autofunction:: internlm.train.initialize_model + +InternLM uses the field ``model_type`` and ``model`` in the config file to control model initialization process. An example model initialization configuration +can be defined as follows: + +.. code-block:: python + + model_type = "INTERNLM" # default is "INTERNLM", used to register classes and modules for model initialization + NUM_ATTENTION_HEAD = 32 + VOCAB_SIZE = 103168 + HIDDEN_SIZE = 4096 + NUM_LAYER = 32 + MLP_RATIO = 8 / 3 + model = dict( + checkpoint=False, # The proportion of layers for activation aheckpointing, the optional value are True/False/[0-1] + num_attention_heads=NUM_ATTENTION_HEAD, + embed_split_hidden=True, + vocab_size=VOCAB_SIZE, + embed_grad_scale=1, + parallel_output=True, + hidden_size=HIDDEN_SIZE, + num_layers=NUM_LAYER, + mlp_ratio=MLP_RATIO, + apply_post_layer_norm=False, + dtype="torch.bfloat16", # Support: "torch.float16", "torch.half", "torch.bfloat16", "torch.float32", "torch.tf32" + norm_type="rmsnorm", + layer_norm_epsilon=1e-5, + use_flash_attn=True, + num_chunks=1, # if num_chunks > 1, interleaved pipeline scheduler is used. + ) + +- The field ``model_type`` specifics the model type has been registered and to be initialized. +- The parameters in field ``model`` specific the configuration settings during model initialization. + +It is worth noting that, users can define new model type, and register model's initialization function by decorater ``@MODEL_INITIALIZER.register_module``, which ``MODEL_INITIALIZER`` is an instantiated object of class ``internlm.util.registry.Registry``, the example is shown as follows. + +.. code-block:: python + + MODEL_TYPE = "NEW_MODEL" + + @MODEL_INITIALIZER.register_module(module_name=MODEL_TYPE) + def build_new_model_with_cfg(*args, **kwargs): + +.. _InternLM-optim-init: + Optimizer Initialization ------------------------- +.. autofunction:: internlm.train.initialize_optimizer + +.. _InternLM-dl-init: + Dataloader Initialization ------------------------- +.. autofunction:: internlm.train.get_train_data_loader + +.. _InternLM-trainer-init: + Trainer Initialization ------------------------- + +.. autofunction:: internlm.initialize.initialize_trainer \ No newline at end of file diff --git a/doc/code-docs/source/install.md b/doc/code-docs/source/install.md index 26f57c0..befb018 100644 --- a/doc/code-docs/source/install.md +++ b/doc/code-docs/source/install.md @@ -1,70 +1,2 @@ -## Installation - -### Environment Preparation -The required packages and corresponding version are shown as follows: -- Python == 3.10 -- GCC == 10.2.0 -- MPFR == 4.1.0 -- CUDA >= 11.7 -- Pytorch >= 1.13.1 -- Transformers >= 4.28.0 -- Flash-Attention >= v1.0.5 -- Apex == 23.05 -- GPU with Ampere or Hopper architecture (such as H100, A100) -- Linux OS - -After installing the above dependencies, some system environment variables need to be updated: -```bash -export CUDA_PATH={path_of_cuda_11.7} -export GCC_HOME={path_of_gcc_10.2.0} -export MPFR_HOME={path_of_mpfr_4.1.0} -export LD_LIBRARY_PATH=${GCC_HOME}/lib64:${MPFR_HOME}/lib:${CUDA_PATH}/lib64:$LD_LIBRARY_PATH -export PATH=${GCC_HOME}/bin:${CUDA_PATH}/bin:$PATH -export CC=${GCC_HOME}/bin/gcc -export CXX=${GCC_HOME}/bin/c++ -``` - -### Environment Installation -Clone the project `internlm` and its dependent submodules from the github repository, as follows: -```bash -git clone git@github.com:InternLM/InternLM.git --recurse-submodules -``` - -It is recommended to build a Python-3.10 virtual environment using conda and install the required dependencies based on the `requirements/` files: -```bash -conda create --name internlm-env python=3.10 -y -conda activate internlm-env -cd internlm -pip install -r requirements/torch.txt -pip install -r requirements/runtime.txt -``` - -Install flash-attention (version v1.0.5): -```bash -cd ./third_party/flash-attention -python setup.py install -cd ./csrc -cd fused_dense_lib && pip install -v . -cd ../xentropy && pip install -v . -cd ../rotary && pip install -v . -cd ../layer_norm && pip install -v . -cd ../../../../ -``` - -Install Apex (version 23.05): -```bash -cd ./third_party/apex -pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ -cd ../../ -``` - -### Environment Image -Users can obtain an image with the InternLM runtime environment installed from https://hub.docker.com/r/sunpengsdu/internlm. The commands for pulling the image and starting the container are as follows: - -```bash -# pull image -docker pull sunpengsdu/internlm:torch1.13-cuda11.7-flashatten1.0.5-centos -# start container -docker run --gpus all -d -it --shm-size=2gb --name myinternlm sunpengsdu/internlm:torch1.13-cuda11.7-flashatten1.0.5-centos -docker exec -it myinternlm bash -``` +```{include} ../../en/install.md +``` \ No newline at end of file diff --git a/doc/code-docs/source/monitor.rst b/doc/code-docs/source/monitor.rst index ff8cd1b..57d0798 100644 --- a/doc/code-docs/source/monitor.rst +++ b/doc/code-docs/source/monitor.rst @@ -1,10 +1,26 @@ Monitor and Alert ================= - Monitoring ----------------- +InternLM uses ``internlm.monitor.monitor.initialize_monitor_manager()`` to initialize context monitor. During this time, +a singleton ``internlm.monitor.monitor.MonitorManager`` will manage monitoring thread and track training status +with ``internlm.monitor.monitor.MonitorTracker``. + +.. autofunction:: internlm.monitor.monitor.initialize_monitor_manager + +.. autoclass:: internlm.monitor.monitor.MonitorManager + :members: + +.. autoclass:: internlm.monitor.monitor.MonitorTracker + :members: Alerting ----------------- + +InternLM monitor thread periodically tracks loss spike, potential stuck condition, runtime exception, and SIGTERM signal. +When above situation occurs, an alert will be triggered and a message will be sent to the Feishu webhook address by calling +``internlm.monitor.alert.send_feishu_msg_with_webhook()`` + +.. autofunction:: internlm.monitor.alert.send_feishu_msg_with_webhook diff --git a/doc/code-docs/source/parallel.rst b/doc/code-docs/source/parallel.rst index 3515847..dcdebad 100644 --- a/doc/code-docs/source/parallel.rst +++ b/doc/code-docs/source/parallel.rst @@ -1,23 +1,158 @@ Parallel Training -================= +================== -.. 整体说一下并行配置使用方式,接下来再分模块详细说明 +.. Brief introduction to training parallelism, and how-to guide about config setting + +InternLM supports tensor parallel, pipeline parallel, sequence parallel, data parallel, and ZeRO1.5 to parallelize the training pipeline. +When initializing the distributed environment, we need to specify tensor parallel size, pipeline parallel size, data parallel size, +and ZeRO1.5 strategy. + +The parallel setting of InternLM is fully config-driven, and you can change the parallelism by modifying +`config file `_. An exmaple parallel training configuration can be defined as follows: + +.. code-block:: python + + parallel = dict( + zero1=8, + tensor=1, + pipeline=dict(size=1, interleaved_overlap=True), + sequence_parallel=False, + ) + +- zero1: zero parallel strategy, divided into the following three cases, the default value is -1 + + - When ``size <= 0``, the size of the zero1 process group is equal to the size of the data parallel process group, so the optimizer state parameters will be split within the data parallel range. + - When ``size == 1``, zero1 is not used, and all data parallel groups retain the complete optimizer state parameters. + - When ``size > 1`` and ``size <= data_parallel_world_size``, the zero1 process group is a subset of the data parallel process group. + +- tensor: tensor parallel size, usually the number of GPUs per node, the default value is 1 +- pipeline: pipeline parallel strategy + + - size: pipeline parallel size, the default value is 1 + - interleaved_overlap: bool type, when interleaved scheduling, enable or disable communication optimization, the default value is False + +- sequence_parallel: whether to enable sequence parallelism, the default value is False + +Note: `Data parallel size = Total number of GPUs / Pipeline parallel size / Tensor parallel size` Tensor Parallel ----------------- +The implementation of tensor parallel for InternLM is based on `flash attention `_, which has tensor +parallel extensions to parallelize `attention `_ and +`linear `_ blocks in InternLM model. + +To use tensor parallel, you need to set the value of tensor parallel size ``parallel.tensor`` in the config file, which is usually the number of GPUs per node. + +.. figure:: ../../imgs/tensor_parallel.png + :scale: 50% + :class: with-border + + Tensor parallel, adopted from `flash-attention `_ Pipeline Parallel ----------------- +InternLM uses `1F1B `_ (one forward pass followed by one backward pass) for pipeline parallel. For 1F1B strategy, there are two implementations: +(1) non-interleaved scheduler, which is memory-efficient (2) interleaved scheduler, which is both memory-efficient and time-efficient. + +.. figure:: ../../imgs/pipeline_schedule.png + :scale: 45% + :class: with-border + + Non-interleaved and interleaved scheduler for 1F1B pipeline parallelism, adopted from `Megatron-LM `_ + +scheduler for non-interleaved 1F1B strategy +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To use non-interleaved pipeline scheduler, you need to set ``model.num_chunks = 1`` in the config file. + +.. autoclass:: internlm.core.scheduler.pipeline_scheduler.PipelineScheduler + :members: + +scheduler for interleaved 1F1B strategy +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To use interleaved pipeline scheduler, you need to set ``model.num_chunks > 1`` in the config file. + +.. autoclass:: internlm.core.scheduler.pipeline_scheduler.InterleavedPipelineScheduler + :members: + +Also, to enable communication overlap when using interleaved pipeline scheduler, you need to set ``parallel.pipeline.interleaved_overlap = True`` +in the config file. + +When ``parallel.pipeline.interleaved_overlap = True``, function ``InterleavedPipelineScheduler._run_1f1b_loop_with_overlap`` will be called and +``internlm.core.communication.AsynCommunicator`` will be created for managing async communication. Asynchronous communication will be enabled in 1F1B stage to make full +use of uplink/downlink bandwidth and achieve communication overlap. + +The difference between 1F1B stage without overlap and 1F1B stage with overlap is shown as follows: + +The 1F1B stage without overlap consists of the following steps: + +.. code-block:: bash + + 1. Perform the forward pass. + 2. Perform the backward pass. + 3. Send the forward output of this iteration to the next stage, and send the backward output of this iteration to the previous stage, and receive the forward and backward inputs for the next iteration. + +The 1F1B stage with overlap consists of the following steps: + +.. code-block:: bash + + 1. Perform the forward pass. + 2. Check if the backward input is ready. + 3. Send the forward output and receive the forward input for the next iteration. + 4. Perform the backward pass. + 5. Check if the forward input is ready. + 6. Send the backward output and receive the backward input for the next iteration. + Sequence Parallel ----------------- +Sequence parallel is a technique to reduce activation memory in layer norm and dropout without additional computation, communication or memory overhead. +The implementation of sequence parallel for InternLM is based on `flash attention `_. + +To enable sequence parallel, you need to set ``parallel.sequence_parallel = True`` in the config file. + +.. figure:: ../../imgs/sequence_parallel.png + :scale: 50% + :class: with-border + + Sequence parallel, adopted from flash-attention Data Parallel ----------------- +InternLM supports data parallel. For data parallel: + +`Data parallel size = Total number of GPUs / Pipeline parallel size / Tensor parallel size` ZeRO1.5 ------------------ \ No newline at end of file +----------------- + +The implementation of ZeRO1.5 uses the concept of hierarchical sharding via config value ``parallel.zero1``, which enables sharding within local nodes. + +1. If ``parallel.zero1 <= 0``, the size of the zero process group is equal to the size of the dp process group, so parameters will be divided within the range of dp. +2. If ``parallel.zero1 == 1``, zero is not used, and all dp groups retain the full amount of model parameters. +3. If ``parallel.zero1 > 1`` and ``parallel.zero1 <= dp world size``, the world size of zero is a subset of dp world size. For smaller models, it is usually a better choice to split the parameters within nodes with a setting ``parallel.zero1 <= 8``. + +Furthermore, you can enable communication-computation overlap, set bucket reduce size, gradient clipping parameters in the config file. + +.. code-block:: python + + hybrid_zero_optimizer = dict( + # Enable low_level_optimzer overlap_communication + overlap_sync_grad=True, + overlap_sync_param=True, + # bucket size for nccl communication params + reduce_bucket_size=512 * 1024 * 1024, + # grad clipping + clip_grad_norm=1.0, + ) + +There are two communication optimizations worth paying attention to here: + +- overlap_sync_grad: If set True, overlapping training backward pass with gradients' all-reduce communication +- overlap_sync_param: If set True, overlapping parameters' broadcast communication with next step's forward pass + +.. autoclass:: internlm.solver.optimizer.hybrid_zero_optim.HybridZeroOptimizer + :members: diff --git a/doc/code-docs/source/profiler.rst b/doc/code-docs/source/profiler.rst index c10f425..aed4d0c 100644 --- a/doc/code-docs/source/profiler.rst +++ b/doc/code-docs/source/profiler.rst @@ -1,11 +1,29 @@ Profiler ======== -.. 可介绍torch profiler, memory profiler的使用 +.. Mainly about the usage of torch profiler and memory profiler Torch Profiler ----------------- +InternLM uses ``internlm.train.initialize_llm_profile()`` to profile performance data, execution time duration and breakdown analysis of +step time. The implementation is based on `torch.profiler `_ and output tracing files can +be visualized with `tensorboard `_. +To use this torch profiler tool, you need to enable profiling by passing the ``--profiling`` flag when starting training. After torch +profiling is completed, you can find the profiling results in the ``{JOB_NAME}/{start_time}/traces/rank{}_dp{}_tp{}_pp{}`` folder. + +.. autofunction:: internlm.train.initialize_llm_profile Memory Profiler ------------------ \ No newline at end of file +----------------- + +InternLM provides a practical solution ``internlm.utils.simple_memory_profiler.SimpleMemoryProfiler`` to monitor actual GPU memory usage. +In the implmentation, model data (including model parameters, model gradients, and optimizer states) and non-model data +(including activations) are calculated. + +To use this memory profiler tool, you need to enable profiling by passing the ``--profiling`` flag when starting training. After memory +profiling is completed, you can find the profiling results (including logs of memory usage at different time point and sunburst charts +showing overall memory usage) for a specific rank device in the ``memory_trace/rank{}_dp{}_tp{}`` folder. + +.. autoclass:: internlm.utils.simple_memory_profiler.SimpleMemoryProfiler + :members: diff --git a/doc/code-docs/source/qa.rst b/doc/code-docs/source/qa.rst new file mode 100644 index 0000000..2c0a7b5 --- /dev/null +++ b/doc/code-docs/source/qa.rst @@ -0,0 +1,2 @@ +Q&A +=== \ No newline at end of file diff --git a/doc/code-docs/source/training.rst b/doc/code-docs/source/training.rst index e9ee124..f8e90dd 100644 --- a/doc/code-docs/source/training.rst +++ b/doc/code-docs/source/training.rst @@ -1,2 +1,10 @@ Training API -============ \ No newline at end of file +============ + +InternLM training API is managed in ``internlm.core.trainer.Trainer``. After defining the training engine and runtime scheduler, +we can call training API to perform training, evaluation, zero gradients and parameter update steps. + +For detailed usage, please refer to Trainer API documentation and examples. + +.. autoclass:: internlm.core.trainer.Trainer + :members: \ No newline at end of file diff --git a/doc/code-docs/source/usage.md b/doc/code-docs/source/usage.md new file mode 100644 index 0000000..3146774 --- /dev/null +++ b/doc/code-docs/source/usage.md @@ -0,0 +1,4 @@ +```{include} ../../en/usage.md +:relative-docs: docs/ +:relative-images: +``` \ No newline at end of file diff --git a/doc/en/install.md b/doc/en/install.md index 591cb5d..c216293 100644 --- a/doc/en/install.md +++ b/doc/en/install.md @@ -1,4 +1,4 @@ -## InternLM Installation +## Installation ### Environment Preparation The required packages and corresponding version are shown as follows: diff --git a/doc/en/usage.md b/doc/en/usage.md index e286edc..45bb8be 100644 --- a/doc/en/usage.md +++ b/doc/en/usage.md @@ -1,4 +1,4 @@ -## Pre-training and Fine-tuning Tutorial for InternLM +## Quickstart Guide for Pre-training and Fine-tuning To start a demo model training, you need to prepare three things: **installation**, **dataset preparation**, and **model training configuration**. In this guide, we will first cover the steps for dataset preparation and then briefly describe the model training configuration. @@ -93,10 +93,7 @@ data = dict( ) ``` -
- -
- +![pack_into_one](../imgs/pack_into_one.png) Currently, it supports passing the dataset file path `train_folder`, and the file format is required to be as follows: diff --git a/doc/imgs/pipeline_schedule.png b/doc/imgs/pipeline_schedule.png new file mode 100644 index 0000000000000000000000000000000000000000..64398cefe9bc50dd87ff2ecc13e99b7a808ed3ae GIT binary patch literal 257725 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