From e7c9444cd31d8bc0045e2961656f5dc45d1468cd Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Wed, 20 Apr 2022 22:58:08 -0700 Subject: [PATCH 01/10] WIP: Models documentation --- docs/assets/hub/models-linked-datasets.png | Bin 0 -> 47767 bytes docs/assets/hub/models-linked-spaces.png | Bin 0 -> 13662 bytes docs/hub/_sections.yml | 3 + docs/hub/models-adding-libraries.md | 181 +++++++++++++++++++++ docs/hub/models-cards-co2.md | 54 ++++++ docs/hub/models-cards.md | 123 ++++++++++++++ docs/hub/models-inference.md | 37 +++++ docs/hub/models-interacting.md | 115 +++++++++++++ docs/hub/models-main.md | 17 ++ docs/hub/models-the-hub.md | 60 +++++++ docs/hub/models-widgets.md | 120 ++++++++++++++ docs/hub/repositories-best-practices.md | 50 +++++- 12 files changed, 759 insertions(+), 1 deletion(-) create mode 100644 docs/assets/hub/models-linked-datasets.png create mode 100644 docs/assets/hub/models-linked-spaces.png create mode 100644 docs/hub/models-adding-libraries.md create mode 100644 docs/hub/models-cards-co2.md create mode 100644 docs/hub/models-cards.md create mode 100644 docs/hub/models-inference.md create mode 100644 docs/hub/models-interacting.md create mode 100644 docs/hub/models-main.md create mode 100644 docs/hub/models-the-hub.md create mode 100644 docs/hub/models-widgets.md diff --git a/docs/assets/hub/models-linked-datasets.png b/docs/assets/hub/models-linked-datasets.png new file mode 100644 index 0000000000000000000000000000000000000000..733f73dc262e5dae8d0c2f2c7cc67ebcc1834668 GIT binary patch literal 47767 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 literal 0 HcmV?d00001 diff --git a/docs/assets/hub/models-linked-spaces.png b/docs/assets/hub/models-linked-spaces.png new file mode 100644 index 0000000000000000000000000000000000000000..894dd9c8c60c6f2f9403db1a28a0618e69fee715 GIT binary patch literal 13662 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 bKoDfawgQUGNqFr)J2|Dr6~wAU41)d-x%h$t literal 0 HcmV?d00001 diff --git a/docs/hub/_sections.yml b/docs/hub/_sections.yml index d07c87609..751064cc2 100644 --- a/docs/hub/_sections.yml +++ b/docs/hub/_sections.yml @@ -4,6 +4,9 @@ - local: repositories-main title: Repositories +- local: models-main + title: Models + - local: main title: Hub documentation diff --git a/docs/hub/models-adding-libraries.md b/docs/hub/models-adding-libraries.md new file mode 100644 index 000000000..ab2db2694 --- /dev/null +++ b/docs/hub/models-adding-libraries.md @@ -0,0 +1,181 @@ +--- +title: Integrate a library with the Hub +--- + +# Integrate your library with the Hub + +The Hugging Face Hub aims to facilitate the sharing of machine learning models, checkpoints, and artifacts. This endeavor includes integrating the Hub into many of the amazing third-party libraries in the community. Some of the ones already integrated include [spaCy](https://spacy.io/usage/projects#huggingface_hub), [AllenNLP](https://allennlp.org/), and [timm](https://rwightman.github.io/pytorch-image-models/), among many others. Integration means users can download and upload files to the Hub directly from your library. We hope you will integrate your library and join us in democratizing artificial intelligence for everyone! + +Integrating the Hub with your library provides many benefits, including: + +- Free model hosting for you and your users. +- Built-in file versioning - even for huge files - made possible by [Git-LFS](https://git-lfs.github.com/). +- All public models are powered by the [Inference API](https://api-inference.huggingface.co/docs/python/html/index.html). +- In-browser widgets allow users to interact with your hosted models directly. + +This tutorial will help you integrate the Hub into your library so your users can benefit from all the features offered by the Hub. + +Before you begin, we recommend you create a [Hugging Face account](https://huggingface.co/join) from which you can manage your repositories and files. + +If you need help with the integration at any point, feel free to open an [issue](https://github.com/huggingface/huggingface_hub/issues/new/choose), and we would be more than happy to help you! + +## Installation + +1. Install the `huggingface_hub` library with pip in your environment: + + ```bash + python -m pip install huggingface_hub + ``` + +2. Once you have successfully installed the `huggingface_hub` library, log in to your Hugging Face account: + + ```bash + huggingface-cli login + ``` + + ```bash + _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_| + _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _| + _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_| + _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _| + _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_| + + + Username: + Password: + ``` + +3. Alternatively, if you prefer working from a Jupyter or Colaboratory notebook, login with `notebook_login`: + + ```python + >>> from huggingface_hub import notebook_login + >>> notebook_login() + ``` + + `notebook_login` will launch a widget in your notebook from which you can enter your Hugging Face credentials. + +## Download files from the Hub + +Integration allows users to download your hosted files directly from the Hub using your library. + +Use the `hf_hub_download` function to retrieve a URL and download files from your repository. Downloaded files are stored in your cache: `~/.cache/huggingface/hub`. You don't have to redownload the file the next time you use it, and for larger files, this can save a lot of time. Furthermore, if the repository is updated with a new version of the file, `huggingface_hub` will automatically download the latest version and store it in the cache for you. Users don't have to worry about updating their files. + +For example, download the `config.json` file from the [lysandre/arxiv-nlp](https://huggingface.co/lysandre/arxiv-nlp) repository: + +```python +>>> from huggingface_hub import hf_hub_download +>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json") +``` + +Download a specific version of the file by specifying the `revision` parameter. The `revision` parameter can be a branch name, tag, or commit hash. + +The commit hash must be a full-length hash instead of the shorter 7-character commit hash: + +```python +>>> from huggingface_hub import hf_hub_download +>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="877b84a8f93f2d619faa2a6e514a32beef88ab0a") +``` + +Use the `cache_dir` parameter to change where a file is stored: + +```python +>>> from huggingface_hub import hf_hub_download +>>> hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", cache_dir="/home/lysandre/test") +``` + +### Code sample + +We recommend adding a code snippet to explain how a model should be used in your downstream library. + +![/docs/assets/hub/code_snippet.png](/docs/assets/hub/code_snippet.png) + +Add a code snippet by updating the [Libraries Typescript file](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Libraries.ts) with instructions for your model. For example, the [Asteroid](https://huggingface.co/asteroid-team) integration includes a brief code snippet for how to load and use an Asteroid model: + +```typescript +const asteroid = (model: ModelData) => +`from asteroid.models import BaseModel + +model = BaseModel.from_pretrained("${model.id}")`; +``` + +This will also add a tag to your model so users can quickly identify models from your library. + +![/docs/assets/hub/libraries-tags.png](/docs/assets/hub/libraries-tags.png) + +## Upload files to the Hub + +You might also want to provide a method for creating model repositories and uploading files to the Hub directly from your library. The `huggingface_hub` library offers two methods to assist you with creating repositories and uploading files: + +- `create_repo` creates a repository on the Hub. +- `upload_file` directly uploads files to a repository on the Hub. + +### `create_repo` + +The `create_repo` method creates a repository on the Hub. Use the `name` parameter to provide a name for your repository: + +```python +>>> from huggingface_hub import create_repo +>>> create_repo(repo_id="test-model") +'https://huggingface.co/lysandre/test-model' +``` + +When you check your Hugging Face account, you should now see a `test-model` repository under your namespace. + +### `upload_file` + +The `upload_file` method uploads files to the Hub. This method requires the following: + +- A path to the file to upload. +- The final path in the repository. +- The repository you wish to push the files to. + +For example: + +```python +>>> from huggingface_hub import upload_file +>>> upload_file( +... path_or_fileobj="/home/lysandre/dummy-test/README.md", +... path_in_repo="README.md", +... repo_id="lysandre/test-model" +... ) +'https://huggingface.co/lysandre/test-model/blob/main/README.md' +``` + +If you need to upload more than one file, take a look at the utilities offered by the `Repository` class [here](/docs/hub/how-to-upstream#`Repository`). + +Once again, if you check your Hugging Face account, you should see the file inside your repository. + +Lastly, it is important to add a model card, so users understand how to use your model. See [here](/docs/hub/model-repos#what-are-model-cards-and-why-are-they-useful) for more details about how to create a model card. + +## Set up the Inference API + +Our Inference API powers models uploaded to the Hub through your library. + +All third-party libraries are Dockerized, so you can install the dependencies you'll need for your library to work correctly. Add your library to the existing Docker images by navigating to the [Docker images folder](https://github.com/huggingface/api-inference-community/tree/main/docker_images). + +1. Copy the `common` folder and rename it with the name of your library (e.g. `docker/common` to `docker/your-awesome-library`). +2. There are four files you need to edit: + * List the packages required for your library to work in `requirements.txt`. + * Update `app/main.py` with the tasks supported by your model (see [here](https://github.com/huggingface/api-inference-community) for a complete list of available tasks). Look out for the `IMPLEMENT_THIS` flag to add your supported task. + + ```python + ALLOWED_TASKS: Dict[str, Type[Pipeline]] = { + "token-classification": TokenClassificationPipeline + } + ``` + + * For each task your library supports, modify the `app/pipelines/task_name.py` files accordingly. We have also added an `IMPLEMENT_THIS` flag in the pipeline files to guide you. If there isn't a pipeline that supports your task, feel free to add one. Open an [issue](https://github.com/huggingface/hub-docs/issues/new) here, and we will be happy to help you. + * Add your model and task to the `tests/test_api.py` file. For example, if you have a text generation model: + + ```python + TESTABLE_MODELS: Dict[str,str] = { + "text-generation": "my-gpt2-model" + } + ``` +3. Finally, run the following test to ensure everything works as expected: + + ```bash + pytest -sv --rootdir docker_images/your-awesome-library/docker_images/your-awesome-library/ + ``` + +With these simple but powerful methods, you brought the full functionality of the Hub into your library. Users can download files stored on the Hub from your library with `hf_hub_download`, create repositories with `create_repo`, and upload files with `upload_file`. You also set up Inference API with your library, allowing users to interact with your models on the Hub from inside a browser. \ No newline at end of file diff --git a/docs/hub/models-cards-co2.md b/docs/hub/models-cards-co2.md new file mode 100644 index 000000000..c3c88dac7 --- /dev/null +++ b/docs/hub/models-cards-co2.md @@ -0,0 +1,54 @@ +--- +title: Carbon Emissions +--- + +

Displaying carbon emissions for your model

+ +## Why is it useful to calculate the carbon emissions of my model? + +Training ML models is often energy intensive and can produce a substantial carbon footprint, as described by [Strubell et al.](https://arxiv.org/abs/1906.02243). It's therefore important to *track* and *report* the emissions of models to get a better idea of the environmental impacts of our field. + + +## What information should I include about the carbon footprint of my model? + +If you can, include information about: +- where the model was trained (in terms of location) +- the hardware that was used -- e.g. GPU, TPU or CPU, and how many +- training type: pre-training or fine-tuning +- the estimated carbon footprint of the model, calculated in real-time with the [Code Carbon](https://github.com/mlco2/codecarbon) package or after the fact using the [ML CO2 Calculator](https://mlco2.github.io/impact/). + +## Carbon footprint metadata + +The data can be added to the model card metadata (README.md file). The structure of the metadata should be: + +```yaml +--- +co2_eq_emissions: + emissions: "in grams of CO2" + source: "source of the information, either directly from AutoTrain, code carbon or from a scientific article documenting the model" + training_type: "pretraining or fine-tuning" + geographical_location: "as granular as possible, for instance Quebec, Canada or Brooklyn, NY, USA" + hardware_used: "how much compute and what kind, e.g. 8 v100 GPUs" +--- +``` + +## How is the carbon footprint of my model calculated? 🌎 + +By taking into account the computing hardware, location, usage and training time, it's possible to provide an estimate of how much CO2 was produced by the model. + +The math is actually pretty simple! βž• + +First, you take the *carbon intensity* of the electric grid that is being used for the training -- this is how much CO2 is produced by KwH of electricity used. This depends on the location where the hardware is located and the [energy mix](https://electricitymap.org/) used at that location -- whether it's renewable energy like solar 🌞, wind 🌬️ and hydro πŸ’§, or non-renewable energy like coal ⚫ and natural gas πŸ’¨. The more renewable energy is used, the less carbon intensive it is! + +Then, you take the power consumption of the GPU during training -- this is done using the `pynvml` library. + +Finally, you multiply the power consumption and carbon intensity by the training time of the model, and you have an estimate of how much CO2 was emitted. + +Keep in mind that this isn't an exact number, because there are other factors that come into play -- like the energy that's used for data center heating and cooling -- which will increase carbon emissions. But this will already give you a good idea of the scale of CO2 emissions that your model is producing! + +To add **Carbon Emissions** metadata to your models: + +1. If you are using **AutoTrain**, this is tracked for you πŸ”₯ +2. Otherwise, use a tracker like Code Carbon in your training code, then specify `co2_eq_emissions.emissions: 1.2345` in your model card metadata, where `1.2345` is the emissions value in **grams**. + +To learn more about the carbon footprint of Transformers, check out the [video](https://www.youtube.com/watch?v=ftWlj4FBHTg), part of the Hugging Face Course! diff --git a/docs/hub/models-cards.md b/docs/hub/models-cards.md new file mode 100644 index 000000000..cb7d4727d --- /dev/null +++ b/docs/hub/models-cards.md @@ -0,0 +1,123 @@ +--- +title: Model Cards +--- + +

Model Cards

+ +## What are Model Cards? +Mdoel cards are markdown files that accompany the models and provide very useful information. They are extremely important for discoverability, reproducibility and sharing! They are the `README.md` file in any model repo. + +The model card should describe: +- the model +- its intended uses & potential limitations, including bias and ethical considerations as detailed in [Mitchell, 2018](https://arxiv.org/abs/1810.03993) +- the training params and experimental info (you can embed or link to an experiment tracking platform for reference) +- which datasets did you train on and your eval results + +## Model Card metadata + [TODO: How to handle this?] + +You can add a YAML section to the model cards (that `README.md` file) by adding three `---` to the top of your model card, including all of the metadata, and enclosing it with another group of `---` such as the example below: + +```yaml +--- +language: + - "List of ISO 639-1 code for your language" + - lang1 + - lang2 +thumbnail: "url to a thumbnail used in social sharing" +tags: +- tag1 +- tag2 +license: "any valid license identifier" +datasets: +- dataset1 +- dataset2 +metrics: +- metric1 +- metric2 +--- +``` + +You can find the detailed specification [here](https://github.com/huggingface/hub-docs/blame/main/modelcard.md). + + +Some useful information on them: +* All the tags can be used to filter the list of models on https://huggingface.co/models. +* License identifiers are the keywords listed in the right column of [this table](#list-of-license-identifiers). +* Dataset, metric, and language identifiers are those listed on the [Datasets](https://huggingface.co/datasets), [Metrics](https://huggingface.co/metrics) and [Languages](https://huggingface.co/languages) pages and in the [`datasets`](https://github.com/huggingface/datasets) repository. + +You can even specify your **model's eval results** in a structured way, which will allow the Hub to parse, display, and even link them to Papers With Code leaderboards. See how to format this data [in the metadata spec](https://github.com/huggingface/hub-docs/blame/main/modelcard.md). + + +Here is a partial example (omitting the eval results part): +```yaml +--- +language: +- ru +- en +tags: +- translation +license: apache-2.0 +datasets: +- wmt19 +metrics: +- bleu +- sacrebleu +--- +``` + +If a model includes valid eval results, they will be displayed like this: + +![/docs/assets/hub/eval-results.jpg](/docs/assets/hub/eval-results.jpg) + +### CO2 Emissions +(Maybe this should be its own page? Or rather, this can link to another page?) +[TODO: LINK TO A SUB-DOC] + +## FAQ + +### How are model tags determined? + +Each model page lists all the model's tags in the page header, below the model name. + +Those are primarily computed from the model card metadata, except that we also add some of them automatically, as described in [How is a model's type of inference API and widget determined?](TODO). + +### Can I specify which framework supports my model? + +Yes!πŸ”₯ You can specify the framework in the model card metadata section: + +```yaml +tags: +- flair +``` + +Find more about our supported libraries [here](TODO: LINK TO LIBRARIES LIST)! + +### How can I link a model to a dataset? + +You can specify the dataset in the metadata: + +```yaml +datasets: +- wmt19 +``` + +### Can I write LaTeX in my model card? + +Yes, we use the [KaTeX](https://katex.org/) math typesetting library to render math formulas server-side, before parsing the markdown. + +You have to use the following delimiters: +- `$$ ... $$` for display mode +- `\\` `(` `...` `\\` `)` for inline mode (no space between the slashes and the parenthesis). + +Then you'll be able to write: + +$$ +\LaTeX +$$ + +$$ +\mathrm{MSE} = \left(\frac{1}{n}\right)\sum_{i=1}^{n}(y_{i} - x_{i})^{2} +$$ + +$$ E=mc^2 $$ \ No newline at end of file diff --git a/docs/hub/models-inference.md b/docs/hub/models-inference.md new file mode 100644 index 000000000..a72b58588 --- /dev/null +++ b/docs/hub/models-inference.md @@ -0,0 +1,37 @@ +--- +title: Inference API docs +--- + +

Inference API

+ +For detailed usage documentation, please refer to [Accelerated Inference API Documentation](https://api-inference.huggingface.co/docs/python/html/index.html). + + +## What technology do you use to power the inference API? + +For πŸ€— Transformers models, the API is built on top of our [Pipelines](https://huggingface.co/transformers/main_classes/pipelines.html) feature. + +On top of `Pipelines` and depending on the model type, we build a number of production optimizations like: +- compiling models to optimized intermediary representations (e.g. [ONNX](https://medium.com/microsoftazure/accelerate-your-nlp-pipelines-using-hugging-face-transformers-and-onnx-runtime-2443578f4333)), +- maintaining a Least Recently Used cache ensuring that the most popular models are always loaded, +- scaling the underlying compute infrastructure on the fly depending on the load constraints. + +For models from [other libraries](/docs/hub/libraries), the API uses [Starlette](https://www.starlette.io) and runs in [Docker containers](https://github.com/huggingface/api-inference-community/tree/main/docker_images). Each library defines the implementation of [different pipelines](https://github.com/huggingface/api-inference-community/tree/main/docker_images/sentence_transformers/app/pipelines). + + +## How can I turn off the inference API for my model? + +Specify `inference: false` in your model card's metadata. + + +## Can I send large volumes of requests? Can I get accelerated APIs? + +If you are interested in accelerated inference and/or higher volumes of requests and/or a SLA, please contact us at `api-enterprise at huggingface.co`. + +## How can I see my usage? + +You can head to the [Inference API dashboard](https://api-inference.huggingface.co/dashboard/). Learn more about it in the [Inference API documentation](https://api-inference.huggingface.co/docs/python/html/usage.html#api-usage-dashboard). + +## Is there programmatic access to the Inference API? + +Yes, the `huggingface_hub` library has a client wrapper documented [here](/docs/hub/how-to-inference). diff --git a/docs/hub/models-interacting.md b/docs/hub/models-interacting.md new file mode 100644 index 000000000..d417b2d60 --- /dev/null +++ b/docs/hub/models-interacting.md @@ -0,0 +1,115 @@ +--- +title: Interacting with Models on the Hub +--- + +

Interacting with models on the hub

+ +## Accessing models for local use + +TODO + +### Can I access models programatically? + +You can use the [`huggingface_hub`](https://github.com/huggingface/huggingface_hub) library to create, delete, update and retrieve information from repos. You can also use it to download files from repos and integrate it to your own library! For example, you can easily load a Scikit learn model with few lines. + +```py +from huggingface_hub import hf_hub_url, cached_download +import joblib + +REPO_ID = "YOUR_REPO_ID" +FILENAME = "sklearn_model.joblib" + +model = joblib.load(cached_download( + hf_hub_url(REPO_ID, FILENAME) +)) +``` + +## Uploading models + +The first step is to create an account at [Hugging Face](https://huggingface.co/login). The models are shared in the form of Git-based repositories which give you versioning, branches, discoverability and sharing features, integration with over a dozen libraries and more! You have control over what you want to upload to your repository, which could include checkpoints, configs and any other files. + +The repository can be either linked with an individual, such as [osanseviero/fashion_brands_patterns](https://huggingface.co/osanseviero/fashion_brands_patterns) or with an organization, such as [facebook/bart-large-xsum](https://huggingface.co/facebook/bart-large-xsum). Organizations can be used if you want to upload models that are related to a company, community or library! If you choose an organization, the model will be featured on the organization’s page and every member of the organization will have the ability to contribute to the repository. You can create a new organization [here](https://huggingface.co/organizations/new). + +There are several ways to upload models to the Hub, which are described below. + +### Using the web interface + +To create a brand new model repository, visit [huggingface.co/new](http://huggingface.co/new). Then follow these steps: + +1. In the "Files and versions" tab, select "Add File" and specify "Upload File": + +![/docs/assets/hub/add-file.png](/docs/assets/hub/add-file.png) + +2. From there, select a file from your computer to upload and leave a helpful commit message to know what you are uploading: + +![docs/assets/hub/commit-file.png](/docs/assets/hub/commit-file.png) + +3. Afterwards click "Commit changes" and your model will be uploaded to the Hub! + +4. Inspect files and history + +You can check your repository with all the recently added files! + +![/docs/assets/hub/repo_with_files.png](/docs/assets/hub/repo_with_files.png) + +The UI allows you to explore the model files and commits and to see the diff introduced by each commit: + +![/docs/assets/hub/explore_history.gif](/docs/assets/hub/explore_history.gif) + +5. Add metadata + +You can add metadata to your model card. You can specify: +* the type of task this model is for, enabling widgets and the Inference API. +* the used library (`transformers`, `spaCy`, etc) +* the language +* the dataset +* metrics +* license +* a lot more! + +Read more about model tags [here](/docs/hub/model-repos#model-card-metadata). + +6. Add TensorBoard traces + +Any repository that contains TensorBoard traces (filenames that contain `tfevents`) is categorized with the [`TensorBoard` tag](https://huggingface.co/models?filter=tensorboard). As a convention, we suggest that you save traces under the `runs/` subfolder. The "Training metrics" tab then makes it easy to review charts of the logged variables, like the loss or the accuracy. + +![Training metrics tab on a model's page, with TensorBoard](/docs/assets/hub/tensorboard.png) + +Models trained with πŸ€— Transformers will generate [TensorBoard traces](https://huggingface.co/transformers/main_classes/callback.html?highlight=tensorboard#transformers.integrations.TensorBoardCallback) by default if [`tensorboard`](https://pypi.org/project/tensorboard/) is installed. + + +### Using Git + +Since model repos are just Git repositories, you can use Git to push your model files to the Hub. Follow the guide on [Getting Started with Repositories](repositories-getting-started.md) to learn about using the `git` CLI to commit and push your models. + + +### Using the `huggingface_hub` client library + +There is a rich feature set in the `huggingface_hub` library which allows you to manage repositories, including creating repos and uploading models to the Model Hub. For more information, visit [the client library's documentation](https://huggingface.co/docs/huggingface_hub/index). + + +## FAQ + +### How can I see what dataset was used to train the model? + +It's up to the person who uploaded the model to include the training information! You may find the information about the datasets that the model was trained on in the model card. If the datasets that were used for the model are on the Hub, the uploader may have included them in the model card's metadata. In that case, the datasets would be linked with this handy card on the right side of the model page: + +![Linked datasets for a model](../assets/hub/models-linked-datasets.png) + +### How can I see an example of the model in action? + +Models can have inference widgets which let you try out the model in the browser! Inference widgets are easy to configure, and there are many kinds to choose from. Visit the [Widgets documentation](models-widgets.md) to learn more. + +The Hugging Face Hub is also home to Spaces, which are interactive demos that can be used to showcase models. If a model has any Spaces associated with it, they'll be linked on the model page like so: + +![Linked spaces for a model](../assets/hub/models-linked-spaces.png) + +Spaces are a great way to show off a model you've made, or to explore new ways to use existing models! Visit the [Spaces documentation](TODO) to learn all about how to make your own. + +### How do I upload an update / new version of the model? + +Releasing an update to a model that you've already published can be done by pushing a new commit to your model's repo. To do this, go through the same process that you followed to upload your initial model. Your previous model versions will remain in the repository as previous commits. + +### What if I have a different checkpoint of the model trained on a different dataset? + +By convention each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](TODO), or by linking the in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under "Other pre-trained model versions". diff --git a/docs/hub/models-main.md b/docs/hub/models-main.md new file mode 100644 index 000000000..56c9bd786 --- /dev/null +++ b/docs/hub/models-main.md @@ -0,0 +1,17 @@ +--- +title: Models +--- + +

Models

+ +The Hugging Face Hub hosts a large number of models that can be used for a variety of [machine learning tasks](TODO: Link to TASKS). Since models are stored in repositories, each model repo benefits from [all of the features](./repositories-main) that every repo on the Hugging Face Hub comes with. Additionally, model repos have a suite of features that make exploring and using models as easy as possible. + +## Contents + +- [The Model Hub](./models-the-hub) +- [Model Cards](./models-cards) + - [CO2 emissions](./models-cards-co2) +- [Interacting with models on the Hub](./models-interacting) + - [Integrating libraries with the Hub](./models-adding-libraries) +- [Widgets](./models-widgets) +- [Inference API](./models-inference) diff --git a/docs/hub/models-the-hub.md b/docs/hub/models-the-hub.md new file mode 100644 index 000000000..043ea68f7 --- /dev/null +++ b/docs/hub/models-the-hub.md @@ -0,0 +1,60 @@ +--- +title: The Model Hub +--- + +

The Model Hub

+ +## What is the Model Hub? + +The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using [TODO] + +You can refer to the following video for a guide on navigating the Model Hub: + + + +## Exploring Models + +TODO + +### Searching with the UI + +TODO + +### Tasks + +TODO: + +(Also adding new tasks) -- Am I sure that this needs to be in here? There's currently no documentation on this, and my goal right now isn't to write new content... + +### Searching the Hub with Python + +[TODO: At the moment this has an entire page, written as a tutorial... should I split it up?] + +## Libraries + +The Hub supports a number of libraries and we're working on expanding this support! We're happy to welcome to the Hub a set of Open Source libraries that are pushing Machine Learning forward. + +The table below summarizes the supported libraries and how they are integrated. Find all our supported libraries [here](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Libraries.ts)! + +| Library | Description | Inference API | Widgets | Download from Hub | Push to Hub | +|-----------------------|-------------------------------------------------------------------------------|---------------|-------:|-------------------|-------------| +| [πŸ€— Transformers](https://github.com/huggingface/transformers) | State-of-the-art Natural Language Processing for Pytorch, TensorFlow, and JAX | βœ… | βœ… | βœ… | βœ… | +| [Adapter Transformers](https://github.com/Adapter-Hub/adapter-transformers) | Extends πŸ€—Transformers with Adapters. | ❌ | ❌ | βœ… | βœ… | +| [AllenNLP](https://github.com/allenai/allennlp) | An open-source NLP research library, built on PyTorch. | βœ… | βœ… | βœ… | ❌ | +| [Asteroid](https://github.com/asteroid-team/asteroid) | Pytorch-based audio source separation toolkit | βœ… | βœ… | βœ… | ❌ | +| [docTR](https://github.com/mindee/doctr) | Models and datasets for OCR-related tasks in PyTorch & TensorFlow | βœ… | βœ… | βœ… | ❌ | +| [ESPnet](https://github.com/espnet/espnet) | End-to-end speech processing toolkit (e.g. TTS) | βœ… | βœ… | βœ… | ❌ | +| [Flair](https://github.com/flairNLP/flair) | Very simple framework for state-of-the-art NLP. | βœ… | βœ… | βœ… | ❌ | +| [Pyannote](https://github.com/pyannote/pyannote-audio) | Neural building blocks for speaker diarization. | ❌ | ❌ | βœ… | ❌ | +| [PyCTCDecode](https://github.com/kensho-technologies/pyctcdecode) | Language model supported CTC decoding for speech recognition | ❌ | ❌ | βœ… | ❌ | +| [Sentence Transformers](https://github.com/UKPLab/sentence-transformers) | Compute dense vector representations for sentences, paragraphs, and images. | βœ… | βœ… | βœ… | βœ… | +| [spaCy](https://github.com/explosion/spaCy) | Advanced Natural Language Processing in Python and Cython. | βœ… | βœ… | βœ… | βœ… | +| [Speechbrain](https://speechbrain.github.io/) | A PyTorch Powered Speech Toolkit. | βœ… | βœ… | βœ… | ❌ | +| [TensorFlowTTS](https://github.com/TensorSpeech/TensorFlowTTS) | Real-time state-of-the-art speech synthesis architectures. | ❌ | ❌ | βœ… | ❌ | +| [Timm](https://github.com/rwightman/pytorch-image-models) | Collection of image models, scripts, pretrained weights, etc. | ❌ | ❌ | βœ… | ❌ | +| [Stable-Baselines3](https://github.com/DLR-RM/stable-baselines3) | Set of reliable implementations of deep reinforcement learning algorithms in PyTorch | ❌ | ❌ | βœ… | βœ… | + + +### How can I add a new library to the Inference API? + +Read about it in [Adding a Library Guide](/docs/hub/adding-a-library). diff --git a/docs/hub/models-widgets.md b/docs/hub/models-widgets.md new file mode 100644 index 000000000..c33b22304 --- /dev/null +++ b/docs/hub/models-widgets.md @@ -0,0 +1,120 @@ +--- +title: Model Widg +--- + +

The Model Hub

+ +## What's a widget? + +Many model repos have a widget that allows anyone to do inference directly in the browser! + +Here are some examples: +* [Named Entity Recognition](https://huggingface.co/spacy/en_core_web_sm?text=My+name+is+Sarah+and+I+live+in+London) using [spaCy](https://spacy.io/). +* [Image Classification](https://huggingface.co/google/vit-base-patch16-224) using [πŸ€— Transformers](https://github.com/huggingface/transformers) +* [Text to Speech](https://huggingface.co/julien-c/ljspeech_tts_train_tacotron2_raw_phn_tacotron_g2p_en_no_space_train) using [ESPnet](https://github.com/espnet/espnet). +* [Sentence Similarity](https://huggingface.co/osanseviero/full-sentence-distillroberta3) using [Sentence Transformers](https://github.com/UKPLab/sentence-transformers). + +You can try out all the widgets [here](https://huggingface-widgets.netlify.app/). + +## Creating a Widget + +[TODO] + +### How can I control my model's widget example input? + +You can specify the widget input in the model card metadata section: + +```yaml +widget: +- text: "Jens Peter Hansen kommer fra Danmark" +``` + +You can provide more than one example input. In the examples dropdown menu of the widget, they will appear as `Example 1`, `Example 2`, etc. Optionally, you can supply `example_title` as well. + +![/docs/assets/hub/widget_input_examples.gif](/docs/assets/hub/widget_input_examples.gif) + +```yaml +widget: +- text: "Is this review positive or negative? Review: Best cast iron skillet you will every buy." + example_title: "Sentiment analysis" +- text: "Barack Obama nominated Hilary Clinton as his secretary of state on Monday. He chose her because she had ..." + example_title: "Coreference resolution" +- text: "On a shelf, there are five books: a gray book, a red book, a purple book, a blue book, and a black book ..." + example_title: "Logic puzzles" +- text: "The two men running to become New York City's next mayor will face off in their first debate Wednesday night ..." + example_title: "Reading comprehension" +``` + +Moreover, you can specify non-text example inputs in the model card metadata. Refer [here](https://github.com/huggingface/hub-docs/blob/main/docs/hub/input-examples.md) for a complete list of example input formats for all widget types. For vision & audio widget types, provide example inputs with `src` rather than `text`. + +For example, allow users to choose from two sample audio files for automatic speech recognition tasks by: + +```yaml +widget: +- src: https://example.org/somewhere/speech_samples/sample1.flac + example_title: Speech sample 1 +- src: https://example.org/somewhere/speech_samples/sample2.flac + example_title: Speech sample 2 +``` + +Note that you can also include example files in your model repository and use +them as: + +```yaml +widget: +- src: https://huggingface.co/username/model_repo/resolve/main/sample1.flac + example_title: Custom Speech Sample 1 +``` + +We provide example inputs for some languages and most widget types in [the DefaultWidget.ts file](https://github.com/huggingface/hub-docs/blob/master/js/src/lib/interfaces/DefaultWidget.ts). If some examples are missing, we welcome PRs from the community to add them! + +### How is a model's type of inference API and widget determined? + +To determine which pipeline and widget to display (`text-classification`, `token-classification`, `translation`, etc.), we analyze information in the repo such as the metadata provided in the model card and configuration files. This information is mapped to a single `pipeline_tag`. We choose to expose **only one** widget per model for simplicity. + +For most use cases, the model type is determined from the tags. For example, if there is `tag: text-classification` in the metadata, the inferred `pipeline_tag` will be `text-classification`. + +For `πŸ€— Transformers` however, the model type is determined automatically from `config.json`. The architecture can be used to determine the type: for example, `AutoModelForTokenClassification` corresponds to `token-classification`. If you're really interested in this, you can see pseudo-code in [this gist](https://gist.github.com/julien-c/857ba86a6c6a895ecd90e7f7cab48046). + +You can always manually override your pipeline type with pipeline_tag: xxx in your model card metadata. + + +## What are all the possible task/widget types? + +You can find all the supported tasks [here](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Types.ts). + +Here are some with links to examples: + +- `text-classification`, for instance [`roberta-large-mnli`](https://huggingface.co/roberta-large-mnli) +- `token-classification`, for instance [`dbmdz/bert-large-cased-finetuned-conll03-english`](https://huggingface.co/dbmdz/bert-large-cased-finetuned-conll03-english) +- `question-answering`, for instance [`distilbert-base-uncased-distilled-squad`](https://huggingface.co/distilbert-base-uncased-distilled-squad) +- `translation`, for instance [`t5-base`](https://huggingface.co/t5-base) +- `summarization`, for instance [`facebook/bart-large-cnn`](https://huggingface.co/facebook/bart-large-cnn) +- `conversational`, for instance [`facebook/blenderbot-400M-distill`](https://huggingface.co/facebook/blenderbot-400M-distill) +- `text-generation`, for instance [`gpt2`](https://huggingface.co/gpt2) +- `fill-mask`, for instance [`distilroberta-base`](https://huggingface.co/distilroberta-base) +- `zero-shot-classification` (implemented on top of a nli `text-classification` model), for instance [`facebook/bart-large-mnli`](https://huggingface.co/facebook/bart-large-mnli) +- `table-question-answering`, for instance [`google/tapas-base-finetuned-wtq`](https://huggingface.co/google/tapas-base-finetuned-wtq) +- `sentence-similarity`, for instance [`osanseviero/full-sentence-distillroberta2`](/osanseviero/full-sentence-distillroberta2) + +## How can I control my model's widget Inference API parameters? + +Generally, the Inference API for a model uses the default pipeline settings associated with each task. But if you'd like to change the pipeline's default settings and specify additional inference parameters, you can configure the parameters directly through the model card metadata. Refer [here](https://api-inference.huggingface.co/docs/python/html/detailed_parameters.html#) for some of the most commonly used parameters associated with each task. + +For example, if you want to specify an aggregation strategy for a NER task in the widget: + +```yaml +inference: + parameters: + aggregation_strategy: "none" +``` + +Or if you'd like to change the temperature for a summarization task in the widget: + +```yaml +inference: + parameters: + temperature: 0.7 +``` + +The Inference API allows you to send HTTP requests to models in the Hugging Face Hub. The Inference API is 2x to 10x faster than the widgets! ⚑⚑ Learn more about it by reading the [Inference API documentation](./models-inference.md). \ No newline at end of file diff --git a/docs/hub/repositories-best-practices.md b/docs/hub/repositories-best-practices.md index d712c5e6b..aa53db1b3 100644 --- a/docs/hub/repositories-best-practices.md +++ b/docs/hub/repositories-best-practices.md @@ -22,4 +22,52 @@ Can use content from https://github.com/huggingface/huggingface_hub/issues/769 a You are able to add a license to any repo that you create on the Hugging Face Hub to let other users know about the permissions that you want to attribute to your code. The license can also be added to your repository's `README.md` file, known as a *card* on the Hub, in the card's metadata section. Remember to seek out and respect a project's license if you're considering using their code. -A [**full list of the available licenses**](TODO) is available in these docs. +A full list of the available licenses is available here: + +Fullname | License identifier (to use in model card) +--- | --- +Academic Free License v3.0 | `afl-3.0` +Apache license 2.0 | `apache-2.0` +Artistic license 2.0 | `artistic-2.0` +Boost Software License 1.0 | `bsl-1.0` +BSD 2-clause "Simplified" license | `bsd-2-clause` +BSD 3-clause "New" or "Revised" license | `bsd-3-clause` +BSD 3-clause Clear license | `bsd-3-clause-clear` +Creative Commons license family | `cc` +Creative Commons Zero v1.0 Universal | `cc0-1.0` +Creative Commons Attribution 3.0 | `cc-by-3.0` +Creative Commons Attribution 4.0 | `cc-by-4.0` +Creative Commons Attribution Share Alike 3.0 | `cc-by-sa-3.0` +Creative Commons Attribution Share Alike 4.0 | `cc-by-sa-4.0` +Creative Commons Attribution Non Commercial 3.0 |`cc-by-nc-3.0` +Creative Commons Attribution Non Commercial 4.0 |`cc-by-nc-4.0` +Creative Commons Attribution Non Commercial Share Alike 3.0| `cc-by-nc-sa-3.0` +Creative Commons Attribution Non Commercial Share Alike 4.0| `cc-by-nc-sa-4.0` +Do What The F*ck You Want To Public License | `wtfpl` +Educational Community License v2.0 | `ecl-2.0` +Eclipse Public License 1.0 | `epl-1.0` +Eclipse Public License 2.0 | `epl-2.0` +European Union Public License 1.1 | `eupl-1.1` +GNU Affero General Public License v3.0 | `agpl-3.0` +GNU General Public License family | `gpl` +GNU General Public License v2.0 | `gpl-2.0` +GNU General Public License v3.0 | `gpl-3.0` +GNU Lesser General Public License family | `lgpl` +GNU Lesser General Public License v2.1 | `lgpl-2.1` +GNU Lesser General Public License v3.0 | `lgpl-3.0` +ISC | `isc` +LaTeX Project Public License v1.3c | `lppl-1.3c` +Microsoft Public License | `ms-pl` +MIT | `mit` +Mozilla Public License 2.0 | `mpl-2.0` +Open Software License 3.0 | `osl-3.0` +PostgreSQL License | `postgresql` +SIL Open Font License 1.1 | `ofl-1.1` +University of Illinois/NCSA Open Source License | `ncsa` +The Unlicense | `unlicense` +zLib License | `zlib` +Open Data Commons Public Domain Dedication and License | `pddl` +Lesser General Public License For Linguistic Resources | `lgpl-lr` +Other | `other` + +In case of `license: other` please add the license's text to a `LICENSE` file inside your repo (or contact us to add the license you use to this list). From 59c077f9cd77d8c6cd02cc39bde6ce4269fed4c1 Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Thu, 21 Apr 2022 13:39:44 -0700 Subject: [PATCH 02/10] Add rest of models content --- docs/assets/hub/models-usage-modal.png | Bin 0 -> 133718 bytes docs/assets/hub/models-usage.png | Bin 0 -> 48569 bytes docs/hub/models-cards.md | 11 ++-- docs/hub/models-interacting.md | 17 ++++- docs/hub/models-main.md | 5 +- docs/hub/models-tasks.md | 88 +++++++++++++++++++++++++ docs/hub/models-the-hub.md | 20 +----- docs/hub/models-widgets.md | 18 ++--- 8 files changed, 119 insertions(+), 40 deletions(-) create mode 100644 docs/assets/hub/models-usage-modal.png create mode 100644 docs/assets/hub/models-usage.png create mode 100644 docs/hub/models-tasks.md diff --git a/docs/assets/hub/models-usage-modal.png b/docs/assets/hub/models-usage-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..96116e71fd51c8088fec2d8825dfccd229ccd243 GIT binary patch literal 133718 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%0Au;y**zgRYxu;)Zr6^6su(GEnhd4t#s9NNT>0$e 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�ucv7 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 literal 0 HcmV?d00001 diff --git a/docs/hub/models-cards.md b/docs/hub/models-cards.md index cb7d4727d..f6d6ad737 100644 --- a/docs/hub/models-cards.md +++ b/docs/hub/models-cards.md @@ -5,6 +5,7 @@ title: Model Cards

Model Cards

## What are Model Cards? + Mdoel cards are markdown files that accompany the models and provide very useful information. They are extremely important for discoverability, reproducibility and sharing! They are the `README.md` file in any model repo. The model card should describe: @@ -14,7 +15,6 @@ The model card should describe: - which datasets did you train on and your eval results ## Model Card metadata - [TODO: How to handle this?] You can add a YAML section to the model cards (that `README.md` file) by adding three `---` to the top of your model card, including all of the metadata, and enclosing it with another group of `---` such as the example below: @@ -70,9 +70,8 @@ If a model includes valid eval results, they will be displayed like this: ![/docs/assets/hub/eval-results.jpg](/docs/assets/hub/eval-results.jpg) -### CO2 Emissions -(Maybe this should be its own page? Or rather, this can link to another page?) -[TODO: LINK TO A SUB-DOC] +### CO2 Emissions +Among other details, the Model Card is also a great place to store information about the CO2 impact of your model. Visit our [guide on tracking and reporting CO2 emissions](./models-cards-co2) to learn more. ## FAQ @@ -80,7 +79,7 @@ If a model includes valid eval results, they will be displayed like this: Each model page lists all the model's tags in the page header, below the model name. -Those are primarily computed from the model card metadata, except that we also add some of them automatically, as described in [How is a model's type of inference API and widget determined?](TODO). +Those are primarily computed from the model card metadata, except that we also add some of them automatically, as described in [How is a model's type of inference API and widget determined?](./models-widgets). ### Can I specify which framework supports my model? @@ -91,7 +90,7 @@ tags: - flair ``` -Find more about our supported libraries [here](TODO: LINK TO LIBRARIES LIST)! +Find more about our supported libraries [here](./models-the-hub#Libraries)! ### How can I link a model to a dataset? diff --git a/docs/hub/models-interacting.md b/docs/hub/models-interacting.md index d417b2d60..9942699c7 100644 --- a/docs/hub/models-interacting.md +++ b/docs/hub/models-interacting.md @@ -6,7 +6,20 @@ title: Interacting with Models on the Hub ## Accessing models for local use -TODO +Since all models are stored on the Model Hub as Git repositories, you can clone the models locally by running: + +```bash +git lfs install +git clone +``` + +For detailed information on how to access the model you can click on the "Use in Transformer" button on any model page. + +![Models can be used locally through the "Use in Transformer" button](../assets/hub/models-usage.png) + +If the model can be used with `πŸ€— transformers`, you'll even receive snippets to help you get started. + +![Snippets for using a model with the πŸ€— transformers library](../assets/hub/models-usage-modal.png) ### Can I access models programatically? @@ -112,4 +125,4 @@ Releasing an update to a model that you've already published can be done by push ### What if I have a different checkpoint of the model trained on a different dataset? -By convention each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](TODO), or by linking the in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under "Other pre-trained model versions". +By convention each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](./modelcard), or by linking the in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under "Other pre-trained model versions". diff --git a/docs/hub/models-main.md b/docs/hub/models-main.md index 56c9bd786..1bddbd394 100644 --- a/docs/hub/models-main.md +++ b/docs/hub/models-main.md @@ -4,13 +4,14 @@ title: Models

Models

-The Hugging Face Hub hosts a large number of models that can be used for a variety of [machine learning tasks](TODO: Link to TASKS). Since models are stored in repositories, each model repo benefits from [all of the features](./repositories-main) that every repo on the Hugging Face Hub comes with. Additionally, model repos have a suite of features that make exploring and using models as easy as possible. +The Hugging Face Hub hosts a large number of models that can be used for a [variety of machine learning tasks](https://huggingface.co/tasks). Since models are stored in repositories, each model repo benefits from [all of the features](./repositories-main) that every repo on the Hugging Face Hub comes with. Additionally, model repos have a suite of features that make exploring and using models as easy as possible. These docs will take you through everything you'll need to know to find models on the Hub, upload your own models, and make the most of everything the Model Hub has to offer! ## Contents - [The Model Hub](./models-the-hub) - [Model Cards](./models-cards) - - [CO2 emissions](./models-cards-co2) + - [CO2 emissions](./models-cards-co2) +- [Tasks](./models-tasks) - [Interacting with models on the Hub](./models-interacting) - [Integrating libraries with the Hub](./models-adding-libraries) - [Widgets](./models-widgets) diff --git a/docs/hub/models-tasks.md b/docs/hub/models-tasks.md new file mode 100644 index 000000000..44f753011 --- /dev/null +++ b/docs/hub/models-tasks.md @@ -0,0 +1,88 @@ +--- +title: Tasks +--- + +# Tasks + +## What's a task? + +Tasks, or pipeline types, describe the "shape" of each model's API (inputs and outputs) and are used to determine which Inference API and widget we want to display for any given model. + +![/docs/assets/hub/tasks.png](/docs/assets/hub/tasks.png) + +This classification is rather coarse-grained (you can always add more fine-grained task name in your model tags), so **you should rarely have to create a new task**. If you do want to add support for a new task, this document explains the required steps. + +## Overview + +Having a new task fully integrated in the Hub means that: +* Users can search for all models of a given task. +* The Inference API supports the task. +* Users can try out models directly with the widget. πŸ† + +Note that you're not expected to implement all the steps. Adding a new task is a community effort, and multiple people can contribute to it. πŸ§‘β€πŸ€β€πŸ§‘ + +To begin the process, open a new issue in the [huggingface_hub](https://github.com/huggingface/huggingface_hub/issues) repository. Please use the "Adding a new task" template. ⚠️Before doing any coding, it's suggested to go over this document. ⚠️ + +The first step is to upload a model for your proposed task. Once you have a model in the Hub for the new task, the next step is to enable it in the Inference API. There are three types of support that you can choose from: + +* πŸ€— using a `transformers` model +* 🐳 using a model from an [officially supported library](/docs/hub/libraries) +* πŸ–¨οΈ using a model with custom inference code. This option is experimental and has downsides, so it's always suggested to use any of the other two approaches if possible. + +Finally, there are a couple of UI elements that can be added, such as the task icon and the widget, that complete the integration in the Hub. πŸ“· + +Some steps are orthogonal, you don't need to do them in order. **You don't need the Inference API to add the icon.** This means that, even if there isn't full integration at the moment, users can still search for models of a given task. + +## Adding new tasks to the Hub + +### Using Hugging Face transformers library + +If your model is a `transformers`-based model, there is a 1:1 mapping between the Inference API task and a `pipeline` class. Here are some example PRs from the `transformers` library: +* [Adding ImageClassificationPipeline](https://github.com/huggingface/transformers/pull/11598) +* [Adding AudioClassificationPipeline](https://github.com/huggingface/transformers/pull/13342) + +Once the pipeline is submitted and deployed, you should be able to use the Inference API for your model. + +### Using Community Inference API with a supported library + +The Hub also supports over 10 open-source libraries in the [Community Inference API](https://github.com/huggingface/api-inference-community). + +**Adding a new task is relatively straightforward and requires 2 PRs:** +* PR 1: Add the new task to the API [validation](https://github.com/huggingface/api-inference-community/blob/main/api_inference_community/validation.py). This code ensures that the inference input is valid for a given task. Some PR examples: + * [Add text-to-image](https://github.com/huggingface/huggingface_hub/commit/5f040a117cf2a44d704621012eb41c01b103cfca#diff-db8bbac95c077540d79900384cfd524d451e629275cbb5de7a31fc1cd5d6c189) + * [Add audio-classification](https://github.com/huggingface/huggingface_hub/commit/141e30588a2031d4d5798eaa2c1250d1d1b75905#diff-db8bbac95c077540d79900384cfd524d451e629275cbb5de7a31fc1cd5d6c189) + * [Add structured-data-classification](https://github.com/huggingface/huggingface_hub/commit/dbea604a45df163d3f0b4b1d897e4b0fb951c650#diff-db8bbac95c077540d79900384cfd524d451e629275cbb5de7a31fc1cd5d6c189) +* PR 2: Add the new task to a library docker image. You should also add a template to [`docker_images/common/app/pipelines`](https://github.com/huggingface/api-inference-community/tree/main/docker_images/common/app/pipelines) to facilitate integrating the task in other libraries. Here is an example PR: + * [Add text-classification to spaCy](https://github.com/huggingface/huggingface_hub/commit/6926fd9bec23cb963ce3f58ec53496083997f0fa#diff-3f1083a92ca0047b50f9ad2d04f0fe8dfaeee0e26ab71eb8835e365359a1d0dc) + +### Adding Community Inference API for a quick prototype + +**My model is not supported by any library. Am I doomed? 😱** + +No, you're not! We have an experimental Docker image for quick prototyping of new tasks and introduction of new libraries. This is the [generic Inference API](https://github.com/huggingface/api-inference-community/tree/main/docker_images/generic) and should allow you to have a new task in production with very little development from your side. + +How does it work from the user point of view? Users create a copy of a [template](https://huggingface.co/templates) repo for their given task. Users then need to define their `requirements.txt` and fill `pipeline.py`. Note that this is not intended for fast production use cases, but more for quick experimentation and prototyping. + + +### UI elements + +The Hub allows users to filter models by a given task. In order to do this, you need to add the task to a couple of places and pick an icon for the task. + +1. Add the task type to `Types.ts` + +In [interfaces/Types.ts](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Types.ts), you need to do a couple of things + +* Add the type to `PipelineType`. Note that they are sorted in different categories (NLP, Audio, Computer Vision and others). +* Specify the task color in `PIPELINE_COLOR`. +* Specify the display order in `PIPELINE_TAGS_DISPLAY_ORDER`. + +2. Choose an icon + +You can add an icon in the [lib/Icons](https://github.com/huggingface/hub-docs/tree/main/js/src/lib/Icons) directory. We usually choose carbon icons from https://icones.js.org/collection/carbon. + + +### Widget + +Once the task is in production, what could be more exciting that implementing some way for users to play directly with the models in their browser? 🀩 You can find all the widgets [here](https://huggingface-widgets.netlify.app/). + +In case you would be interested in contributing with a widget, you can look at the [implementation](https://github.com/huggingface/hub-docs/tree/main/js/src/lib/components/InferenceWidget/widgets) of all the widgets. You can also find WIP documentation on how to implement a widget in https://github.com/huggingface/hub-docs/tree/main/js. \ No newline at end of file diff --git a/docs/hub/models-the-hub.md b/docs/hub/models-the-hub.md index 043ea68f7..19807809b 100644 --- a/docs/hub/models-the-hub.md +++ b/docs/hub/models-the-hub.md @@ -6,30 +6,12 @@ title: The Model Hub ## What is the Model Hub? -The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using [TODO] +The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [πŸ€— transformers](https://huggingface.co/docs/transformers/index) for fine-tuning and other usage. To use models in production, they can even be deployed using the [Inference API](./models-inference). You can refer to the following video for a guide on navigating the Model Hub: -## Exploring Models - -TODO - -### Searching with the UI - -TODO - -### Tasks - -TODO: - -(Also adding new tasks) -- Am I sure that this needs to be in here? There's currently no documentation on this, and my goal right now isn't to write new content... - -### Searching the Hub with Python - -[TODO: At the moment this has an entire page, written as a tutorial... should I split it up?] - ## Libraries The Hub supports a number of libraries and we're working on expanding this support! We're happy to welcome to the Hub a set of Open Source libraries that are pushing Machine Learning forward. diff --git a/docs/hub/models-widgets.md b/docs/hub/models-widgets.md index c33b22304..13ef32478 100644 --- a/docs/hub/models-widgets.md +++ b/docs/hub/models-widgets.md @@ -18,7 +18,13 @@ You can try out all the widgets [here](https://huggingface-widgets.netlify.app/) ## Creating a Widget -[TODO] +A widget is automatically created for your model when you upload it to the Hub. To determine which pipeline and widget to display (`text-classification`, `token-classification`, `translation`, etc.), we analyze information in the repo such as the metadata provided in the model card and configuration files. This information is mapped to a single `pipeline_tag`. We choose to expose **only one** widget per model for simplicity. + +For most use cases, the model type is determined from the tags. For example, if there is `tag: text-classification` in the metadata, the inferred `pipeline_tag` will be `text-classification`. + +For `πŸ€— Transformers` however, the model type is determined automatically from `config.json`. The architecture can be used to determine the type: for example, `AutoModelForTokenClassification` corresponds to `token-classification`. If you're really interested in this, you can see pseudo-code in [this gist](https://gist.github.com/julien-c/857ba86a6c6a895ecd90e7f7cab48046). + +You can always manually override your pipeline type with pipeline_tag: xxx in your model card metadata. ### How can I control my model's widget example input? @@ -68,16 +74,6 @@ widget: We provide example inputs for some languages and most widget types in [the DefaultWidget.ts file](https://github.com/huggingface/hub-docs/blob/master/js/src/lib/interfaces/DefaultWidget.ts). If some examples are missing, we welcome PRs from the community to add them! -### How is a model's type of inference API and widget determined? - -To determine which pipeline and widget to display (`text-classification`, `token-classification`, `translation`, etc.), we analyze information in the repo such as the metadata provided in the model card and configuration files. This information is mapped to a single `pipeline_tag`. We choose to expose **only one** widget per model for simplicity. - -For most use cases, the model type is determined from the tags. For example, if there is `tag: text-classification` in the metadata, the inferred `pipeline_tag` will be `text-classification`. - -For `πŸ€— Transformers` however, the model type is determined automatically from `config.json`. The architecture can be used to determine the type: for example, `AutoModelForTokenClassification` corresponds to `token-classification`. If you're really interested in this, you can see pseudo-code in [this gist](https://gist.github.com/julien-c/857ba86a6c6a895ecd90e7f7cab48046). - -You can always manually override your pipeline type with pipeline_tag: xxx in your model card metadata. - ## What are all the possible task/widget types? From 70710093da5a5375465c772bc2141701fef172dc Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Thu, 21 Apr 2022 13:40:35 -0700 Subject: [PATCH 03/10] Fix TODO links --- docs/hub/hugging-face-hub.md | 2 +- docs/hub/repositories-getting-started.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/hub/hugging-face-hub.md b/docs/hub/hugging-face-hub.md index 8629c6bce..558778bd9 100644 --- a/docs/hub/hugging-face-hub.md +++ b/docs/hub/hugging-face-hub.md @@ -24,7 +24,7 @@ On it, you'll be able to upload and discover... Unlike other hosting solutions, the Hub offers **versioning, commit history, diffs, branches, and over a dozen library integrations**! You can learn more about the features that all repositories share in the **Repositories documentation**. ## Models -Models on the Hugging Face Hub allow for simple discovery and usage to maximize model impact. To promote responsible model usage and development, model repos are equipped with [Model Cards](TODO) to inform users of each model's limitations and biases. Additional [metadata](/docs/hub/model-repos#model-card-metadata) about info such as their tasks, languages, and metrics can be included, with training metrics charts even added if the repository contains [TensorBoard traces](https://huggingface.co/models?filter=tensorboard). It's also easy to add an **inference widget** to your model, allowing anyone to play with the model directly in the browser! For production settings, an API is provided to **instantly serve your model**. +Models on the Hugging Face Hub allow for simple discovery and usage to maximize model impact. To promote responsible model usage and development, model repos are equipped with [Model Cards](./models-cards) to inform users of each model's limitations and biases. Additional [metadata](/docs/hub/model-repos#model-card-metadata) about info such as their tasks, languages, and metrics can be included, with training metrics charts even added if the repository contains [TensorBoard traces](https://huggingface.co/models?filter=tensorboard). It's also easy to add an **inference widget** to your model, allowing anyone to play with the model directly in the browser! For production settings, an API is provided to **instantly serve your model**. To upload models to the Hub, or download models and integrate them into your work, explore the **Models documentation**. You can also choose from [**over a dozen frameworks**](/docs/hub/libraries) such as πŸ€— Transformers, Asteroid, and ESPnet that support the Hugging Face Hub. diff --git a/docs/hub/repositories-getting-started.md b/docs/hub/repositories-getting-started.md index abc4afffe..60a43a389 100644 --- a/docs/hub/repositories-getting-started.md +++ b/docs/hub/repositories-getting-started.md @@ -33,13 +33,13 @@ Using the Hub's web interface you can easily create repositories, add files (eve 3. Next, enter your model’s name. This will also be the name of the repository. Finally, you can specify whether you want your model to be public or private. -You can leave the *License* field blank for now. To learn about licenses, visit the **Licenses** (TODO: LINK TO LICENSES) section of this document. +You can leave the *License* field blank for now. To learn about licenses, visit the [**Licenses**](repositories-best-practices#Licenses) section of this documentation. After creating your model repository, you should see a page like this: ![/docs/assets/hub/empty_repo.png](/docs/assets/hub/empty_repo.png) -Note that the Hub prompts you to create a *Model Card*, which you can learn about in the **Model Cards documentation** (TODO: LINK). Including a Model Card in your model repo is best practice, but since we're only making a test repo at the moment we can skip this. +Note that the Hub prompts you to create a *Model Card*, which you can learn about in the [**Model Cards documentation**](./models-cards). Including a Model Card in your model repo is best practice, but since we're only making a test repo at the moment we can skip this. ## Cloning repositories From 00f592c88f4bc8d46353b3c40658a45670facc4d Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Thu, 21 Apr 2022 14:29:49 -0700 Subject: [PATCH 04/10] Fix some formatting and typos --- docs/hub/models-cards.md | 2 +- docs/hub/models-interacting.md | 2 +- docs/hub/models-the-hub.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/hub/models-cards.md b/docs/hub/models-cards.md index f6d6ad737..3e97ce273 100644 --- a/docs/hub/models-cards.md +++ b/docs/hub/models-cards.md @@ -90,7 +90,7 @@ tags: - flair ``` -Find more about our supported libraries [here](./models-the-hub#Libraries)! +Find more about our supported libraries [here](./models-the-hub#libraries)! ### How can I link a model to a dataset? diff --git a/docs/hub/models-interacting.md b/docs/hub/models-interacting.md index 9942699c7..f24f476f1 100644 --- a/docs/hub/models-interacting.md +++ b/docs/hub/models-interacting.md @@ -125,4 +125,4 @@ Releasing an update to a model that you've already published can be done by push ### What if I have a different checkpoint of the model trained on a different dataset? -By convention each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](./modelcard), or by linking the in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under "Other pre-trained model versions". +By convention each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](./modelcard), or by linking them in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under *"Other pre-trained model versions"*. diff --git a/docs/hub/models-the-hub.md b/docs/hub/models-the-hub.md index 19807809b..ffbde95f3 100644 --- a/docs/hub/models-the-hub.md +++ b/docs/hub/models-the-hub.md @@ -6,7 +6,7 @@ title: The Model Hub ## What is the Model Hub? -The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [πŸ€— transformers](https://huggingface.co/docs/transformers/index) for fine-tuning and other usage. To use models in production, they can even be deployed using the [Inference API](./models-inference). +The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [`πŸ€— transformers`](https://huggingface.co/docs/transformers/index) for fine-tuning and other usage. To use models in production, they can even be deployed using the [Inference API](./models-inference). You can refer to the following video for a guide on navigating the Model Hub: From 395eb081d011e9e35e5fcd4668f6d08c132f3c65 Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Thu, 21 Apr 2022 14:48:42 -0700 Subject: [PATCH 05/10] Fix link (remove .md) --- docs/hub/models-widgets.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hub/models-widgets.md b/docs/hub/models-widgets.md index 13ef32478..cdca95877 100644 --- a/docs/hub/models-widgets.md +++ b/docs/hub/models-widgets.md @@ -113,4 +113,4 @@ inference: temperature: 0.7 ``` -The Inference API allows you to send HTTP requests to models in the Hugging Face Hub. The Inference API is 2x to 10x faster than the widgets! ⚑⚑ Learn more about it by reading the [Inference API documentation](./models-inference.md). \ No newline at end of file +The Inference API allows you to send HTTP requests to models in the Hugging Face Hub. The Inference API is 2x to 10x faster than the widgets! ⚑⚑ Learn more about it by reading the [Inference API documentation](./models-inference). \ No newline at end of file From 8fddb2b676ca585721978c11eacd15e07cc233bb Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Thu, 21 Apr 2022 15:16:33 -0700 Subject: [PATCH 06/10] Grammarly typo fixes --- docs/hub/models-adding-libraries.md | 2 +- docs/hub/models-cards-co2.md | 4 ++-- docs/hub/models-cards.md | 2 +- docs/hub/models-interacting.md | 12 ++++++------ docs/hub/models-tasks.md | 10 +++++----- docs/hub/models-the-hub.md | 2 +- docs/hub/models-widgets.md | 10 +++++----- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/hub/models-adding-libraries.md b/docs/hub/models-adding-libraries.md index ab2db2694..f2e078964 100644 --- a/docs/hub/models-adding-libraries.md +++ b/docs/hub/models-adding-libraries.md @@ -58,7 +58,7 @@ If you need help with the integration at any point, feel free to open an [issue] Integration allows users to download your hosted files directly from the Hub using your library. -Use the `hf_hub_download` function to retrieve a URL and download files from your repository. Downloaded files are stored in your cache: `~/.cache/huggingface/hub`. You don't have to redownload the file the next time you use it, and for larger files, this can save a lot of time. Furthermore, if the repository is updated with a new version of the file, `huggingface_hub` will automatically download the latest version and store it in the cache for you. Users don't have to worry about updating their files. +Use the `hf_hub_download` function to retrieve a URL and download files from your repository. Downloaded files are stored in your cache: `~/.cache/huggingface/hub`. You don't have to re-download the file the next time you use it, and for larger files, this can save a lot of time. Furthermore, if the repository is updated with a new version of the file, `huggingface_hub` will automatically download the latest version and store it in the cache for you. Users don't have to worry about updating their files. For example, download the `config.json` file from the [lysandre/arxiv-nlp](https://huggingface.co/lysandre/arxiv-nlp) repository: diff --git a/docs/hub/models-cards-co2.md b/docs/hub/models-cards-co2.md index c3c88dac7..55ee67ad8 100644 --- a/docs/hub/models-cards-co2.md +++ b/docs/hub/models-cards-co2.md @@ -6,7 +6,7 @@ title: Carbon Emissions ## Why is it useful to calculate the carbon emissions of my model? -Training ML models is often energy intensive and can produce a substantial carbon footprint, as described by [Strubell et al.](https://arxiv.org/abs/1906.02243). It's therefore important to *track* and *report* the emissions of models to get a better idea of the environmental impacts of our field. +Training ML models is often energy-intensive and can produce a substantial carbon footprint, as described by [Strubell et al.](https://arxiv.org/abs/1906.02243). It's therefore important to *track* and *report* the emissions of models to get a better idea of the environmental impacts of our field. ## What information should I include about the carbon footprint of my model? @@ -38,7 +38,7 @@ By taking into account the computing hardware, location, usage and training time The math is actually pretty simple! βž• -First, you take the *carbon intensity* of the electric grid that is being used for the training -- this is how much CO2 is produced by KwH of electricity used. This depends on the location where the hardware is located and the [energy mix](https://electricitymap.org/) used at that location -- whether it's renewable energy like solar 🌞, wind 🌬️ and hydro πŸ’§, or non-renewable energy like coal ⚫ and natural gas πŸ’¨. The more renewable energy is used, the less carbon intensive it is! +First, you take the *carbon intensity* of the electric grid that is being used for the training -- this is how much CO2 is produced by KwH of electricity used. This depends on the location where the hardware is located and the [energy mix](https://electricitymap.org/) used at that location -- whether it's renewable energy like solar 🌞, wind 🌬️ and hydro πŸ’§, or non-renewable energy like coal ⚫ and natural gas πŸ’¨. The more renewable energy is used, the less carbon-intensive it is! Then, you take the power consumption of the GPU during training -- this is done using the `pynvml` library. diff --git a/docs/hub/models-cards.md b/docs/hub/models-cards.md index 3e97ce273..ee739b6e6 100644 --- a/docs/hub/models-cards.md +++ b/docs/hub/models-cards.md @@ -6,7 +6,7 @@ title: Model Cards ## What are Model Cards? -Mdoel cards are markdown files that accompany the models and provide very useful information. They are extremely important for discoverability, reproducibility and sharing! They are the `README.md` file in any model repo. +Model cards are markdown files that accompany the models and provide very useful information. They are extremely important for discoverability, reproducibility and sharing! They are the `README.md` file in any model repo. The model card should describe: - the model diff --git a/docs/hub/models-interacting.md b/docs/hub/models-interacting.md index f24f476f1..5b1c74943 100644 --- a/docs/hub/models-interacting.md +++ b/docs/hub/models-interacting.md @@ -13,7 +13,7 @@ git lfs install git clone ``` -For detailed information on how to access the model you can click on the "Use in Transformer" button on any model page. +For detailed information on how to access the model, you can click on the "Use in Transformer" button on any model page. ![Models can be used locally through the "Use in Transformer" button](../assets/hub/models-usage.png) @@ -21,9 +21,9 @@ If the model can be used with `πŸ€— transformers`, you'll even receive snippets ![Snippets for using a model with the πŸ€— transformers library](../assets/hub/models-usage-modal.png) -### Can I access models programatically? +### Can I access models programmatically? -You can use the [`huggingface_hub`](https://github.com/huggingface/huggingface_hub) library to create, delete, update and retrieve information from repos. You can also use it to download files from repos and integrate it to your own library! For example, you can easily load a Scikit learn model with few lines. +You can use the [`huggingface_hub`](https://github.com/huggingface/huggingface_hub) library to create, delete, update and retrieve information from repos. You can also use it to download files from repos and integrate it to your own library! For example, you can easily load a Scikit learn model with a few lines. ```py from huggingface_hub import hf_hub_url, cached_download @@ -41,7 +41,7 @@ model = joblib.load(cached_download( The first step is to create an account at [Hugging Face](https://huggingface.co/login). The models are shared in the form of Git-based repositories which give you versioning, branches, discoverability and sharing features, integration with over a dozen libraries and more! You have control over what you want to upload to your repository, which could include checkpoints, configs and any other files. -The repository can be either linked with an individual, such as [osanseviero/fashion_brands_patterns](https://huggingface.co/osanseviero/fashion_brands_patterns) or with an organization, such as [facebook/bart-large-xsum](https://huggingface.co/facebook/bart-large-xsum). Organizations can be used if you want to upload models that are related to a company, community or library! If you choose an organization, the model will be featured on the organization’s page and every member of the organization will have the ability to contribute to the repository. You can create a new organization [here](https://huggingface.co/organizations/new). +The repository can either be linked with an individual, such as [osanseviero/fashion_brands_patterns](https://huggingface.co/osanseviero/fashion_brands_patterns) or with an organization, such as [facebook/bart-large-xsum](https://huggingface.co/facebook/bart-large-xsum). Organizations can be used if you want to upload models that are related to a company, community or library! If you choose an organization, the model will be featured on the organization’s page and every member of the organization will have the ability to contribute to the repository. You can create a new organization [here](https://huggingface.co/organizations/new). There are several ways to upload models to the Hub, which are described below. @@ -111,7 +111,7 @@ It's up to the person who uploaded the model to include the training information ### How can I see an example of the model in action? -Models can have inference widgets which let you try out the model in the browser! Inference widgets are easy to configure, and there are many kinds to choose from. Visit the [Widgets documentation](models-widgets.md) to learn more. +Models can have inference widgets that let you try out the model in the browser! Inference widgets are easy to configure, and there are many kinds to choose from. Visit the [Widgets documentation](models-widgets.md) to learn more. The Hugging Face Hub is also home to Spaces, which are interactive demos that can be used to showcase models. If a model has any Spaces associated with it, they'll be linked on the model page like so: @@ -125,4 +125,4 @@ Releasing an update to a model that you've already published can be done by push ### What if I have a different checkpoint of the model trained on a different dataset? -By convention each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](./modelcard), or by linking them in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under *"Other pre-trained model versions"*. +By convention, each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](./modelcard), or by linking to them in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under *"Other pre-trained model versions"*. diff --git a/docs/hub/models-tasks.md b/docs/hub/models-tasks.md index 44f753011..6fb50ad3e 100644 --- a/docs/hub/models-tasks.md +++ b/docs/hub/models-tasks.md @@ -10,7 +10,7 @@ Tasks, or pipeline types, describe the "shape" of each model's API (inputs and o ![/docs/assets/hub/tasks.png](/docs/assets/hub/tasks.png) -This classification is rather coarse-grained (you can always add more fine-grained task name in your model tags), so **you should rarely have to create a new task**. If you do want to add support for a new task, this document explains the required steps. +This classification is rather coarse-grained (you can always add more fine-grained task names in your model tags), so **you should rarely have to create a new task**. If you do want to add support for a new task, this document explains the required steps. ## Overview @@ -59,9 +59,9 @@ The Hub also supports over 10 open-source libraries in the [Community Inference **My model is not supported by any library. Am I doomed? 😱** -No, you're not! We have an experimental Docker image for quick prototyping of new tasks and introduction of new libraries. This is the [generic Inference API](https://github.com/huggingface/api-inference-community/tree/main/docker_images/generic) and should allow you to have a new task in production with very little development from your side. +No, you're not! We have an experimental Docker image for quick prototyping of new tasks and the introduction of new libraries. This is the [generic Inference API](https://github.com/huggingface/api-inference-community/tree/main/docker_images/generic) and should allow you to have a new task in production with very little development from your side. -How does it work from the user point of view? Users create a copy of a [template](https://huggingface.co/templates) repo for their given task. Users then need to define their `requirements.txt` and fill `pipeline.py`. Note that this is not intended for fast production use cases, but more for quick experimentation and prototyping. +How does it work from the user's point of view? Users create a copy of a [template](https://huggingface.co/templates) repo for their given task. Users then need to define their `requirements.txt` and fill `pipeline.py`. Note that this is not intended for fast production use cases, but more for quick experimentation and prototyping. ### UI elements @@ -72,7 +72,7 @@ The Hub allows users to filter models by a given task. In order to do this, you In [interfaces/Types.ts](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Types.ts), you need to do a couple of things -* Add the type to `PipelineType`. Note that they are sorted in different categories (NLP, Audio, Computer Vision and others). +* Add the type to `PipelineType`. Note that they are sorted into different categories (NLP, Audio, Computer Vision and others). * Specify the task color in `PIPELINE_COLOR`. * Specify the display order in `PIPELINE_TAGS_DISPLAY_ORDER`. @@ -83,6 +83,6 @@ You can add an icon in the [lib/Icons](https://github.com/huggingface/hub-docs/t ### Widget -Once the task is in production, what could be more exciting that implementing some way for users to play directly with the models in their browser? 🀩 You can find all the widgets [here](https://huggingface-widgets.netlify.app/). +Once the task is in production, what could be more exciting than implementing some way for users to play directly with the models in their browser? 🀩 You can find all the widgets [here](https://huggingface-widgets.netlify.app/). In case you would be interested in contributing with a widget, you can look at the [implementation](https://github.com/huggingface/hub-docs/tree/main/js/src/lib/components/InferenceWidget/widgets) of all the widgets. You can also find WIP documentation on how to implement a widget in https://github.com/huggingface/hub-docs/tree/main/js. \ No newline at end of file diff --git a/docs/hub/models-the-hub.md b/docs/hub/models-the-hub.md index ffbde95f3..bbe252356 100644 --- a/docs/hub/models-the-hub.md +++ b/docs/hub/models-the-hub.md @@ -6,7 +6,7 @@ title: The Model Hub ## What is the Model Hub? -The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [`πŸ€— transformers`](https://huggingface.co/docs/transformers/index) for fine-tuning and other usage. To use models in production, they can even be deployed using the [Inference API](./models-inference). +The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [`πŸ€— transformers`](https://huggingface.co/docs/transformers/index) for fine-tuning and other usages. To use models in production, they can even be deployed using the [Inference API](./models-inference). You can refer to the following video for a guide on navigating the Model Hub: diff --git a/docs/hub/models-widgets.md b/docs/hub/models-widgets.md index cdca95877..e9998a87a 100644 --- a/docs/hub/models-widgets.md +++ b/docs/hub/models-widgets.md @@ -1,8 +1,8 @@ --- -title: Model Widg +title: Model Widgets --- -

The Model Hub

+

Widgets

## What's a widget? @@ -41,7 +41,7 @@ You can provide more than one example input. In the examples dropdown menu of th ```yaml widget: -- text: "Is this review positive or negative? Review: Best cast iron skillet you will every buy." +- text: "Is this review positive or negative? Review: Best cast iron skillet you will ever buy." example_title: "Sentiment analysis" - text: "Barack Obama nominated Hilary Clinton as his secretary of state on Monday. He chose her because she had ..." example_title: "Coreference resolution" @@ -51,7 +51,7 @@ widget: example_title: "Reading comprehension" ``` -Moreover, you can specify non-text example inputs in the model card metadata. Refer [here](https://github.com/huggingface/hub-docs/blob/main/docs/hub/input-examples.md) for a complete list of example input formats for all widget types. For vision & audio widget types, provide example inputs with `src` rather than `text`. +Moreover, you can specify non-text example inputs in the model card metadata. Refer [here](https://github.com/huggingface/hub-docs/blob/main/docs/hub/input-examples.md) for a complete list of sample input formats for all widget types. For vision & audio widget types, provide example inputs with `src` rather than `text`. For example, allow users to choose from two sample audio files for automatic speech recognition tasks by: @@ -79,7 +79,7 @@ We provide example inputs for some languages and most widget types in [the Defau You can find all the supported tasks [here](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Types.ts). -Here are some with links to examples: +Here are some links to examples: - `text-classification`, for instance [`roberta-large-mnli`](https://huggingface.co/roberta-large-mnli) - `token-classification`, for instance [`dbmdz/bert-large-cased-finetuned-conll03-english`](https://huggingface.co/dbmdz/bert-large-cased-finetuned-conll03-english) From 240986afc19f925429acfbd8a4f2f5c6f9e0e144 Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Thu, 21 Apr 2022 18:23:12 -0700 Subject: [PATCH 07/10] Use Grammarly for phrasing and flow. --- docs/hub/models-adding-libraries.md | 14 ++++++------- docs/hub/models-cards-co2.md | 30 +++++++++++++-------------- docs/hub/models-cards.md | 23 +++++++++------------ docs/hub/models-inference.md | 10 ++++----- docs/hub/models-interacting.md | 32 ++++++++++++++--------------- docs/hub/models-main.md | 2 +- docs/hub/models-tasks.md | 22 ++++++++++---------- docs/hub/models-the-hub.md | 6 +++--- docs/hub/models-widgets.md | 12 +++++------ 9 files changed, 74 insertions(+), 77 deletions(-) diff --git a/docs/hub/models-adding-libraries.md b/docs/hub/models-adding-libraries.md index f2e078964..189fd712f 100644 --- a/docs/hub/models-adding-libraries.md +++ b/docs/hub/models-adding-libraries.md @@ -4,7 +4,7 @@ title: Integrate a library with the Hub # Integrate your library with the Hub -The Hugging Face Hub aims to facilitate the sharing of machine learning models, checkpoints, and artifacts. This endeavor includes integrating the Hub into many of the amazing third-party libraries in the community. Some of the ones already integrated include [spaCy](https://spacy.io/usage/projects#huggingface_hub), [AllenNLP](https://allennlp.org/), and [timm](https://rwightman.github.io/pytorch-image-models/), among many others. Integration means users can download and upload files to the Hub directly from your library. We hope you will integrate your library and join us in democratizing artificial intelligence for everyone! +The Hugging Face Hub aims to facilitate sharing machine learning models, checkpoints, and artifacts. This endeavor includes integrating the Hub into many of the amazing third-party libraries in the community. Some of the ones already integrated include [spaCy](https://spacy.io/usage/projects#huggingface_hub), [AllenNLP](https://allennlp.org/), and [timm](https://rwightman.github.io/pytorch-image-models/), among many others. Integration means users can download and upload files to the Hub directly from your library. We hope you will integrate your library and join us in democratizing artificial intelligence for everyone! Integrating the Hub with your library provides many benefits, including: @@ -17,7 +17,7 @@ This tutorial will help you integrate the Hub into your library so your users ca Before you begin, we recommend you create a [Hugging Face account](https://huggingface.co/join) from which you can manage your repositories and files. -If you need help with the integration at any point, feel free to open an [issue](https://github.com/huggingface/huggingface_hub/issues/new/choose), and we would be more than happy to help you! +If you need help with the integration, feel free to open an [issue](https://github.com/huggingface/huggingface_hub/issues/new/choose), and we would be more than happy to help you! ## Installation @@ -85,7 +85,7 @@ Use the `cache_dir` parameter to change where a file is stored: ### Code sample -We recommend adding a code snippet to explain how a model should be used in your downstream library. +We recommend adding a code snippet to explain how to use a model in your downstream library. ![/docs/assets/hub/code_snippet.png](/docs/assets/hub/code_snippet.png) @@ -98,13 +98,13 @@ const asteroid = (model: ModelData) => model = BaseModel.from_pretrained("${model.id}")`; ``` -This will also add a tag to your model so users can quickly identify models from your library. +Doing so will also add a tag to your model so users can quickly identify models from your library. ![/docs/assets/hub/libraries-tags.png](/docs/assets/hub/libraries-tags.png) ## Upload files to the Hub -You might also want to provide a method for creating model repositories and uploading files to the Hub directly from your library. The `huggingface_hub` library offers two methods to assist you with creating repositories and uploading files: +You might also want to provide a method for creating model repositories and uploading files to the Hub directly from your library. The `huggingface_hub` library offers two ways to assist you with creating repositories and uploading files: - `create_repo` creates a repository on the Hub. - `upload_file` directly uploads files to a repository on the Hub. @@ -141,11 +141,11 @@ For example: 'https://huggingface.co/lysandre/test-model/blob/main/README.md' ``` -If you need to upload more than one file, take a look at the utilities offered by the `Repository` class [here](/docs/hub/how-to-upstream#`Repository`). +If you need to upload more than one file, look at the utilities offered by the `Repository` class [here](TODO). Once again, if you check your Hugging Face account, you should see the file inside your repository. -Lastly, it is important to add a model card, so users understand how to use your model. See [here](/docs/hub/model-repos#what-are-model-cards-and-why-are-they-useful) for more details about how to create a model card. +Lastly, it is important to add a model card so users understand how to use your model. See [here](/docs/hub/model-repos#what-are-model-cards-and-why-are-they-useful) for more details about how to create a model card. ## Set up the Inference API diff --git a/docs/hub/models-cards-co2.md b/docs/hub/models-cards-co2.md index 55ee67ad8..55a96b389 100644 --- a/docs/hub/models-cards-co2.md +++ b/docs/hub/models-cards-co2.md @@ -4,47 +4,47 @@ title: Carbon Emissions

Displaying carbon emissions for your model

-## Why is it useful to calculate the carbon emissions of my model? +## Why is it beneficial to calculate the carbon emissions of my model? Training ML models is often energy-intensive and can produce a substantial carbon footprint, as described by [Strubell et al.](https://arxiv.org/abs/1906.02243). It's therefore important to *track* and *report* the emissions of models to get a better idea of the environmental impacts of our field. ## What information should I include about the carbon footprint of my model? -If you can, include information about: +If you can, you should include information about: - where the model was trained (in terms of location) -- the hardware that was used -- e.g. GPU, TPU or CPU, and how many +- the hardware used -- e.g. GPU, TPU, or CPU, and how many - training type: pre-training or fine-tuning - the estimated carbon footprint of the model, calculated in real-time with the [Code Carbon](https://github.com/mlco2/codecarbon) package or after the fact using the [ML CO2 Calculator](https://mlco2.github.io/impact/). ## Carbon footprint metadata -The data can be added to the model card metadata (README.md file). The structure of the metadata should be: +You can add the carbon footprint data to the model card metadata (in the README.md file). The structure of the metadata should be: ```yaml --- co2_eq_emissions: - emissions: "in grams of CO2" - source: "source of the information, either directly from AutoTrain, code carbon or from a scientific article documenting the model" - training_type: "pretraining or fine-tuning" - geographical_location: "as granular as possible, for instance Quebec, Canada or Brooklyn, NY, USA" - hardware_used: "how much compute and what kind, e.g. 8 v100 GPUs" + emissions: "in grams of CO2" + source: "source of the information, either directly from AutoTrain, code carbon or from a scientific article documenting the model" + training_type: "pre-training or fine-tuning" + geographical_location: "as granular as possible, for instance Quebec, Canada or Brooklyn, NY, USA" + hardware_used: "how much compute and what kind, e.g. 8 v100 GPUs" --- ``` ## How is the carbon footprint of my model calculated? 🌎 -By taking into account the computing hardware, location, usage and training time, it's possible to provide an estimate of how much CO2 was produced by the model. +Considering the computing hardware, location, usage, and training time, you can estimate how much CO2 the model produced. -The math is actually pretty simple! βž• +The math is pretty simple! βž• -First, you take the *carbon intensity* of the electric grid that is being used for the training -- this is how much CO2 is produced by KwH of electricity used. This depends on the location where the hardware is located and the [energy mix](https://electricitymap.org/) used at that location -- whether it's renewable energy like solar 🌞, wind 🌬️ and hydro πŸ’§, or non-renewable energy like coal ⚫ and natural gas πŸ’¨. The more renewable energy is used, the less carbon-intensive it is! +First, you take the *carbon intensity* of the electric grid used for the training -- this is how much CO2 is produced by KwH of electricity used. The carbon intensity depends on the location of the hardware and the [energy mix](https://electricitymap.org/) used at that location -- whether it's renewable energy like solar 🌞, wind 🌬️ and hydro πŸ’§, or non-renewable energy like coal ⚫ and natural gas πŸ’¨. The more renewable energy gets used for training, the less carbon-intensive it is! -Then, you take the power consumption of the GPU during training -- this is done using the `pynvml` library. +Then, you take the power consumption of the GPU during training using the `pynvml` library. -Finally, you multiply the power consumption and carbon intensity by the training time of the model, and you have an estimate of how much CO2 was emitted. +Finally, you multiply the power consumption and carbon intensity by the training time of the model, and you have an estimate of the CO2 emission. -Keep in mind that this isn't an exact number, because there are other factors that come into play -- like the energy that's used for data center heating and cooling -- which will increase carbon emissions. But this will already give you a good idea of the scale of CO2 emissions that your model is producing! +Keep in mind that this isn't an exact number because other factors come into play -- like the energy used for data center heating and cooling -- which will increase carbon emissions. But this will give you a good idea of the scale of CO2 emissions that your model is producing! To add **Carbon Emissions** metadata to your models: diff --git a/docs/hub/models-cards.md b/docs/hub/models-cards.md index ee739b6e6..b9cd39cef 100644 --- a/docs/hub/models-cards.md +++ b/docs/hub/models-cards.md @@ -6,17 +6,18 @@ title: Model Cards ## What are Model Cards? -Model cards are markdown files that accompany the models and provide very useful information. They are extremely important for discoverability, reproducibility and sharing! They are the `README.md` file in any model repo. +Model cards are markdown files that accompany the models and provide handy information. They are essential for discoverability, reproducibility, and sharing! They are the `README.md` file in any model repo. The model card should describe: - the model - its intended uses & potential limitations, including bias and ethical considerations as detailed in [Mitchell, 2018](https://arxiv.org/abs/1810.03993) - the training params and experimental info (you can embed or link to an experiment tracking platform for reference) -- which datasets did you train on and your eval results +- which datasets were used to train your model +- your evaluation results -## Model Card metadata +## Model card metadata -You can add a YAML section to the model cards (that `README.md` file) by adding three `---` to the top of your model card, including all of the metadata, and enclosing it with another group of `---` such as the example below: +A model repo will render its `README.md` as a model card. To control how the Hub displays the card, you can create a YAML section in the README file to define some metadata. Start by adding three `---` at the top, then include all of the relevant metadata, and close the section with another group of `---` like the example below: ```yaml --- @@ -40,15 +41,13 @@ metrics: You can find the detailed specification [here](https://github.com/huggingface/hub-docs/blame/main/modelcard.md). - -Some useful information on them: -* All the tags can be used to filter the list of models on https://huggingface.co/models. +These are some useful things to know about the metadata in model cards: +* You can filter the list of models on https://huggingface.co/models with tags. * License identifiers are the keywords listed in the right column of [this table](#list-of-license-identifiers). * Dataset, metric, and language identifiers are those listed on the [Datasets](https://huggingface.co/datasets), [Metrics](https://huggingface.co/metrics) and [Languages](https://huggingface.co/languages) pages and in the [`datasets`](https://github.com/huggingface/datasets) repository. You can even specify your **model's eval results** in a structured way, which will allow the Hub to parse, display, and even link them to Papers With Code leaderboards. See how to format this data [in the metadata spec](https://github.com/huggingface/hub-docs/blame/main/modelcard.md). - Here is a partial example (omitting the eval results part): ```yaml --- @@ -71,15 +70,13 @@ If a model includes valid eval results, they will be displayed like this: ![/docs/assets/hub/eval-results.jpg](/docs/assets/hub/eval-results.jpg) ### CO2 Emissions -Among other details, the Model Card is also a great place to store information about the CO2 impact of your model. Visit our [guide on tracking and reporting CO2 emissions](./models-cards-co2) to learn more. +The model card is also a great place to store information about the CO2 impact of your model. Visit our [guide on tracking and reporting CO2 emissions](./models-cards-co2) to learn more. ## FAQ ### How are model tags determined? -Each model page lists all the model's tags in the page header, below the model name. - -Those are primarily computed from the model card metadata, except that we also add some of them automatically, as described in [How is a model's type of inference API and widget determined?](./models-widgets). +Each model page lists all the model's tags in the page header, below the model name. These are primarily computed from the model card metadata, although some are added automatically, as described in [How is a model's type of inference API and widget determined?](./models-widgets). ### Can I specify which framework supports my model? @@ -103,7 +100,7 @@ datasets: ### Can I write LaTeX in my model card? -Yes, we use the [KaTeX](https://katex.org/) math typesetting library to render math formulas server-side, before parsing the markdown. +Yes! We use the [KaTeX](https://katex.org/) math typesetting library to render math formulas server-side before parsing the markdown. You have to use the following delimiters: - `$$ ... $$` for display mode diff --git a/docs/hub/models-inference.md b/docs/hub/models-inference.md index a72b58588..d350b876d 100644 --- a/docs/hub/models-inference.md +++ b/docs/hub/models-inference.md @@ -4,16 +4,16 @@ title: Inference API docs

Inference API

-For detailed usage documentation, please refer to [Accelerated Inference API Documentation](https://api-inference.huggingface.co/docs/python/html/index.html). +Please refer to [Accelerated Inference API Documentation](https://api-inference.huggingface.co/docs/python/html/index.html) for detailed information. ## What technology do you use to power the inference API? -For πŸ€— Transformers models, the API is built on top of our [Pipelines](https://huggingface.co/transformers/main_classes/pipelines.html) feature. +For πŸ€— Transformers models, we power the API through our [Pipelines](https://huggingface.co/transformers/main_classes/pipelines.html) feature. -On top of `Pipelines` and depending on the model type, we build a number of production optimizations like: +On top of `Pipelines` and depending on the model type, we make several production optimizations like: - compiling models to optimized intermediary representations (e.g. [ONNX](https://medium.com/microsoftazure/accelerate-your-nlp-pipelines-using-hugging-face-transformers-and-onnx-runtime-2443578f4333)), -- maintaining a Least Recently Used cache ensuring that the most popular models are always loaded, +- maintaining a Least Recently Used cache, ensuring that the most popular models are always loaded, - scaling the underlying compute infrastructure on the fly depending on the load constraints. For models from [other libraries](/docs/hub/libraries), the API uses [Starlette](https://www.starlette.io) and runs in [Docker containers](https://github.com/huggingface/api-inference-community/tree/main/docker_images). Each library defines the implementation of [different pipelines](https://github.com/huggingface/api-inference-community/tree/main/docker_images/sentence_transformers/app/pipelines). @@ -26,7 +26,7 @@ Specify `inference: false` in your model card's metadata. ## Can I send large volumes of requests? Can I get accelerated APIs? -If you are interested in accelerated inference and/or higher volumes of requests and/or a SLA, please contact us at `api-enterprise at huggingface.co`. +If you are interested in accelerated inference, higher volumes of requests, or an SLA, please contact us at `api-enterprise at huggingface.co`. ## How can I see my usage? diff --git a/docs/hub/models-interacting.md b/docs/hub/models-interacting.md index 5b1c74943..a945f122f 100644 --- a/docs/hub/models-interacting.md +++ b/docs/hub/models-interacting.md @@ -6,24 +6,24 @@ title: Interacting with Models on the Hub ## Accessing models for local use -Since all models are stored on the Model Hub as Git repositories, you can clone the models locally by running: +Since all models on the Model Hub are Git repositories, you can clone the models locally by running: ```bash git lfs install git clone ``` -For detailed information on how to access the model, you can click on the "Use in Transformer" button on any model page. +For detailed information on accessing the model, you can click on the "Use in Transformer" button on any model page. ![Models can be used locally through the "Use in Transformer" button](../assets/hub/models-usage.png) -If the model can be used with `πŸ€— transformers`, you'll even receive snippets to help you get started. +If the model is compatible with `πŸ€— transformers`, you'll even receive snippets to help you get started. ![Snippets for using a model with the πŸ€— transformers library](../assets/hub/models-usage-modal.png) ### Can I access models programmatically? -You can use the [`huggingface_hub`](https://github.com/huggingface/huggingface_hub) library to create, delete, update and retrieve information from repos. You can also use it to download files from repos and integrate it to your own library! For example, you can easily load a Scikit learn model with a few lines. +You can use the [`huggingface_hub`](https://github.com/huggingface/huggingface_hub) library to create, delete, update and retrieve information from repos. You can also download files from repos or integrate them into your library! For example, you can quickly load a Scikit learn model with a few lines. ```py from huggingface_hub import hf_hub_url, cached_download @@ -39,11 +39,11 @@ model = joblib.load(cached_download( ## Uploading models -The first step is to create an account at [Hugging Face](https://huggingface.co/login). The models are shared in the form of Git-based repositories which give you versioning, branches, discoverability and sharing features, integration with over a dozen libraries and more! You have control over what you want to upload to your repository, which could include checkpoints, configs and any other files. +The first step is to create an account at [Hugging Face](https://huggingface.co/login). Models on the Hub are Git-based repositories, which give you versioning, branches, discoverability and sharing features, integration with over a dozen libraries, and more! You have control over what you want to upload to your repository, which could include checkpoints, configs, and any other files. -The repository can either be linked with an individual, such as [osanseviero/fashion_brands_patterns](https://huggingface.co/osanseviero/fashion_brands_patterns) or with an organization, such as [facebook/bart-large-xsum](https://huggingface.co/facebook/bart-large-xsum). Organizations can be used if you want to upload models that are related to a company, community or library! If you choose an organization, the model will be featured on the organization’s page and every member of the organization will have the ability to contribute to the repository. You can create a new organization [here](https://huggingface.co/organizations/new). +You can link repositories with an individual, such as [osanseviero/fashion_brands_patterns](https://huggingface.co/osanseviero/fashion_brands_patterns), or with an organization, such as [facebook/bart-large-xsum](https://huggingface.co/facebook/bart-large-xsum). Organizations can collect models related to a company, community, or library! If you choose an organization, the model will be featured on the organization’s page, and every member of the organization will have the ability to contribute to the repository. You can create a new organization [here](https://huggingface.co/organizations/new). -There are several ways to upload models to the Hub, which are described below. +There are several ways to upload models to the Hub, described below. ### Using the web interface @@ -57,7 +57,7 @@ To create a brand new model repository, visit [huggingface.co/new](http://huggin ![docs/assets/hub/commit-file.png](/docs/assets/hub/commit-file.png) -3. Afterwards click "Commit changes" and your model will be uploaded to the Hub! +3. Afterwards, click **Commit changes** to upload your model to the Hub! 4. Inspect files and history @@ -73,7 +73,7 @@ The UI allows you to explore the model files and commits and to see the diff int You can add metadata to your model card. You can specify: * the type of task this model is for, enabling widgets and the Inference API. -* the used library (`transformers`, `spaCy`, etc) +* the used library (`transformers`, `spaCy`, etc.) * the language * the dataset * metrics @@ -98,31 +98,31 @@ Since model repos are just Git repositories, you can use Git to push your model ### Using the `huggingface_hub` client library -There is a rich feature set in the `huggingface_hub` library which allows you to manage repositories, including creating repos and uploading models to the Model Hub. For more information, visit [the client library's documentation](https://huggingface.co/docs/huggingface_hub/index). +The rich feature set in the `huggingface_hub` library allows you to manage repositories, including creating repos and uploading models to the Model Hub. Visit [the client library's documentation](https://huggingface.co/docs/huggingface_hub/index) to learn more. ## FAQ ### How can I see what dataset was used to train the model? -It's up to the person who uploaded the model to include the training information! You may find the information about the datasets that the model was trained on in the model card. If the datasets that were used for the model are on the Hub, the uploader may have included them in the model card's metadata. In that case, the datasets would be linked with this handy card on the right side of the model page: +It's up to the person who uploaded the model to include the training information! You may find the information about the datasets that the model was trained on in the model card. If the datasets used for the model are on the Hub, the uploader may have included them in the model card's metadata. In that case, the datasets would be linked with a handy card on the right side of the model page: ![Linked datasets for a model](../assets/hub/models-linked-datasets.png) ### How can I see an example of the model in action? -Models can have inference widgets that let you try out the model in the browser! Inference widgets are easy to configure, and there are many kinds to choose from. Visit the [Widgets documentation](models-widgets.md) to learn more. +Models can have inference widgets that let you try out the model in the browser! Inference widgets are easy to configure, and there are many different options at your disposal. Visit the [Widgets documentation](models-widgets.md) to learn more. -The Hugging Face Hub is also home to Spaces, which are interactive demos that can be used to showcase models. If a model has any Spaces associated with it, they'll be linked on the model page like so: +The Hugging Face Hub is also home to Spaces, which are interactive demos used to showcase models. If a model has any Spaces associated with it, you'll find them linked on the model page like so: ![Linked spaces for a model](../assets/hub/models-linked-spaces.png) -Spaces are a great way to show off a model you've made, or to explore new ways to use existing models! Visit the [Spaces documentation](TODO) to learn all about how to make your own. +Spaces are a great way to show off a model you've made or explore new ways to use existing models! Visit the [Spaces documentation](TODO) to learn how to make your own. ### How do I upload an update / new version of the model? -Releasing an update to a model that you've already published can be done by pushing a new commit to your model's repo. To do this, go through the same process that you followed to upload your initial model. Your previous model versions will remain in the repository as previous commits. +Releasing an update to a model that you've already published can be done by pushing a new commit to your model's repo. To do this, go through the same process that you followed to upload your initial model. Your previous model versions will remain in the repository's commit history. ### What if I have a different checkpoint of the model trained on a different dataset? -By convention, each model repo should contain a single checkpoint trained on a particular dataset, and any new checkpoints trained on different datasets should be uploaded to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](./modelcard), or by linking to them in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under *"Other pre-trained model versions"*. +By convention, each model repo should contain a single checkpoint trained on a particular dataset. You should upload any new checkpoints trained on different datasets to the Hub in a new model repo. You can link the models together by using a [tag in your model card's metadata](./modelcard) or by linking to them in the model cards. The [akiyamasho/AnimeBackgroundGAN-Shinkai](https://huggingface.co/akiyamasho/AnimeBackgroundGAN-Shinkai#other-pre-trained-model-versions) model, for example, references other checkpoints in the model card under *"Other pre-trained model versions"*. diff --git a/docs/hub/models-main.md b/docs/hub/models-main.md index 1bddbd394..424140e43 100644 --- a/docs/hub/models-main.md +++ b/docs/hub/models-main.md @@ -4,7 +4,7 @@ title: Models

Models

-The Hugging Face Hub hosts a large number of models that can be used for a [variety of machine learning tasks](https://huggingface.co/tasks). Since models are stored in repositories, each model repo benefits from [all of the features](./repositories-main) that every repo on the Hugging Face Hub comes with. Additionally, model repos have a suite of features that make exploring and using models as easy as possible. These docs will take you through everything you'll need to know to find models on the Hub, upload your own models, and make the most of everything the Model Hub has to offer! +The Hugging Face Hub hosts many models for a [variety of machine learning tasks](https://huggingface.co/tasks). Models are stored in repositories, so they benefit from [all the features](./repositories-main) possessed by every repo on the Hugging Face Hub. Additionally, model repos have attributes that make exploring and using models as easy as possible. These docs will take you through everything you'll need to know to find models on the Hub, upload your models, and make the most of everything the Model Hub offers! ## Contents diff --git a/docs/hub/models-tasks.md b/docs/hub/models-tasks.md index 6fb50ad3e..22282a964 100644 --- a/docs/hub/models-tasks.md +++ b/docs/hub/models-tasks.md @@ -10,16 +10,16 @@ Tasks, or pipeline types, describe the "shape" of each model's API (inputs and o ![/docs/assets/hub/tasks.png](/docs/assets/hub/tasks.png) -This classification is rather coarse-grained (you can always add more fine-grained task names in your model tags), so **you should rarely have to create a new task**. If you do want to add support for a new task, this document explains the required steps. +This classification is relatively coarse-grained (you can always add more fine-grained task names in your model tags), so **you should rarely have to create a new task**. If you want to add support for a new task, this document explains the required steps. ## Overview -Having a new task fully integrated in the Hub means that: +Having a new task integrated into the Hub means that: * Users can search for all models of a given task. * The Inference API supports the task. * Users can try out models directly with the widget. πŸ† -Note that you're not expected to implement all the steps. Adding a new task is a community effort, and multiple people can contribute to it. πŸ§‘β€πŸ€β€πŸ§‘ +Note that you don't need to implement all the steps by yourself. Adding a new task is a community effort, and multiple people can contribute. πŸ§‘β€πŸ€β€πŸ§‘ To begin the process, open a new issue in the [huggingface_hub](https://github.com/huggingface/huggingface_hub/issues) repository. Please use the "Adding a new task" template. ⚠️Before doing any coding, it's suggested to go over this document. ⚠️ @@ -27,11 +27,11 @@ The first step is to upload a model for your proposed task. Once you have a mode * πŸ€— using a `transformers` model * 🐳 using a model from an [officially supported library](/docs/hub/libraries) -* πŸ–¨οΈ using a model with custom inference code. This option is experimental and has downsides, so it's always suggested to use any of the other two approaches if possible. +* πŸ–¨οΈ using a model with custom inference code. This experimental option has downsides, so we recommend using one of the other approaches. -Finally, there are a couple of UI elements that can be added, such as the task icon and the widget, that complete the integration in the Hub. πŸ“· +Finally, you can add a couple of UI elements, such as the task icon and the widget, that complete the integration in the Hub. πŸ“· -Some steps are orthogonal, you don't need to do them in order. **You don't need the Inference API to add the icon.** This means that, even if there isn't full integration at the moment, users can still search for models of a given task. +Some steps are orthogonal; you don't need to do them in order. **You don't need the Inference API to add the icon.** This means that, even if there isn't full integration yet, users can still search for models of a given task. ## Adding new tasks to the Hub @@ -59,20 +59,20 @@ The Hub also supports over 10 open-source libraries in the [Community Inference **My model is not supported by any library. Am I doomed? 😱** -No, you're not! We have an experimental Docker image for quick prototyping of new tasks and the introduction of new libraries. This is the [generic Inference API](https://github.com/huggingface/api-inference-community/tree/main/docker_images/generic) and should allow you to have a new task in production with very little development from your side. +No, you're not! The [generic Inference API](https://github.com/huggingface/api-inference-community/tree/main/docker_images/generic) is an experimental Docker image for quickly prototyping new tasks and introducing new libraries, which should allow you to have a new task in production with very little development from your side. -How does it work from the user's point of view? Users create a copy of a [template](https://huggingface.co/templates) repo for their given task. Users then need to define their `requirements.txt` and fill `pipeline.py`. Note that this is not intended for fast production use cases, but more for quick experimentation and prototyping. +How does it work from the user's point of view? Users create a copy of a [template](https://huggingface.co/templates) repo for their given task. Users then need to define their `requirements.txt` and fill `pipeline.py`. Note that this is intended for quick experimentation and prototyping instead of fast production use-cases. ### UI elements -The Hub allows users to filter models by a given task. In order to do this, you need to add the task to a couple of places and pick an icon for the task. +The Hub allows users to filter models by a given task. To do this, you need to add the task to several places. You'll also get to pick an icon for the task! 1. Add the task type to `Types.ts` In [interfaces/Types.ts](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Types.ts), you need to do a couple of things -* Add the type to `PipelineType`. Note that they are sorted into different categories (NLP, Audio, Computer Vision and others). +* Add the type to `PipelineType`. Note that pipeline types are sorted into different categories (NLP, Audio, Computer Vision, and others). * Specify the task color in `PIPELINE_COLOR`. * Specify the display order in `PIPELINE_TAGS_DISPLAY_ORDER`. @@ -85,4 +85,4 @@ You can add an icon in the [lib/Icons](https://github.com/huggingface/hub-docs/t Once the task is in production, what could be more exciting than implementing some way for users to play directly with the models in their browser? 🀩 You can find all the widgets [here](https://huggingface-widgets.netlify.app/). -In case you would be interested in contributing with a widget, you can look at the [implementation](https://github.com/huggingface/hub-docs/tree/main/js/src/lib/components/InferenceWidget/widgets) of all the widgets. You can also find WIP documentation on how to implement a widget in https://github.com/huggingface/hub-docs/tree/main/js. \ No newline at end of file +If you would be interested in contributing with a widget, you can look at the [implementation](https://github.com/huggingface/hub-docs/tree/main/js/src/lib/components/InferenceWidget/widgets) of all the widgets. You can also find WIP documentation on implementing a widget in https://github.com/huggingface/hub-docs/tree/main/js. \ No newline at end of file diff --git a/docs/hub/models-the-hub.md b/docs/hub/models-the-hub.md index bbe252356..91fb594b3 100644 --- a/docs/hub/models-the-hub.md +++ b/docs/hub/models-the-hub.md @@ -6,7 +6,7 @@ title: The Model Hub ## What is the Model Hub? -The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [`πŸ€— transformers`](https://huggingface.co/docs/transformers/index) for fine-tuning and other usages. To use models in production, they can even be deployed using the [Inference API](./models-inference). +The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [`πŸ€— transformers`](https://huggingface.co/docs/transformers/index) for fine-tuning and other usages. You can even leverage the [Inference API](./models-inference) to use models in production. You can refer to the following video for a guide on navigating the Model Hub: @@ -14,9 +14,9 @@ You can refer to the following video for a guide on navigating the Model Hub: ## Libraries -The Hub supports a number of libraries and we're working on expanding this support! We're happy to welcome to the Hub a set of Open Source libraries that are pushing Machine Learning forward. +The Hub supports many libraries, and we're working on expanding this support! We're happy to welcome to the Hub a set of Open Source libraries that are pushing Machine Learning forward. -The table below summarizes the supported libraries and how they are integrated. Find all our supported libraries [here](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Libraries.ts)! +The table below summarizes the supported libraries and their level of integration. Find all our supported libraries [here](https://github.com/huggingface/hub-docs/blob/main/js/src/lib/interfaces/Libraries.ts)! | Library | Description | Inference API | Widgets | Download from Hub | Push to Hub | |-----------------------|-------------------------------------------------------------------------------|---------------|-------:|-------------------|-------------| diff --git a/docs/hub/models-widgets.md b/docs/hub/models-widgets.md index e9998a87a..1fb0e6343 100644 --- a/docs/hub/models-widgets.md +++ b/docs/hub/models-widgets.md @@ -6,7 +6,7 @@ title: Model Widgets ## What's a widget? -Many model repos have a widget that allows anyone to do inference directly in the browser! +Many model repos have a widget that allows anyone to run inferences directly in the browser! Here are some examples: * [Named Entity Recognition](https://huggingface.co/spacy/en_core_web_sm?text=My+name+is+Sarah+and+I+live+in+London) using [spaCy](https://spacy.io/). @@ -18,13 +18,13 @@ You can try out all the widgets [here](https://huggingface-widgets.netlify.app/) ## Creating a Widget -A widget is automatically created for your model when you upload it to the Hub. To determine which pipeline and widget to display (`text-classification`, `token-classification`, `translation`, etc.), we analyze information in the repo such as the metadata provided in the model card and configuration files. This information is mapped to a single `pipeline_tag`. We choose to expose **only one** widget per model for simplicity. +A widget is automatically created for your model when you upload it to the Hub. To determine which pipeline and widget to display (`text-classification`, `token-classification`, `translation`, etc.), we analyze information in the repo, such as the metadata provided in the model card and configuration files. This information is mapped to a single `pipeline_tag`. We choose to expose **only one** widget per model for simplicity. -For most use cases, the model type is determined from the tags. For example, if there is `tag: text-classification` in the metadata, the inferred `pipeline_tag` will be `text-classification`. +For most use cases, we determine the model type from the tags. For example, if there is `tag: text-classification` in the metadata, the inferred `pipeline_tag` will be `text-classification`. -For `πŸ€— Transformers` however, the model type is determined automatically from `config.json`. The architecture can be used to determine the type: for example, `AutoModelForTokenClassification` corresponds to `token-classification`. If you're really interested in this, you can see pseudo-code in [this gist](https://gist.github.com/julien-c/857ba86a6c6a895ecd90e7f7cab48046). +However, for `πŸ€— Transformers`, the model type is determined automatically from `config.json`. The architecture can determine the type: for example, `AutoModelForTokenClassification` corresponds to `token-classification`. If you're interested in this, you can see pseudo-code in [this gist](https://gist.github.com/julien-c/857ba86a6c6a895ecd90e7f7cab48046). -You can always manually override your pipeline type with pipeline_tag: xxx in your model card metadata. +You can always manually override your pipeline type with `pipeline_tag: xxx` in your model card metadata. ### How can I control my model's widget example input? @@ -113,4 +113,4 @@ inference: temperature: 0.7 ``` -The Inference API allows you to send HTTP requests to models in the Hugging Face Hub. The Inference API is 2x to 10x faster than the widgets! ⚑⚑ Learn more about it by reading the [Inference API documentation](./models-inference). \ No newline at end of file +The Inference API allows you to send HTTP requests to models in the Hugging Face Hub, and it's 2x to 10x faster than the widgets! ⚑⚑ Learn more about it by reading the [Inference API documentation](./models-inference). \ No newline at end of file From e6dc555738c55ff18a4e65b6d532b4903bb7c0e0 Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Mon, 9 May 2022 19:41:26 -0700 Subject: [PATCH 08/10] Apply suggestions from code review Co-authored-by: Steven Liu <59462357+stevhliu@users.noreply.github.com> --- docs/hub/models-cards-co2.md | 2 +- docs/hub/models-cards.md | 8 ++++---- docs/hub/models-interacting.md | 2 +- docs/hub/models-the-hub.md | 2 +- docs/hub/models-widgets.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/hub/models-cards-co2.md b/docs/hub/models-cards-co2.md index 55a96b389..5e01cee8d 100644 --- a/docs/hub/models-cards-co2.md +++ b/docs/hub/models-cards-co2.md @@ -15,7 +15,7 @@ If you can, you should include information about: - where the model was trained (in terms of location) - the hardware used -- e.g. GPU, TPU, or CPU, and how many - training type: pre-training or fine-tuning -- the estimated carbon footprint of the model, calculated in real-time with the [Code Carbon](https://github.com/mlco2/codecarbon) package or after the fact using the [ML CO2 Calculator](https://mlco2.github.io/impact/). +- the estimated carbon footprint of the model, calculated in real-time with the [Code Carbon](https://github.com/mlco2/codecarbon) package or after training using the [ML CO2 Calculator](https://mlco2.github.io/impact/). ## Carbon footprint metadata diff --git a/docs/hub/models-cards.md b/docs/hub/models-cards.md index b9cd39cef..49a3b3738 100644 --- a/docs/hub/models-cards.md +++ b/docs/hub/models-cards.md @@ -6,11 +6,11 @@ title: Model Cards ## What are Model Cards? -Model cards are markdown files that accompany the models and provide handy information. They are essential for discoverability, reproducibility, and sharing! They are the `README.md` file in any model repo. +Model cards are Markdown files that accompany the models and provide handy information. They are essential for discoverability, reproducibility, and sharing! You can find a model card as the `README.md` file in any model repo. The model card should describe: - the model -- its intended uses & potential limitations, including bias and ethical considerations as detailed in [Mitchell, 2018](https://arxiv.org/abs/1810.03993) +- its intended uses & potential limitations, including biases and ethical considerations as detailed in [Mitchell, 2018](https://arxiv.org/abs/1810.03993) - the training params and experimental info (you can embed or link to an experiment tracking platform for reference) - which datasets were used to train your model - your evaluation results @@ -70,7 +70,7 @@ If a model includes valid eval results, they will be displayed like this: ![/docs/assets/hub/eval-results.jpg](/docs/assets/hub/eval-results.jpg) ### CO2 Emissions -The model card is also a great place to store information about the CO2 impact of your model. Visit our [guide on tracking and reporting CO2 emissions](./models-cards-co2) to learn more. +The model card is also a great place to show information about the CO2 impact of your model. Visit our [guide on tracking and reporting CO2 emissions](./models-cards-co2) to learn more. ## FAQ @@ -100,7 +100,7 @@ datasets: ### Can I write LaTeX in my model card? -Yes! We use the [KaTeX](https://katex.org/) math typesetting library to render math formulas server-side before parsing the markdown. +Yes! We use the [KaTeX](https://katex.org/) math typesetting library to render math formulas server-side before parsing the Markdown. You have to use the following delimiters: - `$$ ... $$` for display mode diff --git a/docs/hub/models-interacting.md b/docs/hub/models-interacting.md index a945f122f..292c5fed0 100644 --- a/docs/hub/models-interacting.md +++ b/docs/hub/models-interacting.md @@ -17,7 +17,7 @@ For detailed information on accessing the model, you can click on the "Use in Tr ![Models can be used locally through the "Use in Transformer" button](../assets/hub/models-usage.png) -If the model is compatible with `πŸ€— transformers`, you'll even receive snippets to help you get started. +If the model is compatible with πŸ€— Transformers, you'll even receive snippets to help you get started. ![Snippets for using a model with the πŸ€— transformers library](../assets/hub/models-usage-modal.png) diff --git a/docs/hub/models-the-hub.md b/docs/hub/models-the-hub.md index 91fb594b3..fef7c2467 100644 --- a/docs/hub/models-the-hub.md +++ b/docs/hub/models-the-hub.md @@ -6,7 +6,7 @@ title: The Model Hub ## What is the Model Hub? -The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Pre-trained models are available to be downloaded using the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with [`πŸ€— transformers`](https://huggingface.co/docs/transformers/index) for fine-tuning and other usages. You can even leverage the [Inference API](./models-inference) to use models in production. +The Model Hub is where the members of the Hugging Face community can host all of their model checkpoints for simple storage, discovery, and sharing. Download pre-trained models with the [`huggingface_hub` client library](https://huggingface.co/docs/huggingface_hub/index) or with πŸ€— [`Transformers`](https://huggingface.co/docs/transformers/index) for fine-tuning and other usages. You can even leverage the [Inference API](./models-inference) to use models in production. You can refer to the following video for a guide on navigating the Model Hub: diff --git a/docs/hub/models-widgets.md b/docs/hub/models-widgets.md index 1fb0e6343..b4cafe755 100644 --- a/docs/hub/models-widgets.md +++ b/docs/hub/models-widgets.md @@ -22,7 +22,7 @@ A widget is automatically created for your model when you upload it to the Hub. For most use cases, we determine the model type from the tags. For example, if there is `tag: text-classification` in the metadata, the inferred `pipeline_tag` will be `text-classification`. -However, for `πŸ€— Transformers`, the model type is determined automatically from `config.json`. The architecture can determine the type: for example, `AutoModelForTokenClassification` corresponds to `token-classification`. If you're interested in this, you can see pseudo-code in [this gist](https://gist.github.com/julien-c/857ba86a6c6a895ecd90e7f7cab48046). +However, for πŸ€— Transformers, the model type is determined automatically from `config.json`. The architecture can determine the type: for example, `AutoModelForTokenClassification` corresponds to `token-classification`. If you're interested in this, you can see pseudo-code in [this gist](https://gist.github.com/julien-c/857ba86a6c6a895ecd90e7f7cab48046). You can always manually override your pipeline type with `pipeline_tag: xxx` in your model card metadata. From fb6073289cb8808af1106515dac0296526da2b1e Mon Sep 17 00:00:00 2001 From: Nima Boscarino Date: Wed, 11 May 2022 00:18:40 -0700 Subject: [PATCH 09/10] Address review comments --- docs/hub/models-cards.md | 39 ++++++++++++++------------------------ docs/hub/models-the-hub.md | 2 +- docs/hub/models-widgets.md | 4 ++-- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/docs/hub/models-cards.md b/docs/hub/models-cards.md index 49a3b3738..10188aaa1 100644 --- a/docs/hub/models-cards.md +++ b/docs/hub/models-cards.md @@ -39,12 +39,21 @@ metrics: --- ``` -You can find the detailed specification [here](https://github.com/huggingface/hub-docs/blame/main/modelcard.md). +You can also specify the supported frameworks in the model card metadata section: -These are some useful things to know about the metadata in model cards: -* You can filter the list of models on https://huggingface.co/models with tags. -* License identifiers are the keywords listed in the right column of [this table](#list-of-license-identifiers). -* Dataset, metric, and language identifiers are those listed on the [Datasets](https://huggingface.co/datasets), [Metrics](https://huggingface.co/metrics) and [Languages](https://huggingface.co/languages) pages and in the [`datasets`](https://github.com/huggingface/datasets) repository. +```yaml +tags: +- flair +``` + +Find more about our supported libraries [here](./models-the-hub#libraries), and see the detailed model card specification [here](https://github.com/huggingface/hub-docs/blame/main/modelcard.md). + +The metadata that you add to the model card enables certain interactions on the Hub. For example: +* The tags that you add to the metadata allow users to filter and discover models at https://huggingface.co/models. +* If you choose a license using the keywords listed in the right column of [this table](#list-of-license-identifiers), the license will be displayed on the model page. +* Adding datasets to the metadata will add a message reading `Datasets used to train:` to your model card and link the relevant datasets, if they're available on the Hub. + +Dataset, metric, and language identifiers are those listed on the [Datasets](https://huggingface.co/datasets), [Metrics](https://huggingface.co/metrics) and [Languages](https://huggingface.co/languages) pages and in the [`datasets`](https://github.com/huggingface/datasets) repository. You can even specify your **model's eval results** in a structured way, which will allow the Hub to parse, display, and even link them to Papers With Code leaderboards. See how to format this data [in the metadata spec](https://github.com/huggingface/hub-docs/blame/main/modelcard.md). @@ -78,26 +87,6 @@ The model card is also a great place to show information about the CO2 Date: Wed, 11 May 2022 00:21:06 -0700 Subject: [PATCH 10/10] move deprecated content to its own folder --- docs/hub/_sections.yml | 45 ------------------- docs/hub/{ => deprecated}/adding-a-library.md | 0 docs/hub/{ => deprecated}/adding-a-model.md | 0 docs/hub/{ => deprecated}/adding-a-task.md | 0 docs/hub/{ => deprecated}/datasets-tags.md | 0 docs/hub/{ => deprecated}/endpoints.md | 0 .../hub/{ => deprecated}/how-to-downstream.md | 0 docs/hub/{ => deprecated}/how-to-inference.md | 0 docs/hub/{ => deprecated}/how-to-upstream.md | 0 docs/hub/{ => deprecated}/inference.md | 0 docs/hub/{ => deprecated}/input-examples.md | 0 docs/hub/{ => deprecated}/libraries.md | 0 docs/hub/{ => deprecated}/main.md | 0 docs/hub/{ => deprecated}/model-repos.md | 0 docs/hub/{ => deprecated}/org-cards.md | 0 .../hub/{ => deprecated}/searching-the-hub.md | 0 docs/hub/{ => deprecated}/security.md | 0 docs/hub/{ => deprecated}/spaces.md | 0 .../{ => deprecated}/tutorial-add-library.md | 0 19 files changed, 45 deletions(-) rename docs/hub/{ => deprecated}/adding-a-library.md (100%) rename docs/hub/{ => deprecated}/adding-a-model.md (100%) rename docs/hub/{ => deprecated}/adding-a-task.md (100%) rename docs/hub/{ => deprecated}/datasets-tags.md (100%) rename docs/hub/{ => deprecated}/endpoints.md (100%) rename docs/hub/{ => deprecated}/how-to-downstream.md (100%) rename docs/hub/{ => deprecated}/how-to-inference.md (100%) rename docs/hub/{ => deprecated}/how-to-upstream.md (100%) rename docs/hub/{ => deprecated}/inference.md (100%) rename docs/hub/{ => deprecated}/input-examples.md (100%) rename docs/hub/{ => deprecated}/libraries.md (100%) rename docs/hub/{ => deprecated}/main.md (100%) rename docs/hub/{ => deprecated}/model-repos.md (100%) rename docs/hub/{ => deprecated}/org-cards.md (100%) rename docs/hub/{ => deprecated}/searching-the-hub.md (100%) rename docs/hub/{ => deprecated}/security.md (100%) rename docs/hub/{ => deprecated}/spaces.md (100%) rename docs/hub/{ => deprecated}/tutorial-add-library.md (100%) diff --git a/docs/hub/_sections.yml b/docs/hub/_sections.yml index 751064cc2..3d1f97095 100644 --- a/docs/hub/_sections.yml +++ b/docs/hub/_sections.yml @@ -6,48 +6,3 @@ - local: models-main title: Models - -- local: main - title: Hub documentation - -- local: model-repos - title: Everything you wanted to know about repos - -- local: adding-a-model - title: Adding a model to the Hub - -- local: libraries - title: Libraries - -- local: inference - title: Inference - -- local: endpoints - title: Hub API Endpoints - -- local: spaces - title: Spaces documentation - -- local: org-cards - title: Organization cards - -- local: adding-a-library - title: Integrate a library with the Hub - -- local: searching-the-hub - title: How to search the Hub efficiently - -- local: how-to-downstream - title: How to download files from the Hub - -- local: how-to-upstream - title: How to create repositories and upload files to the Hub - -- local: how-to-inference - title: How to use the Inference API from the Hub library - -- local: adding-a-task - title: Adding a new task to the Hub - -- local: security - title: Security tips diff --git a/docs/hub/adding-a-library.md b/docs/hub/deprecated/adding-a-library.md similarity index 100% rename from docs/hub/adding-a-library.md rename to docs/hub/deprecated/adding-a-library.md diff --git a/docs/hub/adding-a-model.md b/docs/hub/deprecated/adding-a-model.md similarity index 100% rename from docs/hub/adding-a-model.md rename to docs/hub/deprecated/adding-a-model.md diff --git a/docs/hub/adding-a-task.md b/docs/hub/deprecated/adding-a-task.md similarity index 100% rename from docs/hub/adding-a-task.md rename to docs/hub/deprecated/adding-a-task.md diff --git a/docs/hub/datasets-tags.md b/docs/hub/deprecated/datasets-tags.md similarity index 100% rename from docs/hub/datasets-tags.md rename to docs/hub/deprecated/datasets-tags.md diff --git a/docs/hub/endpoints.md b/docs/hub/deprecated/endpoints.md similarity index 100% rename from docs/hub/endpoints.md rename to docs/hub/deprecated/endpoints.md diff --git a/docs/hub/how-to-downstream.md b/docs/hub/deprecated/how-to-downstream.md similarity index 100% rename from docs/hub/how-to-downstream.md rename to docs/hub/deprecated/how-to-downstream.md diff --git a/docs/hub/how-to-inference.md b/docs/hub/deprecated/how-to-inference.md similarity index 100% rename from docs/hub/how-to-inference.md rename to docs/hub/deprecated/how-to-inference.md diff --git a/docs/hub/how-to-upstream.md b/docs/hub/deprecated/how-to-upstream.md similarity index 100% rename from docs/hub/how-to-upstream.md rename to docs/hub/deprecated/how-to-upstream.md diff --git a/docs/hub/inference.md b/docs/hub/deprecated/inference.md similarity index 100% rename from docs/hub/inference.md rename to docs/hub/deprecated/inference.md diff --git a/docs/hub/input-examples.md b/docs/hub/deprecated/input-examples.md similarity index 100% rename from docs/hub/input-examples.md rename to docs/hub/deprecated/input-examples.md diff --git a/docs/hub/libraries.md b/docs/hub/deprecated/libraries.md similarity index 100% rename from docs/hub/libraries.md rename to docs/hub/deprecated/libraries.md diff --git a/docs/hub/main.md b/docs/hub/deprecated/main.md similarity index 100% rename from docs/hub/main.md rename to docs/hub/deprecated/main.md diff --git a/docs/hub/model-repos.md b/docs/hub/deprecated/model-repos.md similarity index 100% rename from docs/hub/model-repos.md rename to docs/hub/deprecated/model-repos.md diff --git a/docs/hub/org-cards.md b/docs/hub/deprecated/org-cards.md similarity index 100% rename from docs/hub/org-cards.md rename to docs/hub/deprecated/org-cards.md diff --git a/docs/hub/searching-the-hub.md b/docs/hub/deprecated/searching-the-hub.md similarity index 100% rename from docs/hub/searching-the-hub.md rename to docs/hub/deprecated/searching-the-hub.md diff --git a/docs/hub/security.md b/docs/hub/deprecated/security.md similarity index 100% rename from docs/hub/security.md rename to docs/hub/deprecated/security.md diff --git a/docs/hub/spaces.md b/docs/hub/deprecated/spaces.md similarity index 100% rename from docs/hub/spaces.md rename to docs/hub/deprecated/spaces.md diff --git a/docs/hub/tutorial-add-library.md b/docs/hub/deprecated/tutorial-add-library.md similarity index 100% rename from docs/hub/tutorial-add-library.md rename to docs/hub/deprecated/tutorial-add-library.md

%$_Nps}~LPDZthV7js(GWs? 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