Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Testen von Modellen mit Produktionsvarianten
In produktiven ML-Workflows versuchen Datenwissenschaftler und -ingenieure häufig, die Leistung mit verschiedenen Methoden zu verbessern, z. B. durch Automatische Modelloptimierung mit KI SageMaker, Training auf zusätzlichen oder aktuelleren Daten, Verbesserung der Merkmalsauswahl, Verwendung besser aktualisierter Instances und Bereitstellung von Containern. Sie können Produktionsvarianten verwenden, um Ihre Modelle, Instances und Container zu vergleichen und den Kandidaten mit der besten Leistung für die Beantwortung von Inferenzanfragen auszuwählen.
Mit SageMaker KI-Endpunkten mit mehreren Varianten können Sie Endpunktaufrufanfragen auf mehrere Produktionsvarianten verteilen, indem Sie die Verkehrsverteilung für jede Variante angeben, oder Sie können eine bestimmte Variante direkt für jede Anfrage aufrufen. In diesem Thema betrachten wir beide Methoden zum Testen von ML-Modellen.
Themen
Testen von Modellen durch Angabe der Verteilung des Datenverkehrs
Um mehrere Modelle zu testen, indem der Datenverkehr zwischen ihnen verteilt wird, geben Sie den Prozentsatz des Datenverkehrs an, der an jedes Modell weitergeleitet wird, indem Sie die Gewichtung für jede Produktionsvariante in der Endpunktkonfiguration angeben. Weitere Informationen finden Sie unter CreateEndpointConfig. Das folgende Diagramm zeigt, wie dies im Detail funktioniert.
Testen von Modellen durch Aufrufen bestimmter Varianten
Um mehrere Modelle zu testen, indem Sie für jede Anfrage bestimmte Modelle aufrufen, geben Sie die spezifische Version des Modells an, das Sie aufrufen möchten, indem Sie beim Aufruf einen Wert für den TargetVariant Parameter angeben. InvokeEndpoint SageMaker AI stellt sicher, dass die Anfrage von der von Ihnen angegebenen Produktionsvariante verarbeitet wird. Wenn Sie die Verteilung des Datenverkehrs bereits angegeben und einen Wert für den Parameter TargetVariant angegeben haben, überschreibt das Ziel-Routing die zufällige Verteilung des Datenverkehrs. Das folgende Diagramm zeigt, wie dies im Detail funktioniert.
Beispiel für einen A/B Modelltest
Die Durchführung von A/B Tests zwischen einem neuen Modell und einem alten Modell mit Produktionsdatenverkehr kann ein effektiver letzter Schritt im Validierungsprozess für ein neues Modell sein. Beim A/B Testen testen Sie verschiedene Varianten Ihrer Modelle und vergleichen, wie jede Variante abschneidet. Wenn die neuere Version des Modells eine bessere Leistung erbringt als die bisherige Version, ersetzen Sie die alte Version des Modells durch die neue Version in der Produktion.
Das folgende Beispiel zeigt, wie A/B Modelltests durchgeführt werden. Ein Beispiel-Notizbuch, das dieses Beispiel implementiert, finden Sie unter "A/B Testen von ML-Modellen in der Produktion
Schritt 1: Erstellen und Bereitstellen von Modellen
Zunächst legen wir fest, wo sich unsere Modelle in Amazon S3 befinden. Diese Standorte werden verwendet, wenn wir unsere Modelle in folgenden Schritten bereitstellen:
model_url = f"s3://{path_to_model_1}" model_url2 = f"s3://{path_to_model_2}"
Als Nächstes erstellen wir die Modellobjekte mit den Bild- und Modelldaten. Diese Modellobjekte werden verwendet, um Produktionsvarianten auf einem Endpunkt bereitzustellen. Die Modelle werden durch Training von ML-Modellen auf verschiedenen Datensätzen, verschiedenen Algorithmen oder ML-Frameworks und verschiedenen Hyperparametern entwickelt:
from sagemaker.core import image_uris model_name = f"DEMO-xgb-churn-pred-{datetime.now():%Y-%m-%d-%H-%M-%S}" model_name2 = f"DEMO-xgb-churn-pred2-{datetime.now():%Y-%m-%d-%H-%M-%S}" image_uri = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-1') image_uri2 = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-2') sm_session.create_model( name=model_name, role=role, container_defs={ 'Image': image_uri, 'ModelDataUrl': model_url } ) sm_session.create_model( name=model_name2, role=role, container_defs={ 'Image': image_uri2, 'ModelDataUrl': model_url2 } )
Wir erstellen nun zwei Produktionsvarianten mit jeweils eigenem Modell und Ressourcenanforderungen (Instance-Typ und -Anzahl). Auf diese Weise können Sie auch Modelle mit verschiedenen Instance-Typen testen.
Wir legen ein initial_weight von 1 für beide Varianten fest. Dies bedeutet, dass 50 % der Anfragen an Variant1 und die restlichen 50 % der Anfragen an Variant2 gehen. Die Summe der Gewichtungen in beiden Varianten ist 2 und jede Variante hat eine Gewichtungszuweisung von 1. Das bedeutet, dass jede Variante oder 50% des gesamten Datenverkehrs erhält 1/2.
from sagemaker.session import production_variant variant1 = production_variant( model_name=model_name, instance_type="ml.m5.xlarge", initial_instance_count=1, variant_name='Variant1', initial_weight=1, ) variant2 = production_variant( model_name=model_name2, instance_type="ml.m5.xlarge", initial_instance_count=1, variant_name='Variant2', initial_weight=1, )
Endlich sind wir bereit, diese Produktionsvarianten auf einem SageMaker KI-Endpunkt einzusetzen.
endpoint_name = f"DEMO-xgb-churn-pred-{datetime.now():%Y-%m-%d-%H-%M-%S}" print(f"EndpointName={endpoint_name}") sm_session.endpoint_from_production_variants( name=endpoint_name, production_variants=[variant1, variant2] )
Schritt 2: Aufrufen der bereitgestellten Modelle
Jetzt senden wir Anfragen an diesen Endpunkt, um Inferenzen in Echtzeit zu erhalten. Wir verwenden sowohl die Verteilung des Datenverkehrs als auch das direkte Targeting.
Zuerst verwenden wir die Verteilung des Datenverkehrs, die wir im vorherigen Schritt konfiguriert haben. Jede Inferenzantwort enthält den Namen der Produktionsvariante, die die Anforderung verarbeitet, sodass wir sehen können, dass der Datenverkehr zu den beiden Produktionsvarianten ungefähr gleich ist.
# get a subset of test data for a quick test !tail -120 test_data/test-dataset-input-cols.csv > test_data/test_sample_tail_input_cols.csv print(f"Sending test traffic to the endpoint {endpoint_name}. \nPlease wait...") with open('test_data/test_sample_tail_input_cols.csv', 'r') as f: for row in f: print(".", end="", flush=True) payload = row.rstrip('\n') sm_runtime.invoke_endpoint( EndpointName=endpoint_name, ContentType="text/csv", Body=payload ) time.sleep(0.5) print("Done!")
SageMaker Die KI gibt Metriken wie Latency und Invocations für jede Variante in Amazon CloudWatch aus. Eine vollständige Liste der Metriken, die SageMaker KI ausgibt, finden Sie unter. SageMaker Amazon-KI-Metriken in Amazon CloudWatch Lassen Sie uns die Anzahl der Aufrufe pro Variante abfragen CloudWatch , um zu zeigen, wie Aufrufe standardmäßig auf Varianten aufgeteilt werden:
Lassen Sie uns nun eine bestimmte Version des Modells aufrufen, indem Sie Variant1 als TargetVariant im Aufruf von invoke_endpoint angeben.
print(f"Sending test traffic to the endpoint {endpoint_name}. \nPlease wait...") with open('test_data/test_sample_tail_input_cols.csv', 'r') as f: for row in f: print(".", end="", flush=True) payload = row.rstrip('\n') sm_runtime.invoke_endpoint( EndpointName=endpoint_name, ContentType="text/csv", Body=payload, TargetVariant="Variant1" ) time.sleep(0.5)
Um zu bestätigen, dass alle neuen Aufrufe verarbeitet wurdenVariant1, können wir die Anzahl der Aufrufe CloudWatch pro Variante abfragen. Wir sehen, dass für die letzten Aufrufe (aktueller Zeitstempel) alle Anfragen von Variant1 verarbeitet wurden, wie wir angegeben hatten. Es wurden keine Aufrufe für Variant2 gemacht.
Schritt 3: Beurteilen der Leistung des Modells
Um zu sehen, welche Modellversion besser abschneidet, evaluieren wir für jede Variante die Genauigkeit, die Präzision, den Erinnerungswert, den F1-Score und den Receiver, der charactersistic/Area unter der Kurve arbeitet. Betrachten wir zunächst diese Metriken für Variant1:
Betrachten wir nun die Metriken für Variant2:
Für die meisten unserer definierten Metriken, ist die Leistung von Variant2 besser, also ist dies diejenige, die wir in der Produktion verwenden möchten.
Schritt 4: Erhöhen des Datenverkehrs auf das beste Modell
Nun, da wir festgestellt haben, dass Variant2 eine bessere Leistung erzielt als Variant1, verlagern wir mehr Verkehr darauf. Wir können es weiterhin verwenden, TargetVariant um eine bestimmte Modellvariante aufzurufen, aber ein einfacherer Ansatz besteht darin, die jeder Variante zugewiesenen Gewichte durch Aufrufen UpdateEndpointWeightsAndCapacities zu aktualisieren. Dadurch wird die Verteilung des Datenverkehrs in Ihre Produktionsvarianten geändert, ohne dass Aktualisierungen des Endpunkts erforderlich sind. Erinnern Sie sich im Abschnitt „Setup“ daran, dass wir Variantengewichte festgelegt haben, um den Traffic 50/50 aufzuteilen. Die folgenden CloudWatch Metriken für die Gesamtzahl der Aufrufe für jede Variante zeigen uns die Aufrufmuster für jede Variante:
Jetzt verlagern wir 75% des Traffics auf, Variant2 indem wir jeder verwendeten Variante eine neue Gewichtung zuweisen. UpdateEndpointWeightsAndCapacities SageMaker KI sendet jetzt 75% der Inferenzanfragen an Variant2 und die restlichen 25% der Anfragen an. Variant1
sm.update_endpoint_weights_and_capacities( EndpointName=endpoint_name, DesiredWeightsAndCapacities=[ { "DesiredWeight": 25, "VariantName": variant1["VariantName"] }, { "DesiredWeight": 75, "VariantName": variant2["VariantName"] } ] )
Die CloudWatch Metriken für die Gesamtzahl der Aufrufe für jede Variante zeigen uns höhere Aufrufe für als für: Variant2 Variant1
Wir können unsere Metriken weiterhin überwachen, und wenn wir mit der Leistung einer Variante zufrieden sind, können wir 100 % des Datenverkehrs an diese Variante weiterleiten. Wir verwenden UpdateEndpointWeightsAndCapacities, um die Zuweisungen des Datenverkehrs für die Varianten zu aktualisieren. Die Gewichtung für Variant1 ist auf 0 und die Gewichtung für Variant2 auf 1 festgelegt. SageMaker AI sendet jetzt 100% aller Inferenzanfragen anVariant2.
sm.update_endpoint_weights_and_capacities( EndpointName=endpoint_name, DesiredWeightsAndCapacities=[ { "DesiredWeight": 0, "VariantName": variant1["VariantName"] }, { "DesiredWeight": 1, "VariantName": variant2["VariantName"] } ] )
Die CloudWatch Metriken für die Gesamtzahl der Aufrufe für jede Variante zeigen, dass alle Inferenzanfragen von verarbeitet werden Variant2 und keine Inferenzanfragen von verarbeitet werden. Variant1
Sie können Ihren Endpunkt jetzt sicher aktualisieren und Variant1 aus Ihrem Endpunkt löschen. Sie können auch mit dem Testen neuer Modelle in der Produktion fortfahren, indem Sie dem Endpunkt neue Varianten hinzufügen und die Schritte 2 – 4 ausführen.