# Customizable configs Our dataclass configs allow you to easily plug in different permutations of models, dataloaders, modules, etc. and modify all parameters from a typed CLI supported by [tyro](https://pypi.org/project/tyro/). ### Base components All basic, reusable config components can be found in `nerfstudio/configs/base_config.py`. The `Config` class at the bottom of the file is the upper-most config level and stores all of the sub-configs needed to get started with training. You can browse this file and read the attribute annotations to see what configs are available and what each specifies. ### Creating new configs If you are interested in creating a brand new model or data format, you will need to create a corresponding config with associated parameters you want to expose as configurable. Let's say you want to create a new model called Nerfacto. You can create a new `Model` class that extends the base class as described [here](pipelines/models.ipynb). Before the model definition, you define the actual `NerfactoModelConfig` which points to the `NerfactoModel` class (make sure to wrap the `_target` classes in a `field` as shown below). :::{admonition} Tip :class: info You can then enable type/auto complete on the config passed into the `NerfactoModel` by specifying the config type below the class definition. ::: ```python """nerfstudio/models/nerfacto.py""" @dataclass class NerfactoModelConfig(ModelConfig): """Nerfacto Model Config""" _target: Type = field(default_factory=lambda: NerfactoModel) ... class NerfactoModel(Model[NerfactoModelConfig]): """Nerfacto model""" ... ``` The same logic applies to all other custom configs you want to create. For more examples, you can see `nerfstudio/data/dataparsers/nerfstudio_dataparsers.py`, `nerfstudio/data/datamanagers.py`. :::{admonition} See Also :class: seealso For how to create the actual data and model classes that follow the configs, please refer to [pipeline overview](pipelines/index.rst). ::: ### Updating method configs If you are interested in creating a new model config, you will have to modify the `nerfstudio/configs/method_configs.py` file. This is where all of the configs for implemented models are housed. You can browse this file to see how we construct various existing models by modifying the `Config` class and specifying new or modified default components. For instance, say we created a brand new model called Nerfacto that has an associated `NerfactoModelConfig`, we can specify the following new Config by overriding the pipeline and optimizers attributes appropriately. ```python """nerfstudio/configs/method_configs.py""" method_configs["nerfacto"] = Config( method_name="nerfacto", pipeline=VanillaPipelineConfig( model=NerfactoModelConfig(eval_num_rays_per_chunk=1 << 14), ), optimizers={ "proposal_networks": { "optimizer": AdamOptimizerConfig(lr=1e-2, eps=1e-15), "scheduler": None, }, "fields": { "optimizer": AdamOptimizerConfig(lr=1e-2, eps=1e-15), "scheduler": None, }, }, ) ``` After placing your new `Config` class into the `method_configs` dictionary, you can provide a description for the model by updating the `descriptions` dictionary at the top of the file. ### Modifying from CLI Often times, you just want to play with the parameters of an existing model without having to specify a new one. You can easily do so via CLI. Below, we showcase some useful CLI commands. - List out all existing models ```bash ns-train --help ``` - List out all exist configurable parameters for `{METHOD_NAME}` ```bash ns-train {METHOD_NAME} --help ``` - Change the train/eval dataset ```bash ns-train {METHOD_NAME} --data DATA_PATH ``` - Enable the viewer ```bash ns-train {METHOD_NAME} --vis viewer ``` - See what options are available for the specified dataparser (e.g. blender-data) ```bash ns-train {METHOD_NAME} {DATA_PARSER} --help ``` - Run with changed dataparser attributes and viewer on ```bash # NOTE: the dataparser and associated configurations go at the end of the command ns-train {METHOD_NAME} --vis viewer {DATA_PARSER} --scale-factor 0.5 ``` ### Extending Nerfstudio with custom methods In order to extend the Nerfstudio and register your own methods, you can package your code as a python package and register it with Nerfstudio as a `nerfstudio.method_configs` entrypoint in the `pyproject.toml` file. The Nerfstudio will automatically look for all registered methods and will register them to be used by method such as `ns-train`. Here is an example: ```python """my_package/my_config.py""" from nerfstudio.engine.trainer import TrainerConfig from nerfstudio.plugins.types import MethodSpecification MyMethod = MethodSpecification( config=TrainerConfig( method_name="my-method", ... ), description="Custom description" ) """pyproject.toml""" [project] name = "my_package" ... [project.entry-points.'nerfstudio.method_configs'] my-method = 'my_package.my_config:MyMethod' ```