|
<!--- |
|
Copyright 2023 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. |
|
--> |
|
|
|
# Generating the documentation |
|
|
|
To generate the documentation, you first have to build it. Several packages are necessary to build the doc, |
|
you can install them with the following command, at the root of the code repository: |
|
|
|
```bash |
|
pip install -e ".[docs]" |
|
``` |
|
|
|
Then you need to install our special tool that builds the documentation: |
|
|
|
```bash |
|
pip install git+https://github.com/huggingface/doc-builder |
|
``` |
|
|
|
--- |
|
**NOTE** |
|
|
|
You only need to generate the documentation to inspect it locally (if you're planning changes and want to |
|
check how they look before committing for instance). You don't have to commit the built documentation. |
|
|
|
--- |
|
|
|
## Building the documentation |
|
|
|
Once you have setup the `doc-builder` and additional packages, you can generate the documentation by |
|
typing the following command: |
|
|
|
```bash |
|
doc-builder build peft docs/source/ --build_dir ~/tmp/test-build |
|
``` |
|
|
|
You can adapt the `--build_dir` to set any temporary folder that you prefer. This command will create it and generate |
|
the MDX files that will be rendered as the documentation on the main website. You can inspect them in your favorite |
|
Markdown editor. |
|
|
|
## Previewing the documentation |
|
|
|
To preview the docs, first install the `watchdog` module with: |
|
|
|
```bash |
|
pip install watchdog |
|
``` |
|
|
|
Then run the following command: |
|
|
|
```bash |
|
doc-builder preview {package_name} {path_to_docs} |
|
``` |
|
|
|
For example: |
|
|
|
```bash |
|
doc-builder preview peft docs/source |
|
``` |
|
|
|
The docs will be viewable at [http://localhost:3000](http://localhost:3000). You can also preview the docs once you have opened a PR. You will see a bot add a comment to a link where the documentation with your changes lives. |
|
|
|
--- |
|
**NOTE** |
|
|
|
The `preview` command only works with existing doc files. When you add a completely new file, you need to update `_toctree.yml` & restart `preview` command (`ctrl-c` to stop it & call `doc-builder preview ...` again). |
|
|
|
--- |
|
|
|
## Adding a new element to the navigation bar |
|
|
|
Accepted files are Markdown (.md or .mdx). |
|
|
|
Create a file with its extension and put it in the source directory. You can then link it to the toc-tree by putting |
|
the filename without the extension in the [`_toctree.yml`](https://github.com/huggingface/peft/blob/main/docs/source/_toctree.yml) file. |
|
|
|
## Renaming section headers and moving sections |
|
|
|
It helps to keep the old links working when renaming the section header and/or moving sections from one document to another. This is because the old links are likely to be used in Issues, Forums, and Social media and it'd make for a much more superior user experience if users reading those months later could still easily navigate to the originally intended information. |
|
|
|
Therefore, we simply keep a little map of moved sections at the end of the document where the original section was. The key is to preserve the original anchor. |
|
|
|
So if you renamed a section from: "Section A" to "Section B", then you can add at the end of the file: |
|
|
|
``` |
|
Sections that were moved: |
|
|
|
[ <a href="#section-b">Section A</a><a id="section-a"></a> ] |
|
``` |
|
and of course, if you moved it to another file, then: |
|
|
|
``` |
|
Sections that were moved: |
|
|
|
[ <a href="../new-file#section-b">Section A</a><a id="section-a"></a> ] |
|
``` |
|
|
|
Use the relative style to link to the new file so that the versioned docs continue to work. |
|
|
|
|
|
## Writing Documentation - Specification |
|
|
|
The `huggingface/peft` documentation follows the |
|
[Google documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) style for docstrings, |
|
although we can write them directly in Markdown. |
|
|
|
### Adding a new tutorial |
|
|
|
Adding a new tutorial or section is done in two steps: |
|
|
|
- Add a new file under `./source`. This file can either be ReStructuredText (.rst) or Markdown (.md). |
|
- Link that file in `./source/_toctree.yml` on the correct toc-tree. |
|
|
|
Make sure to put your new file under the proper section. It's unlikely to go in the first section (*Get Started*), so |
|
depending on the intended targets (beginners, more advanced users, or researchers) it should go in sections two, three, or |
|
four. |
|
|
|
### Writing source documentation |
|
|
|
Values that should be put in `code` should either be surrounded by backticks: \`like so\`. Note that argument names |
|
and objects like True, None, or any strings should usually be put in `code`. |
|
|
|
When mentioning a class, function, or method, it is recommended to use our syntax for internal links so that our tool |
|
adds a link to its documentation with this syntax: \[\`XXXClass\`\] or \[\`function\`\]. This requires the class or |
|
function to be in the main package. |
|
|
|
If you want to create a link to some internal class or function, you need to |
|
provide its path. For instance: \[\`utils.gather\`\]. This will be converted into a link with |
|
`utils.gather` in the description. To get rid of the path and only keep the name of the object you are |
|
linking to in the description, add a ~: \[\`~utils.gather\`\] will generate a link with `gather` in the description. |
|
|
|
The same works for methods so you can either use \[\`XXXClass.method\`\] or \[~\`XXXClass.method\`\]. |
|
|
|
#### Defining arguments in a method |
|
|
|
Arguments should be defined with the `Args:` (or `Arguments:` or `Parameters:`) prefix, followed by a line return and |
|
an indentation. The argument should be followed by its type, with its shape if it is a tensor, a colon, and its |
|
description: |
|
|
|
``` |
|
Args: |
|
n_layers (`int`): The number of layers of the model. |
|
``` |
|
|
|
If the description is too long to fit in one line (more than 119 characters in total), another indentation is necessary |
|
before writing the description after the argument. |
|
|
|
Finally, to maintain uniformity if any *one* description is too long to fit on one line, the |
|
rest of the parameters should follow suit and have an indention before their description. |
|
|
|
Here's an example showcasing everything so far: |
|
|
|
``` |
|
Args: |
|
gradient_accumulation_steps (`int`, *optional*, default to 1): |
|
The number of steps that should pass before gradients are accumulated. A number > 1 should be combined with `Accelerator.accumulate`. |
|
cpu (`bool`, *optional*): |
|
Whether or not to force the script to execute on CPU. Will ignore GPU available if set to `True` and force the execution on one process only. |
|
``` |
|
|
|
For optional arguments or arguments with defaults we follow the following syntax: imagine we have a function with the |
|
following signature: |
|
|
|
``` |
|
def my_function(x: str = None, a: float = 1): |
|
``` |
|
|
|
then its documentation should look like this: |
|
|
|
``` |
|
Args: |
|
x (`str`, *optional*): |
|
This argument controls ... and has a description longer than 119 chars. |
|
a (`float`, *optional*, defaults to 1): |
|
This argument is used to ... and has a description longer than 119 chars. |
|
``` |
|
|
|
Note that we always omit the "defaults to \`None\`" when None is the default for any argument. Also note that even |
|
if the first line describing your argument type and its default gets long, you can't break it on several lines. You can |
|
however write as many lines as you want in the indented description (see the example above with `input_ids`). |
|
|
|
#### Writing a multi-line code block |
|
|
|
Multi-line code blocks can be useful for displaying examples. They are done between two lines of three backticks as usual in Markdown: |
|
|
|
|
|
```` |
|
```python |
|
# first line of code |
|
# second line |
|
# etc |
|
``` |
|
```` |
|
|
|
#### Writing a return block |
|
|
|
The return block should be introduced with the `Returns:` prefix, followed by a line return and an indentation. |
|
The first line should be the type of the return, followed by a line return. No need to indent further for the elements |
|
building the return. |
|
|
|
Here's an example of a single value return: |
|
|
|
``` |
|
Returns: |
|
`List[int]`: A list of integers in the range [0, 1] --- 1 for a special token, 0 for a sequence token. |
|
``` |
|
|
|
Here's an example of a tuple return, comprising several objects: |
|
|
|
``` |
|
Returns: |
|
`tuple(torch.FloatTensor)` comprising various elements depending on the configuration ([`BertConfig`]) and inputs: |
|
- ** loss** (*optional*, returned when `masked_lm_labels` is provided) `torch.FloatTensor` of shape `(1,)` -- |
|
Total loss is the sum of the masked language modeling loss and the next sequence prediction (classification) loss. |
|
- **prediction_scores** (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`) -- |
|
Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax). |
|
``` |
|
|
|
## Styling the docstring |
|
|
|
We have an automatic script running with the `make style` comment that will make sure that: |
|
- the docstrings fully take advantage of the line width |
|
- all code examples are formatted using black, like the code of the Transformers library |
|
|
|
This script may have some weird failures if you made a syntax mistake or if you uncover a bug. Therefore, it's |
|
recommended to commit your changes before running `make style`, so you can revert the changes done by that script |
|
easily. |
|
|
|
## Writing documentation examples |
|
|
|
The syntax for Example docstrings can look as follows: |
|
|
|
``` |
|
Example: |
|
|
|
```python |
|
>>> import time |
|
>>> from accelerate import Accelerator |
|
>>> accelerator = Accelerator() |
|
>>> if accelerator.is_main_process: |
|
... time.sleep(2) |
|
>>> else: |
|
... print("I'm waiting for the main process to finish its sleep...") |
|
>>> accelerator.wait_for_everyone() |
|
>>> # Should print on every process at the same time |
|
>>> print("Everyone is here") |
|
``` |
|
``` |
|
|
|
The docstring should give a minimal, clear example of how the respective function |
|
is to be used in inference and also include the expected (ideally sensible) |
|
output. |
|
Often, readers will try out the example before even going through the function |
|
or class definitions. Therefore, it is of utmost importance that the example |
|
works as expected. |