Verwaltung und Inbetriebnahme von ML-Modellen

Seite 4: Das Werkzeug Cortex

Inhaltsverzeichnis

Nachdem das Daten- und Modellmanagement, die Standardisierung und die Inferenz der Modelle behandelt wurde, steht als Nächstes die Inbetriebnahme des Modells an. Die Inferenz des Modells soll über eine REST-API erreichbar sein. Dazu eignet sich der Einsatz des Cloud-Infrastruktur-Werkzeug Cortex, das Modelle skalierbar auf AWS deployt. Das Projekt unterstützt ONNX-Modelle und führt diese mit der ONNX Runtime aus.

Cortex ist ein ML-Deployment-Werkzeug für Inferenz. Mithilfe der Open-Source-Plattform können Entwickler Modelle als REST-API auf einem Kubernetes-Cluster bereitstellen. Derzeit unterstützt Cortex hierfür nur die Services von AWS. In der Zukunft soll Cortex aber auch für andere Kubernetes-Provider verfügbar sein. Für das Deployment verwendet das Tool die Amazon Services S3 und Elastic Kubernetes Service (EKS). S3 ist ein Objektspeicher, auf dem sich die trainierten Modelle ablegen lassen. EKS ist ein vollständig verwalteter Kubernetes-Service.

Entwickler können das Toolkit über die Kommandozeile installieren. Es benötigt Zugriff auf eine AWS-Umgebung für das Erstellen der Ressourcen. Dafür sind die AWS Credentials eines Benutzers notwendig. Um die Komplexität beim Erstellen des Benutzers nicht zu sprengen, erhält er in diesem Beispiel die AdministratorAccess-Policy. An dieser Stelle sei erwähnt, dass in einem produktiven Umfeld davon abgeraten wird, einem Account mehr Berechtigungen zu erteilen als notwendig sind. Die minimalen Berechtigungen können Interessierte hier nachlesen.

Die Installation erfolgt anschließend mit dem Befehl cortex cluster up. Sie kann bis zu 15 Minuten dauern, da währenddessen verschiedene Ressourcen wie das EKS Cluster, EC2-Instanzen, die zugehörigen Netzwerkeinstellungen und der S3 Bucket angelegt werden. Bevor das System die Installation bestätigt, kommt es zu einer Auflistung aller Kosten, die Cortex erzeugt (s.Tabelle).

AWS Ressourcen Kosten pro Stunde
EKS Cluster $0.10
20GB EBS volume for the operator $0.003
T3.Medium instance for the operator $0.0456
NAT Gateway $0.048
2 Elastic Load Balancers $0.056
50GB EBS Volume for APIs $0.008
M5.Large instance for APIs $0.107

Nachdem die Installation abgeschlossen ist, bedarf es der Durchführung einiger Aufgaben. Zunächst muss man das ONNX-Modell auf dem gewählten S3-Bucket ablegen. Dabei lässt sich das Modell entweder über die AWS-Konsole oder direkt über die Kommandozeile speichern. In einem weiteren Schritt wird die Klasse ONNXPredictor erstellt:

import numpy as np
class ONNXPredictor:
   def __init__(self, onnx_client, config):
       self.client = onnx_client

   def predict(self, payload):
       model_input = payload["image"]
       model_input = np.array(model_input) / 255.0
       prediction = self.client.predict(model_input)
       return prediction

Sie erhält über den Konstruktor den ONNXClient. Dieser verwaltet die ONNX Runtime und enthält den Boilerplate-Code für die Datentransformationen und für das Laden des Modells. Die Klasse wird beim Hochfahren des Pods einmal geladen – ein Pod ist eine deploybare Einheit in Kubernetes. In diesem Fall ist es eine laufende Instanz des Modells. Ein Request reicht den Payload an die predict-Methode weiter. Sie implementiert die Logik für die Entscheidungsfindung.

Die Datei cortex.yaml hält die Konfigurationen fest und listet alle Modell-Instanzen auf, die auf dem Cluster eingerichtet werden sollen. Die Unterscheidung erfolgt über den Namen. Die Datei verbindet das Skript mit dem Modell-Pfad auf S3 und erstellt dadurch ein Deployment.

- name: fashion-classifier
  predictor:
    type: onnx
    path: predictor.py
    model: s3://cortex-XXXX/model.onnx
  compute:
    cpu: 1

Außerdem können Entwickler weitere Konfigurationen wie die Anzahl an Instanzen festlegen.

Der Befehl cortex deploy legt das Modell auf dem Cluster an. Details über die Konfiguration des Deployments, den Status und die Endpoint-Url werden mit dem von dem Befehl cortex get fashion-classifier eingesehen. Weiterhin können Entwickler die Log-Nachrichten der API mit cortex logs fashion-classifier abrufen. Der Befehl get macht die Adresse des Endpoints ausfindig. Daraufhin lässt sich das Deployment mit dem Request testen:

import requests
import imageio
image = imageio.imread("coat_image.png")
url = "http://XXX.eu-west-1.elb.amazonaws.com/fashion-classifier"
r = requests.post(url, json={"image": image.reshape(-1).tolist()})

Über cortex cluster down lässt sich das Tool wieder deinstallieren.

Neben dem schnellen Deployment hat Cortex weitere hilfreiche Features für den operativen Betrieb im Gepäck, die zum größten Teil durch den Einsatz von Kubernetes hinzukommen. Dazu gehören unter anderem Rolling Updates, Autoscaling und Monitoring der Applikationen. Das Monitoring sammelt neben Metriken zum Netzwerkverkehr die über die Verteilung der Vorhersagungen. Diese können darüber aufklären, wie das Modell im Live-Betrieb performt. An dieser Stelle sei erwähnt, dass sich der gewählte Ansatz mit Cortex aus Sicht der Betriebskosten nur eignet, wenn die Applikation konstant aufgerufen wird. Das Kubernetes-Cluster und die beteiligten EC2-Instanzen verursachen laufende Kosten, die erst mit ausreichend hoher Grundlast wirtschaftlich rentabel sind. Der Einsatz von Cortex lohnt sich, sobald genügend viele Inferenzanfragen auftreten, um die operativen Kosten zu rechtfertigen.