fairseq2 provides a flexible runtime extension system that allows you to extend its functionality without modifying the core codebase.
You can register custom models, architectures, and assets through a simple setup function.
The extension system is built around a dependency injection container (learn more in Design Philosophy) that manages fairseq2’s components.
Through this system, you can:
First, create a setup function that registers your custom components:
# in my_package/__init__.pyfromfairseq2.runtime.dependencyimportDependencyContainerdefsetup_my_fairseq2_extension(container:DependencyContainer)->None:# Your extension setup code here...pass
Then, there are two ways to set up your extension:
For Python packages - Use setuptools entry points in pyproject.toml:
Here’s a complete example that shows how to register assets, models, and architectures:
fromfairseq2.runtime.dependencyimportDependencyContainerfromfairseq2.compositionimportregister_package_assets,register_file_assetsfrommy_package.models.my_custom_modelimportMyCustomModel,MyCustomModelConfig,create_my_custom_modeldefsetup_my_fairseq2_extension(container:DependencyContainer)->None:# Register custom objects here...container.register(...)# Register assets (yaml files) from your package, which extends fairseq2register_package_assets(container,"my_package.assets")# Or register assets from a file path, where you put your asset yaml filesregister_file_assets(container,Path("path/to/assets"))# Register model familiesregister_model_family(container,"my_custom_model",# model family namekls=MyCustomModel,# model classconfig_kls=MyCustomModelConfig,# model config classfactory=create_my_custom_model,# factory function# ... other parameters)# Register model architecturesarch=ConfigRegistrar(container,MyCustomModelConfig)@arch("my_custom_arch_variant")# architecture namedefmy_custom_arch_variant()->MyCustomModelConfig:config=MyCustomModelConfig()# ... customize your config here...returnconfig