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

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

מידע על ייצוא מודלים של תמונות וסרטונים ב-Edge זמין במאמר ייצוא מודלים של AutoML Edge.

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

מגבלות

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

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

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

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

תהליך הייצוא

השלבים לייצוא המודל:

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

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

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

ייצוא המודל

המסוף

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

    כניסה לדף Models

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

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

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

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

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

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

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

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

REST

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

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

  • LOCATION: האזור שלכם.
  • PROJECT: [מזהה הפרויקט](/resource-manager/docs/creating-managing-projects#identifiers). .
  • 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ההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Java API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את 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ההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Node.js API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את 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)

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

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

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

במשימה הזו תורידו את המודל המיוצא מ-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 שמשכתם קודם.

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

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

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

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

אתם מספקים את הנתונים (השדה 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 ו-1,024.

  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"
      ]
    }
  ]
}

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

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

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

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

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