TL;DR

Das Trainieren eines ML-Modells kann manchmal kompliziert sein, um es einzurichten und zu wiederholen:

- Dies könnte mit einem Code geschehen, der auf einem Notebook auf einer VM gehostet wird, die Sie manuell starten und nach Beendigung wieder abschalten müssen.
- Möglicherweise müssen Sie jedes Mal ein dataset hochladen, wenn Sie es erneut trainieren möchten.
- Sie müssen tief in Ihren Code eintauchen, wenn Sie einen einzelnen Parameter ändern wollen
- usw.

In diesem Artikel sehen wir uns an, wie wir den Trainingsprozess der Textklassifikatoren von FastAI mit der Google Cloud AI Platform automatisiert haben.

In einem zweiten Artikel werden wir sehen, wie wir es geschafft haben, solche Modelle mit AI Platform und TorchServe einzusetzen.

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

Blog Medium by Artefact

Für wen?

Wenn Sie an einem Projekt arbeiten, bei dem ML-Modelle mehrfach trainiert werden müssen, und Sie es leid sind, Ihre Trainings manuell durchzuführen, sind Sie hier genau richtig.

Wenn Sie es leid sind, VMs für Ihr Training zu verwalten und Ihre Zeit für etwas Interessanteres nutzen möchten, wie z.B. das Lesen von Medium-Artikeln, dann sind Sie hier genau richtig!

Dieser Artikel ist denjenigen gewidmet, die wissen möchten, wie sie Zeit und Ressourcen gewinnen können, indem sie AI Platform für das Training ihrer ML-Modelle verwenden. Wir werden in diesem Artikel sehen, wie wir dies auf ein Projekt angewendet haben, an dem wir gearbeitet haben, indem wir FastAI.

Dieser Artikel ist denjenigen gewidmet, die wissen möchten, wie sie Zeit und Ressourcen gewinnen können, indem sie AI Platform für das Training ihrer ML-Modelle verwenden. Wir werden in diesem Artikel sehen, wie wir dies auf ein Projekt angewendet haben, an dem wir gearbeitet haben, indem wir FastAI.

Voraussetzungen, wenn Sie nachmachen wollen, was wir gemacht haben

AI Platform ist Teil der Google Cloud Platform Suite, ebenso wie die anderen Dienste, die wir zur Automatisierung unserer Trainingspipeline verwendet haben. Hier sind die GCP-Dienste, die wir verwendet haben:

  • KI-Plattform, um das Training des Modells durchzuführen

  • Cloud-Speicher, um die Dateien zu hosten, die für das Training benötigt werden, sowie die Modelldatei, die nach dem Training exportiert wird

  • Cloud Registry, um das Docker-Image zu hosten, das den Trainingscode enthält

  • (Optional) Compute Engine, um das Docker-Image auf einer virtuellen Maschine mit einem Grafikprozessor zu erstellen und auszuführen

Google Cloud SDK, Docker und Nvidia-docker müssen auf dem Rechner, auf dem das Docker-Image erstellt wird, installiert und eingerichtet werden. Der Sinn der Installation von Nvidia-docker besteht darin, das erstellte Docker-Image direkt auf dem Grafikprozessor des Rechners (falls vorhanden) ausführen zu können, um sicherzustellen, dass der Code keine Fehler enthält und das Training wie erwartet auf der KI-Plattform läuft.

Wie wir später in diesem Artikel sehen werden, wurde das Docker-Image aus dem Nvidia-Cuda-Docker-Image erstellt, so dass die erforderlichen Nvidia-Treiber beim Erstellen des Images automatisch installiert werden.

Kontext

In diesem Artikel werden wir sehen, wie wir das Training eines Textklassifizierers automatisiert haben, der mit FastAI erstellt wurde, einer Bibliothek, mit der Benutzer dank der ULM FiT-Methode leistungsstarke Modelle erstellen können.

Example of classification and ULM FiT Workflow

Wir haben sie bereits vorgestellt in ein weiterer Medium-Artikel, Ich lade Sie also ein, es sich anzusehen, wenn Sie mehr darüber erfahren möchten.

Da das, was wir in diesem Artikel sehen werden, auf jedes Framework anwendbar ist, müssen Sie nicht mit FastAI vertraut sein, um weiterzulesen. Alles, was Sie wissen müssen, ist, dass wir zum Trainieren unseres Textklassifizierers neben einem gelabelten dataset auch ein vortrainiertes Modell verwendet haben.

Wie wir die Schulung mit AIPlatform einrichten

Um das Modelltraining mit AI Platform zu automatisieren, müssen Sie festlegen, welcher Code in welcher Umgebung ausgeführt werden soll, wenn der Trainingsbefehl aufgerufen wird. Am besten ist es, ein Docker-Image zu erstellen, das den gesamten Trainingscode und seine Umgebung enthält, so dass AI Platform jedes Mal, wenn Sie es auffordern, ein Modell zu trainieren, nur einen Container aus diesem Image erstellen muss. Wir werden in diesem Teil sehen, wie wir das gemacht haben.

Speichern Sie alle erforderlichen Dateien in einem GCS-Eimer

Bevor wir unser Docker-Image erstellen, das unser Training enthält, mussten wir uns Gedanken über die Dateien machen, die beim Training eines FastAI Textklassifizierungsmodells verwendet werden. Wir beschlossen daher, alle für das Training erforderlichen Dateien in einem GCS-Bucket zu speichern, getrennt in Ordnern für jede Sprache, wobei jeder Datei ein bestimmter Name zugewiesen wurde.

Wir haben dann in unserem Trainingscode (wie wir weiter unten sehen werden) eine Methode implementiert, um diese benötigten Dateien von GCS abzurufen, indem wir nur die Zielsprache als Argument angeben.

Architecture of our GCS bucket

Schreiben Sie den Trainingscode

Nachdem wir die erforderlichen Dateien in GCS hochgeladen haben, haben wir eine Repo mit dem Code für das Training unserer Modelle, der später in einem Docker Image gespeichert werden soll.

Wie Sie in dem verlinkten Repo sehen können, haben wir den Code für das Training in separate Dateien aufgeteilt, um die gesamte Trainingspipeline richtig zu handhaben.

Execution of the training workflow

Wir haben eine Datei definiert, die den gesamten Trainingsworkflow wie folgt ausführt:

  • Rufen Sie die vom Benutzer angegebenen Argumente ab, indem Sie die Methode get_args() aus args_getter.py aufrufen.

  • Rufen Sie die FastAI Trainingsfunktion auf und rufen Sie das trainierte Modell ab, das lokal gespeichert wurde.

  • Laden Sie das trainierte Modell zusammen mit seinen in einer .json-Datei gespeicherten Leistungen auf GCS hoch.

fastai_train.py ist die einzige Datei, die direkt Methoden von FastAI verwendet. Wenn also jemand ein anderes Framework für sein Training einsetzen möchte, muss er nur diese Datei ändern (und natürlich den Inhalt der Konfigurationsdatei).

Der nächste Schritt bestand dann darin, ein Docker-Image zu erstellen, das alles enthält, was für die korrekte Ausführung des Trainings erforderlich ist.

Erstellen Sie die Dockerdatei

Nach der Vorbereitung des Trainingscodes musste eine Dockerdatei erstellt und an Google Container Registry übermittelt werden, damit AI Platform den Code in der richtigen Umgebung abrufen und ausführen kann.

Da das Training unseres Modells auf einer GPU laufen musste, haben wir das Nvidia-cuda Docker-Image importiert, um unser eigenes zu erstellen, so dass alle notwendigen Treiber bereits installiert waren.

# Dockerfile
VON nvidia/cuda:10.2-devel

RUN apt-get update && apt-get install -y --no-install-recommends
    wget
    build-essential

RUN apt-get update && apt-get install -y --no-install-recommends
    python3-dev
    python3-setuptools
    python3-pip

RUN pip3 install pip==20.3.1

WORKDIR /root

# Erstellen Sie Verzeichnisse, die den Code und das heruntergeladene Modell von GCS enthalten
RUN mkdir /wurzel/trainer

RUN mkdir /wurzel/modelle

# Kopieren Sie die Anforderungen
COPY requirements.txt /root/requirements.txt

# Installieren Sie pytorch
RUN pip3 install torch==1.8.0

# Installieren Sie die Anforderungen
RUN pip3 install -r anforderungen.txt

# Installiert google cloud sdk, dies ist hauptsächlich für die Verwendung von gsutil zum Exportieren von Modellen.
RUN wget -nv
    https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz &&
    mkdir /root/tools &&
    tar xvzf google-cloud-sdk.tar.gz -C /root/tools &&
    rm google-cloud-sdk.tar.gz &&
    /root/tools/google-cloud-sdk/install.sh --usage-reporting=false
        --path-update=false --bash-completion=false
        --disable-installation-options &&
    rm -rf /root/.config/* &&
    ln -s /wurzel/.config /config &&
    # Entfernen Sie das von gcloud erstellte Backup-Verzeichnis
    rm -rf /root/tools/google-cloud-sdk/.install/.backup

# Kopieren Sie die Dateien
COPY trainer/fastai_train.py /root/trainer/fastai_train.py

COPY trainer/fastai_config.py /root/trainer/fastai_config.py

KOPIEREN Sie trainer/args_getter.py /root/trainer/args_getter.py

COPY trainer/gcs_utils.py /root/trainer/gcs_utils.py

COPY trainer/training_workflow.py /root/trainer/training_workflow.py

# Pfad-Konfiguration
ENV PATH $PATH:/root/tools/google-cloud-sdk/bin

# Stellen Sie sicher, dass gsutil das Standard-Servicekonto verwendet
RUN echo '[GoogleCompute]nservice_account = default' > /etc/boto.cfg

# Authentifizieren Sie sich bei GCP
CMD gcloud auth anmelden

# Richten Sie den Einstiegspunkt zum Aufrufen des Trainers ein.
ENTRYPOINT ["python3", "trainer/training_workflow.py"]

Wie Sie oben sehen können, führt das Dockerfile die folgenden Schritte aus, um das Image zu erstellen:

  • Zunächst wird das Nvidia-Docker-Image importiert, um das Trainings-Image zu erstellen

  • Dann werden die wichtigsten Befehle zum Einrichten der Umgebung ausgeführt und python und pip heruntergeladen

  • Die Anforderungsdatei wird kopiert

  • Vor der Installation der Anforderungen muss pytorch installiert werden (um Fehler zu vermeiden, die dadurch entstehen, dass FastAI die falsche Version von torch installiert, wenn diese in der Umgebung nicht erkannt wird). Es ist sehr wichtig, die entsprechende Version von pytorch zu wählen, je nachdem, welches cuda-Image verwendet wird. Um zu erfahren, welche Version Sie verwenden müssen, besuchen Sie pytorch.org

  • Nach diesen Schritten sind die Voraussetzungen und das Google Cloud SDK installiert, und die anderen Python-Dateien werden in das Image kopiert.

  • Das Dienstkonto, das standardmäßig für die Authentifizierung bei GCP verwendet werden soll, wird angegeben.

  • Schließlich wird das Training des Modells durch den Aufruf von training_workflow.py durchgeführt.

Erstellen Sie das Image und übertragen Sie es an GCR

Nach der Erstellung der Dockerdatei musste das Image gebaut werden, um es an GCR zu übergeben. Wie im Repo angegeben, mussten verschiedene lokale Variablen definiert werden, wie z.B. die IMAGE_URI in GCR, die REGION unsere Operationen, etc.

Das Image wurde mit diesem Befehl erstellt:

docker build -f Dockerfile -t $IMAGE_URI ./

Bevor wir es an den GCR übertragen, wollten wir sicherstellen, dass beim Aufrufen des Trainings alles einwandfrei funktioniert. Da unsere VM über eine GPU verfügte, haben wir das Image vor dem Übertragen ausgeführt, um zu sehen, was passiert:

docker run --runtime=nvidia $IMAGE_URI --epochs 1 --bucket-name $BUCKET_NAME

Dieser Schritt ist nicht notwendig, kann Ihnen aber viel Zeit ersparen, da Sie so direkt sehen, ob Ihr Code Fehler enthält.

Schließlich haben wir den Container mit folgendem Befehl in den GCR verschoben, $IMAGE_URI ist die Variable, die auf den URI verweist, in dem das Bild in GCR gespeichert ist:

docker push $IMAGE_URI

Führen Sie den Auftrag aus und verfolgen Sie ihn

Nachdem Sie die vorangegangenen Schritte befolgt hatten, war das Training des Modells bereit, mit einem einfachen Befehl im Terminal aufgerufen zu werden. Das Google Cloud SDK musste lediglich aktiviert und lokale Variablen definiert werden:

gcloud ai-platform jobs submit training $JOB_NAME
--Skalierungsebene BASIC_GPU
--region $REGION
--master-image-uri $IMAGE_URI
--
--lang=fr
--epochs=10
--bucket-name=$BUCKET_NAME
--model-dir=$MODEL_DIR

Mit diesem Befehl wird AI Platform aufgefordert, den Container in GCR unter Verwendung seiner IMAGE_URI abzurufen und dann das Training auf dem Grafikprozessor eines Rechners in der Region REGION auszuführen.

Wir haben hier verschiedene Argumente angegeben, wie die Trainingssprache, die Anzahl der Epochen, den Bucket-Namen zum Hoch- und Herunterladen von Dateien in GCS und das Verzeichnis, in dem das trainierte Modell gespeichert werden soll. Dies sind die Argumente, die von der Datei args_getter.py abgerufen werden

Nach der Ausführung des Befehls wurde das Training gestartet und ein Job in der AI Platform-Konsole erstellt, so dass wir die Entwicklung des Trainings verfolgen und die Protokolle der Maschine, die es ausführt, überprüfen können.

Viele Informationen sind zugänglich, wenn Sie den Job in der AI Platform-Konsole ansehen

View of AI Platform Jobs interface

Wenn der Auftrag abgeschlossen ist, wird das trainierte Modell in einem GCS-Bucket als .pth-Datei zusammen mit einer .json-Datei gespeichert, die seine Leistung enthält.

Folder where the files are stored after the training

Wir haben uns entschlossen, die Ergebnisse zu den Labels getrennt zu betrachten, als ob wir einen binären Klassifikator für jedes mögliche Label hätten.

Da wir FastAI verwendet haben, kann die Modelldatei in jeder Umgebung direkt geladen werden, indem Sie die load_learner()-Methode von FastAI aufrufen.

Reusability of trained model

Das Wichtigste zum Mitnehmen

Durch die Automatisierung des Trainings unserer Modelle mit AI Platform konnten wir viel Zeit sparen und mussten verschiedene Aspekte unseres Modelltrainings berücksichtigen, um es effizient in die Produktion zu bringen.

Hier sind einige Erkenntnisse, die wir daraus gewonnen haben:

  • Wenn Sie das Docker-Image direkt auf Ihrem Rechner erstellen und ausführen, bevor Sie es an GCR weiterleiten, können Sie viel Zeit bei der Fehlersuche sparen. Sie sollten jedoch sicherstellen, dass Sie über einen ausreichend leistungsfähigen Rechner verfügen (z. B. die VMs von Google mit GPU).

  • Die Argumente und Parameter müssen gut definiert sein, ebenso wie ihre Standardwerte, um den Trainingsprozess zu vereinfachen und gleichzeitig den Nutzern die Möglichkeit zu geben, ihn aufzumotzen, wenn sie dies möchten

  • FastAI ist eine großartige ML-Bibliothek, und AI Platform Training ist perfekt geeignet, um das Training der Modelle zu automatisieren. Was noch besser ist, ist die Tatsache, dass derselbe Ansatz auf jedes beliebige Framework angewendet werden kann, indem man einfach den Code für das Training selbst im Repo modifiziert

Was kommt als Nächstes?

Nachdem wir Ihnen nun erklärt haben, wie wir das Training unseres Modells automatisiert haben, können wir Ihnen nun zeigen, wie wir es geschafft haben, es einfach aufzurufen, um Dateien bei Bedarf zu klassifizieren.

Bleiben Sie dran für den zweiten Teil dieses Artikels, in dem alles erklärt wird, was Sie wissen müssen, um Ihre trainierten Klassifikatoren mit AI Platform und TorchServe einzusetzen!

Danke fürs Lesen!

Wir hoffen, dass Sie heute etwas gelernt haben und dass es Ihnen bei Ihren zukünftigen ML-Projekten nützlich sein wird. Wenn Sie Fragen oder Kommentare zu diesem Thema haben, können Sie uns gerne kontaktieren.

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