AI Explanations mit AI Platform Prediction verwenden

Dies ist eine allgemeine Anleitung zur Bereitstellung und Verwendung eines AI Platform Prediction-Modells mit AI Explanations.

Hinweise

Bevor Sie ein Modell in AI Platform trainieren und bereitstellen können, müssen Sie einige Schritte ausführen:

  • Lokale Entwicklungsumgebung einrichten
  • GCP-Projekt mit Abrechnung und den erforderlichen APIs einrichten
  • Cloud Storage-Bucket zum Speichern des Trainingspakets und des trainierten Modells erstellen

Folgen Sie bei der Einrichtung Ihres GCP-Projekts der Anleitung in den Beispiel-Notebooks.

Modell speichern

TensorFlow 1.15, 2.1 und 2.2 werden unterstützt. Verwenden Sie tf.saved_model.save zum Speichern von Modellen in TensorFlow 2.3, aber nicht für TensorFlow 1.15.

Weitere Informationen zum Speichern von Modellen zur Verwendung mit AI Explanations und zur Verwendung des Explainable AI SDK.

Erläuterungs-Metadatendatei

Vor dem Bereitstellen des Modells müssen Sie eine Metadatendatei mit Informationen zu Ihren Eingaben, Ausgaben und der Baseline senden, damit Erläuterungen zu den korrekten Teilen Ihres Modells durch AI Explanations bereitgestellt werden können.

Wir empfehlen die Verwendung des Explainable AI SDK, um die Eingaben und Ausgaben Ihres Modells automatisch zu entdecken. In den meisten Fällen spart dies Zeit und Aufwand, da das Explainable AI SDK die Erklärungsmetadaten-Datei für Sie erstellt und hochlädt.

Erläuterungs-Metadatendatei manuell erstellen

Bei einem erweiterten Anwendungsfall können Sie auch Modelleingaben und -ausgaben manuell angeben. So erstellst du eine Erklärungsmetadaten-Datei manuell:

Das folgende Beispiel zeigt, wie eine explanation_metadata.json-Datei aussieht:

{
    "inputs": {
      "data": {
        "input_tensor_name": "YOUR_INPUT_TENSOR_NAME"
        "input_baselines": [0]
      }
    },
    "outputs": {
      "duration": {
        "output_tensor_name": "YOUR_OUTPUT_TENSOR_NAME"
      }
    },
    "framework": "tensorflow"
}

In diesem Beispiel sind "data" und "duration" aussagekräftige Namen für die Eingabe- und Ausgabetensoren, die Sie beim Erstellen und Trainieren des Modells zuweisen können. Die tatsächlichen Namen für Eingabe- und Ausgabetensoren folgen dem Format name:index. Beispiel: x:0 oderPlaceholder:0.

Für input_baselines können Sie erst einmal eine Referenz angeben. In diesem Beispiel stellt [0] ein vollständig schwarzes Bild dar. Sie können mehrere Baselines angeben, um zusätzliche Informationen anzugeben. Weitere Informationen zum Anpassen von Referenzen

Namen für Eingabe- und Ausgabetensoren manuell finden

In den meisten Fällen können Sie mit dem Explainable AI SDK die Ein- und Ausgaben für Ihr Modell generieren. Sie müssen die Eingabe- und Ausgabetensoren nur manuell suchen, wenn Sie ein vortrainiertes TensorFlow 1.15-Modell verwenden.

Wie Sie die Namen für Eingabe- und Ausgabetensoren am besten finden, hängt von den Typen Ihrer Eingabe- und Ausgabedaten sowie davon ab, wie Sie Ihr Modell erstellen. Eine ausführlichere Erläuterung der einzelnen Fälle sowie Beispiele finden Sie in der Anleitung "Ein- und Ausgaben verstehen"

Eingabedatentyp(en) Ausgabedatentyp Weitere Kriterien Empfohlene Vorgehensweise(n)
Numerisch oder String Numerisch Eingaben sind nicht serialisiert. Ausgaben sind keine numerischen Daten, die als kategorische Daten behandelt werden, z. B. numerische Klassen-IDs. Verwenden Sie die SavedModel-Befehlszeile, um die Namen der Eingabe- und Ausgabetensoren zu suchen. Erstellen Sie alternativ die Erläuterungs-Metadatendatei, während Sie das Modell trainieren und speichern, wobei Ihr Programm oder Ihre Umgebung weiterhin Zugriff auf den Trainingscode haben sollte.
Alle serialisierten Daten Alle Fügen Sie Ihrer Bereitstellungseingabefunktion einen TensorFlow-Parsingvorgang hinzu, wenn Sie das Modell exportieren. Verwenden Sie die Ausgabe des Parsingvorgangs, um Eingabetensoren zu identifizieren.
Alle Alle Modell enthält Vorverarbeitungsvorgänge Wenn Sie die Namen der Eingabetensoren nach den Vorverarbeitungsschritten abrufen möchten, verwenden Sie die name-Eigenschaft von tf.Tensor, um die Namen der Eingabetensoren abzurufen.
Alle Keine Wahrscheinlichkeiten, Logits oder andere Typen von Gleitkomma-Tensoren Sie möchten Erläuterungen für Ausgaben erhalten, die keine Wahrscheinlichkeiten, Logits oder andere Arten von Gleitkommatensoren sind. Prüfen Sie Ihre Grafik mit TensorBoard, um die richtigen Ausgabetensoren zu finden.
Alle nicht unterscheidbaren Daten Alle Sie möchten integrierte Gradienten verwenden, für die unterscheidbare Eingaben erforderlich sind. Codieren Sie nicht unterscheidbare Eingaben als unterscheidbare Tensoren. Fügen Sie der Erläuterungs-Metadatendatei die Namen des ursprünglichen Eingabetensors und des codierten Eingabetensors hinzu.

Modelle und Versionen bereitstellen

AI Platform Prediction verwaltet Ihre trainierten Modelle mithilfe von Modell- und Versionsressourcen. Ein AI Platform Prediction-Modell ist ein Container für die Versionen Ihres Modells für maschinelles Lernen.

Zum Bereitstellen eines Modells legen Sie eine Modellressource in AI Platform Prediction an, erstellen eine Version dieses Modells und verknüpfen dann die Modellversion mit der in Cloud Storage gespeicherten Modelldatei.

Modellressource erstellen

AI Platform Prediction verwendet Modellressourcen, um verschiedene Versionen Ihres Modells zu organisieren.

Erstellen Sie eine Modellressource für Ihre Modellversionen. Ersetzen Sie MODEL_NAME im folgenden Befehl des gcloud-Befehlszeilentools durch den gewünschten Namen für Ihr Modell. Ihr Modellname muss mit einem Buchstaben beginnen und darf nur Buchstaben, Zahlen und Unterstriche enthalten.

Sie müssen Ihr Modell auf einem regionalen Endpunkt erstellen, um AI Explanations verwenden zu können.

gcloud ai-platform models create MODEL_NAME \
  --region us-central1

Weitere Informationen finden Sie in der API für AI Platform Prediction-Modelle.

Modellversionen erstellen

Sie können jetzt mit dem trainierten und zuvor in Cloud Storage hochgeladenen Modell eine Modellversion erstellen. Dabei geben Sie die folgenden Parameter an:

  • name: Muss innerhalb des AI Platform Prediction-Modells einmalig sein.
  • deploymentUri: der Pfad zu Ihrem SavedModel-Verzeichnis in Cloud Storage.
  • framework (erforderlich): nur tensorflow
  • runtimeVersion: Verwenden Sie entweder Laufzeitversion 1.15, 2.1 oder 2.2, da diese den AI Explanations-Dienst unterstützen.
  • pythonVersion: Verwenden Sie „3.7“ ab den Laufzeitversionen 1.15.
  • machineType (erforderlich): der Typ der virtuellen Maschine, den AI Platform Prediction für diejenigen Knoten verwendet, die Vorhersagen und Erläuterungen bereitstellen. Wählen Sie einen unterstützten Maschinentyp für AI Explanations aus.
  • explanation-method: zu verwendender Methodentyp für die Feature-Attribution: "sampled-shapley", "integrated-gradient" oder "xrai".
  • Pfade oder Schritte: Verwenden Sie --num-paths für Sampled Shapley und --num-integral-steps für integrierte Gradienten oder XRAI.

Weitere Informationen zu diesen Parametern finden Sie im AI Platform-Training und unter der Prediction API für eine Versionsressource.

  1. Legen Sie Umgebungsvariablen für den Pfad zum Cloud Storage-Verzeichnis mit dem SavedModel sowie den Versionsnamen, den Modellnamen und das von Ihnen gewählte Framework fest.

    MODEL=your_model_name
    MODEL_DIR="gs://your_bucket_name/"
    VERSION=your_version_name
    FRAMEWORK=tensorflow
    
  2. Erstellen Sie die Version:

    EXPLAIN_METHOD="integrated-gradients"
    gcloud beta ai-platform versions create $VERSION \
    --model $MODEL \
    --origin $MODEL_DIR \
    --runtime-version 1.15 \
    --framework $FRAMEWORK \
    --python-version 3.7 \
    --machine-type n1-standard-4 \
    --explanation-method $EXPLAIN_METHOD \
    --num-integral-steps 25 \
    --region us-central1
    

    Das Erstellen der Version dauert einige Minuten. Wenn sie fertig ist, sollten Sie die folgende Ausgabe sehen:

    Creating version (this might take a few minutes)......done.
  3. Prüfen Sie den Status Ihrer Modellbereitstellung und ob Ihr Modell ordnungsgemäß bereitgestellt wird:

    gcloud ai-platform versions describe $VERSION_NAME \
      --model $MODEL_NAME \
      --region us-central1
    

    Prüfen Sie, ob der Status READY lautet. Die Ausgabe sollte etwa so aussehen:

    createTime: '2018-02-28T16:30:45Z'
    deploymentUri: gs://your_bucket_name
    framework: TENSORFLOW
    machineType: n1-standard-4
    name: projects/your_project_id/models/your_model_name/versions/your_version_name
    pythonVersion: '3.7'
    runtimeVersion: '1.15'
    state: READY

Unterstützte Maschinentypen für Erläuterungen

Für AI Explanations-Anfragen müssen Sie Ihre Modellversion mit einem der folgenden Maschinentypen bereitstellen. Wenn Sie keinen Maschinentyp angeben, schlägt die Bereitstellung fehl.

In der folgenden Tabelle werden die verfügbaren Maschinentypen verglichen:

Name vCPUs Arbeitsspeicher (GB)
n1-standard-2 2 7,5
n1-standard-4 4 15
n1-standard-8 8 30
n1-standard-16 16 60
n1-standard-32 32 120

Diese Maschinentypen sind nur für regionale Endpunkte verfügbar. Weitere Informationen zur Unterstützung anderer AI Platform Prediction-Features finden Sie hier.

Weitere Informationen zu den Preisen für die verschiedenen Maschinentypen finden Sie hier. In der Compute Engine-Dokumentation erfahren Sie mehr über die detaillierten Spezifikationen der Compute Engine-Maschinentypen (N1).

Eingabedaten formatieren

Das Basisformat für Onlinevorhersagen ist eine Liste mit Dateninstanzen. Es kann sich dabei um eine einfache Werteliste oder Elemente eines JSON-Objekts handeln. Dies hängt davon ab, wie Sie die Eingaben in der Trainingsanwendung konfiguriert haben: Hier erfahren Sie, wie komplexe Eingaben und binäre Daten für die Vorhersage formatiert werden.

Dieses Beispiel zeigt einen Eingabetensor und einen Instanzschlüssel für ein TensorFlow-Modell:

{"values": [1, 2, 3, 4], "key": 1}

Die Zusammensetzung des JSON-Strings kann komplex sein, solange diese Regeln eingehalten werden:

  • Die oberste Ebene der Instanzdaten muss ein JSON-Objekt sein – ein Wörterbuch aus Schlüssel/Wert-Paaren.

  • Einzelne Werte in einem Instanzobjekt können Strings, Zahlen oder Listen sein. JSON-Objekte können nicht eingebettet werden.

  • Listen dürfen nur Elemente des gleichen Typs (einschließlich anderer Listen) enthalten. Strings und numerische Werte dürfen nicht kombiniert werden.

Sie übergeben Eingabeinstanzen für Onlinevorhersagen als Nachrichtentext für den Aufruf von projects.explain. Weitere Informationen zu den Formatierungsanforderungen des Textes für die Vorhersageanfrage finden Sie hier.

  1. Beachten Sie, dass zum Senden der Anfrage mit gcloud die Eingabedatei eine durch Zeilenumbruch getrennte JSON-Datei sein muss, in der jede Instanz ein JSON-Objekt ist und in einer eigenen Zeile steht.

    {"values": [1, 2, 3, 4], "key": 1}
    {"values": [5, 6, 7, 8], "key": 2}
    

Vorhersagen und Erläuterungen anfragen

Fragen Sie Ihre Vorhersagen und Erläuterungen an:

gcloud beta ai-platform explain \
  --model $MODEL \
  --version $VERSION \
  --json-instances='your-data.txt' \
  --region us-central1

Erläuterungsantwort verstehen

Nachdem Sie das Modell bereitgestellt haben, können Sie mit dem Explainable AI SDK Erläuterungen anfordern und Ergebnisse der Feature-Attribution für Tabellen- und Bilddaten visualisieren.

import explainable_ai_sdk

m = explainable_ai_sdk.load_model_from_ai_platform(PROJECT_ID, MODEL_NAME, VERSION)
explanations = m.explain([instance_dict])
explanations[0].visualize_attributions()

Bei tabellarischen Modellen sind die Quellenangaben in einem Balkendiagramm dargestellt. Bei Bildmodellen werden die Attributionen auf dem Eingabebild angezeigt. Dabei werden dieselben Visualisierungseinstellungen verwendet, die Sie bei der Bereitstellung des Modells angegeben haben.

Weitere Informationen zu den einzelnen Feldern in der Erläuterungsantwort finden Sie in der vollständigen Beispielantwort in der API-Referenz.

Hier können Sie sich darüber informieren, wie Sie die Erläuterungsantwort anhand der Beispiel-Notebooks parsen:

TensorFlow 2:

TensorFlow 1.15:

Erläuterungen prüfen

Mit dem folgenden Codebeispiel können Sie eine Reihe von Erläuterungen prüfen und feststellen, ob Sie Ihre Referenzen anpassen müssen.

Im Code muss der Wert Ihres Eingabeschlüssels nur entsprechend den Angaben in der explanation_metadata.json-Datei aktualisiert werden.

{
    "inputs": {
      "YOUR_INPUT_KEY_VALUE": {
        "input_tensor_name": "YOUR_INPUT_TENSOR_NAME"
        "input_baselines": [0]
      }
    ...
}

Wenn der Wert Ihres Eingabeschlüssels z. B. "data" ist, lautet derselbe Wert in Zeile 4 des folgenden Code-Snippets "data":

def check_explanations(example, mean_tgt_value=None, variance_tgt_value=None):
  passed_test = 0
  total_test = 1
  attribution_vals = example['attributions_by_label'][0]['attributions']['YOUR-INPUT-KEY-VALUE']

  baseline_score = example['attributions_by_label'][0]['baseline_score']
  sum_with_baseline = np.sum(attribution_vals) + baseline_score
  predicted_val = example['attributions_by_label'][0]['example_score']

  # Check 1
  # The prediction at the input is equal to that at the baseline.
  #  Please use a different baseline. Some suggestions are: random input, training
  #  set mean.
  if abs(predicted_val - baseline_score) <= 0.05:
    print('Warning: example score and baseline score are too close.')
    print('You might not get attributions.')
  else:
    passed_test += 1

  # Check 2 (only for models using Integrated Gradient explanations)
  # Ideally, the sum of the integrated gradients must be equal to the difference
  # in the prediction probability at the input and baseline. Any discrepancy in
  # these two values is due to the errors in approximating the integral.
  if explain_method == 'integrated-gradients':
    total_test += 1
    want_integral = predicted_val - baseline_score
    got_integral = sum(attribution_vals)
    if abs(want_integral-got_integral)/abs(want_integral) > 0.05:
        print('Warning: Integral approximation error exceeds 5%.')
        print('Please try increasing the number of integrated gradient steps.')
    else:
        passed_test += 1

  print(passed_test, ' out of ', total_test, ' sanity checks passed.')

Beim Parsen Ihrer Erläuterungen können Sie diese Prüfungen für jede erhaltene Attribution durchführen:

for i in attributions_resp['explanations']:
  check_explanations(i)

Näherungsfehler zur Verbesserung der Ergebnisse verwenden

Die Methoden zur Feature-Attribution in AI Explanations (Sampled Shapley, integrierte Gradienten und XRAI) beruhen alle auf Varianten von Shapley-Werten. Da Shapley-Werte sehr rechenintensiv sind, werden in AI Explanations Näherungswerte anstelle der exakten Werte angegeben. Neben den Ergebnissen der Feature-Attribution gibt AI Explanations auch einen Näherungsfehler zurück. Wenn der Näherungsfehler 0,05 überschreitet, sollten Sie Ihre Eingaben anpassen, um den Fehlerwert zu reduzieren.

Sie können den Wert für den Näherungsfehler reduzieren und sich den exakten Werten annähern, wenn Sie die folgenden Eingaben ändern:

  • Erhöhen der Anzahl der integralen Schritte oder der Anzahl der Pfade
  • Ändern der ausgewählten Eingabereferenz(en)
  • Hinzufügen weiterer Eingabereferenzen. Mit den Methoden "Integrierte Gradienten" und "XRAI" wird durch die Verwendung zusätzlicher Referenzen die Latenz erhöht. Wenn Sie zusätzliche Referenzen mit der Methode "Sampled Shapley" verwenden, wird die Latenz nicht erhöht.

Schritte oder Pfade erhöhen

Erhöhen Sie Folgendes, um den Wert für den Näherungsfehler zu verringern:

  • Die Anzahl der Pfade für Sampled Shapley
  • Die Anzahl der integralen Schritte für integrierte Gradienten oder XRAI

Sie legen diese Parameter bei der Erstellung einer Versionsressource während der Modellbereitstellung fest.

Referenzen anpassen

Sie können input_baselines in Ihrer explanation_metadata.json-Datei festlegen. Dieser Abschnitt enthält Beispiele für tabellarische Daten und für Bilddaten. Bei Eingabereferenzen kann es sich um einen Medianwert, einen Mindestwert, einen Höchstwert oder einen Zufallswert in Bezug auf die Trainingsdaten handeln.

Allgemein gilt:

  • Beginnen Sie mit einer Referenz, die die Medianwerte darstellt.
  • Ändern Sie diese in eine Referenz, die Zufallswerte darstellt.
  • Probieren Sie zwei Referenzen aus, die die Mindest- und Höchstwerte darstellen.
  • Fügen Sie eine weitere Referenz hinzu, die Zufallswerte darstellt.

Beispiel für tabellarische Daten

Mit dem folgenden Python-Code erstellen Sie den Inhalt einer Datei mit Erläuterungsmetadaten für tabellarische Daten. Sie können entweder Sampled Shapley oder integrierte Gradienten verwenden, um Feature-Attributionen für tabellarische Daten zu erhalten. Dieser Code ist Teil des Beispiel-Notebooks für tabellarische Daten.

Beachten Sie, dass input_baselines eine Liste ist, in der Sie mehrere Referenzen angeben können. In diesem Beispiel wird nur eine Referenz festgelegt. Die Referenz ist eine Liste der Medianwerte für die Trainingsdaten (in diesem Beispiel train_data).

explanation_metadata = {
    "inputs": {
      "data": {
        "input_tensor_name": model.input.name,
        "input_baselines": [train_data.median().values.tolist()],
        "encoding": "bag_of_features",
        "index_feature_mapping": train_data.columns.tolist()
      }
    },
    "outputs": {
      "duration": {
        "output_tensor_name": model.output.name
      }
    },
  "framework": "tensorflow"
  }

Legen Sie input_baselines so fest, um zwei Referenzen anzugeben, die die Mindest- und Höchstwerte darstellen: [train_data.min().values.tolist(), train_data.max().values.tolist()]

Beispiel für Bilddaten

Der folgende Python-Code erstellt den Inhalt einer Datei mit Erläuterungsmetadaten für Bilddaten. Sie können integrierte Gradienten verwenden, um Feature-Attributionen für Bilddaten zu erhalten. Dieser Code ist Teil des Beispiel-Notebooks für Bilddaten.

Beachten Sie, dass input_baselines eine Liste ist, in der Sie mehrere Referenzen angeben können. In diesem Beispiel wird nur eine Referenz festgelegt. Die Referenz ist eine Liste von Zufallswerten. Verwenden Sie Zufallswerte für eine Bildreferenz, wenn Ihr Trainings-Dataset sehr viele Schwarz-Weiß-Bilder enthält.

Setzen Sie andernfalls input_baselines auf [0, 1], um Schwarz-Weiß-Bilder darzustellen.

random_baseline = np.random.rand(192,192,3)

explanation_metadata = {
    "inputs": {
      "data": {
        "input_tensor_name": "input_pixels:0",
        "modality": "image",
        "input_baselines": [random_baseline.tolist()]
      }
    },
    "outputs": {
      "probability": {
        "output_tensor_name": "dense/Softmax:0"
      }
    },
  "framework": "tensorflow"
  }

Nächste Schritte