ייצוא מודלים טבלאיים של AutoML

בדף הזה מוסבר איך להשתמש ב-Vertex AI כדי לייצא את המודל הטבלאי של AutoML ל-Cloud Storage, להוריד את המודל לשרת מקומי או לשרת שמארח ספק שירותי ענן אחר, ואז להשתמש ב-Docker כדי להפוך את המודל לזמין לחיזויים.

מידע על ייצוא מודלים זמין במאמר שיטה: models.export.

אחרי שמייצאים את המודל הטבלאי, אם רוצים לייבא אותו בחזרה ל-Vertex AI, אפשר לעיין במאמר בנושא ייבוא מודלים ל-Vertex AI.

מגבלות

יש מגבלות על ייצוא של מודלים טבלאיים של AutoML:

  • אפשר לייצא רק מודלים של סיווג טבלאי ורגרסיה של AutoML. אין תמיכה בייצוא של מודלים של AutoML לחיזוי נתונים טבלאיים.

  • אי אפשר להשתמש ב-Vertex AI ניתן להסברה באמצעות מודלים טבלאיים שיוצאו. אם אתם צריכים להשתמש ב-Vertex AI ניתן להסברה, עליכם להציג חיזויים ממודל שמתארח ב-Vertex AI.

  • אפשר להפעיל את המודל הטבלאי המיוצא רק במעבדי ארכיטקטורת x86 שתומכים בערכות הוראות של Advanced Vector Extensions‏ (AVX).

תהליך הייצוא

כדי לייצא את המודל:

  1. הגדרת הסביבה
  2. ייצוא המודל
  3. שליפה והפעלה של שרת המודל.
  4. בקשת חיזויים.

לפני שמתחילים

כדי לבצע את המשימה הזו, צריך קודם לסיים את המשימות הבאות:

ייצוא המודל

המסוף

  1. במסוף Google Cloud , בקטע Vertex AI, עוברים לדף Models.

    כניסה לדף Models

  2. לוחצים על המודל הטבלאי שרוצים לייצא כדי לפתוח את דף הפרטים שלו.

  3. לוחצים על ייצוא בסרגל הלחצנים כדי לייצא את המודל.

  4. בוחרים תיקייה קיימת או יוצרים תיקייה חדשה ב-Cloud Storage במיקום הרצוי.

    הקטגוריה צריכה לעמוד בדרישות לגבי קטגוריות.

    אי אפשר לייצא מודל לקטגוריה ברמה העליונה. צריך להשתמש לפחות ברמה אחת של תיקייה.

    כדי לקבל את התוצאות הטובות ביותר, כדאי ליצור תיקייה חדשה וריקה. בשלב מאוחר יותר, תעתיקו את כל התוכן של התיקייה.

  5. לוחצים על ייצוא.

    בקטע הבא נסביר איך להוריד את המודל המיוצא לשרת.

REST

משתמשים בשיטה models.export כדי לייצא מודל ל-Cloud Storage.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • LOCATION: האזור שלכם.
  • PROJECT: מזהה הפרויקט.
  • MODEL_ID: המזהה של המודל שרוצים לייצא.
  • GCS_DESTINATION : תיקיית היעד ב-Cloud Storage. לדוגמה, gs://export-bucket/exports.

    אי אפשר לייצא מודל לקטגוריה ברמה העליונה. צריך להשתמש לפחות ברמה אחת של תיקייה.

    התיקייה צריכה לעמוד בדרישות של הקטגוריה.

    כדי לקבל את התוצאות הטובות ביותר, כדאי ליצור תיקייה חדשה. תעתיקו את כל התוכן של התיקייה בשלב מאוחר יותר.

ה-method של ה-HTTP וכתובת ה-URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID:export

גוף בקשת JSON:

{
  "outputConfig": {
    "exportFormatId": "tf-saved-model",
    "artifactDestination": {
      "outputUriPrefix": "GCS_DESTINATION"
    }
  }
}

כדי לשלוח את הבקשה עליכם לבחור אחת מהאפשרויות הבאות:

curl

שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID:export"

PowerShell

שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/models/MODEL_ID:export" | Select-Object -Expand Content

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/models/MODEL_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.ExportModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-12T20:53:40.130785Z",
      "updateTime": "2020-10-12T20:53:40.130785Z"
    },
    "outputInfo": {
      "artifactOutputUri": "gs://OUTPUT_BUCKET/model-MODEL_ID/EXPORT_FORMAT/YYYY-MM-DDThh:mm:ss.sssZ"
    }
  }
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה במאמר Vertex AI quickstart using client libraries. מידע נוסף מופיע במאמרי העזרה של Vertex AI Java API.

כדי לבצע אימות ב-Vertex AI, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.aiplatform.v1.ExportModelOperationMetadata;
import com.google.cloud.aiplatform.v1.ExportModelRequest;
import com.google.cloud.aiplatform.v1.ExportModelResponse;
import com.google.cloud.aiplatform.v1.GcsDestination;
import com.google.cloud.aiplatform.v1.ModelName;
import com.google.cloud.aiplatform.v1.ModelServiceClient;
import com.google.cloud.aiplatform.v1.ModelServiceSettings;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ExportModelTabularClassificationSample {
  public static void main(String[] args)
      throws InterruptedException, ExecutionException, TimeoutException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    String gcsDestinationOutputUriPrefix = "gs://your-gcs-bucket/destination_path";
    String project = "YOUR_PROJECT_ID";
    String modelId = "YOUR_MODEL_ID";
    exportModelTableClassification(gcsDestinationOutputUriPrefix, project, modelId);
  }

  static void exportModelTableClassification(
      String gcsDestinationOutputUriPrefix, String project, String modelId)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    ModelServiceSettings modelServiceSettings =
        ModelServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (ModelServiceClient modelServiceClient = ModelServiceClient.create(modelServiceSettings)) {
      String location = "us-central1";
      ModelName modelName = ModelName.of(project, location, modelId);

      GcsDestination.Builder gcsDestination = GcsDestination.newBuilder();
      gcsDestination.setOutputUriPrefix(gcsDestinationOutputUriPrefix);
      ExportModelRequest.OutputConfig outputConfig =
          ExportModelRequest.OutputConfig.newBuilder()
              .setExportFormatId("tf-saved-model")
              .setArtifactDestination(gcsDestination)
              .build();

      OperationFuture<ExportModelResponse, ExportModelOperationMetadata> exportModelResponseFuture =
          modelServiceClient.exportModelAsync(modelName, outputConfig);
      System.out.format(
          "Operation name: %s\n", exportModelResponseFuture.getInitialFuture().get().getName());
      System.out.println("Waiting for operation to finish...");
      ExportModelResponse exportModelResponse =
          exportModelResponseFuture.get(300, TimeUnit.SECONDS);
      System.out.format(
          "Export Model Tabular Classification Response: %s", exportModelResponse.toString());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה במאמר Vertex AI quickstart using client libraries. מידע נוסף מופיע במאמרי העזרה של Vertex AI Node.js API.

כדי לבצע אימות ב-Vertex AI, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */

// const gcsDestinationOutputUriPrefix ='YOUR_GCS_DESTINATION_\
// OUTPUT_URI_PREFIX'; eg. "gs://<your-gcs-bucket>/destination_path"
// const modelId = 'YOUR_MODEL_ID';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

// Imports the Google Cloud Model Service Client library
const {ModelServiceClient} = require('@google-cloud/aiplatform');

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};

// Instantiates a client
const modelServiceClient = new ModelServiceClient(clientOptions);

async function exportModelTabularClassification() {
  // Configure the name resources
  const name = `projects/${project}/locations/${location}/models/${modelId}`;
  // Configure the outputConfig resources
  const outputConfig = {
    exportFormatId: 'tf-saved-model',
    artifactDestination: {
      outputUriPrefix: gcsDestinationOutputUriPrefix,
    },
  };
  const request = {
    name,
    outputConfig,
  };

  // Export Model request
  const [response] = await modelServiceClient.exportModel(request);
  console.log(`Long running operation : ${response.name}`);

  // Wait for operation to complete
  await response.promise();
  console.log(`Export model response : ${JSON.stringify(response.result)}`);
}
exportModelTabularClassification();

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

from google.cloud import aiplatform_v1beta1


def export_model_tabular_classification_sample(
    project: str,
    model_id: str,
    gcs_destination_output_uri_prefix: str,
    location: str = "us-central1",
    api_endpoint: str = "us-central1-aiplatform.googleapis.com",
    timeout: int = 300,
):
    # The AI Platform services require regional API endpoints.
    client_options = {"api_endpoint": api_endpoint}
    # Initialize client that will be used to create and send requests.
    # This client only needs to be created once, and can be reused for multiple requests.
    client = aiplatform_v1beta1.ModelServiceClient(client_options=client_options)
    gcs_destination = {"output_uri_prefix": gcs_destination_output_uri_prefix}
    output_config = {
        "artifact_destination": gcs_destination,
        "export_format_id": "tf-saved-model",
    }
    name = client.model_path(project=project, location=location, model=model_id)
    response = client.export_model(name=name, output_config=output_config)
    print("Long running operation:", response.operation.name)
    print("output_info:", response.metadata.output_info)
    export_model_response = response.result(timeout=timeout)
    print("export_model_response:", export_model_response)

קבלת הסטטוס של פעולת ייצוא

חלק מהבקשות מפעילות תהליכים ארוכים שדורשים זמן להשלמה. הבקשות האלה מחזירות שם פעולה, שאפשר להשתמש בו כדי לראות את סטטוס הפעולה או לבטל אותה. ‫Vertex AI מספק שיטות עזר לביצוע קריאות לפעולות ממושכות. מידע נוסף זמין במאמר בנושא עבודה עם פעולות ממושכות.

שליפה והרצה של שרת המודל

במשימה הזו תורידו את המודל המיוצא מ-Cloud Storage ותפעילו את קונטיינר Docker, כדי שהמודל יהיה מוכן לקבל בקשות לחיזוי.

כדי לשלוף ולהריץ את שרת המודל:

  1. במחשב שבו יופעל המודל, עוברים לספרייה שבה רוצים לשמור את המודל המיוצא.

  2. מורידים את המודל המיוצא:

    gcloud storage cp <var>gcs-destination</var> . --recursive
    

    כאשר gcs-destination הוא הנתיב למיקום של המודל המיוצא ב-Cloud Storage.

    המודל מועתק לספרייה הנוכחית, בנתיב הבא:

    ./model-<model-id>/tf-saved-model/<export-timestamp>

    הנתיב יכול להכיל את tf-saved-model או את custom-trained.

  3. משנים את השם של הספרייה כדי להסיר את חותמת הזמן.

    mv model-<model-id>/tf-saved-model/<export-timestamp> model-<model-id>/tf-saved-model/<new-dir-name>
    

    חותמת הזמן הופכת את הספרייה ללא תקינה עבור Docker.

  4. מושכים את קובץ אימג' של Docker של שרת המודל.

    sudo docker pull MODEL_SERVER_IMAGE
    

    התמונה של שרת המודלים למשיכה נמצאת בקובץ environment.json בספריית המודלים המיוצאת. הנתיב צריך להיות:

    ./model-<model-id>/tf-saved-model/<new-dir-name>/environment.json

  5. מפעילים את קונטיינר Docker באמצעות שם הספרייה שיצרתם:

    docker run -v `pwd`/model-<model-id>/tf-saved-model/<new-dir-name>:/models/default -p 8080:8080 -it MODEL_SERVER_IMAGE
    

אפשר להפסיק את שרת המודל בכל שלב באמצעות Ctrl-C.

עדכון של קובץ ה-Docker של שרת המודל

כשמייצאים את המודל, מורידים את קובץ ה-Docker של שרת המודל, ולכן צריך לעדכן את שרת המודל באופן מפורש כדי לקבל עדכונים ותיקוני באגים. צריך לעדכן את שרת המודלים באופן תקופתי באמצעות הפקודה הבאה:

docker pull MODEL_SERVER_IMAGE

מוודאים שכתובת ה-URI של קובץ אימג' של Docker זהה לכתובת ה-URI של קובץ אימג' של Docker שמשכתם קודם.

קבלת תחזיות מהמודל המיוצא

שרת המודלים בקונטיינר של תמונת Vertex AI מטפל בבקשות לחיזוי ומחזיר תוצאות חיזוי.

אי אפשר להשתמש בחיזוי אצווה במודלים שמייצאים.

פורמט נתוני החיזוי

אתם מספקים את הנתונים (השדה payload) לבקשת החיזוי בפורמט JSON הבא:

{ "instances": [ { "column_name_1": value, "column_name_2": value, … } , … ] }

בדוגמה הבאה מוצגת בקשה עם שלוש עמודות: עמודה קטגורית, מערך מספרי ומבנה. הבקשה כוללת שתי שורות.

{
  "instances": [
    {
      "categorical_col": "mouse",
      "num_array_col": [
        1,
        2,
        3
      ],
      "struct_col": {
        "foo": "piano",
        "bar": "2019-05-17T23:56:09.05Z"
      }
    },
    {
      "categorical_col": "dog",
      "num_array_col": [
        5,
        6,
        7
      ],
      "struct_col": {
        "foo": "guitar",
        "bar": "2019-06-17T23:56:09.05Z"
      }
    }
  ]
}

שליחת בקשת חיזוי

  1. מכניסים את נתוני הבקשה לקובץ טקסט, למשל, tmp/request.json.

    מספר השורות של הנתונים בבקשה לתחזית, שנקרא גודל המיני-אצווה, משפיע על זמן האחזור ועל קצב העברת הנתונים של התחזית. ככל שגודל המיני-batch גדול יותר, כך זמן האחזור והתפוקה גבוהים יותר. כדי להקטין את זמן האחזור, כדאי להשתמש בגודל קטן יותר של מיני-אצווה. כדי להגדיל את קצב העברת הנתונים, מגדילים את גודל המיני-batch. הגדלים הנפוצים ביותר של קבוצות קטנות הם 1, 32, 64, 128, 256, 512 ו-1024.

  2. שליחת בקשה לתחזית:

    curl -X POST --data @/tmp/request.json http://localhost:8080/predict
    

פורמט תוצאות התחזית

הפורמט של התוצאות תלוי ביעד של המודל.

תוצאות של מודל סיווג

תוצאות החיזוי של מודלים לסיווג (בינארי ורב-מחלקה) מחזירות ציון הסתברות לכל ערך פוטנציאלי של עמודת היעד. אתם צריכים להחליט איך אתם רוצים להשתמש בציונים. לדוגמה, כדי לקבל סיווג בינארי מהציונים שסופקו, צריך לזהות ערך סף. אם יש שתי מחלקות, A ו-B, צריך לסווג את הדוגמה כ-A אם הניקוד של A גבוה מהסף שנבחר, וכ-B אחרת. במערכי נתונים לא מאוזנים, יכול להיות שערך הסף יתקרב ל-100% או ל-0%.

מטען הייעודי (payload) של תוצאות עבור מודל סיווג נראה דומה לדוגמה הזו:

{
  "predictions": [
    {
      "scores": [
        0.539999994635582,
        0.2599999845027924,
        0.2000000208627896
      ],
      "classes": [
        "apple",
        "orange",
        "grape"
      ]
    },
    {
      "scores": [
        0.23999999463558197,
        0.35999998450279236,
        0.40000002086278963
      ],
      "classes": [
        "apple",
        "orange",
        "grape"
      ]
    }
  ]
}

תוצאות של מודל רגרסיה

ערך חזוי מוחזר לכל שורה תקינה של בקשת החיזוי. לא מוחזרים מרווחי חיזוי עבור מודלים שמיוצאים.

מטען הייעודי של תוצאות למודל רגרסיה נראה דומה לדוגמה הזו:

{
  "predictions": [
    {
      "value": -304.3663330078125,
      "lower_bound": -56.32196807861328,
      "upper_bound": 126.51904296875
    },
    {
      "value": -112.3663330078125,
      "lower_bound": 16.32196807861328,
      "upper_bound": 255.51904296875
    }
  ]
}

המאמרים הבאים