fairseq2 provides a flexible runtime extension system that allows you to extend its functionality without modifying the core codebase. This system leverages Python’s setuptools entry points to dynamically load and register extensions during initialization.
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:
fromfairseq2.contextimportRuntimeContextdefsetup_my_extension(context:RuntimeContext)->None:# Register your custom components here using `context`.pass
Here’s a complete example of implementing a fairseq2 extension:
fromfairseq2.contextimportRuntimeContextfromfairseq2.setupimportregister_package_metadata_providerdefsetup_my_extension(context:RuntimeContext)->None:# Get the global asset storeasset_store=context.asset_store# To manage assets from a custom source, you can append a function that returns the asset source name to the list of environment resolvers# For example, the following code registers a function that returns "mycluster" as the asset source name.# This allows you to add assets in the asset cards with identifiers that ends with "@mycluster".asset_store.env_resolvers.append(lambda:"mycluster")# Register a package metadata provider for the "my_package" and read the model cards from the "my_package.cards" module.register_package_metadata_provider(context,"my_package.cards")