Eu estava procurando maneiras alternativas de salvar um modelo treinado no PyTorch. Até agora, encontrei duas alternativas.
- torch.save () para salvar um modelo e torch.load () para carregar um modelo.
- model.state_dict () para salvar um modelo treinado e model.load_state_dict () para carregar o modelo salvo.
Eu me deparei com essa discussão em que a abordagem 2 é recomendada sobre a abordagem 1.
Minha pergunta é: por que a segunda abordagem é preferida? É apenas porque os módulos torch.nn têm essas duas funções e somos incentivados a usá-los?
python
serialization
deep-learning
pytorch
tensor
Wasi Ahmad
fonte
fonte
torch.save(model, f)
etorch.save(model.state_dict(), f)
. Os arquivos salvos têm o mesmo tamanho. Agora eu estou confuso. Além disso, eu achei o uso de pickle para salvar model.state_dict () extremamente lento. Eu acho que a melhor maneira é usar,torch.save(model.state_dict(), f)
já que você lida com a criação do modelo, e a tocha lida com o carregamento dos pesos do modelo, eliminando possíveis problemas. Referência: discuss.pytorch.org/t/saving-torch-models/838/4pickle
?Respostas:
Encontrei esta página no repositório do github, colarei o conteúdo aqui.
Abordagem recomendada para salvar um modelo
Existem duas abordagens principais para serializar e restaurar um modelo.
O primeiro (recomendado) salva e carrega apenas os parâmetros do modelo:
Depois, mais tarde:
O segundo salva e carrega o modelo inteiro:
Depois, mais tarde:
No entanto, nesse caso, os dados serializados são vinculados às classes específicas e à estrutura de diretórios exata usada, para que possam ser quebrados de várias maneiras quando usados em outros projetos ou após alguns refatores sérios.
fonte
pickle
?Depende do que você quer fazer.
Caso nº 1: salve o modelo para usá-lo por inferência : salve o modelo, restaure-o e altere o modelo para o modo de avaliação. Isso é feito porque você geralmente tem
BatchNorm
eDropout
camadas que por padrão estão no modo de trem na construção:Caso nº 2: salve o modelo para continuar o treinamento mais tarde : se você precisar continuar treinando o modelo que está prestes a salvar, precisará salvar mais do que apenas o modelo. Você também precisa salvar o estado do otimizador, épocas, pontuação etc. Você faria assim:
Para retomar o treinamento, você faria coisas como:
state = torch.load(filepath)
e, em seguida, para restaurar o estado de cada objeto individual, algo como isto:Como você está retomando o treinamento, NÃO ligue
model.eval()
depois de restaurar os estados ao carregar.Caso nº 3: Modelo a ser usado por outra pessoa sem acesso ao seu código : No Tensorflow, você pode criar um
.pb
arquivo que define a arquitetura e os pesos do modelo. Isso é muito útil, especialmente ao usarTensorflow serve
. A maneira equivalente de fazer isso no Pytorch seria:Dessa forma, ainda não é à prova de balas e, como o pytorch ainda está passando por muitas alterações, eu não o recomendaria.
fonte
torch.load
retorna apenas um OrderedDict. Como você obtém o modelo para fazer previsões?A biblioteca pickle Python implementa protocolos binários para serializar e desserializar um objeto Python.
Quando você
import torch
(ou quando você usa PyTorch) que vaiimport pickle
para você e você não precisa chamarpickle.dump()
epickle.load()
diretamente, o que são os métodos para salvar e carregar o objeto.Na verdade,
torch.save()
etorch.load()
vai embrulharpickle.dump()
epickle.load()
para você.A
state_dict
outra resposta mencionada merece apenas mais algumas notas.O
state_dict
que temos dentro do PyTorch? Na verdade, existem doisstate_dict
s.O modelo PyTorch é
torch.nn.Module
temmodel.parameters()
chamada para obter parâmetros learnable (w eb). Esses parâmetros aprendíveis, uma vez definidos aleatoriamente, serão atualizados ao longo do tempo à medida que aprendemos. Parâmetros aprendíveis são os primeirosstate_dict
.O segundo
state_dict
é o ditado de estado do otimizador. Você se lembra que o otimizador é usado para melhorar nossos parâmetros aprendíveis. Mas o otimizadorstate_dict
é fixo. Nada a aprender lá.Como os
state_dict
objetos são dicionários Python, eles podem ser facilmente salvos, atualizados, alterados e restaurados, adicionando uma grande modularidade aos modelos e otimizadores do PyTorch.Vamos criar um modelo super simples para explicar isso:
Este código produzirá o seguinte:
Observe que este é um modelo mínimo. Você pode tentar adicionar uma pilha de
Observe que apenas as camadas com parâmetros que podem ser aprendidos (camadas convolucionais, camadas lineares etc.) e buffers registrados (camadas batchnorm) têm entradas nos modelos
state_dict
.Coisas não aprendidas pertencem ao objeto otimizador
state_dict
, que contém informações sobre o estado do otimizador, bem como os hiperparâmetros usados.O resto da história é o mesmo; na fase de inferência (essa é uma fase em que usamos o modelo após o treinamento) para prever; nós previmos com base nos parâmetros que aprendemos. Portanto, para a inferência, só precisamos salvar os parâmetros
model.state_dict()
.E para usar mais tarde model.load_state_dict (torch.load (filepath)) model.eval ()
Nota: Não esqueça a última linha,
model.eval()
isto é crucial após o carregamento do modelo.Também não tente salvar
torch.save(model.parameters(), filepath)
. Omodel.parameters()
é apenas o objeto gerador.Por outro lado,
torch.save(model, filepath)
salva o próprio objeto do modelo, mas lembre-se de que o modelo não possui o otimizadorstate_dict
. Verifique a outra excelente resposta de @Jadiel de Armas para salvar o ditado de estado do otimizador.fonte
Uma convenção comum do PyTorch é salvar modelos usando uma extensão de arquivo .pt ou .pth.
Salvar / carregar modelo inteiro Salvar:
Carga:
A classe do modelo deve ser definida em algum lugar
fonte
Se você deseja salvar o modelo e deseja retomar o treinamento posteriormente:
GPU única: Salvar:
Carga:
GPU múltipla: Salvar
Carga:
fonte