From c22871bd5e7f1219e575e7df1f194c5472a84715 Mon Sep 17 00:00:00 2001 From: Ao Tang Date: Mon, 4 Nov 2024 16:06:57 -0500 Subject: [PATCH 01/50] Recipe Fix for NeMo CI (#11127) * rename starcoder to starcoder_15b * change sc1 TP2 -> PP2 * change sc1 to PP8 * change nemotron4 340b to TP16 * Apply isort and black reformatting Signed-off-by: suiyoubi * nemotron340b and gemma 7b fix * change to PP18 * revert TPPPCP settings for 340b * enable sp * enable sp --------- Signed-off-by: suiyoubi Signed-off-by: Ao Tang Co-authored-by: suiyoubi --- nemo/collections/llm/recipes/__init__.py | 4 ++-- nemo/collections/llm/recipes/gemma_7b.py | 5 ++++- nemo/collections/llm/recipes/nemotron4_340b.py | 4 ++-- nemo/collections/llm/recipes/starcoder2_15b.py | 2 +- .../llm/recipes/{starcoder.py => starcoder_15b.py} | 6 +++--- 5 files changed, 12 insertions(+), 9 deletions(-) rename nemo/collections/llm/recipes/{starcoder.py => starcoder_15b.py} (98%) diff --git a/nemo/collections/llm/recipes/__init__.py b/nemo/collections/llm/recipes/__init__.py index a37d75d4dee8..9f53ec88bdc8 100644 --- a/nemo/collections/llm/recipes/__init__.py +++ b/nemo/collections/llm/recipes/__init__.py @@ -59,11 +59,11 @@ qwen2_7b, qwen2_72b, qwen2_500m, - starcoder, starcoder2, starcoder2_3b, starcoder2_7b, starcoder2_15b, + starcoder_15b, t5_3b, t5_11b, t5_220m, @@ -110,7 +110,7 @@ "t5_220m", "t5_3b", "t5_11b", - "starcoder", + "starcoder_15b", "starcoder2", "starcoder2_3b", "starcoder2_7b", diff --git a/nemo/collections/llm/recipes/gemma_7b.py b/nemo/collections/llm/recipes/gemma_7b.py index 836f0404c021..44efb3fe56b8 100644 --- a/nemo/collections/llm/recipes/gemma_7b.py +++ b/nemo/collections/llm/recipes/gemma_7b.py @@ -55,7 +55,7 @@ def model() -> run.Config[pl.LightningModule]: def trainer( - tensor_parallelism: int = 1, + tensor_parallelism: int = 2, pipeline_parallelism: int = 1, pipeline_parallelism_type: Optional[torch.dtype] = None, virtual_pipeline_parallelism: Optional[int] = None, @@ -171,6 +171,9 @@ def pretrain_recipe( For more details on pre-training LLMs with NeMo, see the pre-training guide in the `examples/llm/pretrain/` directory. """ + # Disable cuDNN attention since TE 1.8 does not support head dim > 128 + os.environ['NVTE_FUSED_ATTN'] = "0" + return run.Partial( fn, model=model(), diff --git a/nemo/collections/llm/recipes/nemotron4_340b.py b/nemo/collections/llm/recipes/nemotron4_340b.py index 2b2bb201ecb7..c02950109669 100644 --- a/nemo/collections/llm/recipes/nemotron4_340b.py +++ b/nemo/collections/llm/recipes/nemotron4_340b.py @@ -62,8 +62,8 @@ def pretrain_recipe( pipeline_parallelism: int = 12, pipeline_parallelism_type: Optional[torch.dtype] = torch.bfloat16, virtual_pipeline_parallelism: Optional[int] = 8, - context_parallelism: int = 1, - sequence_parallelism: bool = False, + context_parallelism: int = 2, + sequence_parallelism: bool = True, num_nodes: int = 768, num_gpus_per_node: int = 8, max_steps: int = 100000, diff --git a/nemo/collections/llm/recipes/starcoder2_15b.py b/nemo/collections/llm/recipes/starcoder2_15b.py index 9ca06ce4691a..a59ec272c865 100644 --- a/nemo/collections/llm/recipes/starcoder2_15b.py +++ b/nemo/collections/llm/recipes/starcoder2_15b.py @@ -58,7 +58,7 @@ def pretrain_recipe( # Trainer tensor_parallelism: int = 4, pipeline_parallelism: int = 2, - pipeline_parallelism_type: Optional[torch.dtype] = None, + pipeline_parallelism_type: Optional[torch.dtype] = torch.bfloat16, virtual_pipeline_parallelism: Optional[int] = None, context_parallelism: int = 1, sequence_parallelism: bool = False, diff --git a/nemo/collections/llm/recipes/starcoder.py b/nemo/collections/llm/recipes/starcoder_15b.py similarity index 98% rename from nemo/collections/llm/recipes/starcoder.py rename to nemo/collections/llm/recipes/starcoder_15b.py index b90cec0fbd7e..d4e76abe897e 100644 --- a/nemo/collections/llm/recipes/starcoder.py +++ b/nemo/collections/llm/recipes/starcoder_15b.py @@ -143,9 +143,9 @@ def pretrain_recipe( dir: Optional[str] = None, name: str = "default", # Trainer - tensor_parallelism: int = 2, - pipeline_parallelism: int = 1, - pipeline_parallelism_type: Optional[torch.dtype] = None, + tensor_parallelism: int = 1, + pipeline_parallelism: int = 8, + pipeline_parallelism_type: Optional[torch.dtype] = torch.bfloat16, virtual_pipeline_parallelism: Optional[int] = None, context_parallelism: int = 1, sequence_parallelism: bool = False, From 65415edd84bf0c07c995d32fd8d79611af3943ad Mon Sep 17 00:00:00 2001 From: Onur Yilmaz <35306097+oyilmaz-nvidia@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:35:18 -0500 Subject: [PATCH 02/50] vLLM Hugging Face exporter (#11124) * fix minor import bug Signed-off-by: Onur Yilmaz * Add save pretrained to HF model Signed-off-by: Onur Yilmaz * vllm hf exporter added Signed-off-by: Onur Yilmaz * pytriton function added Signed-off-by: Onur Yilmaz * update test Signed-off-by: Onur Yilmaz * Example fixed Signed-off-by: Onur Yilmaz * Apply isort and black reformatting Signed-off-by: oyilmaz-nvidia * Remove unused import --------- Signed-off-by: Onur Yilmaz Signed-off-by: oyilmaz-nvidia Co-authored-by: oyilmaz-nvidia --- examples/llm/sft/hf.py | 11 +- examples/llm/sft/hf_vllm.py | 62 ++++++++++ .../tokenizers/huggingface/auto_tokenizer.py | 4 + .../gpt/model/hf_auto_model_for_causal_lm.py | 9 ++ nemo/export/vllm_hf_exporter.py | 115 ++++++++++++++++++ 5 files changed, 199 insertions(+), 2 deletions(-) create mode 100755 examples/llm/sft/hf_vllm.py create mode 100755 nemo/export/vllm_hf_exporter.py diff --git a/examples/llm/sft/hf.py b/examples/llm/sft/hf.py index f7b50298ea14..3d5daddc7a79 100644 --- a/examples/llm/sft/hf.py +++ b/examples/llm/sft/hf.py @@ -55,6 +55,7 @@ def squad(tokenizer) -> pl.LightningDataModule: parser.add_argument('--accelerator', default='gpu', choices=['gpu']) parser.add_argument('--max-steps', type=int, default=100) parser.add_argument('--wandb-project', type=str, default=None) + parser.add_argument('--model-save-path', type=str, default=None) args = parser.parse_args() wandb = None @@ -70,9 +71,12 @@ def squad(tokenizer) -> pl.LightningDataModule: grad_clip = None use_dist_samp = False + model = llm.HfAutoModelForCausalLM(args.model) + tokenizer = model.tokenizer + llm.api.finetune( - model=llm.HfAutoModelForCausalLM(args.model), - data=squad(llm.HfAutoModelForCausalLM.configure_tokenizer(args.model)), + model=model, + data=squad(tokenizer), trainer=nl.Trainer( devices=args.devices, max_steps=args.max_steps, @@ -89,3 +93,6 @@ def squad(tokenizer) -> pl.LightningDataModule: optim=fdl.build(llm.adam.pytorch_adam_with_flat_lr(max_lr=1e-5, clip_grad=0.5)), log=None, ) + + if args.model_save_path is not None: + model.save_pretrained(args.model_save_path) diff --git a/examples/llm/sft/hf_vllm.py b/examples/llm/sft/hf_vllm.py new file mode 100755 index 000000000000..8110c0fafc4f --- /dev/null +++ b/examples/llm/sft/hf_vllm.py @@ -0,0 +1,62 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from nemo.deploy import DeployPyTriton +from nemo.deploy.nlp import NemoQueryLLM + +try: + from nemo.export.vllm_hf_exporter import vLLMHFExporter +except Exception: + raise Exception( + "vLLM should be installed in the environment or import " + "the vLLM environment in the NeMo FW container using " + "source /opt/venv/bin/activate command" + ) + + +if __name__ == '__main__': + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument('--model', required=True, type=str, help="Local path or model name on Hugging Face") + parser.add_argument('--triton-model-name', required=True, type=str, help="Name for the service") + args = parser.parse_args() + + exporter = vLLMHFExporter() + exporter.export(model=args.model) + + nm = DeployPyTriton( + model=exporter, + triton_model_name=args.triton_model_name, + triton_model_version=1, + max_batch_size=64, + port=8000, + address="0.0.0.0", + ) + + nm.deploy() + nm.run() + + nq = NemoQueryLLM(url="localhost:8000", model_name=args.triton_model_name) + output_deployed = nq.query_llm( + prompts=["How are you doing?"], + max_output_len=128, + top_k=1, + top_p=0.2, + temperature=1.0, + ) + + print("------------- Output: ", output_deployed) + nm.stop() diff --git a/nemo/collections/common/tokenizers/huggingface/auto_tokenizer.py b/nemo/collections/common/tokenizers/huggingface/auto_tokenizer.py index 43d377b73f34..14da2d13a030 100644 --- a/nemo/collections/common/tokenizers/huggingface/auto_tokenizer.py +++ b/nemo/collections/common/tokenizers/huggingface/auto_tokenizer.py @@ -298,3 +298,7 @@ def name(self): def save_vocabulary(self, save_directory: str, filename_prefix: str = None): """Saves tokenizer's vocabulary and other artifacts to the specified directory""" return self.tokenizer.save_vocabulary(save_directory=save_directory, filename_prefix=filename_prefix) + + def save_pretrained(self, save_directory: str): + """Saves tokenizer's vocabulary and other artifacts to the specified directory""" + return self.tokenizer.save_pretrained(save_directory) diff --git a/nemo/collections/llm/gpt/model/hf_auto_model_for_causal_lm.py b/nemo/collections/llm/gpt/model/hf_auto_model_for_causal_lm.py index 4396b82e0e5c..eada3f4c3eb8 100644 --- a/nemo/collections/llm/gpt/model/hf_auto_model_for_causal_lm.py +++ b/nemo/collections/llm/gpt/model/hf_auto_model_for_causal_lm.py @@ -20,6 +20,7 @@ from nemo.collections.common.tokenizers.huggingface.auto_tokenizer import AutoTokenizer from nemo.collections.llm import fn from nemo.lightning import io +from nemo.utils import logging def masked_cross_entropy(logits, targets, mask=None): @@ -111,3 +112,11 @@ def validation_step(self, batch, batch_idx): loss = output.loss self.log('val_loss', loss, on_step=True, on_epoch=True, prog_bar=True) + + def save_pretrained(self, path): + assert self.model is not None, "Model has to be created first." + self.model.save_pretrained(path) + if self._tokenizer is not None: + self._tokenizer.save_pretrained(path) + else: + logging.warning("A tokenizer wasn't created before to save.") diff --git a/nemo/export/vllm_hf_exporter.py b/nemo/export/vllm_hf_exporter.py new file mode 100755 index 000000000000..2d9754e08767 --- /dev/null +++ b/nemo/export/vllm_hf_exporter.py @@ -0,0 +1,115 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from typing import List + +import numpy as np +from pytriton.decorators import batch +from pytriton.model_config import Tensor +from vllm import LLM, SamplingParams + +from nemo.deploy import ITritonDeployable +from nemo.deploy.utils import cast_output, str_ndarray2list + + +class vLLMHFExporter(ITritonDeployable): + """ + The Exporter class uses vLLM APIs to convert a HF model to vLLM and makes the class, + deployable with Triton server. + + Example: + from nemo.export import vLLMHFExporter + from nemo.deploy import DeployPyTriton + + exporter = vLLMHFExporter() + exporter.export(model="/path/to/model/") + + server = DeployPyTriton( + model=exporter, + triton_model_name='model' + ) + + server.deploy() + server.serve() + server.stop() + """ + + def __init__(self): + self.model = None + + def export(self, model): + """ + Exports the HF checkpoint to vLLM and initializes the engine. + Args: + model (str): model name or the path + """ + self.model = LLM(model=model) + + @property + def get_triton_input(self): + inputs = ( + Tensor(name="prompts", shape=(-1,), dtype=bytes), + Tensor(name="max_output_len", shape=(-1,), dtype=np.int_, optional=True), + Tensor(name="top_k", shape=(-1,), dtype=np.int_, optional=True), + Tensor(name="top_p", shape=(-1,), dtype=np.single, optional=True), + Tensor(name="temperature", shape=(-1,), dtype=np.single, optional=True), + ) + return inputs + + @property + def get_triton_output(self): + outputs = (Tensor(name="outputs", shape=(-1,), dtype=bytes),) + return outputs + + @batch + def triton_infer_fn(self, **inputs: np.ndarray): + try: + infer_input = {"input_texts": str_ndarray2list(inputs.pop("prompts"))} + if "max_output_len" in inputs: + infer_input["max_output_len"] = inputs.pop("max_output_len")[0][0] + if "top_k" in inputs: + infer_input["top_k"] = inputs.pop("top_k")[0][0] + if "top_p" in inputs: + infer_input["top_p"] = inputs.pop("top_p")[0][0] + if "temperature" in inputs: + infer_input["temperature"] = inputs.pop("temperature")[0][0] + + output_texts = self.forward(**infer_input) + output = cast_output(output_texts, np.bytes_) + except Exception as error: + err_msg = "An error occurred: {0}".format(str(error)) + output = cast_output([err_msg], np.bytes_) + + return {"outputs": output} + + def forward( + self, + input_texts: List[str], + max_output_len: int = 64, + top_k: int = 1, + top_p: float = 0.0, + temperature: float = 1.0, + ): + assert self.model is not None, "Model is not initialized." + + sampling_params = SamplingParams( + max_tokens=max_output_len, temperature=temperature, top_k=int(top_k), top_p=top_p + ) + request_output = self.model.generate(input_texts, sampling_params) + output = [] + for o in request_output: + output.append(o.outputs[0].text) + + return output From 82ae2f2fae311f691404c54eb0dbec3a8a355aa0 Mon Sep 17 00:00:00 2001 From: Huiying Date: Mon, 4 Nov 2024 18:19:11 -0800 Subject: [PATCH 03/50] update nemo args for mcore flash decode arg change (#11138) * update mcore transformer layer, block, attention forward args for flash decode Signed-off-by: Huiying Li * Apply isort and black reformatting Signed-off-by: HuiyingLi * update mcore tag in Dockerfile.ci Signed-off-by: HuiyingLi --------- Signed-off-by: Huiying Li Signed-off-by: HuiyingLi Signed-off-by: HuiyingLi Co-authored-by: HuiyingLi --- Dockerfile.ci | 2 +- .../megatron/bert/bert_model.py | 2 ++ .../megatron/falcon/falcon_decoder_layer.py | 4 +++- .../gpt_full_te_layer_autocast_spec.py | 2 ++ .../megatron/griffin/griffin_model.py | 4 +++- .../common/megatron/adapters/mcore_mixins.py | 18 +++++++++++++++--- 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Dockerfile.ci b/Dockerfile.ci index 10ea68f2c247..d51f79e1b3af 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -53,7 +53,7 @@ RUN pip install nemo_run@git+https://github.com/NVIDIA/NeMo-Run.git@${NEMO_RUN_T # Install NeMo requirements ARG TE_TAG=7d576ed25266a17a7b651f2c12e8498f67e0baea ARG MODELOPT_VERSION=0.19.0 -ARG MCORE_TAG=213c8a23fa9fe95d19eff0932a1e6e71767f0962 +ARG MCORE_TAG=441cb9250101cf2cc406f0439b802f34f923f251 ARG APEX_TAG=810ffae374a2b9cb4b5c5e28eaeca7d7998fca0c RUN \ diff --git a/nemo/collections/nlp/models/language_modeling/megatron/bert/bert_model.py b/nemo/collections/nlp/models/language_modeling/megatron/bert/bert_model.py index 67a4802d83f6..0d75ab7cc706 100644 --- a/nemo/collections/nlp/models/language_modeling/megatron/bert/bert_model.py +++ b/nemo/collections/nlp/models/language_modeling/megatron/bert/bert_model.py @@ -206,6 +206,8 @@ def forward( context=None, context_mask=None, rotary_pos_emb=None, + rotary_pos_cos=None, + rotary_pos_sin=None, inference_params=None, packed_seq_params=None, ): diff --git a/nemo/collections/nlp/models/language_modeling/megatron/falcon/falcon_decoder_layer.py b/nemo/collections/nlp/models/language_modeling/megatron/falcon/falcon_decoder_layer.py index 1783d5f5f3fd..131f154d6709 100644 --- a/nemo/collections/nlp/models/language_modeling/megatron/falcon/falcon_decoder_layer.py +++ b/nemo/collections/nlp/models/language_modeling/megatron/falcon/falcon_decoder_layer.py @@ -55,7 +55,7 @@ class FalconTransformerLayer(TransformerLayer): Transformer layer takes input with size [s, b, h] and returns an output of the same size. - + """ def __init__( @@ -106,6 +106,8 @@ def forward( context=None, context_mask=None, rotary_pos_emb=None, + rotary_pos_cos=None, + rotary_pos_sin=None, inference_params=None, packed_seq_params=None, ): diff --git a/nemo/collections/nlp/models/language_modeling/megatron/gpt_full_te_layer_autocast_spec.py b/nemo/collections/nlp/models/language_modeling/megatron/gpt_full_te_layer_autocast_spec.py index e9fb1833fc08..d1945139dee9 100644 --- a/nemo/collections/nlp/models/language_modeling/megatron/gpt_full_te_layer_autocast_spec.py +++ b/nemo/collections/nlp/models/language_modeling/megatron/gpt_full_te_layer_autocast_spec.py @@ -250,6 +250,8 @@ def forward( context=None, context_mask=None, rotary_pos_emb=None, + rotary_pos_cos=None, + rotary_pos_sin=None, inference_params=None, packed_seq_params=None, # TODO: handle this ): diff --git a/nemo/collections/nlp/models/language_modeling/megatron/griffin/griffin_model.py b/nemo/collections/nlp/models/language_modeling/megatron/griffin/griffin_model.py index 7a327a3a35cb..e0e3a2339ca1 100755 --- a/nemo/collections/nlp/models/language_modeling/megatron/griffin/griffin_model.py +++ b/nemo/collections/nlp/models/language_modeling/megatron/griffin/griffin_model.py @@ -160,7 +160,9 @@ def forward( rotary_pos_emb = None self.decoder.input_tensor = None if self.position_embedding_type == 'rope': - rotary_seq_len = self.rotary_pos_emb.get_rotary_seq_len(None, self.decoder, hidden_states, self.config) + rotary_seq_len = self.rotary_pos_emb.get_rotary_seq_len( + None, self.decoder, hidden_states, self.config, None + ) rotary_pos_emb = self.rotary_pos_emb(rotary_seq_len) hidden_states = self.decoder(hidden_states, attention_mask=attention_mask, rotary_pos_emb=rotary_pos_emb) diff --git a/nemo/collections/nlp/modules/common/megatron/adapters/mcore_mixins.py b/nemo/collections/nlp/modules/common/megatron/adapters/mcore_mixins.py index 5128b4ca6b16..da9c98fd94ea 100644 --- a/nemo/collections/nlp/modules/common/megatron/adapters/mcore_mixins.py +++ b/nemo/collections/nlp/modules/common/megatron/adapters/mcore_mixins.py @@ -80,11 +80,21 @@ def forward( context: Tensor = None, context_mask: Tensor = None, rotary_pos_emb: Tensor = None, + rotary_pos_cos: Tensor = None, + rotary_pos_sin: Tensor = None, inference_params: InferenceParams = None, packed_seq_params: PackedSeqParams = None, ): hidden_states = super().forward( - hidden_states, attention_mask, context, context_mask, rotary_pos_emb, inference_params, packed_seq_params + hidden_states, + attention_mask, + context, + context_mask, + rotary_pos_emb, + rotary_pos_cos, + rotary_pos_sin, + inference_params, + packed_seq_params, ) mlp_head_adapter = self.get_adapter_module(AdapterName.MLP_HEAD_ADAPTER) @@ -220,6 +230,8 @@ def forward( inference_params=None, rotary_pos_emb=None, packed_seq_params=None, + rotary_pos_cos=None, + rotary_pos_sin=None, ): # hidden_states: [sq, b, h] @@ -237,8 +249,8 @@ def forward( # =================================================== # Adjust key, value, and rotary_pos_emb for inference # =================================================== - key, value, rotary_pos_emb, attn_mask_type = self._adjust_key_value_for_inference( - inference_params, key, value, rotary_pos_emb + query, key, value, rotary_pos_emb, attn_mask_type = self._adjust_key_value_for_inference( + inference_params, query, key, value, rotary_pos_emb ) if packed_seq_params is not None: From 5bf10e411ad83f7c55d1edfe8e499ff9c58f70de Mon Sep 17 00:00:00 2001 From: Chen Cui Date: Mon, 4 Nov 2024 21:41:56 -0500 Subject: [PATCH 04/50] Fix freeze_model call in peft (#11146) * fix freeze_model call in peft Signed-off-by: Chen Cui * Apply isort and black reformatting Signed-off-by: cuichenx --------- Signed-off-by: Chen Cui Signed-off-by: cuichenx Co-authored-by: cuichenx --- nemo/lightning/pytorch/callbacks/peft.py | 14 ++++++-------- tests/lightning/pytorch/callbacks/test_peft.py | 8 ++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/nemo/lightning/pytorch/callbacks/peft.py b/nemo/lightning/pytorch/callbacks/peft.py index a089ef8dff8f..906cbd6e450e 100644 --- a/nemo/lightning/pytorch/callbacks/peft.py +++ b/nemo/lightning/pytorch/callbacks/peft.py @@ -94,18 +94,15 @@ def __call__(self, model: nn.Module) -> nn.Module: Returns: nn.Module: The transformed model with PEFT applied. """ + self.freeze_model(model) - # If using megatron virtual pipeline parallelism, model is a list of - # model chunks so iterate over model + # apply walk to model(s) if isinstance(model, MegatronParallel) and len(model) > 1: for model_chunk in model: - model_chunk.freeze() model_chunk.walk(self.transform) elif isinstance(model, torch.nn.parallel.distributed.DistributedDataParallel): - model.module.freeze() model.module.walk(self.transform) else: - model.freeze() model.walk(self.transform) return model @@ -122,12 +119,14 @@ def freeze_model(self, model: nn.Module) -> None: Returns: nn.Module: The transformed model with PEFT applied. """ + if isinstance(model, MegatronParallel) and len(model) > 1: + for model_chunk in model: + model_chunk.freeze() if isinstance(model, torch.nn.parallel.distributed.DistributedDataParallel): model.module.freeze() - model.module.walk(self.transform) else: model.freeze() - model.train(mode=True) + model.train(mode=True) def setup(self, trainer: pl.Trainer, pl_module: pl.LightningModule, stage: str) -> None: from nemo.lightning.pytorch.strategies.utils import create_checkpoint_io @@ -136,7 +135,6 @@ def setup(self, trainer: pl.Trainer, pl_module: pl.LightningModule, stage: str) trainer.strategy.trainer = trainer wrapped_io = partial(WrappedAdapterIO, peft=self) - ckpt_io_kwargs = {} ckpt_io_kwarg_names = [ "save_ckpt_format", diff --git a/tests/lightning/pytorch/callbacks/test_peft.py b/tests/lightning/pytorch/callbacks/test_peft.py index 95caca4d2784..49a6aa0784aa 100644 --- a/tests/lightning/pytorch/callbacks/test_peft.py +++ b/tests/lightning/pytorch/callbacks/test_peft.py @@ -26,6 +26,11 @@ class DummyPEFT(PEFT): def transform(self, module, name=None, prefix=None): return module # No-op transform for testing + def freeze_model(self, module): + super().freeze_model(module) + self.is_called = True + return module + class DummyModel(nn.Module, fn.FNMixin): def __init__(self): super().__init__() @@ -38,6 +43,9 @@ def test_peft_call(self): transformed_model = peft(model) + assert ( + hasattr(peft, "is_called") and peft.is_called == True + ), "peft methods may subclass `freeze_model()`, so it must be called" assert transformed_model.linear.weight.requires_grad == False assert transformed_model.conv.weight.requires_grad == False From 6419367452d8a07cc980919e6b038d5f2a500768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?oliver=20k=C3=B6nig?= Date: Tue, 5 Nov 2024 13:33:53 +0100 Subject: [PATCH 05/50] =?UTF-8?q?[=F0=9F=A4=A0]:=20Howdy=20folks,=20let's?= =?UTF-8?q?=20bump=20`Dockerfile.ci`=20to=203d27a9d=20!=20(#11159)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- Dockerfile.ci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.ci b/Dockerfile.ci index d51f79e1b3af..80b4155648e4 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -53,7 +53,7 @@ RUN pip install nemo_run@git+https://github.com/NVIDIA/NeMo-Run.git@${NEMO_RUN_T # Install NeMo requirements ARG TE_TAG=7d576ed25266a17a7b651f2c12e8498f67e0baea ARG MODELOPT_VERSION=0.19.0 -ARG MCORE_TAG=441cb9250101cf2cc406f0439b802f34f923f251 +ARG MCORE_TAG=3d27a9de61534a0af248b7cf5af6013d93bd52db ARG APEX_TAG=810ffae374a2b9cb4b5c5e28eaeca7d7998fca0c RUN \ From a294601ef81c2b70ebda08f0b29d0e73bc5fe5f2 Mon Sep 17 00:00:00 2001 From: Alexandros Koumparoulis <153118171+akoumpa@users.noreply.github.com> Date: Tue, 5 Nov 2024 05:41:57 -0800 Subject: [PATCH 06/50] NeMo-UX: Add sgd optim (#11157) * fix Signed-off-by: Alexandros Koumparoulis * add sgd Signed-off-by: Alexandros Koumparoulis * remove stale args Signed-off-by: Alexandros Koumparoulis * remove clip grad arg Signed-off-by: Alexandros Koumparoulis * Pass optimizer as a run.Partial instead Signed-off-by: Alexandros Koumparoulis * move param extraction out of PytorchOptimizerModule Signed-off-by: Alexandros Koumparoulis * fix Signed-off-by: Alexandros Koumparoulis * Add ParamsT import Signed-off-by: Alexandros Koumparoulis * fix Signed-off-by: Alexandros Koumparoulis * fix Signed-off-by: Alexandros Koumparoulis * fix Signed-off-by: Alexandros Koumparoulis * Apply isort and black reformatting Signed-off-by: akoumpa --------- Signed-off-by: Alexandros Koumparoulis Signed-off-by: akoumpa Co-authored-by: akoumpa --- examples/llm/peft/hf.py | 2 +- examples/llm/sft/hf.py | 2 +- nemo/collections/llm/recipes/optim/adam.py | 34 +++------ nemo/collections/llm/recipes/optim/sgd.py | 62 ++++++++++++++++ nemo/lightning/pytorch/optim/pytorch.py | 84 +++++++++++----------- 5 files changed, 115 insertions(+), 69 deletions(-) create mode 100644 nemo/collections/llm/recipes/optim/sgd.py diff --git a/examples/llm/peft/hf.py b/examples/llm/peft/hf.py index c6dbbf90bf29..97f21d6c253e 100644 --- a/examples/llm/peft/hf.py +++ b/examples/llm/peft/hf.py @@ -96,7 +96,7 @@ def formatting_prompts_func(examples): use_distributed_sampler=use_dist_samp, logger=wandb, ), - optim=fdl.build(llm.adam.pytorch_adam_with_flat_lr(max_lr=1e-5, clip_grad=0.5)), + optim=fdl.build(llm.adam.pytorch_adam_with_flat_lr(lr=1e-5)), log=None, peft=llm.peft.LoRA( target_modules=['*_proj'], diff --git a/examples/llm/sft/hf.py b/examples/llm/sft/hf.py index 3d5daddc7a79..39efe87de368 100644 --- a/examples/llm/sft/hf.py +++ b/examples/llm/sft/hf.py @@ -90,7 +90,7 @@ def squad(tokenizer) -> pl.LightningDataModule: use_distributed_sampler=use_dist_samp, logger=wandb, ), - optim=fdl.build(llm.adam.pytorch_adam_with_flat_lr(max_lr=1e-5, clip_grad=0.5)), + optim=fdl.build(llm.adam.pytorch_adam_with_flat_lr(lr=1e-5)), log=None, ) diff --git a/nemo/collections/llm/recipes/optim/adam.py b/nemo/collections/llm/recipes/optim/adam.py index 8aa0e7ebf613..b5a60b6f8b3f 100644 --- a/nemo/collections/llm/recipes/optim/adam.py +++ b/nemo/collections/llm/recipes/optim/adam.py @@ -17,12 +17,7 @@ import nemo_run as run from megatron.core.optimizer import OptimizerConfig -from nemo.lightning.pytorch.optim import ( - CosineAnnealingScheduler, - MegatronOptimizerModule, - OptimizerModule, - PytorchOptimizerModule, -) +from nemo.lightning.pytorch.optim import CosineAnnealingScheduler, MegatronOptimizerModule, PytorchOptimizerModule @run.cli.factory @@ -35,7 +30,7 @@ def distributed_fused_adam_with_cosine_annealing( max_lr: float = 1e-4, min_lr: Optional[float] = None, clip_grad: float = 1.0, -) -> run.Config[OptimizerModule]: +) -> run.Config[PytorchOptimizerModule]: opt_cfg = run.Config( OptimizerConfig, @@ -68,20 +63,17 @@ def distributed_fused_adam_with_cosine_annealing( @run.cli.factory def pytorch_adam_with_cosine_annealing( - precision: str = "bf16-mixed", # or "16-mixed" warmup_steps: int = 2000, constant_steps: int = 0, max_lr: float = 1e-5, min_lr: Optional[float] = None, - clip_grad: float = 1.0, -) -> run.Config[OptimizerModule]: +) -> run.Config[PytorchOptimizerModule]: from torch.optim import Adam return run.Config( PytorchOptimizerModule, - optim_cls=Adam, - config=run.Config( - dict, + optimizer_fn=run.Partial( + Adam, lr=max_lr, weight_decay=0.1, betas=(0.9, 0.95), @@ -98,21 +90,15 @@ def pytorch_adam_with_cosine_annealing( @run.cli.factory def pytorch_adam_with_flat_lr( - precision: str = "bf16-mixed", # or "16-mixed" - warmup_steps: int = 2000, - constant_steps: int = 0, - max_lr: float = 1e-5, - min_lr: Optional[float] = None, - clip_grad: float = 1.0, -) -> run.Config[OptimizerModule]: + lr: float = 1e-5, +) -> run.Config[PytorchOptimizerModule]: from torch.optim import Adam return run.Config( PytorchOptimizerModule, - optim_cls=Adam, - config=run.Config( - dict, - lr=max_lr, + optimizer_fn=run.Partial( + Adam, + lr=lr, weight_decay=0.1, betas=(0.9, 0.95), eps=1e-8, diff --git a/nemo/collections/llm/recipes/optim/sgd.py b/nemo/collections/llm/recipes/optim/sgd.py new file mode 100644 index 000000000000..7c55c6915ee1 --- /dev/null +++ b/nemo/collections/llm/recipes/optim/sgd.py @@ -0,0 +1,62 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Optional + +import nemo_run as run + +from nemo.lightning.pytorch.optim import CosineAnnealingScheduler, PytorchOptimizerModule + + +@run.cli.factory +def pytorch_sgd_with_cosine_annealing( + warmup_steps: int = 2000, + constant_steps: int = 0, + max_lr: float = 1e-5, + min_lr: Optional[float] = None, + wd: float = 1e-4, +) -> run.Config[PytorchOptimizerModule]: + from torch.optim import SGD + + return run.Config( + PytorchOptimizerModule, + optimizer_fn=run.Partial( + SGD, + lr=max_lr, + weight_decay=wd, + ), + lr_scheduler=run.Config( + CosineAnnealingScheduler, + warmup_steps=warmup_steps, + constant_steps=constant_steps, + min_lr=min_lr or (0.1 * max_lr), + ), + ) + + +@run.cli.factory +def pytorch_sgd_with_flat_lr( + lr: float = 1e-5, + wd: float = 1e-4, +) -> run.Config[PytorchOptimizerModule]: + from torch.optim import SGD + + return run.Config( + PytorchOptimizerModule, + optimizer_fn=run.Partial( + SGD, + lr=lr, + weight_decay=wd, + ), + ) diff --git a/nemo/lightning/pytorch/optim/pytorch.py b/nemo/lightning/pytorch/optim/pytorch.py index 6600fc0cf0a4..9d773917e4f4 100644 --- a/nemo/lightning/pytorch/optim/pytorch.py +++ b/nemo/lightning/pytorch/optim/pytorch.py @@ -15,7 +15,9 @@ from typing import Callable, List, Optional import pytorch_lightning as pl +import pytorch_lightning as L from torch.optim import Optimizer +from torch.optim.optimizer import ParamsT from nemo.lightning.megatron_parallel import MegatronParallel from nemo.lightning.pytorch.optim.base import LRSchedulerModule, OptimizerModule @@ -25,20 +27,43 @@ def _param_does_not_have_wd(param_name, param): return 'bias' in param_name +def _extract_model_params_for_optim(model, weight_decay=0, no_weight_decay_cond=None): + params_with_wd, params_without_wd = [], [] + if no_weight_decay_cond is not None: + for name, param in model.named_parameters(): + if no_weight_decay_cond(name, param): + params_without_wd.append(param) + else: + params_with_wd.append(param) + else: + params_with_wd = model.parameters() + + assert max(map(len, (params_with_wd, params_without_wd))) > 0, "Expected at least one optimizer with params" + + return [ + {'params': params, 'weight_decay': wd} + for params, wd in zip((params_with_wd, params_without_wd), (weight_decay, 0)) + ] + + class PytorchOptimizerModule(OptimizerModule): """A OptimizerModule for pytorch optimizers. Attributes: - config (OptimizerConfig): Configuration for the optimizer. + optimizer_fn (Callable[[ParamsT], Optimizer]): Configuration for the optimizer. no_weight_decay_cond (Optional[Callable]): Condition for no weight decay. scale_lr_cond (Optional[Callable]): Condition for scaling learning rate. lr_mult (float): Learning rate multiplier. Example:: - config = OptimizerConfig(...) + optimizer_fn = run.Partial( + SGD, + lr=lr, + weight_decay=wd, + ) lr_scheduler = MyLRSchedulerModule(...) - optimizer_module = PytorchOptimizerModule(config, lr_scheduler) + optimizer_module = PytorchOptimizerModule(optimizer_fn, lr_scheduler) Methods: setup(model): Sets up the optimizer. @@ -47,8 +72,7 @@ class PytorchOptimizerModule(OptimizerModule): def __init__( self, - optim_cls, - config: dict = {'lr': 3e-4}, + optimizer_fn: Callable[[ParamsT], Optimizer], lr_scheduler: Optional[LRSchedulerModule] = None, no_weight_decay_cond: Optional[Callable] = _param_does_not_have_wd, scale_lr_cond: Optional[Callable] = None, @@ -57,7 +81,7 @@ def __init__( """Initializes the PytorchOptimizerModule. Args: - config (OptimizerConfig): Configuration for the optimizer. + optimizer_fn (Callable[[ParamsT], Optimizer]): Configuration for the optimizer. lr_scheduler (Optional[LRSchedulerModule]): The learning rate scheduler module. no_weight_decay_cond (Optional[Callable]): Condition for no weight decay. scale_lr_cond (Optional[Callable]): Condition for scaling learning rate. @@ -65,12 +89,10 @@ def __init__( """ super().__init__(lr_scheduler=lr_scheduler) - self.optim_cls = optim_cls - self.config = config + self.optimizer_fn = optimizer_fn self.no_weight_decay_cond = no_weight_decay_cond self.scale_lr_cond = scale_lr_cond self.lr_mult = lr_mult - self.optim_cls = optim_cls def on_fit_start(self, trainer: "pl.Trainer", pl_module: "pl.LightningModule"): # Noop @@ -92,41 +114,17 @@ def optimizers(self, model) -> List[Optimizer]: if isinstance(model, MegatronParallel): raise ValueError("Model cannot be an instance of MegatronParallel") - params_with_wd, params_without_wd = [], [] - if self.no_weight_decay_cond is not None: - for name, param in model.named_parameters(): - if self.no_weight_decay_cond(name, param): - params_without_wd.append(param) - else: - params_with_wd.append(param) - else: - params_with_wd = model.parameters() - - optimizers = [] - if len(params_with_wd) > 0: - optimizers.append( - self.optim_cls( - params_with_wd, - **self.config, - ) - ) - - if len(params_without_wd) > 0: - wd = self.config.get('weight_decay', None) - kwargs['weight_decay'] = 0 - optimizers.append( - self.optim_cls( - params_without_wd, - **kwargs, - ) - ) - # restore value - if wd is not None: - kwargs['weight_decay'] = wd - - assert len(optimizers) > 0, "Expected at least one optimizer with params" - return optimizers + wd = self.optimizer_fn.keywords.get('weight_decay', 0) + return self.optimizer_fn(_extract_model_params_for_optim(model, wd, self.no_weight_decay_cond)) def finalize_model_grads(self, *args, **kwargs): # Noop pass + + def connect(self, model: L.LightningModule) -> None: + """Connects the optimizer module to the model and trainer. + + Args: + model (L.LightningModule): The model to which the optimizer module is being connected. + """ + model.configure_optimizers = lambda: self.optimizers(model) From ee7f47bfd6fdcadf9386d9298b838c33933cb454 Mon Sep 17 00:00:00 2001 From: Ssofja <78349198+Ssofja@users.noreply.github.com> Date: Tue, 5 Nov 2024 20:13:22 +0400 Subject: [PATCH 07/50] Added deprecation notice (#11133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added deprecation notice Signed-off-by: Ssofja * Apply isort and black reformatting Signed-off-by: Ssofja * Updated text in deprecation notice Co-authored-by: Nithin Rao Signed-off-by: Ssofja <78349198+Ssofja@users.noreply.github.com> * Updated text in deprecation notice Co-authored-by: Nithin Rao Signed-off-by: Ssofja <78349198+Ssofja@users.noreply.github.com> * Apply isort and black reformatting Signed-off-by: Ssofja * Update version Co-authored-by: Somshubra Majumdar Signed-off-by: Ssofja <78349198+Ssofja@users.noreply.github.com> * Update nemo/collections/asr/data/audio_to_text.py Co-authored-by: oliver könig Signed-off-by: Ssofja <78349198+Ssofja@users.noreply.github.com> --------- Signed-off-by: Ssofja Signed-off-by: Ssofja Signed-off-by: Ssofja <78349198+Ssofja@users.noreply.github.com> Co-authored-by: Ssofja Co-authored-by: Nithin Rao Co-authored-by: Somshubra Majumdar Co-authored-by: oliver könig --- nemo/collections/asr/data/audio_to_text.py | 4 ++++ nemo/collections/asr/models/aed_multitask_models.py | 5 +++++ nemo/collections/asr/models/classification_models.py | 2 ++ nemo/collections/asr/models/confidence_ensemble.py | 2 ++ nemo/collections/asr/models/ctc_models.py | 4 ++++ nemo/collections/asr/models/rnnt_models.py | 4 ++++ 6 files changed, 21 insertions(+) diff --git a/nemo/collections/asr/data/audio_to_text.py b/nemo/collections/asr/data/audio_to_text.py index d5ece6202da7..542f0fe70eca 100644 --- a/nemo/collections/asr/data/audio_to_text.py +++ b/nemo/collections/asr/data/audio_to_text.py @@ -42,6 +42,7 @@ is_datastore_path, is_tarred_path, ) +from nemo.utils.decorators import deprecated from nemo.utils.distributed import webdataset_split_by_workers from nemo.utils.get_rank import is_global_rank_zero @@ -730,6 +731,9 @@ def __call__(self, *args): ) +@deprecated( + explanation='Webdataset support will be removed in v2.1.0 versions, please use LhotseSpeechToTextBpeDataset class instead' +) class _TarredAudioToTextDataset(IterableDataset): """ A similar Dataset to the AudioToCharDataset/AudioToBPEDataset, but which loads tarred audio files. diff --git a/nemo/collections/asr/models/aed_multitask_models.py b/nemo/collections/asr/models/aed_multitask_models.py index fc3662b04bc8..268438c2e09d 100644 --- a/nemo/collections/asr/models/aed_multitask_models.py +++ b/nemo/collections/asr/models/aed_multitask_models.py @@ -61,6 +61,8 @@ SpectrogramType, ) from nemo.utils import logging, model_utils +from nemo.utils.decorators import deprecated + __all__ = ['EncDecMultiTaskModel'] @@ -886,6 +888,9 @@ def _transcribe_forward( decoder_input_ids=decoder_input_ids, ) + @deprecated( + explanation='The return type of args will be updated in the upcoming release to ensure a consistent output format across all decoder types, such that a Hypothesis object is always returned.' + ) def _transcribe_output_processing(self, outputs, trcfg: MultiTaskTranscriptionConfig) -> GenericTranscriptionType: """ Internal function to process the model's outputs to return the results to the user. This function is called by diff --git a/nemo/collections/asr/models/classification_models.py b/nemo/collections/asr/models/classification_models.py index 7b226f59e364..b49ef50583a7 100644 --- a/nemo/collections/asr/models/classification_models.py +++ b/nemo/collections/asr/models/classification_models.py @@ -39,6 +39,7 @@ from nemo.core.neural_types import * from nemo.utils import logging, model_utils from nemo.utils.cast_utils import cast_all +from nemo.utils.decorators import deprecated __all__ = ['EncDecClassificationModel', 'EncDecRegressionModel'] @@ -483,6 +484,7 @@ def get_transcribe_config(cls) -> ClassificationInferConfig: return ClassificationInferConfig() +@deprecated(explanation='EncDecClassificationModel will be merged with EncDecSpeakerLabelModel class.') class EncDecClassificationModel(_EncDecBaseModel): """Encoder decoder Classification models.""" diff --git a/nemo/collections/asr/models/confidence_ensemble.py b/nemo/collections/asr/models/confidence_ensemble.py index 9ae3bc3fbb5d..c6b2846085af 100644 --- a/nemo/collections/asr/models/confidence_ensemble.py +++ b/nemo/collections/asr/models/confidence_ensemble.py @@ -33,6 +33,7 @@ from nemo.collections.asr.parts.utils.rnnt_utils import Hypothesis from nemo.core.classes import ModelPT from nemo.utils import model_utils +from nemo.utils.decorators import deprecated # frozen is required to allow hashing of this class and use it @@ -151,6 +152,7 @@ def compute_confidence(hypothesis: Hypothesis, confidence_cfg: ConfidenceConfig) return conf_value +@deprecated(version='v2.1.0') class ConfidenceEnsembleModel(ModelPT): """Implementation of the confidence ensemble model. diff --git a/nemo/collections/asr/models/ctc_models.py b/nemo/collections/asr/models/ctc_models.py index 4976c09b44c1..edf4f84a9f9b 100644 --- a/nemo/collections/asr/models/ctc_models.py +++ b/nemo/collections/asr/models/ctc_models.py @@ -43,6 +43,7 @@ from nemo.core.classes.mixins import AccessMixin from nemo.core.neural_types import AudioSignal, LabelsType, LengthsType, LogprobsType, NeuralType, SpectrogramType from nemo.utils import logging +from nemo.utils.decorators import deprecated __all__ = ['EncDecCTCModel'] @@ -668,6 +669,9 @@ def _transcribe_forward(self, batch: Any, trcfg: TranscribeConfig): del greedy_predictions return output + @deprecated( + explanation='The return type of args will be updated in the upcoming release to ensure a consistent output format across all decoder types, such that a Hypothesis object is always returned.' + ) def _transcribe_output_processing(self, outputs, trcfg: TranscribeConfig) -> GenericTranscriptionType: logits = outputs.pop('logits') logits_len = outputs.pop('logits_len') diff --git a/nemo/collections/asr/models/rnnt_models.py b/nemo/collections/asr/models/rnnt_models.py index 0d1fbe651dc3..2b319a3c7dec 100644 --- a/nemo/collections/asr/models/rnnt_models.py +++ b/nemo/collections/asr/models/rnnt_models.py @@ -46,6 +46,7 @@ from nemo.core.classes.mixins import AccessMixin from nemo.core.neural_types import AcousticEncodedRepresentation, AudioSignal, LengthsType, NeuralType, SpectrogramType from nemo.utils import logging +from nemo.utils.decorators import deprecated class EncDecRNNTModel(ASRModel, ASRModuleMixin, ExportableEncDecModel, ASRTranscriptionMixin): @@ -899,6 +900,9 @@ def _transcribe_forward(self, batch: Any, trcfg: TranscribeConfig): output = dict(encoded=encoded, encoded_len=encoded_len) return output + @deprecated( + explanation='The return type of args will be updated in the upcoming release to ensure a consistent output format across all decoder types, such that a "Hypothesis" object is always returned.' + ) def _transcribe_output_processing( self, outputs, trcfg: TranscribeConfig ) -> Tuple[List['Hypothesis'], List['Hypothesis']]: From 3a1a34d6d65f108ac36529d6c9e56733fd39fd8c Mon Sep 17 00:00:00 2001 From: Pablo Garay Date: Tue, 5 Nov 2024 08:47:56 -0800 Subject: [PATCH 08/50] Update copyright check (#11168) * Make/move copyright check template * Adjustment for standard format --- .github/workflows/copyright-check.yml | 43 ++------------------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/.github/workflows/copyright-check.yml b/.github/workflows/copyright-check.yml index 724f3afb6177..ebd35c51dc44 100644 --- a/.github/workflows/copyright-check.yml +++ b/.github/workflows/copyright-check.yml @@ -11,49 +11,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + name: Copyright check on: pull_request: jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - path: ${{ github.run_id }} - fetch-depth: 0 - - - name: Check files have copyright notice - run: | - cd ${{ github.run_id }} - - # Files ending with .py should have Copyright notice in the first 10 lines - find_files_with_missing_copyright() { - find ./ -type f -name '*.py' -not -path "./.git/*" -not -path "./*__init__.py" | while read path; do - echo -en $path"\t" - head -n 10 $path | tr '\n' '\t' | sed 's/\t$/\n/' - done \ - | egrep -iv 'Copyright.*NVIDIA CORPORATION.*' \ - | egrep -iv '*MIT.*Licen.e.*' \ - | egrep -iv '*Copyright.*Apache.*' \ - | egrep -iv '*Apache.*License.*' \ - | while read line; do - echo $line | cut -d' ' -f1 - done - } - - - declare RESULT=($(find_files_with_missing_copyright)) # (..) = array - - if [ "${#RESULT[@]}" -gt 0 ]; then - echo "Error: Found files with missing copyright:" - for (( i=0; i<"${#RESULT[@]}"; i++ )); do - echo "path= ${RESULT[$i]}" - done - exit 1; - else - echo "Ok: All (Python) files start with copyright notice" - fi + copyright-check: + uses: NVIDIA/NeMo-FW-CI-templates/.github/workflows/_copyright_check.yml@v0.2.0 \ No newline at end of file From fb00406638facbcd0f7e1ba9aaea304e9d713a5f Mon Sep 17 00:00:00 2001 From: Anna Shors <71393111+ashors1@users.noreply.github.com> Date: Tue, 5 Nov 2024 10:01:49 -0800 Subject: [PATCH 09/50] Call `ckpt_to_weights_subdir` from `MegatronCheckpointIO` (#10897) * locate weights path within MegatronCheckpointIO Signed-off-by: ashors1 * small refactor Signed-off-by: ashors1 * remove another instance of ckpt_to_weights_subdir Signed-off-by: ashors1 * move ckpt_to_weights_subdir Signed-off-by: ashors1 * Apply isort and black reformatting Signed-off-by: ashors1 * Apply isort and black reformatting Signed-off-by: artbataev * add weights path in save_checkpoint Signed-off-by: ashors1 * fix circular import Signed-off-by: ashors1 * Apply isort and black reformatting Signed-off-by: ashors1 * handle saving in ckpt_to_weights_subdir Signed-off-by: ashors1 * fix minor typo Signed-off-by: ashors1 * bug fixes Signed-off-by: ashors1 * fix undefined variable Signed-off-by: ashors1 * move function Signed-off-by: ashors1 * Apply isort and black reformatting Signed-off-by: ashors1 * fix adapter meta file path Signed-off-by: Chen Cui * Apply isort and black reformatting Signed-off-by: cuichenx * fix mixtral test Signed-off-by: ashors1 * fix mixtral test Signed-off-by: ashors1 * use function for weights subdir Signed-off-by: Chen Cui * address comments Signed-off-by: ashors1 * move asserts Signed-off-by: ashors1 * fix undefined vars Signed-off-by: ashors1 * bug fix Signed-off-by: ashors1 --------- Signed-off-by: ashors1 Signed-off-by: ashors1 Signed-off-by: artbataev Signed-off-by: Chen Cui Signed-off-by: cuichenx Co-authored-by: ashors1 Co-authored-by: artbataev Co-authored-by: Chen Cui Co-authored-by: cuichenx --- nemo/lightning/ckpt_utils.py | 6 ---- nemo/lightning/fabric/fabric.py | 4 +-- nemo/lightning/io/connector.py | 4 +-- nemo/lightning/io/pl.py | 30 +++++++++++++++++-- .../pytorch/callbacks/model_checkpoint.py | 22 +++++++------- nemo/lightning/pytorch/callbacks/peft.py | 4 +-- .../pytorch/strategies/megatron_strategy.py | 9 +----- tests/collections/llm/bitexact/mixtral/run.sh | 2 +- .../llm/megatron_mixtral_pretraining.py | 2 +- 9 files changed, 47 insertions(+), 36 deletions(-) diff --git a/nemo/lightning/ckpt_utils.py b/nemo/lightning/ckpt_utils.py index ae1fe520a119..fa588092497a 100644 --- a/nemo/lightning/ckpt_utils.py +++ b/nemo/lightning/ckpt_utils.py @@ -33,12 +33,6 @@ def idempotent_path_append(base_dir: Union[str, Path], suffix) -> Path: return base_dir -def ckpt_to_weights_subdir(filepath: Union[str, Path]) -> Path: - """Given an input checkpoint filepath, clean it using `ckpt_to_dir` and then return the weights subdirectory.""" - base_dir = ckpt_to_dir(filepath=filepath) - return idempotent_path_append(base_dir, WEIGHTS_PATH) - - def ckpt_to_context_subdir(filepath: Union[str, Path]) -> Path: """Given an input checkpoint filepath, clean it using `ckpt_to_dir` and then return the context subdirectory.""" base_dir = ckpt_to_dir(filepath=filepath) diff --git a/nemo/lightning/fabric/fabric.py b/nemo/lightning/fabric/fabric.py index b1ca867cab83..60eb518a1e42 100644 --- a/nemo/lightning/fabric/fabric.py +++ b/nemo/lightning/fabric/fabric.py @@ -22,7 +22,7 @@ from torch import nn from typing_extensions import Self, override -from nemo.lightning.ckpt_utils import ckpt_to_context_subdir, ckpt_to_weights_subdir +from nemo.lightning.ckpt_utils import ckpt_to_context_subdir from nemo.lightning.io.mixin import IOMixin, serialization, track_io if TYPE_CHECKING: @@ -83,7 +83,7 @@ def load_model( model = context.model dist_model = self.setup_module(model) - self.load(ckpt_to_weights_subdir(path), {"state_dict": dist_model}) + self.load(path, {"state_dict": dist_model}) return dist_model diff --git a/nemo/lightning/io/connector.py b/nemo/lightning/io/connector.py index fd7b814fe730..2ccb9bb1b1fe 100644 --- a/nemo/lightning/io/connector.py +++ b/nemo/lightning/io/connector.py @@ -22,7 +22,7 @@ from filelock import FileLock, Timeout from pytorch_lightning.trainer.states import TrainerFn -from nemo.lightning.ckpt_utils import ckpt_to_context_subdir, ckpt_to_weights_subdir +from nemo.lightning.ckpt_utils import ckpt_to_context_subdir # Dynamically inherit from the correct Path subclass based on the operating system. if os.name == 'nt': @@ -198,7 +198,7 @@ def nemo_save(self, output_path: Path, trainer: pl.Trainer, dump_io: bool = True trainer.strategy.setup(trainer) output_path = Path(output_path) output_path.mkdir(parents=True, exist_ok=True) - trainer.save_checkpoint(ckpt_to_weights_subdir(output_path)) + trainer.save_checkpoint(output_path) if getattr(trainer.strategy, "async_save", False): trainer.strategy.checkpoint_io.maybe_finalize_save_checkpoint(blocking=True) diff --git a/nemo/lightning/io/pl.py b/nemo/lightning/io/pl.py index 1a7880e38492..10ed52b136c2 100644 --- a/nemo/lightning/io/pl.py +++ b/nemo/lightning/io/pl.py @@ -37,7 +37,7 @@ from torch import nn from typing_extensions import Self, override -from nemo.lightning.ckpt_utils import ckpt_to_dir +from nemo.lightning.ckpt_utils import WEIGHTS_PATH, ckpt_to_dir from nemo.lightning.io.capture import IOProtocol from nemo.lightning.io.mixin import IOMixin @@ -78,6 +78,26 @@ def construct_extra(cls, trainer: pl.Trainer) -> Dict[str, Any]: return extra +def ckpt_to_weights_subdir(filepath: Union[str, Path], is_saving) -> Path: + """Given an input checkpoint filepath, clean it using `ckpt_to_dir` and then return the weights subdirectory, if it exists.""" + filepath = ckpt_to_dir(filepath=filepath) + base_dir = filepath + assert isinstance(base_dir, Path) + if base_dir.parts[-1] != WEIGHTS_PATH: + maybe_base_dir = base_dir / WEIGHTS_PATH + if maybe_base_dir.is_dir() or is_saving: + base_dir = maybe_base_dir + ## handle adapter paths + if hasattr(base_dir, "base_model_path") and base_dir.base_model_path.parts[-1] != WEIGHTS_PATH: + maybe_base_model_path = base_dir.base_model_path / WEIGHTS_PATH + if maybe_base_model_path.is_dir() or is_saving: + base_dir.base_model_path = base_dir.base_model_path / WEIGHTS_PATH + if is_saving: + assert base_dir.parts[-1] == WEIGHTS_PATH + assert base_dir.parent == Path(filepath) + return base_dir + + class MegatronCheckpointIO(AsyncCompatibleCheckpointIO, IOMixin): """CheckpointIO that utilizes :func:`torch.save` and :func:`torch.load` to save and load checkpoints respectively, common for most use cases. @@ -132,7 +152,8 @@ def save_checkpoint(self, checkpoint: Dict[str, Any], path: _PATH, storage_optio f" storage_options, but {storage_options=} was provided." f" Ignoring given storage_options" ) - checkpoint_dir = ckpt_to_dir(path) + checkpoint_dir = ckpt_to_weights_subdir(path, is_saving=True) + fs = get_filesystem(checkpoint_dir) if fs.isdir(checkpoint_dir) and dist_checkpointing.check_is_distributed_checkpoint(checkpoint_dir): logging.info(f'Distributed checkpoint at path {checkpoint_dir} already exists, skipping saving') @@ -180,6 +201,11 @@ def load_checkpoint( if not fs.isdir(path): raise ValueError(f"Distributed checkpoints should be a directory. Found: {path}.") + # Load from ckpt_path/weights (new format) if it exists + path = ckpt_to_weights_subdir(path, is_saving=False) + if hasattr(path, "base_model_path") and not path.base_model_path.exists(): + path.base_model_path = path.base_model_path.parent + if self.save_ckpt_format == 'zarr' and self.load_directly_on_device: from megatron.core.dist_checkpointing.strategies.tensorstore import TensorStoreLoadShardedStrategy diff --git a/nemo/lightning/pytorch/callbacks/model_checkpoint.py b/nemo/lightning/pytorch/callbacks/model_checkpoint.py index cffa8b9275ff..b384976d82bd 100644 --- a/nemo/lightning/pytorch/callbacks/model_checkpoint.py +++ b/nemo/lightning/pytorch/callbacks/model_checkpoint.py @@ -58,7 +58,6 @@ class ModelCheckpoint(PTLModelCheckpoint): """ UNFINISHED_CHECKPOINT_SUFFIX = "-unfinished" - WEIGHTS_PATH = "weights" def __init__( self, @@ -438,7 +437,6 @@ def _save_checkpoint(self, trainer: 'pytorch_lightning.Trainer', filepath: str) # barrier_after=True, so all ranks continue after the unfinished checkpoint marker is placed. # if anything goes wrong during checkpointing, we should be able to detect that data is incomplete. - ckpt_filepath = ckpt_to_dir(filepath) / ModelCheckpoint.WEIGHTS_PATH self.set_checkpoint_unfinished_marker(filepath, barrier_after=True) ema_callback = self._ema_callback(trainer) @@ -455,15 +453,15 @@ def _save_checkpoint(self, trainer: 'pytorch_lightning.Trainer', filepath: str) if self.async_save: raise ValueError('async_save with EMA not supported') with ema_callback.save_original_optimizer_state(trainer): - super()._save_checkpoint(trainer, ckpt_filepath) + super()._save_checkpoint(trainer, filepath) # save EMA copy of the model as well. with ema_callback.save_ema_model(trainer): - rank_zero_info(f"Saving EMA weights to separate checkpoint {ckpt_filepath}") - ckpt_filepath = self._ema_format_filepath(ckpt_filepath) + rank_zero_info(f"Saving EMA weights to separate checkpoint {filepath}") + filepath = self._ema_format_filepath(filepath) if self.verbose: - rank_zero_info(f"Saving EMA weights to separate checkpoint {ckpt_filepath}") - super()._save_checkpoint(trainer, ckpt_filepath) + rank_zero_info(f"Saving EMA weights to separate checkpoint {filepath}") + super()._save_checkpoint(trainer, filepath) self.remove_checkpoint_unfinished_marker(filepath, barrier_before=True) else: ## Determine whether to include optimizer states in the checkpoint @@ -489,7 +487,7 @@ def _save_checkpoint(self, trainer: 'pytorch_lightning.Trainer', filepath: str) self.deferred_ckpts_to_remove.append([]) else: storage_options = None - trainer.save_checkpoint(ckpt_filepath, save_weights_only, storage_options=storage_options) + trainer.save_checkpoint(filepath, save_weights_only, storage_options=storage_options) if self.always_save_context and is_global_rank_zero(): TrainerContext.from_trainer(trainer).io_dump(ckpt_to_dir(filepath) / "context", yaml_attrs=["model"]) @@ -598,11 +596,11 @@ def _remove_unfinished_checkpoints(checkpoint_dir: Union[Path, str]) -> None: } checkpoint_filepaths = {f.resolve() for f in checkpoint_dir.rglob("*.ckpt")} - for ckpt_filepath in checkpoint_filepaths: - possible_marker_path = ModelCheckpoint.format_checkpoint_unfinished_marker_path(ckpt_filepath) + for filepath in checkpoint_filepaths: + possible_marker_path = ModelCheckpoint.format_checkpoint_unfinished_marker_path(filepath) if possible_marker_path in existing_marker_filepaths: - logging.warning(f'Removing unfinished checkpoint: {ckpt_filepath}') - os.remove(ckpt_filepath) + logging.warning(f'Removing unfinished checkpoint: {filepath}') + os.remove(filepath) # some directories might be distributed checkpoints, we remove these if they have a unfinished marker all_dirpaths = {d.resolve() for d in checkpoint_dir.glob("*") if d.is_dir()} diff --git a/nemo/lightning/pytorch/callbacks/peft.py b/nemo/lightning/pytorch/callbacks/peft.py index 906cbd6e450e..5336615a4a38 100644 --- a/nemo/lightning/pytorch/callbacks/peft.py +++ b/nemo/lightning/pytorch/callbacks/peft.py @@ -28,7 +28,7 @@ from nemo.lightning.ckpt_utils import ADAPTER_META_FILENAME from nemo.lightning.io.mixin import IOMixin -from nemo.lightning.io.pl import ckpt_to_dir +from nemo.lightning.io.pl import ckpt_to_dir, ckpt_to_weights_subdir from nemo.lightning.megatron_parallel import MegatronParallel from nemo.lightning.pytorch.callbacks.model_transform import ModelTransform from nemo.lightning.pytorch.optim.megatron import MegatronOptimizerModule @@ -346,7 +346,7 @@ def save_checkpoint(self, checkpoint: Dict[str, Any], path: _PATH, storage_optio if is_global_rank_zero(): metadata = {"model_ckpt_path": str(self.model_ckpt_path)} - base_dir = ckpt_to_dir(path) + base_dir = ckpt_to_weights_subdir(path, is_saving=True) base_dir.mkdir(parents=True, exist_ok=True) adapter_meta_path = base_dir / ADAPTER_META_FILENAME with open(adapter_meta_path, "w") as f: diff --git a/nemo/lightning/pytorch/strategies/megatron_strategy.py b/nemo/lightning/pytorch/strategies/megatron_strategy.py index e99be666ec04..8a0147a4613a 100644 --- a/nemo/lightning/pytorch/strategies/megatron_strategy.py +++ b/nemo/lightning/pytorch/strategies/megatron_strategy.py @@ -57,7 +57,6 @@ from nemo.core.optim.mcore_optim import McoreDistributedOptimizer from nemo.lightning import _strategy_lib, io -from nemo.lightning.ckpt_utils import ckpt_to_weights_subdir from nemo.lightning.megatron_parallel import ( CallbackConnector, MegatronParallel, @@ -703,13 +702,7 @@ def load_checkpoint(self, checkpoint_path: Union[str, Path], selective_restore: if self.lightning_module.optimizers(use_pl_optimizer=False): sharded_state_dict["optimizer"] = [self.optimizer_sharded_state_dict(is_loading=True)] - # Load from ckpt_path/weights (new format) if it exists, otherwise load from ckpt_path (legacy format) - load_dir = ckpt_to_weights_subdir(checkpoint_path) - if not load_dir.exists(): - load_dir = checkpoint_path - if isinstance(load_dir, AdapterPath) and not load_dir.base_model_path.exists(): - load_dir.base_model_path = load_dir.base_model_path.parent - checkpoint = self.checkpoint_io.load_checkpoint(load_dir, sharded_state_dict=sharded_state_dict) + checkpoint = self.checkpoint_io.load_checkpoint(checkpoint_path, sharded_state_dict=sharded_state_dict) return checkpoint diff --git a/tests/collections/llm/bitexact/mixtral/run.sh b/tests/collections/llm/bitexact/mixtral/run.sh index c32dbbc95b98..0fe9e331b18a 100644 --- a/tests/collections/llm/bitexact/mixtral/run.sh +++ b/tests/collections/llm/bitexact/mixtral/run.sh @@ -43,4 +43,4 @@ python3 /workspace/tests/collections/llm/bitexact/mixtral/pretrain_mini_mixtral. # Compare outputs python3 /workspace/tests/collections/llm/bitexact/mixtral/compare_ckpts.py \ - "$NEMO_OUTPUT_PATH/checkpoints/--None=0.0000-epoch=0/" "$MCORE_OUTPUT_PATH/iter_0000010/" + "$NEMO_OUTPUT_PATH/checkpoints/--None=0.0000-epoch=0/weights" "$MCORE_OUTPUT_PATH/iter_0000010/" diff --git a/tests/collections/llm/megatron_mixtral_pretraining.py b/tests/collections/llm/megatron_mixtral_pretraining.py index 82188f75351e..b4c5b960e0a7 100644 --- a/tests/collections/llm/megatron_mixtral_pretraining.py +++ b/tests/collections/llm/megatron_mixtral_pretraining.py @@ -158,7 +158,7 @@ def main(args): ) # Confirm checkpoint directory structure - output_path = Path(args.experiment_dir) / "checkpoints/--None=0.0000-epoch=0/" + output_path = Path(args.experiment_dir) / "checkpoints/--None=0.0000-epoch=0/weights" assert output_path.exists(), f"Expected {output_path} to exist" assert output_path.is_dir(), f"Expected {output_path} to be a directory" output_files = ['__0_0.distcp', '__0_1.distcp', 'common.pt', 'metadata.json', '.metadata'] From a08754d26e04ae1a765274cad70312e1e7caae3c Mon Sep 17 00:00:00 2001 From: Sam O Date: Tue, 5 Nov 2024 12:56:09 -0600 Subject: [PATCH 10/50] Fix export of configuration parameters to Weights and Biases (#10995) * Fix export of configuration parameters to weights and biases Add test to ensure json serializability of hparams_init after restore Signed-off-by: Sam Oluwalana * Function was moved in recent versions Signed-off-by: Sam Oluwalana * Apply isort and black reformatting Signed-off-by: soluwalana --------- Signed-off-by: Sam Oluwalana Signed-off-by: soluwalana Co-authored-by: soluwalana --- nemo/core/classes/modelPT.py | 9 +++++++++ tests/core/test_save_restore.py | 17 ++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/nemo/core/classes/modelPT.py b/nemo/core/classes/modelPT.py index 5b8d414ac85b..a15f769e9d88 100644 --- a/nemo/core/classes/modelPT.py +++ b/nemo/core/classes/modelPT.py @@ -1027,6 +1027,7 @@ def on_validation_epoch_end(self) -> Optional[Dict[str, Dict[str, torch.Tensor]] if 'log' in output_dict: self.log_dict(output_dict.pop('log'), on_epoch=True) + # return everything else return output_dict @@ -1646,6 +1647,14 @@ def hparams(self): self._cfg (e.g., in self.setup_optimization()) that was not done via `self.cfg = new_cfg`. """ self._set_hparams(OmegaConf.create({'cfg': self._cfg})) + + if ( + hasattr(self, '_hparams_initial') + and 'cfg' in self._hparams_initial + and isinstance(self._hparams_initial['cfg'], DictConfig) + ): + self._hparams_initial['cfg'] = OmegaConf.to_object(self._hparams_initial['cfg']) + return super().hparams @property diff --git a/tests/core/test_save_restore.py b/tests/core/test_save_restore.py index 394ced55a452..8ac9dfeca1ae 100644 --- a/tests/core/test_save_restore.py +++ b/tests/core/test_save_restore.py @@ -12,10 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. import filecmp +import json import os import shutil import tempfile -from typing import Callable, Dict, Optional, Set, Union +from typing import Any, Callable, Dict, Optional, Set, Union import pytest import torch @@ -59,6 +60,18 @@ def getattr2(object, attr): return getattr2(getattr(object, arr[0]), '.'.join(arr[1:])) +def _is_json_serializable(value: Any) -> bool: + """Test whether a variable can be encoded as json.""" + if value is None or isinstance(value, (bool, int, float, str, list, dict)): # fast path + return True + try: + json.dumps(value) + return True + except (TypeError, OverflowError): + # OverflowError is raised if number is too large to encode + return False + + class MockModel(ModelPT): def __init__(self, cfg, trainer=None): super(MockModel, self).__init__(cfg=cfg, trainer=trainer) @@ -1193,6 +1206,8 @@ def test_mock_model_nested_child_from_pretrained(self): parent = self.__test_restore_elsewhere(parent, map_location='cpu') assert isinstance(parent.ctc_model, EncDecCTCModel) + assert _is_json_serializable(parent.ctc_model.hparams_initial) + @pytest.mark.unit def test_mock_model_nested_custom_config_field(self): """ From f14a622b7667beebdf310faafeddb793e9bc7775 Mon Sep 17 00:00:00 2001 From: Ali Taghibakhshi <71892896+JRD971000@users.noreply.github.com> Date: Tue, 5 Nov 2024 22:08:55 +0300 Subject: [PATCH 11/50] add lora recipt for 405b (#10991) * add lora recipt for 405b * Apply isort and black reformatting Signed-off-by: JRD971000 * remove pdb :D * Apply isort and black reformatting Signed-off-by: JRD971000 * Update llama31_405b.py Signed-off-by: Ali Taghibakhshi <71892896+JRD971000@users.noreply.github.com> * fix typo Signed-off-by: Ali Taghibakhshi <71892896+JRD971000@users.noreply.github.com> --------- Signed-off-by: JRD971000 Signed-off-by: Ali Taghibakhshi <71892896+JRD971000@users.noreply.github.com> Co-authored-by: JRD971000 --- nemo/collections/llm/recipes/llama31_405b.py | 63 +++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/nemo/collections/llm/recipes/llama31_405b.py b/nemo/collections/llm/recipes/llama31_405b.py index ce0d0cdc63ca..e753c48387c0 100644 --- a/nemo/collections/llm/recipes/llama31_405b.py +++ b/nemo/collections/llm/recipes/llama31_405b.py @@ -22,9 +22,11 @@ from pytorch_lightning.callbacks.callback import Callback from nemo import lightning as nl -from nemo.collections.llm.api import pretrain +from nemo.collections.llm.api import finetune, pretrain from nemo.collections.llm.gpt.data.mock import MockDataModule from nemo.collections.llm.gpt.model.llama import Llama31Config405B, LlamaModel +from nemo.collections.llm.peft.lora import LoRA +from nemo.collections.llm.recipes.finetune_default import default_finetune_recipe from nemo.collections.llm.recipes.log.default import default_log, default_resume, tensorboard_logger from nemo.collections.llm.recipes.optim.adam import distributed_fused_adam_with_cosine_annealing from nemo.collections.llm.recipes.precision.mixed_precision import bf16_mixed @@ -237,3 +239,62 @@ def pretrain_performance_optimizations(recipe: run.Partial) -> run.Partial: ) return recipe + + +@run.cli.factory(target=finetune, name=NAME) +def finetune_recipe( + dir: Optional[str] = None, + name: str = "default", + num_nodes: int = 3, + num_gpus_per_node: int = 8, + peft_scheme: Optional[str] = 'lora', +) -> run.Partial: + """ + Create a fine-tuning recipe for Llama3.1 405B model. + + This function sets up a complete configuration for fine-tuning, including + model, trainer, data, logging, optimization, and resumption settings. + The recipe uses LoRA (Low-Rank Adaptation) for efficient fine-tuning, unless peft_scheme is set to None. + + Args: + dir (Optional[str]): Directory for saving logs and checkpoints. + name (str): Name of the fine-tuning run. + num_nodes (int): Number of compute nodes to use. + num_gpus_per_node (int): Number of GPUs per node. + peft_scheme (Optional[str]): Name of the peft scheme to use for fine-tuning. Allowed values: 'lora', 'none'/None. + + Returns: + run.Partial: Partial configuration for fine-tuning. + + Examples: + CLI usage: + $ nemo llm finetune --factory llama31_405b + $ nemo llm finetune --factory "llama31_405b(num_nodes=3, name='my_llama31_405b_finetune')" + + Python API usage: + >>> recipe = finetune_recipe(name="llama31_405b_finetune", num_nodes=3) + >>> print(recipe) + + Note: + This recipe uses the SQuAD dataset for fine-tuning. Be aware that fine-tuning a 405B model + requires substantial computational resources. + """ + recipe = default_finetune_recipe( + model(), "meta-llama/Meta-Llama-3.1-405B", dir, name, num_nodes, num_gpus_per_node + ) + + if peft_scheme is None or peft_scheme.lower() == 'none': + assert num_nodes >= 4 + recipe.trainer.strategy.tensor_model_parallel_size = 8 + recipe.trainer.strategy.pipeline_model_parallel_size = 4 + recipe.optim.config.lr = 5e-6 + elif peft_scheme.lower() == 'lora': + recipe.peft = run.Config(LoRA) + recipe.trainer.strategy.tensor_model_parallel_size = 4 + recipe.trainer.strategy.pipeline_model_parallel_size = 6 + recipe.trainer.strategy.virtual_pipeline_parallelism = 7 + recipe.data.global_batch_size = 128 + recipe.optim.config.lr = 1e-4 + else: + raise ValueError(f"Unrecognized peft scheme: {peft_scheme}") + return recipe From a9ba593028b42aebb2e369eb2a35f6eb23376551 Mon Sep 17 00:00:00 2001 From: meatybobby Date: Tue, 5 Nov 2024 17:22:19 -0800 Subject: [PATCH 12/50] Change activation parsing in TRTLLM (#11173) * Fix squared relu * Fix openai-gelu --- nemo/export/trt_llm/nemo_ckpt_loader/nemo_file.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nemo/export/trt_llm/nemo_ckpt_loader/nemo_file.py b/nemo/export/trt_llm/nemo_ckpt_loader/nemo_file.py index 08629483e006..d261874db757 100644 --- a/nemo/export/trt_llm/nemo_ckpt_loader/nemo_file.py +++ b/nemo/export/trt_llm/nemo_ckpt_loader/nemo_file.py @@ -395,7 +395,7 @@ def load_nemo_model(nemo_ckpt: Union[str, Path], nemo_export_dir: Union[str, Pat nemo_model_config[k] = v elif k == "activation_func": if isinstance(v, torch.jit.ScriptFunction): - nemo_model_config["activation"] = v.name.replace("_", "-") + nemo_model_config["activation"] = v.name else: nemo_model_config["activation"] = v.__name__ @@ -405,7 +405,9 @@ def load_nemo_model(nemo_ckpt: Union[str, Path], nemo_export_dir: Union[str, Pat if nemo_model_config["activation"] == "silu": nemo_model_config["activation"] = "fast-swiglu" elif nemo_model_config["activation"] == "openai_gelu": - nemo_model_config["activation"] = "geglu" + nemo_model_config["activation"] = "openai-gelu" + elif nemo_model_config["activation"] == "squared_relu": + nemo_model_config["activation"] = "squared-relu" nemo_model_config["mcore_gpt"] = True nemo_model_config["max_position_embeddings"] = nemo_model_config.get("seq_length", 4096) From 30235e07d7ff8897cedaa43bf6030060941e4953 Mon Sep 17 00:00:00 2001 From: Zeeshan Patel Date: Wed, 6 Nov 2024 00:26:48 -0800 Subject: [PATCH 13/50] added dit training diagrams (#10873) Signed-off-by: Zeeshan Patel --- .../diffusion/assets/mixed_training.png | Bin 0 -> 917676 bytes .../diffusion/assets/pipeline_conditioning.png | Bin 0 -> 161908 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 nemo/collections/diffusion/assets/mixed_training.png create mode 100644 nemo/collections/diffusion/assets/pipeline_conditioning.png diff --git a/nemo/collections/diffusion/assets/mixed_training.png b/nemo/collections/diffusion/assets/mixed_training.png new file mode 100644 index 0000000000000000000000000000000000000000..2226e4c4d5e905af62451852b599bd353eb2f217 GIT binary patch literal 917676 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

F|WsT*I57hfksHo2}RjfQ2!r%GeWfA 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 z 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