30. März 2021
In diesem zweiten Artikel der Serie von zwei Artikeln gehe ich auf die Bereitstellung und den Einsatz unserer Modelle im großen Maßstab ein. Wenn Sie den ersten Artikel über das Training eines Fastai-Modells in großem Maßstab auf AI Platform Training verpasst haben, finden Sie hier den Link.

TL;DR

In diesem zweiten Artikel der Serie von zwei Artikeln gehe ich auf die Bereitstellung und den Einsatz unserer Modelle im großen Maßstab ein. Wenn Sie den ersten Artikel über das Training eines Fastai-Modells in großem Maßstab auf AI Platform Training verpasst haben, finden Sie hier den Link.

Der Einsatz eines Deep Learning-Modells kann verschiedene Herausforderungen mit sich bringen:

  • Skalierung der Ressourcen auf Instanzen mit oder ohne Beschleuniger (NVIDIA GPUs)

  • Kosteneffizienz

In diesem Artikel erkläre ich, wie ich einen Deep Learning-Textklassifikator, der mit der FastAI-Bibliothek trainiert wurde, in 2 Hauptschritten bedient habe:

  • Fastai-Modell mit TorchServe bereitstellen

  • Host Serving auf der GCP AI-Plattform Vorhersage

Alle Materialien finden Sie in der github repository. Dieses Repository wurde von einem anderen Projekt inspiriert, das darauf abzielte, einen Fastai-Bildklassifikator auf dem AWS SageMaker Inference Endpoint einzusetzen Hier.

1- Verteilen Sie das Fastai-Modell mit TorchServe

TorchServe macht es einfach, PyTorch-Modelle in Produktionsumgebungen in großem Umfang einzusetzen. Die Entwicklung einer eigenen Client-Server-Architektur ist damit nicht mehr erforderlich. Die FastAI-Bibliothek basiert auf dem PyTorch-Framework. Sie ermöglicht es, diese Technologie zu nutzen, um Fastai-Modelle bereitzustellen, indem Sie Ihr Fastai-Modell als reines PyTorch-Objekt laden (Entfernen der Fastai-Abstraktion).

1-1 Exportieren Sie Modellgewichte aus FastAI

Dazu müssen Sie den FastAI-Lernenden aus dem Export-Pickle aus dem letzten Beitrag wiederherstellen und seine Modellgewichte mit PyTorch speichern.

Importfackel
from fastai.text import load_learner
from fastai.text.learner import get_c, get_text_vocab
learn = load_learner(“fastai_cls.pkl”)
vocab_sz = len(_get_text_vocab(dls)) #dls ist der dataloader, den Sie für das Training verwendet haben
n_class = get_c(dls)
config = awd_lstm_clas_config.copy()
torch.save(learn.model.state_dict(), “fastai_cls_weights.pth”)

1-2 PyTorch Modell von FastAI

Sobald Sie Ihre pytorch-Gewichte exportiert haben, müssen Sie die Modellstruktur neu aufbauen, um Ihre Gewichte in das Modell laden zu können. Möglicherweise müssen Sie ein wenig im Fastai-Quellcode wühlen, um Ihre Implementierung zu finden, aber zum Glück kann man im Jupyter-Notebook den Quellcode untersuchen, indem man ein ?? vor einen Funktionsnamen setzt.

Für den Textklassifikator können Sie ein reines Pytorch-Objekt laden, indem Sie die Funktion fastai get_text_classifier verwenden

from fastai.text.learner import get_text_classifier
from fastai.text.all import AWD_LSTM
torch_pure_model = get_text_classifier(AWD_LSTM, vocab_sz, n_class, config=config)

1-3 Reproduzieren Sie die Fastai-Vorverarbeitungsschritte

Sobald Sie Ihr reines Pytorch-Modell erhalten haben, müssen Sie die gleiche Vorverarbeitung anwenden, die auch für das Training verwendet wurde. FastAI verfügt über eine sehr praktische Methode .predict, die auf einen Text (ein einfaches String-Objekt) angewendet werden kann. Diese Methode reproduziert natürlich die Vorverarbeitung des Trainings und beseitigt somit das Risiko einer Verzerrung der Trainingsdaten.

text = “Das war ein sehr guter Film”
pred_fastai = learn.predict(text)
pred_fastai
>>(Kategorie tensor(1), tensor(1), tensor([0.0036, 0.9964]))

In unserem Fall müssen wir diese Verantwortung selbst übernehmen, da wir die Fastai-Abstraktion loswerden und direkt mit PyTorch-Objekten arbeiten müssen.

In meinem Beispiel habe ich einen Spacy-Tokenizer verwendet, also habe ich die fastai-Vorverarbeitung wie unten gezeigt reproduziert:
Importfackel

Importfackel
from fastai.text.core import Tokenizer, SpacyTokenizerfrom fastai.text.data import Numericalize
example = “Hallo, dies ist ein Test.”
tokenizer = Tokenizer(
tok=SpacyTokenizer(“en”)
)
numericalizer = Numericalize(vocab=vocab)
example_processed = numericalizer(tokenizer(example))
beispiel_verarbeitet
>>> Tensor([ 4, 7, 26, 29, 16, 72, 69, 31])
inputs = example_processed.resize(1, len(example_processed))
outputs = model_torch.forward(inputs)[0] preds = torch.softmax(outputs, dim=-1) #YSie können jede Aktivierungsfunktion verwenden, die Sie benötigen
preds
>>> tensor([[0.0036, 0.9964]], grad_fn=)

Wie Sie sehen können, sind die Ergebnisse, die ich mit torch functions und learn.predict erhalte, die gleichen, da ich die gleichen Vorverarbeitungsschritte beibehalten konnte.

1-4 Stellen Sie Ihr Modell über torchserve bereit

In diesem Abschnitt stellen wir das PyTorch-Modell auf TorchServe bereit. Für die Installation lesen Sie bitte das TorchServe Github Repository.
Insgesamt gibt es hauptsächlich 3 Schritte, um TorchServe zu benutzen:

  1. Archivieren Sie das Modell als *.mar.
  2. Starten Sie den Fackeldienst.

Rufen Sie die API auf und erhalten Sie die Antwort.
Um das Modell zu archivieren, werden in unserem Fall mindestens 2 Dateien benötigt:

  1. PyTorch-Modellgewichte fastai_cls_weights.pth.
  2. Benutzerdefinierter TorchServe-Handler.

Benutzerdefinierter Handler

Wie in /deployment/handler.py gezeigt, akzeptiert der TorchServe-Handler data und Kontext. In unserem Beispiel definieren wir eine weitere Python-Helferklasse mit 4 Instanzmethoden, die wir implementieren: initialize, preprocess, inference und postprocess.

Jetzt können Sie TorchServe einrichten und starten.

TorchServe in Aktion

Schritt 1: Archivieren Sie das Modell PyTorch
torch-model-archiver
--model-name=fastai_model
-Version=1.0
-serialized-file=/home/model-server/fastai_cls_weights.pth
-- extra-files=/home/model-server/config.py,/home/model-server/vocab.json
-handler=/home/model-server/handler.py
--export-path=/home/model-server/model-store/
Schritt 2: Servieren Sie das Modell
torchserve -start -ncs -model-store model_store -models fastai_model.mar
Schritt 3: Rufen Sie die API auf und erhalten Sie die Antwort (hier verwenden wir curl).
curl -X POST -H "Content-Type: application/json" -d '["dies war ein schlechter Film"]' http://127.0.0.1:8080/predictions/fastai_model

Der erste Aufruf hat eine längere Latenzzeit, da die in initialize definierten Modellgewichte geladen werden, aber dies wird ab dem zweiten Aufruf gemildert.

2- Einsatz auf der KI-Plattform Vorhersage

In diesem Abschnitt stellen wir das mit TorchServe trainierte FastAI-Modell in der GCP AI Platform Prediction mithilfe eines angepassten Docker-Images bereit. Weitere Einzelheiten zu den GCP AI Platform Prediction-Routinen mit benutzerdefinierten Containern finden Sie in diesem Artikel. Beachten Sie, dass diese Option nur verfügbar ist, wenn Sie AI Platform Prediction mit regionalen Endpunkten verwenden.

Schritte zur Bereitstellung eines Fastai-Modells auf der KI-Plattform Prediction:

Erstellen Sie zunächst ein KI-Plattform-Vorhersagemodell auf einem regionalen Endpunkt:

gcloud beta ai-platform Modelle erstellen MODEL_NAME #eg: fastai_text_clf
-region=REGION #eg: europa-west1
-Enable-logging
-enable-console-logging

2-1 Erstellen Sie Ihr Docker-Image, das von Ihrer Version verwendet werden soll

  • Erstellen Sie einen Ordner model/ im Stammverzeichnis des Repositorys

  • Legen Sie Ihre Fastai-Modellgewichte in model/text/ ab und nennen Sie sie fastai_cls_weights.pth

  • Ein Artefakt-Repository erstellen

gcloud beta Artefakte Repositories erstellen ARTIFACT_REGISTRY_NAME #eg: getting-started-fastai
-repository-format=docker
-location=REGION #eg: europa-west1
  • Erstellen Sie Ihr Docker-Image

docker build -f TextDockerfile -t REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0

2-2 (Optional) Prüfen Sie, ob Ihr Docker-Image einwandfrei läuft

  • Führen Sie Ihr Docker-Image lokal aus und testen Sie es

docker run -it -p 8080:8080 REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0
curl -X POST -H "Content-Type: application/json" -d '["dies war ein schlechter Film"]' 127.0.0.1:8080/vorhersagen/fastai_model

2-3 Schieben Sie Ihr Docker-Image in eine Container-Registry in Ihrem GCP-Projekt

Dazu benötigen Sie die IAM-Anmeldedaten. Sobald Sie sich vergewissert haben, dass Sie sie haben, führen Sie Folgendes aus

gcloud auth configure-docker
docker push REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0

2-4 Erstellen Sie eine Modellversion mit Ihrem Docker-Image

gcloud beta ai-platform Versionen erstellen VERSION_NAME
-region=REGION
-model=MODELL_NAME
-image=REGION-docker.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_NAME/fastai_text_cls:v0
-ports=8080
-health-route=/ping
-predict-route=/vorhersagen/fastai_model

2-5 Testen Sie Ihre Modellversion

curl -X POST
-H "Authorization: Bearer $(gcloud auth print-access-token)"
-H "Content-Type: application/json"
-d '["Das war ein schlechter Film"]'
https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/MODEL_NAME/versions/VERSION_NAME:predict

Ihr Fastai-Modell wird jetzt in einer serverlosen Architektur auf der KI-Plattform Prediction bereitgestellt. Sie können Online-Vorhersagen machen, indem Sie Anfragen an Ihr Modell als REST API senden. Alle Methoden zur Abfrage von Vorhersagen finden Sie unter Google-Dokumentation.

Fazit

Die Verwendung der KI-Plattform Prediction zur Bereitstellung von Modellen jeder Art kann sehr nützlich sein. Dieser Artikel soll ein Beispiel für ein Deep Learning-Modell zeigen, das ein schweres Framework (pytorch) verwendet und kostengünstig bereitgestellt wird.

Einige Einschränkungen sind zu beachten:

  • Selbst mit Autoscaling ist es nicht möglich, auf 0 Instanzen herunterzuskalieren, wenn Sie AI Platform-Modelle verwenden, die auf regionalen Endpunkten bereitgestellt werden. Da dies die einzige Möglichkeit ist, benutzerdefinierte Container zu verwenden, wird immer mindestens eine Instanz aktiv sein.

  • Eine weitere Option, die wir untersucht haben, war die Verwendung von benutzerdefinierten Routinen anstelle von benutzerdefinierten Containern. Dies ist jedoch nur möglich, wenn Ihr Modell und der verpackte Code eine Größe von 500 MB nicht überschreiten, was in unserem Fall nicht erreicht werden konnte.

Mehr über uns und unsere Projekte finden Sie in unserem Medium-Blog