381 votes

La meilleure façon de sauvegarder un modèle formé dans PyTorch ?

Je cherchais des moyens alternatifs pour sauvegarder un modèle formé dans PyTorch. Jusqu'à présent, j'ai trouvé deux alternatives.

  1. torche.save() pour sauvegarder un modèle et torche.load() pour charger un modèle.
  2. modèle.state_dict() pour sauvegarder un modèle formé et modèle.load_state_dict() pour charger le modèle sauvegardé.

Je suis tombé sur ceci discussion où l'approche 2 est recommandée par rapport à l'approche 1.

Ma question est la suivante : pourquoi la deuxième approche est-elle préférable ? Est-ce seulement parce que torche.nn les modules ont ces deux fonctions et nous sommes encouragés à les utiliser ?

3 votes

Je pense que c'est parce que torch.save() enregistre toutes les variables intermédiaires ainsi, comme les sorties intermédiaires pour l'utilisation de la rétro propagation. Mais vous avez seulement besoin de sauvegarder les paramètres du modèle, comme le poids/le biais, etc. Parfois, le premier peut être beaucoup plus grand que le second.

3 votes

J'ai testé torch.save(model, f) y torch.save(model.state_dict(), f) . Les fichiers enregistrés ont la même taille. Maintenant je suis confus. De plus, j'ai trouvé l'utilisation de pickle pour sauvegarder model.state_dict() extrêmement lente. Je pense que le meilleur moyen est d'utiliser torch.save(model.state_dict(), f) puisque vous vous occupez de la création du modèle, et que Torch s'occupe du chargement des poids du modèle, ce qui élimine les problèmes éventuels. Référence : discuss.pytorch.org/t/saving-torch-models/838/4

2 votes

Il semble que PyTorch ait abordé cette question de manière un peu plus explicite dans son document intitulé section des didacticiels -Vous y trouverez de nombreuses informations utiles qui ne figurent pas dans les réponses données ici, notamment la sauvegarde de plusieurs modèles à la fois et le démarrage à chaud des modèles.

6voto

ukemi Points 3499

Sauvegarde locale

La façon dont vous enregistrez votre modèle dépend de la façon dont vous voulez y accéder à l'avenir. Si vous pouvez appeler une nouvelle instance de la classe model tout ce que vous avez à faire est de sauvegarder/charger les poids du modèle avec model.state_dict() :

# Save:
torch.save(old_model.state_dict(), PATH)

# Load:
new_model = TheModelClass(*args, **kwargs)
new_model.load_state_dict(torch.load(PATH))

Si vous ne pouvez pas le faire pour une raison quelconque (ou si vous préférez une syntaxe plus simple), vous pouvez sauvegarder le modèle entier (en fait une référence au(x) fichier(s) définissant le modèle, ainsi que son state_dict) avec torch.save() :

# Save:
torch.save(old_model, PATH)

# Load:
new_model = torch.load(PATH)

Mais comme il s'agit d'une référence à l'emplacement des fichiers définissant la classe modèle, ce code n'est pas portable à moins que ces fichiers ne soient également portés dans la même structure de répertoire.

Sauvegarde dans le nuage - TorchHub

Si vous souhaitez que votre modèle soit portable, vous pouvez facilement permettre qu'il soit importé à l'aide de la fonction torch.hub . Si vous ajoutez un hubconf.py dans un répertoire github, qui peut être facilement appelé à partir de PyTorch pour permettre aux utilisateurs de charger votre modèle avec ou sans poids :

hubconf.py ( github.com/repo_owner/repo_name )

dependencies = ['torch']
from my_module import mymodel as _mymodel

def mymodel(pretrained=False, **kwargs):
    return _mymodel(pretrained=pretrained, **kwargs)

Modèle de chargement :

new_model = torch.hub.load('repo_owner/repo_name', 'mymodel')
new_model_pretrained = torch.hub.load('repo_owner/repo_name', 'mymodel', pretrained=True)

0voto

bruzzo Points 92

De nos jours, tout est écrit dans le tutoriel officiel : https://pytorch.org/tutorials/beginner/saving_loading_models.html

Vous avez plusieurs options sur la façon de sauvegarder et sur ce que vous voulez sauvegarder et tout est expliqué dans ce tutoriel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X