Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[i18n-FR] Translated "Integrations" to french (sub PR of 1900) #2329

Merged
merged 133 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
cbde7dc
Translated toctree & git_vs_htttp
Dec 9, 2023
7d596f8
Translated the cli guide
Dec 10, 2023
9ab5ba7
Testing to see if user is well configured
Dec 10, 2023
5646220
TEsting to see if branch is well configured
Dec 10, 2023
8d3cd26
Translated index
Dec 10, 2023
2687f87
Translated quick-start
Dec 10, 2023
7aff9fd
Corrected a minor error in the english doc
JibrilEl Dec 11, 2023
9fd8930
Reverting a wrong change
JibrilEl Dec 11, 2023
1ea5fc7
Translated installation.md
JibrilEl Dec 11, 2023
66c11a3
Translated community.md
JibrilEl Dec 11, 2023
d2b4c30
Translated download.md
JibrilEl Dec 11, 2023
87b5bbe
Translated hf_file_system.md
JibrilEl Dec 11, 2023
d18cbf9
Translated inference_client
JibrilEl Dec 11, 2023
3f3e831
Translated inference_endpoints.md
JibrilEl Dec 11, 2023
d492923
Fixed a few errors in the translation
JibrilEl Dec 12, 2023
1127be0
Translated integrations.md
JibrilEl Dec 13, 2023
c12624a
Translated mana-cache.md. Did not find a good translfation for cache-…
JibrilEl Dec 14, 2023
a56ee9b
Translated manage-space.md
JibrilEl Dec 15, 2023
158220b
Translated overview.md
JibrilEl Dec 16, 2023
9e2910a
Translated package-reference file
JibrilEl Dec 16, 2023
f7ec79f
Translated hf_api, login, mixins, repository, space_runtime and tenso…
JibrilEl Dec 18, 2023
c043949
Finished the translation of package reference by translating utilitie…
JibrilEl Dec 19, 2023
f2abc0e
Translated model-cards.md
JibrilEl Dec 20, 2023
2aff74f
Translated collections.md
JibrilEl Dec 27, 2023
9189ef8
translated community.md
JibrilEl Dec 28, 2023
df12926
Translated download.md, corrected an error in the english version and…
JibrilEl Dec 29, 2023
621b58c
translated hf_file_system
JibrilEl Dec 30, 2023
f7f7190
Translated inference_endpoints.md
JibrilEl Jan 1, 2024
4a250a5
Translated inference.md
JibrilEl Jan 2, 2024
ea0137b
translated repository.md
JibrilEl Jan 3, 2024
f521215
Translated search.md
JibrilEl Jan 3, 2024
8ab86fb
Translated webhooks_server.md
JibrilEl Jan 3, 2024
c420deb
corrected webhooks
JibrilEl Jan 4, 2024
ca05e4e
Translated upload.md
JibrilEl Jan 4, 2024
a166872
Added "fr" to .github/workflow
JibrilEl Jan 7, 2024
a6bff36
Deleted redirects as it is not needed
JibrilEl Jan 7, 2024
6946056
Corrected toctree.yml
JibrilEl Jan 7, 2024
c1af8c0
Corrected errors o quick-start.md
JibrilEl Jan 7, 2024
5569ed9
Corrected installation.md
JibrilEl Jan 8, 2024
913454f
Changed the translation of the product "space" in the whole documenta…
JibrilEl Jan 10, 2024
4187a37
Corrected git_vs_http
JibrilEl Feb 2, 2024
5617984
Corrected CLI.md
JibrilEl Feb 2, 2024
48c4612
Corrected collections.md
JibrilEl Feb 2, 2024
7efb701
Corrected community.md
JibrilEl Feb 3, 2024
de03384
Corrected download.md
JibrilEl Feb 3, 2024
353fa23
Corrected hf_file_system
JibrilEl Feb 3, 2024
1fad9bd
Correction of docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 9, 2024
5089a9a
Corrected git vs http and index.md
JibrilEl Feb 9, 2024
101e35c
Merge branch 'main' of https://github.com/JibrilEl/huggingface_hub
JibrilEl Feb 9, 2024
82c8a79
Finished correcting index.md
JibrilEl Feb 9, 2024
499cd8c
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
5655476
Update docs/source/fr/_toctree.yml
JibrilEl Feb 9, 2024
3e50bad
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
afbf7db
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
1625548
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
dd88260
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
1759188
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
28daada
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
06dc88f
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
8cf7df0
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
3cb34a5
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
925b655
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
07d3824
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
ad44254
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
e366b2c
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
6d37e1c
Update docs/source/fr/installation.md
JibrilEl Feb 9, 2024
e5b6ded
Finished correcting index.md
JibrilEl Feb 9, 2024
900dcce
Merge branch 'main' of https://github.com/JibrilEl/huggingface_hub
JibrilEl Feb 9, 2024
3c75477
Corrected inference endpoint, a lot of mistakes might have to look at…
JibrilEl Feb 13, 2024
5637113
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
a735616
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
8a578f2
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
8782aed
Update docs/source/fr/_toctree.yml
JibrilEl Feb 16, 2024
d38bf37
Update docs/source/fr/_toctree.yml
JibrilEl Feb 16, 2024
64e18b7
Update docs/source/fr/_toctree.yml
JibrilEl Feb 16, 2024
8423a9e
Update docs/source/fr/_toctree.yml
JibrilEl Feb 16, 2024
c618150
Update docs/source/fr/_toctree.yml
JibrilEl Feb 16, 2024
8666812
Update docs/source/fr/_toctree.yml
JibrilEl Feb 16, 2024
7cdefa2
Update docs/source/fr/_toctree.yml
JibrilEl Feb 16, 2024
2b19af2
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
8924212
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
2475344
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
8ce66cf
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
bdd7733
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
5ea15ea
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
fc85362
Update docs/source/fr/concepts/git_vs_http.md
JibrilEl Feb 16, 2024
34c49a7
Deleted files
JibrilEl Jun 7, 2024
63b0dd2
Revert "Deleted files"
JibrilEl Jun 7, 2024
a5f0d54
Deleted files
JibrilEl Jun 7, 2024
64d4f60
Merge remote-tracking branch 'upstream/main'
JibrilEl Jun 12, 2024
44f2734
Deleted files
JibrilEl Jun 7, 2024
ce1d18f
Delete files
JibrilEl Jun 12, 2024
624bdca
Merge branch 'integrations' of https://github.com/JibrilEl/huggingfac…
JibrilEl Jun 12, 2024
33485b4
Update docs/source/fr/_toctree.yml
JibrilEl Jun 21, 2024
016a0c7
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
d1e45f7
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
4ed7979
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
24c00ae
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
0e57918
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
2f0af2a
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
ac2ddae
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
5cbd2a5
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
7820f8b
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
9c9671b
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
eae1ecc
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
e86816e
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
3ba71e3
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
edd4c64
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
6de4850
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
81f499b
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
6900c72
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
359181c
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
fab861f
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
b3281a2
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
d4e9e95
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
487dbfa
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
89bfa57
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
a101bab
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
251e8e9
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
6cb7f01
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
61514fe
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
74d17c9
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
e1b6419
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
80fc05f
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
7ca5c0b
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
7b0a598
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
5519c3f
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
e2d5330
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
f4873f3
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
9f0f1e9
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
dc49729
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
b4297c4
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
12c6274
Update docs/source/fr/guides/integrations.md
JibrilEl Jun 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion docs/source/fr/_toctree.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,7 @@
- title: "Concepts"
sections:
- local: concepts/git_vs_http
title: Git ou HTTP?
title: Git ou HTTP?
- title: "Guides"
- local: guides/integrations
title: Intégrer dans une librarie
275 changes: 275 additions & 0 deletions docs/source/fr/guides/integrations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,275 @@
<!--⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
rendered properly in your Markdown viewer.
-->

# Intégrez votre framework de ML avec le Hub

Le Hugging Face Hub facilite l'hébergement et le partage de modèles et de jeux de données.
Des [dizaines de librairies](https://huggingface.co/docs/hub/models-libraries) sont intégrées à cet écosysteme. La communauté travaille constamment à en intégrer de nouvelles et contribue ainsi à faciliter la collaboration dans le milieu du machine learning. La librairie `huggingface_hub` joue un rôle clé dans ce processus puisqu'elle permet d'interagir avec le Hub depuis n'importe quel script Python.

Il existe quatre façons principales d'intégrer une bibliothèque au Hub :
1. **Push to Hub** implémente une méthode pour upload un modèle sur le Hub. Cela inclut les paramètres du modèle, sa fiche descriptive (appelée [Model Card](https://huggingface.co/docs/huggingface_hub/how-to-model-cards)) et toute autre information pertinente lié au modèle (par exemple, les logs d'entrainement). Cette méthode est souvent appelée `push_to_hub()`.
2. **Download from Hub** implémente une méthode pour charger un modèle depuis le Hub. La méthode doit télécharger la configuration et les poids du modèle puis instancier celui-ci. Cette méthode est souvent appelée `from_pretrained` ou `load_from_hub()`.
3. **Inference API** utilise nos serveurs pour faire de l'inférence gratuitement sur des modèles supportés par votre librairie.
4. **Widgets** affiche un widget sur la page d'accueil de votre modèle dans le Hub. Les widgets permettent aux utilisateurs de rapidement tester un modèle depuis le navigateur.

Dans ce guide, nous nous concentreront sur les deux premiers sujets. Nous présenterons les deux approches principales que vous pouvez utiliser pour intégrer une librairie, avec leurs avantages et leurs inconvénients. Tout est résumé à la fin du guide pour vous aider à choisir entre les deux. Veuillez garder à l'esprit que ce ne sont que des conseils, et vous êtes libres de les adapter à votre cas d'usage.

Si l'Inference API et les Widgets vous intéressent, vous pouvez suivre [ce guide](https://huggingface.co/docs/hub/models-adding-libraries#set-up-the-inference-api). Dans les deux cas, vous pouvez nous contacter si vous intégrez une librairie au Hub et que vous voulez être listée [dans la documentation officielle](https://huggingface.co/docs/hub/models-libraries).

## Une approche flexible: les helpers

La première approche pour intégrer une librairie au Hub est d'implémenter les méthodes `push_to_hub` et `from_pretrained`
vous même. Ceci vous donne une flexibilité totale sur le choix du fichier que vous voulez upload/download et sur comment
gérer les inputs spécifiques à votre framework. Vous pouvez vous référer aux guides : [upload des fichiers](./upload)
et [télécharger des fichiers](./download) pour en savoir plus sur la manière de faire. Par example, c'est de cette manière que l'intégration
de FastAI est implémentée (voir [`push_to_hub_fastai`] et [`from_pretrained_fastai`]).

L'implémentation peut varier entre différentes librairies, mais le workflow est souvent similaire.

### from_pretrained

Voici un exemple classique pour implémenter la méthode `from_pretrained`:

```python
def from_pretrained(model_id: str) -> MyModelClass:
# Téléchargement des paramètres depuis le Hub
cached_model = hf_hub_download(
repo_id=repo_id,
filename="model.pkl",
library_name="fastai",
library_version=get_fastai_version(),
)

# Instanciation du modèle
return load_model(cached_model)
```

### push_to_hub

La méthode `push_to_hub` demande souvent un peu plus de complexité pour gérer la création du dépôt git, générer la model card et enregistrer les paramètres.
Une approche commune est de sauvegarder tous ces fichiers dans un dossier temporaire, les transférer sur le Hub avant de les supprimer localement.

```python
def push_to_hub(model: MyModelClass, repo_name: str) -> None:
api = HfApi()

# Créez d'un dépôt s'il n'existe pas encore, et obtenez le repo_id associé
repo_id = api.create_repo(repo_name, exist_ok=True).repo_id

# Sauvegardez tous les fichiers dans un chemin temporaire, et pushez les en un seul commit
with TemporaryDirectory() as tmpdir:
tmpdir = Path(tmpdir)

# Sauvegardez les poids
save_model(model, tmpdir / "model.safetensors")

# Générez la model card
card = generate_model_card(model)
(tmpdir / "README.md").write_text(card)

# Sauvegardez les logs
# Sauvegardez le métriques d'évaluation
# ...

# Pushez vers le Hub
return api.upload_folder(repo_id=repo_id, folder_path=tmpdir)
```

Ceci n'est qu'un exemple. Si vous êtes intéressés par des manipulations plus complexes (supprimer des fichiers distants,
upload des poids à la volée, maintenir les poids localement, etc.) consultez le guide [upload des fichiers](./upload).

### Limitations

Bien que très flexible, cette approche a quelques défauts, particulièrement en terme de maintenance. Les utilisateurs
d'Hugging Face sont habitués à utiliser des certaines fonctionnalités lorsqu'ils travaillent avec `huggingface_hub`. Par exemple,
lors du chargement de fichiers depuis le Hub, il est commun de passer des paramètres tels que:
- `token`: pour télécharger depuis un dépôt privé
- `revision`: pour télécharger depuis une branche spécifique
- `cache_dir`: pour paramétrer la mise en cache des fichiers
- `force_download`: pour désactiver le cache
- `api_endpoint`/`proxies`: pour configurer la session HTTP

Lorsque vous pushez des modèles, des paramètres similaires sont utilisables:
- `commit_message`: message de commit personnalisé
- `private`: créé un dépôt privé s'il en manque un
- `create_pr`: créé un pull request au lieu de push vers `main`
- `branch`: push vers une branche au lieu de push sur `main`
- `allow_patterns`/`ignore_patterns`: filtre les fichiers à upload
- `token`
- `api_endpoint`
- ...

Tous ces paramètres peuvent être ajoutés aux implémentations vues ci dessus et passés aux méthodes de `huggingface_hub`.
Toutefois, si un paramètre change ou qu'une nouvelle fonctionnalité est ajoutée, vous devrez mettre à jour votre package.
Supporter ces paramètres implique aussi plus de documentation à maintenir de votre côté. Dans la prochaine section, nous allons voir comment dépasser ces limitations.

## Une approche plus complexe: l'héritage de classe

Comme vu ci-dessus, deux méthodes principales sont à inclure dans votre librairie pour l'intégrer avec le Hub:
la méthode permettant d'upload des fichiers (`push_to_hub`) et celle pour télécharger des fichiers (`from_pretrained`).
Vous pouvez implémenter ces méthodes vous-même mais cela a des inconvénients. Pour gérer ça, `huggingface_hub` fournit
un outil qui utilise l'héritage de classe. Regardons comment ça marche !

Dans beaucoup de cas, une librairie définit déjà les modèles comme des classes Python. La classe contient les
propriétés du modèle et des méthodes pour charger, lancer, entrainer et évaluer le modèle. Notre approche est d'étendre
cette classe pour inclure les fonctionnalités upload et download en utilisant les mixins. Une [mixin](https://stackoverflow.com/a/547714)
est une classe qui est faite pour étendre une classe existante avec une liste de fonctionnalités spécifiques en utilisant l'héritage de classe.
`huggingface_hub` offre son propre mixin, le [`ModelHubMixin`]. La clef ici est de comprendre son comportement et comment le customiser.

La classe [`ModelHubMixin`] implémente 3 méthodes *public* (`push_to_hub`, `save_pretrained` et `from_pretrained`). Ce
sont les méthodes que vos utilisateurs appeleront pour charger/enregistrer des modèles avec votre librairie.
[`ModelHubMixin`] définit aussi 2 méthodes *private* (`_save_pretrained` et `from_pretrained`). Ce sont celle que vous
devez implémenter. Ainsi, pour intégrer votre librairie, vous devez :

1. Faire en sorte que votre classe Model hérite de [`ModelHubMixin`].
2. Implémenter les méthodes privées:
- [`~ModelHubMixin._save_pretrained`]: méthode qui prend en entrée un chemin vers un directory et qui sauvegarde le modèle.
Vous devez écrire toute la logique pour dump votre modèle de cette manière: model card, poids du modèle, fichiers de configuration,
et logs d'entrainement. Toute information pertinente pour ce modèle doit être gérée par cette méthode. Les
[model cards](https://huggingface.co/docs/hub/model-cards) sont particulièrement importantes pour décrire votre modèle. Vérifiez
[notre guide d'implémentation](./model-cards) pour plus de détails.
- [`~ModelHubMixin._from_pretrained`]: **méthode de classe** prenant en entrée un `model_id` et qui retourne un modèle instancié.
Cette méthode doit télécharger un ou plusieurs fichier(s) et le(s) charger.
3. Fini!

L'avantage d'utiliser [`ModelHubMixin`] est qu'une fois que vous vous êtes occupés de la sérialisation et du chargement du fichier,
vous êtes prêts. Vous n'avez pas besoin de vous soucier de la création du dépôt, des commits, des pull requests ou des révisions.
Tout ceci est géré par le mixin et est disponible pour vos utilisateurs. Le Mixin s'assure aussi que les méthodes publiques sont
bien documentées et que les annotations de typage sont spécifiées.

### Un exemple concret: PyTorch

Un bon exemple de ce que nous avons vu ci-dessus est [`PyTorchModelHubMixin`], notre intégration pour le framework PyTorch.
C'est une intégration prête à l'emploi.

#### Comment l'utiliser ?

Voici comment n'importe quel utilisateur peut charger/enregistrer un modèle Pytorch depuis/vers le Hub:

```python
>>> import torch
>>> import torch.nn as nn
>>> from huggingface_hub import PyTorchModelHubMixin

# 1. Définissez votre modèle Pytorch exactement comme vous êtes habitués à le faire
>>> class MyModel(nn.Module, PyTorchModelHubMixin): # héritage multiple
... def __init__(self):
... super().__init__()
... self.param = nn.Parameter(torch.rand(3, 4))
... self.linear = nn.Linear(4, 5)

... def forward(self, x):
... return self.linear(x + self.param)
>>> model = MyModel()

# 2. (optionnel) Sauvegarder le modèle dans un chemin local
>>> model.save_pretrained("path/to/my-awesome-model")

# 3. Pushez les poids du modèle vers le Hub
>>> model.push_to_hub("my-awesome-model")

# 4. initialisez le modèle depuis le Hub
>>> model = MyModel.from_pretrained("username/my-awesome-model")
```

#### Implémentation

L'implémentation est très succincte (voir [ici](https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/hub_mixin.py)).

1. Premièrement, faites hériter votre classe de `ModelHubMixin`:

```python
from huggingface_hub import ModelHubMixin

class PyTorchModelHubMixin(ModelHubMixin):
(...)
```

2. Implémentez la méthode `_save_pretrained`:

```py
from huggingface_hub import ModelCard, ModelCardData

class PyTorchModelHubMixin(ModelHubMixin):
(...)

def _save_pretrained(self, save_directory: Path):
"""Générez une model card et enregistrez les poids d'un modèle Pytroch vers un chemin local."""
model_card = ModelCard.from_template(
card_data=ModelCardData(
license='mit',
library_name="pytorch",
...
),
model_summary=...,
model_type=...,
...
)
(save_directory / "README.md").write_text(str(model))
torch.save(obj=self.module.state_dict(), f=save_directory / "pytorch_model.bin")
```

3. Implémentez la méthode `_from_pretrained`:

```python
class PyTorchModelHubMixin(ModelHubMixin):
(...)

@classmethod # Doit absolument être une méthode de clase !
def _from_pretrained(
cls,
*,
model_id: str,
revision: str,
cache_dir: str,
force_download: bool,
proxies: Optional[Dict],
resume_download: bool,
local_files_only: bool,
token: Union[str, bool, None],
map_location: str = "cpu", # argument supplémentaire
strict: bool = False, # argument supplémentaire
**model_kwargs,
):
"""Chargez les poids pré-entrainés et renvoyez les au modèle chargé."""
if os.path.isdir(model_id): # Peut être un chemin local
print("Loading weights from local directory")
model_file = os.path.join(model_id, "pytorch_model.bin")
else: # Ou un modèle du Hub
model_file = hf_hub_download( # Téléchargez depuis le Hub, en passant le mêmes arguments d'entrée
repo_id=model_id,
filename="pytorch_model.bin",
revision=revision,
cache_dir=cache_dir,
force_download=force_download,
proxies=proxies,
resume_download=resume_download,
token=token,
local_files_only=local_files_only,
)

# Chargez le modèle et reoutnez une logique personnalisée dépendant de votre framework
model = cls(**model_kwargs)
state_dict = torch.load(model_file, map_location=torch.device(map_location))
model.load_state_dict(state_dict, strict=strict)
model.eval()
return model
```

Et c'est fini ! Votre librairie permet maintenant aux utilisateurs d'upload et de télécharger des fichiers vers et depuis le Hub.

## Comparaison

Résumons rapidement les deux approches que nous avons vu avec leurs avantages et leurs défauts. Le tableau ci-dessous
est purement indicatif. Votre framework aura peut-êre des spécifités à prendre en compte. Ce guide
est ici pour vous donner des indications et des idées sur comment gérer l'intégration. Dans tous les cas,
n'hésitez pas à nous contacter si vous avez une question !

<!-- Généré en utilisant https://www.tablesgenerator.com/markdown_tables -->
| Intégration | Utilisant des helpers | Utilisant [`ModelHubMixin`] |
|:---:|:---:|:---:|
| Expérience utilisateur | `model = load_from_hub(...)`<br>`push_to_hub(model, ...)` | `model = MyModel.from_pretrained(...)`<br>`model.push_to_hub(...)` |
| Flexible | Très flexible.<br>Vous controllez complètement l'implémentation. | Moins flexible.<br>Votre framework doit avoir une classe de modèle. |
| Maintenance | Plus de maintenance pour ajouter du support pour la configuration, et de nouvelles fonctionnalités. Peut aussi nécessiter de fixx des problèmes signalés par les utilisateurs.| Moins de maintenance vu que la plupart des intégrations avec le Hub sont implémentés dans `huggingface_hub` |
| Documentation / Anotation de type| A écrire à la main | Géré partiellement par `huggingface_hub`. |
Loading