| <!--- | |
| Copyright 2020 The HuggingFace Team. 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. | |
| --> | |
| # Adding a new model | |
| This folder contains templates to generate new models that fit the current API and pass all tests. It generates | |
| models in both PyTorch, TensorFlow, and Flax and completes the `__init__.py` and auto-modeling files, and creates the | |
| documentation. Their use is described in the [next section](#cookiecutter-templates). | |
| There is also a CLI tool to generate a new model like an existing one called `transformers-cli add-new-model-like`. | |
| Jump to the [Add new model like section](#add-new-model-like-command) to learn how to use it. | |
| ## Cookiecutter Templates | |
| Using the `cookiecutter` utility requires to have all the `dev` dependencies installed. Let's first clone the | |
| repository and install it in our environment: | |
| ```shell script | |
| git clone https://github.com/huggingface/transformers | |
| cd transformers | |
| pip install -e ".[dev]" | |
| ``` | |
| Depending on your OS, and since the number of optional dependencies of Transformers is growing, you might get a | |
| failure with this command. If that's the case make sure to install the Deep Learning framework you are working with | |
| (PyTorch, TensorFlow and/or Flax) then do: | |
| ```bash | |
| pip install -e ".[quality]" | |
| ``` | |
| Once the installation is done, you can use the CLI command `add-new-model` to generate your models: | |
| ```shell script | |
| transformers-cli add-new-model | |
| ``` | |
| This should launch the `cookiecutter` package which should prompt you to fill in the configuration. | |
| The `modelname` should be cased according to the plain text casing, i.e., BERT, RoBERTa, DeBERTa. | |
| ``` | |
| modelname [<ModelNAME>]: | |
| uppercase_modelname [<MODEL_NAME>]: | |
| lowercase_modelname [<model_name>]: | |
| camelcase_modelname [<ModelName>]: | |
| ``` | |
| Fill in the `authors` with your team members: | |
| ``` | |
| authors [The HuggingFace Team]: | |
| ``` | |
| The checkpoint identifier is the checkpoint that will be used in the examples across the files. Put the name you wish, | |
| as it will appear on the modelhub. Do not forget to include the organisation. | |
| ``` | |
| checkpoint_identifier [organisation/<model_name>-base-cased]: | |
| ``` | |
| The tokenizer should either be based on BERT if it behaves exactly like the BERT tokenizer, or a standalone otherwise. | |
| ``` | |
| Select tokenizer_type: | |
| 1 - Based on BERT | |
| 2 - Standalone | |
| Choose from 1, 2 [1]: | |
| ``` | |
| <!--- | |
| Choose if your model is an encoder-decoder, or an encoder-only architecture. | |
| If your model is an encoder-only architecture, the generated architecture will be based on the BERT model. | |
| If your model is an encoder-decoder architecture, the generated architecture will be based on the BART model. You can, | |
| of course, edit the files once the generation is complete. | |
| ``` | |
| Select is_encoder_decoder_model: | |
| 1 - True | |
| 2 - False | |
| Choose from 1, 2 [1]: | |
| ``` | |
| --> | |
| Once the command has finished, you should have a total of 7 new files spread across the repository: | |
| ``` | |
| docs/source/model_doc/<model_name>.md | |
| src/transformers/models/<model_name>/configuration_<model_name>.py | |
| src/transformers/models/<model_name>/modeling_<model_name>.py | |
| src/transformers/models/<model_name>/modeling_tf_<model_name>.py | |
| src/transformers/models/<model_name>/tokenization_<model_name>.py | |
| tests/test_modeling_<model_name>.py | |
| tests/test_modeling_tf_<model_name>.py | |
| ``` | |
| You can run the tests to ensure that they all pass: | |
| ``` | |
| python -m pytest ./tests/test_*<model_name>*.py | |
| ``` | |
| Feel free to modify each file to mimic the behavior of your model. | |
| ⚠ You should be careful about the classes preceded by the following line:️ | |
| ```python | |
| # Copied from transformers.[...] | |
| ``` | |
| This line ensures that the copy does not diverge from the source. If it *should* diverge, because the implementation | |
| is different, this line needs to be deleted. If you don't delete this line and run `make fix-copies`, | |
| your changes will be overwritten. | |
| Once you have edited the files to fit your architecture, simply re-run the tests (and edit them if a change | |
| is needed!) afterwards to make sure everything works as expected. | |
| Once the files are generated and you are happy with your changes, here's a checklist to ensure that your contribution | |
| will be merged quickly: | |
| - You should run the `make fixup` utility to fix the style of the files and to ensure the code quality meets the | |
| library's standards. | |
| - You should complete the documentation file (`docs/source/model_doc/<model_name>.rst`) so that your model may be | |
| usable. | |
| ## Add new model like command | |
| Using the `transformers-cli add-new-model-like` command requires to have all the `dev` dependencies installed. Let's | |
| first clone the repository and install it in our environment: | |
| ```shell script | |
| git clone https://github.com/huggingface/transformers | |
| cd transformers | |
| pip install -e ".[dev]" | |
| ``` | |
| Depending on your OS, and since the number of optional dependencies of Transformers is growing, you might get a | |
| failure with this command. If that's the case make sure to install the Deep Learning framework you are working with | |
| (PyTorch, TensorFlow and/or Flax) then do: | |
| ```bash | |
| pip install -e ".[quality]" | |
| ``` | |
| Once the installation is done, you can use the CLI command `add-new-model-like` to generate your models: | |
| ```shell script | |
| transformers-cli add-new-model-like | |
| ``` | |
| This will start a small questionnaire you have to fill. | |
| ``` | |
| What identifier would you like to use for the model type of this model? | |
| ``` | |
| You will have to input the model type of the model you want to clone. The model type can be found in several places: | |
| - inside the configuration of any checkpoint of that model | |
| - the name of the documentation page of that model | |
| For instance the doc page of `BigBirdPegasus` is `https://huggingface.co/docs/transformers/model_doc/bigbird_pegasus` | |
| so its model type is `"bigbird_pegasus"`. | |
| If you make a typo, the command will suggest you the closest model types it can find. | |
| Once this is done, the questionnaire will ask you for the new model name and its various casings: | |
| ``` | |
| What is the name for your new model? | |
| What identifier would you like to use for the model type of this model? | |
| What name would you like to use for the module of this model? | |
| What prefix (camel-cased) would you like to use for the model classes of this model? | |
| What prefix (upper-cased) would you like to use for the constants relative to this model? | |
| ``` | |
| From your answer to the first question, defaults will be determined for all others. The first name should be written | |
| as you want your model be named in the doc, with no special casing (like RoBERTa) and from there, you can either stick | |
| with the defaults or change the cased versions. | |
| Next will be the name of the config class to use for this model: | |
| ``` | |
| What will be the name of the config class for this model? | |
| ``` | |
| Then, you will be asked for a checkpoint identifier: | |
| ``` | |
| Please give a checkpoint identifier (on the model Hub) for this new model. | |
| ``` | |
| This is the checkpoint that will be used in the examples across the files and the integration tests. Put the name you | |
| wish, as it will appear on the Model Hub. Do not forget to include the organisation. | |
| Then you will have to say whether your model re-uses the same processing classes as the model you're cloning: | |
| ``` | |
| Will your new model use the same processing class as Xxx (XxxTokenizer/XxxFeatureExtractor/XxxImageProcessor) | |
| ``` | |
| Answer yes if you have no intentions to make any change to the class used for preprocessing. It can use different | |
| files (for instance you can reuse the `BertTokenizer` with a new vocab file). | |
| If you answer no, you will have to give the name of the classes | |
| for the new tokenizer/image processor/feature extractor/processor (depending on the model you're cloning). | |
| Next the questionnaire will ask | |
| ``` | |
| Should we add # Copied from statements when creating the new modeling file? | |
| ``` | |
| This is the intenal mechanism used in the library to make sure code copied from various modeling files stay consistent. | |
| If you plan to completely rewrite the modeling file, you should answer no, whereas if you just want to tweak one part | |
| of the model, you should answer yes. | |
| Lastly, the questionnaire will inquire about frameworks: | |
| ``` | |
| Should we add a version of your new model in all the frameworks implemented by Old Model (xxx)? | |
| ``` | |
| If you answer yes, the new model will have files for all the frameworks implemented by the model you're cloning. | |
| Otherwise, you will get a new question to select the frameworks you want. | |
| Once the command has finished, you will see a new subfolder in the `src/transformers/models/` folder, with the | |
| necessary files (configuration and modeling files for all frameworks requested, and maybe the processing files, | |
| depending on your choices). | |
| You will also see a doc file and tests for your new models. First you should run | |
| ``` | |
| make style | |
| make fix-copies | |
| ``` | |
| and then you can start tweaking your model. You should: | |
| - fill the doc file at `docs/source/model_doc/model_name.md` | |
| - tweak the configuration and modeling files to your need | |
| Once you're done, you can run the tests to ensure that they all pass: | |
| ``` | |
| python -m pytest ./tests/test_*<model_name>*.py | |
| ``` | |
| ⚠ You should be careful about the classes preceded by the following line:️ | |
| ```python | |
| # Copied from transformers.[...] | |
| ``` | |
| This line ensures that the copy does not diverge from the source. If it *should* diverge, because the implementation | |
| is different, this line needs to be deleted. If you don't delete this line and run `make fix-copies`, | |
| your changes will be overwritten. | |
| Once you have edited the files to fit your architecture, simply re-run the tests (and edit them if a change | |
| is needed!) afterwards to make sure everything works as expected. | |
| Once the files are generated and you are happy with your changes, here's a checklist to ensure that your contribution | |
| will be merged quickly: | |
| - You should run the `make fixup` utility to fix the style of the files and to ensure the code quality meets the | |
| library's standards. | |
| - You should add your model to the main README then run `make fix-copies`. | |