Spaces:
Runtime error
Runtime error
| # Copyright (c) 2025, 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. | |
| import nemo_run as run | |
| import pytest | |
| from nemo.collections.llm.api import finetune, pretrain | |
| from nemo.collections.llm.gpt.data.mock import MockDataModule | |
| from nemo.collections.llm.gpt.data.squad import SquadDataModule | |
| from nemo.collections.llm.peft.lora import LoRA | |
| from nemo.collections.llm.recipes import gemma2_9b | |
| from nemo.lightning import Trainer | |
| class TestGemma2_9B: | |
| def recipe_module(self): | |
| return gemma2_9b | |
| def test_model(self, recipe_module): | |
| model_config = recipe_module.model() | |
| assert isinstance(model_config, run.Config) | |
| # Note: Actual model class assertions would depend on gemma2_model implementation | |
| def test_pretrain_recipe(self, recipe_module): | |
| recipe = recipe_module.pretrain_recipe() | |
| assert isinstance(recipe, run.Partial) | |
| assert recipe.__fn_or_cls__ == pretrain | |
| assert isinstance(recipe.trainer, run.Config) | |
| assert recipe.trainer.__fn_or_cls__ == Trainer | |
| assert isinstance(recipe.data, run.Config) | |
| assert recipe.data.__fn_or_cls__ == MockDataModule | |
| # Check default parallelism settings | |
| assert recipe.trainer.strategy.tensor_model_parallel_size == 8 | |
| assert recipe.trainer.strategy.pipeline_model_parallel_size == 1 | |
| assert recipe.trainer.strategy.sequence_parallel is False | |
| # Check training configurations | |
| assert recipe.trainer.max_steps == 1168251 | |
| assert recipe.trainer.accumulate_grad_batches == 1 | |
| def test_finetune_recipe(self, recipe_module): | |
| recipe = recipe_module.finetune_recipe() | |
| assert isinstance(recipe, run.Partial) | |
| assert recipe.__fn_or_cls__ == finetune | |
| assert isinstance(recipe.trainer, run.Config) | |
| assert recipe.trainer.__fn_or_cls__ == Trainer | |
| assert isinstance(recipe.data, run.Config) | |
| assert recipe.data.__fn_or_cls__ == SquadDataModule | |
| assert recipe.data.dataset_kwargs == {'add_bos': True} | |
| assert isinstance(recipe.peft, run.Config) | |
| assert recipe.peft.__fn_or_cls__ == LoRA | |
| assert recipe.optim.config.lr == 1e-4 | |
| def test_pretrain_recipe_with_different_configurations(self, recipe_module, num_nodes, num_gpus_per_node): | |
| recipe = recipe_module.pretrain_recipe(num_nodes=num_nodes, num_gpus_per_node=num_gpus_per_node) | |
| assert recipe.trainer.num_nodes == num_nodes | |
| assert recipe.trainer.devices == num_gpus_per_node | |
| def test_finetune_recipe_without_peft(self, recipe_module): | |
| recipe = recipe_module.finetune_recipe(peft_scheme=None) | |
| assert recipe.trainer.strategy.tensor_model_parallel_size == 4 | |
| assert recipe.optim.config.lr == 5e-6 | |
| assert not hasattr(recipe, 'peft') or recipe.peft is None | |
| def test_finetune_recipe_with_invalid_peft(self, recipe_module): | |
| with pytest.raises(ValueError, match="Unrecognized peft scheme: invalid_scheme"): | |
| recipe_module.finetune_recipe(peft_scheme="invalid_scheme") | |