Как сериализовать модель PyTorch для классификации НЛП
Я пытаюсь использовать новую модель НЛП в демонстрационном приложении PyTorch для Android Demo App Git, однако я изо всех сил пытаюсь сериализовать модель, чтобы она работала с Android.
PyTorch демонстрирует следующую демонстрацию модели Resnet:
model = torchvision.models.resnet18(pretrained=True)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("app/src/main/assets/model.pt")
Однако я не уверен, что использовать для ввода "примера" с моей моделью НЛП.
Модель, которую я использую из учебника fastai, и питон связаны здесь: model
Вот Python, который использовался для создания моей модели (с использованием библиотеки Fastai). Это то же самое, что и в ссылке на модель выше, но в упрощенном виде.
from fastai.text import *
path = untar_data('http://files.fast.ai/data/examples/imdb_sample')
path.ls()
#: [PosixPath('/storage/imdb_sample/texts.csv')]
data_lm = TextDataBunch.from_csv(path, 'texts.csv')
data = (TextList.from_csv(path, 'texts.csv', cols='text')
.split_from_df(col=2)
.label_from_df(cols=0)
.databunch())
bs=48
path = untar_data('https://s3.amazonaws.com/fast-ai-nlp/imdb')
data_lm = (TextList.from_folder(path)
.filter_by_folder(include=['train', 'test', 'unsup'])
.split_by_rand_pct(0.1)
.label_for_lm()
.databunch(bs=bs))
learn = language_model_learner(data_lm, AWD_LSTM, drop_mult=0.3)
learn.fit_one_cycle(1, 1e-2, moms=(0.8,0.7))
learn.unfreeze()
learn.fit_one_cycle(10, 1e-3, moms=(0.8,0.7))
learn.save_encoder('fine_tuned_enc')
path = untar_data('https://s3.amazonaws.com/fast-ai-nlp/imdb')
data_clas = (TextList.from_folder(path, vocab=data_lm.vocab)
.split_by_folder(valid='test')
.label_from_folder(classes=['neg', 'pos'])
.databunch(bs=bs))
learn = text_classifier_learner(data_clas, AWD_LSTM, drop_mult=0.5)
learn.load_encoder('fine_tuned_enc')
learn.fit_one_cycle(1, 2e-2, moms=(0.8,0.7))
learn.freeze_to(-2)
learn.fit_one_cycle(1, slice(1e-2/(2.6**4),1e-2), moms=(0.8,0.7))
learn.freeze_to(-3)
learn.fit_one_cycle(1, slice(5e-3/(2.6**4),5e-3), moms=(0.8,0.7))
learn.unfreeze()
learn.fit_one_cycle(2, slice(1e-3/(2.6**4),1e-3), moms=(0.8,0.7))
1 ответ
Через некоторое время я понял, как это сделать. Проблема заключалась в том, что модель Fastai не отслеживала правильно, независимо от того, какую форму ввода я использовал.
В конце концов, я использовал другую модель классификации текста, и она заработала. Я написал руководство о том, как я это сделал, на случай, если это поможет кому-то еще.
Руководство по трассировке NLP PyTorch
Начните с открытия нового Jupyter Python Notebook с помощью предпочитаемого поставщика облачных машин (я использую Paperspace).
Затем скопируйте и запустите код из учебника PyTorch Text Classification. Но замените строку…
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
С участием…
device = torch.device("cpu")
ПРИМЕЧАНИЕ. Это вызвало проблемы с отслеживанием, когда устройство было настроено на CUDA, поэтому я принудительно включил его на ЦП. (это замедлит обучение, но вывод на мобильном телефоне в любом случае будет выполняться с той же скоростью, что и процессор)
Наконец, запустите приведенный ниже код, чтобы правильно отследить модель, чтобы позволить ей запускаться на Android:
data = DataLoader(test_dataset, batch_size=1, collate_fn=generate_batch)
for text, offsets, cls in data:
text, offsets, cls = text.to(device), offsets.to(device), cls.to(device)
example = text, offsets
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model.pt")
Кроме того, если вы хотите получить CSV-копию списка словаря для использования на Android при составлении прогнозов, запустите после этого следующий код:
import pandas as pd
vocab = train_dataset.get_vocab()
df = pd.DataFrame.from_dict(vocab.stoi, orient='index', columns=['token'])
df[:30]
df.to_csv('out.csv')
Эта модель должна нормально работать на Android с использованием PyTorch API.