קבלת מסקנות ממודל לסיווג תמונות

בדף הזה מוסבר איך לקבל מסקנות אונליין (בזמן אמת) ומסקנות באצווה ממודלים לסיווג תמונות באמצעות מסוף Google Cloud או Agent Platform API.

ההבדל בין מסקנות אונליין לבין מסקנות באצווה

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

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

קבלת מסקנות אונליין

פריסת מודל בנקודת קצה

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

אפשר לפרוס יותר ממודל אחד לנקודת קצה, ואפשר לפרוס מודל ליותר מנקודת קצה אחת. מידע נוסף על אפשרויות ועל תרחישי שימוש להטמעה של מודלים

כדי לפרוס מודל, משתמשים באחת מהשיטות הבאות:

מסוף Google Cloud

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

    כניסה לדף Models

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

  3. בעמודה מזהה גרסה, לוחצים על המזהה של גרסת המודל שרוצים לפרוס.

  4. לוחצים על פריסה ובדיקה.

    אם המודל כבר נפרס בנקודות קצה כלשהן, הן מפורטות בקטע Deploy your model.

  5. לוחצים על Deploy to endpoint.

  6. כדי לפרוס את המודל לנקודת קצה חדשה, לוחצים על יצירת נקודת קצה חדשה ומזינים שם לנקודת הקצה החדשה. כדי לפרוס את המודל לנקודת קצה קיימת, לוחצים על Add to existing endpoint (הוספה לנקודת קצה קיימת) ובוחרים את נקודת הקצה Endpoint name (שם נקודת הקצה).

    אפשר להוסיף יותר ממודל אחד לנקודת קצה, ואפשר להוסיף מודל לכמה נקודות קצה. מידע נוסף

    אם אתם פורסים לנקודת קצה חדשה, בוחרים איך אפשר לגשת לנקודת הקצה:

    • לוחצים על Standard כדי שנקודת הקצה תהיה זמינה להסקת מסקנות באמצעות API בארכיטקטורת REST.

    • לוחצים על פרטי כדי שנקודת הקצה תשתמש בחיבור פרטי.

    אם מבצעים פריסה לנקודת קצה קיימת שפריסה אליה מודל אחד או יותר, צריך לעדכן את אחוז חלוקת התנועה של המודל שמבצעים לו פריסה ושל המודלים שכבר נפרסו, כך שהאחוזים שלהם יסתכמו ל-100%.

  7. בוחרים באפשרות AutoML Image ומגדירים אותה באופן הבא:

    1. אם אתם פורסים את המודל לנקודת קצה חדשה, צריך להזין 100 בפיצול התנועה. אחרת, צריך לשנות את ערכי חלוקת התנועה של כל המודלים בנקודת הקצה כך שהסכום שלהם יהיה 100.

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

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

    3. איך משנים את הגדרות ברירת המחדל של רישום מסקנות

    4. מודלים של סיווג בלבד (אופציונלי): בקטע אפשרויות של יכולת הסברה בוחרים באפשרות הפעלת שיוך תכונות למודל הזה כדי להפעיל את Vertex AI ניתן להסברה. מאשרים את הגדרות התצוגה החזותית הקיימות או בוחרים ערכים חדשים ולוחצים על סיום.

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

    5. לוחצים על סיום ליד המודל, ואם כל אחוזי פיצול התנועה נכונים, לוחצים על המשך.

      האזור שבו המודל נפרס מוצג. האזור הזה צריך להיות האזור שבו יצרתם את המודל.

    6. לוחצים על Deploy (פריסה) כדי לפרוס את המודל בנקודת הקצה.

API

כשפורסים מודל באמצעות Agent Platform API, מבצעים את השלבים הבאים:

  1. אם צריך, יוצרים נקודת קצה.
  2. מוצאים את מזהה נקודת הקצה.
  3. פורסים את המודל בנקודת הקצה.

יצירת נקודת קצה

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

gcloud

בדוגמה הבאה משתמשים בפקודה gcloud ai endpoints create:

gcloud ai endpoints create \
  --region=LOCATION \
  --display-name=ENDPOINT_NAME

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

  • LOCATION_ID: האזור שבו משתמשים ב-Agent Platform.
  • ENDPOINT_NAME: השם המוצג של נקודת הקצה.

יכול להיות שיחלפו כמה שניות עד שכלי Google Cloud CLI ייצור את נקודת הקצה.

REST

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

  • LOCATION_ID: האזור שלכם.
  • PROJECT_ID: [מזהה הפרויקט](/resource-manager/docs/creating-managing-projects#identifiers). .
  • ENDPOINT_NAME: השם המוצג של נקודת הקצה.

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

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints

תוכן בקשת JSON:

{
  "display_name": "ENDPOINT_NAME"
}

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

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateEndpointOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-11-05T17:45:42.812656Z",
      "updateTime": "2020-11-05T17:45:42.812656Z"
    }
  }
}
אפשר לבדוק את סטטוס הפעולה עד שהתשובה כוללת את "done": true.

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח.

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


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.aiplatform.v1.CreateEndpointOperationMetadata;
import com.google.cloud.aiplatform.v1.Endpoint;
import com.google.cloud.aiplatform.v1.EndpointServiceClient;
import com.google.cloud.aiplatform.v1.EndpointServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateEndpointSample {

  public static void main(String[] args)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String endpointDisplayName = "YOUR_ENDPOINT_DISPLAY_NAME";
    createEndpointSample(project, endpointDisplayName);
  }

  static void createEndpointSample(String project, String endpointDisplayName)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    EndpointServiceSettings endpointServiceSettings =
        EndpointServiceSettings.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 (EndpointServiceClient endpointServiceClient =
        EndpointServiceClient.create(endpointServiceSettings)) {
      String location = "us-central1";
      LocationName locationName = LocationName.of(project, location);
      Endpoint endpoint = Endpoint.newBuilder().setDisplayName(endpointDisplayName).build();

      OperationFuture<Endpoint, CreateEndpointOperationMetadata> endpointFuture =
          endpointServiceClient.createEndpointAsync(locationName, endpoint);
      System.out.format("Operation name: %s\n", endpointFuture.getInitialFuture().get().getName());
      System.out.println("Waiting for operation to finish...");
      Endpoint endpointResponse = endpointFuture.get(300, TimeUnit.SECONDS);

      System.out.println("Create Endpoint Response");
      System.out.format("Name: %s\n", endpointResponse.getName());
      System.out.format("Display Name: %s\n", endpointResponse.getDisplayName());
      System.out.format("Description: %s\n", endpointResponse.getDescription());
      System.out.format("Labels: %s\n", endpointResponse.getLabelsMap());
      System.out.format("Create Time: %s\n", endpointResponse.getCreateTime());
      System.out.format("Update Time: %s\n", endpointResponse.getUpdateTime());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח.

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

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

// const endpointDisplayName = 'YOUR_ENDPOINT_DISPLAY_NAME';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

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

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

// Instantiates a client
const endpointServiceClient = new EndpointServiceClient(clientOptions);

async function createEndpoint() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;
  const endpoint = {
    displayName: endpointDisplayName,
  };
  const request = {
    parent,
    endpoint,
  };

  // Get and print out a list of all the endpoints for this resource
  const [response] = await endpointServiceClient.createEndpoint(request);
  console.log(`Long running operation : ${response.name}`);

  // Wait for operation to complete
  await response.promise();
  const result = response.result;

  console.log('Create endpoint response');
  console.log(`\tName : ${result.name}`);
  console.log(`\tDisplay name : ${result.displayName}`);
  console.log(`\tDescription : ${result.description}`);
  console.log(`\tLabels : ${JSON.stringify(result.labels)}`);
  console.log(`\tCreate time : ${JSON.stringify(result.createTime)}`);
  console.log(`\tUpdate time : ${JSON.stringify(result.updateTime)}`);
}
createEndpoint();

Python

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

def create_endpoint_sample(
    project: str,
    display_name: str,
    location: str,
):
    aiplatform.init(project=project, location=location)

    endpoint = aiplatform.Endpoint.create(
        display_name=display_name,
        project=project,
        location=location,
    )

    print(endpoint.display_name)
    print(endpoint.resource_name)
    return endpoint

אחזור מזהה נקודת הקצה

כדי לפרוס את המודל, צריך את מזהה נקודת הקצה.

gcloud

בדוגמה הבאה משתמשים בפקודה gcloud ai endpoints list:

gcloud ai endpoints list \
  --region=LOCATION \
  --filter=display_name=ENDPOINT_NAME

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

  • LOCATION_ID: האזור שבו משתמשים ב-Agent Platform.
  • ENDPOINT_NAME: השם המוצג של נקודת הקצה.

רושמים את המספר שמופיע בעמודה ENDPOINT_ID. משתמשים במזהה הזה בשלב הבא.

REST

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

  • LOCATION_ID: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: .
  • ENDPOINT_NAME: השם המוצג של נקודת הקצה.

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

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints?filter=display_name=ENDPOINT_NAME

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

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

{
  "endpoints": [
    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/endpoints/ENDPOINT_ID",
      "displayName": "ENDPOINT_NAME",
      "etag": "AMEw9yPz5pf4PwBHbRWOGh0PcAxUdjbdX2Jm3QO_amguy3DbZGP5Oi_YUKRywIE-BtLx",
      "createTime": "2020-04-17T18:31:11.585169Z",
      "updateTime": "2020-04-17T18:35:08.568959Z"
    }
  ]
}
שימו לב ל-ENDPOINT_ID.

פריסת המודל

בוחרים את הכרטיסייה של השפה או הסביבה שלכם:

gcloud

בדוגמאות הבאות משתמשים בפקודה gcloud ai endpoints deploy-model.

בדוגמה הבאה מתבצע פריסה של Model ל-Endpoint בלי לפצל את התנועה בין כמה משאבי DeployedModel:

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

  • ENDPOINT_ID: המזהה של נקודת הקצה.
  • LOCATION_ID: האזור שבו משתמשים ב-Agent Platform.
  • MODEL_ID: המזהה של המודל שרוצים לפרוס.
  • DEPLOYED_MODEL_NAME: שם ל-DeployedModel. אפשר להשתמש גם בשם המוצג של Model בשביל DeployedModel.
  • MIN_REPLICA_COUNT: מספר הצמתים המינימלי לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים לפי הצורך בהתאם לעומס ההסקה, עד למספר המקסימלי של הצמתים, אבל אף פעם לא פחות ממספר הצמתים הזה.
  • MAX_REPLICA_COUNT: המספר המקסימלי של הצמתים לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים בהתאם לעומס ההסקה, עד למספר הצמתים הזה ולעולם לא פחות ממספר הצמתים המינימלי. אם לא מציינים את הדגל --max-replica-count, המספר המקסימלי של הצמתים מוגדר לערך של --min-replica-count.

מריצים את הפקודה gcloud ai endpoints deploy-model:

‫Linux,‏ macOS או Cloud Shell

gcloud ai endpoints deploy-model ENDPOINT_ID\
  --region=LOCATION_ID \
  --model=MODEL_ID \
  --display-name=DEPLOYED_MODEL_NAME \
  --min-replica-count=MIN_REPLICA_COUNT \
  --max-replica-count=MAX_REPLICA_COUNT \
  --traffic-split=0=100

‏Windows (PowerShell)

gcloud ai endpoints deploy-model ENDPOINT_ID`
  --region=LOCATION_ID `
  --model=MODEL_ID `
  --display-name=DEPLOYED_MODEL_NAME `
  --min-replica-count=MIN_REPLICA_COUNT `
  --max-replica-count=MAX_REPLICA_COUNT `
  --traffic-split=0=100

Windows‏ (cmd.exe)

gcloud ai endpoints deploy-model ENDPOINT_ID^
  --region=LOCATION_ID ^
  --model=MODEL_ID ^
  --display-name=DEPLOYED_MODEL_NAME ^
  --min-replica-count=MIN_REPLICA_COUNT ^
  --max-replica-count=MAX_REPLICA_COUNT ^
  --traffic-split=0=100
 

חלוקת התנועה

הדגל --traffic-split=0=100 בדוגמאות שלמעלה שולח 100% מתנועת החיזוי שמתקבלת ב-Endpoint אל DeployedModel החדש, שמיוצג על ידי המזהה הזמני 0. אם ב-Endpoint כבר יש משאבים אחרים, אפשר לפצל את התנועה בין המשאבים החדשים לבין המשאבים הישנים.DeployedModelEndpointDeployedModel לדוגמה, כדי לשלוח 20% מהתנועה ל-DeployedModel החדש ו-80% מהתנועה ל-DeployedModel ישן יותר, מריצים את הפקודה הבאה.

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

  • OLD_DEPLOYED_MODEL_ID: המזהה של DeployedModel הקיים.

מריצים את הפקודה gcloud ai endpoints deploy-model:

‫Linux,‏ macOS או Cloud Shell

gcloud ai endpoints deploy-model ENDPOINT_ID\
  --region=LOCATION_ID \
  --model=MODEL_ID \
  --display-name=DEPLOYED_MODEL_NAME \ 
  --min-replica-count=MIN_REPLICA_COUNT \
  --max-replica-count=MAX_REPLICA_COUNT \
  --traffic-split=0=20,OLD_DEPLOYED_MODEL_ID=80

‏Windows (PowerShell)

gcloud ai endpoints deploy-model ENDPOINT_ID`
  --region=LOCATION_ID `
  --model=MODEL_ID `
  --display-name=DEPLOYED_MODEL_NAME \ 
  --min-replica-count=MIN_REPLICA_COUNT `
  --max-replica-count=MAX_REPLICA_COUNT `
  --traffic-split=0=20,OLD_DEPLOYED_MODEL_ID=80

Windows‏ (cmd.exe)

gcloud ai endpoints deploy-model ENDPOINT_ID^
  --region=LOCATION_ID ^
  --model=MODEL_ID ^
  --display-name=DEPLOYED_MODEL_NAME \ 
  --min-replica-count=MIN_REPLICA_COUNT ^
  --max-replica-count=MAX_REPLICA_COUNT ^
  --traffic-split=0=20,OLD_DEPLOYED_MODEL_ID=80
 

REST

פורסים את המודל.

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

  • LOCATION_ID: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: .
  • ENDPOINT_ID: המזהה של נקודת הקצה.
  • MODEL_ID: המזהה של המודל שרוצים לפרוס.
  • DEPLOYED_MODEL_NAME: שם ל-DeployedModel. אפשר להשתמש גם בשם המוצג של Model בשביל DeployedModel.
  • MIN_REPLICA_COUNT: מספר הצמתים המינימלי לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים לפי הצורך בהתאם לעומס ההסקה, עד למספר המקסימלי של הצמתים, אבל אף פעם לא פחות ממספר הצמתים הזה.
  • MAX_REPLICA_COUNT: המספר המקסימלי של הצמתים לפריסה הזו. אפשר להגדיל או להקטין את מספר הצמתים בהתאם לעומס ההסקה, עד למספר הצמתים הזה ולעולם לא פחות ממספר הצמתים המינימלי.
  • TRAFFIC_SPLIT_THIS_MODEL: אחוז תנועת החיזוי לנקודת הקצה הזו שינותב למודל שנפרס באמצעות הפעולה הזו. ברירת המחדל היא 100. סכום כל האחוזים של התנועה צריך להיות 100. מידע נוסף על פיצול תנועה
  • DEPLOYED_MODEL_ID_N: אופציונלי. אם מודלים אחרים נפרסים בנקודת הקצה הזו, צריך לעדכן את אחוז חלוקת התנועה שלהם כך שסכום כל האחוזים יהיה 100.
  • TRAFFIC_SPLIT_MODEL_N: ערך אחוז פיצול התנועה למזהה המודל שנפרס.
  • PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי

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

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel

תוכן בקשת JSON:

{
  "deployedModel": {
    "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "automaticResources": {
       "minReplicaCount": MIN_REPLICA_COUNT,
       "maxReplicaCount": MAX_REPLICA_COUNT
     }
  },
  "trafficSplit": {
    "0": TRAFFIC_SPLIT_THIS_MODEL,
    "DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
    "DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
  },
}

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

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

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-19T17:53:16.502088Z",
      "updateTime": "2020-10-19T17:53:16.502088Z"
    }
  }
}

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח.

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


import com.google.api.gax.longrunning.OperationFuture;
import com.google.api.gax.longrunning.OperationTimedPollAlgorithm;
import com.google.api.gax.retrying.RetrySettings;
import com.google.cloud.aiplatform.v1.AutomaticResources;
import com.google.cloud.aiplatform.v1.DedicatedResources;
import com.google.cloud.aiplatform.v1.DeployModelOperationMetadata;
import com.google.cloud.aiplatform.v1.DeployModelResponse;
import com.google.cloud.aiplatform.v1.DeployedModel;
import com.google.cloud.aiplatform.v1.EndpointName;
import com.google.cloud.aiplatform.v1.EndpointServiceClient;
import com.google.cloud.aiplatform.v1.EndpointServiceSettings;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.ModelName;
import com.google.cloud.aiplatform.v1.stub.EndpointServiceStubSettings;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.threeten.bp.Duration;

public class DeployModelSample {

  public static void main(String[] args)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String deployedModelDisplayName = "YOUR_DEPLOYED_MODEL_DISPLAY_NAME";
    String endpointId = "YOUR_ENDPOINT_NAME";
    String modelId = "YOUR_MODEL_ID";
    int timeout = 900;
    deployModelSample(project, deployedModelDisplayName, endpointId, modelId, timeout);
  }

  static void deployModelSample(
      String project,
      String deployedModelDisplayName,
      String endpointId,
      String modelId,
      int timeout)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {

    // Set long-running operations (LROs) timeout
    final OperationTimedPollAlgorithm operationTimedPollAlgorithm =
        OperationTimedPollAlgorithm.create(
            RetrySettings.newBuilder()
                .setInitialRetryDelay(Duration.ofMillis(5000L))
                .setRetryDelayMultiplier(1.5)
                .setMaxRetryDelay(Duration.ofMillis(45000L))
                .setInitialRpcTimeout(Duration.ZERO)
                .setRpcTimeoutMultiplier(1.0)
                .setMaxRpcTimeout(Duration.ZERO)
                .setTotalTimeout(Duration.ofSeconds(timeout))
                .build());

    EndpointServiceStubSettings.Builder endpointServiceStubSettingsBuilder =
        EndpointServiceStubSettings.newBuilder();
    endpointServiceStubSettingsBuilder
        .deployModelOperationSettings()
        .setPollingAlgorithm(operationTimedPollAlgorithm);
    EndpointServiceStubSettings endpointStubSettings = endpointServiceStubSettingsBuilder.build();
    EndpointServiceSettings endpointServiceSettings =
        EndpointServiceSettings.create(endpointStubSettings);
    endpointServiceSettings =
        endpointServiceSettings.toBuilder()
            .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 (EndpointServiceClient endpointServiceClient =
        EndpointServiceClient.create(endpointServiceSettings)) {
      String location = "us-central1";
      EndpointName endpointName = EndpointName.of(project, location, endpointId);
      // key '0' assigns traffic for the newly deployed model
      // Traffic percentage values must add up to 100
      // Leave dictionary empty if endpoint should not accept any traffic
      Map<String, Integer> trafficSplit = new HashMap<>();
      trafficSplit.put("0", 100);
      ModelName modelName = ModelName.of(project, location, modelId);
      AutomaticResources automaticResourcesInput =
          AutomaticResources.newBuilder().setMinReplicaCount(1).setMaxReplicaCount(1).build();
      DeployedModel deployedModelInput =
          DeployedModel.newBuilder()
              .setModel(modelName.toString())
              .setDisplayName(deployedModelDisplayName)
              .setAutomaticResources(automaticResourcesInput)
              .build();

      OperationFuture<DeployModelResponse, DeployModelOperationMetadata> deployModelResponseFuture =
          endpointServiceClient.deployModelAsync(endpointName, deployedModelInput, trafficSplit);
      System.out.format(
          "Operation name: %s\n", deployModelResponseFuture.getInitialFuture().get().getName());
      System.out.println("Waiting for operation to finish...");
      DeployModelResponse deployModelResponse = deployModelResponseFuture.get(20, TimeUnit.MINUTES);

      System.out.println("Deploy Model Response");
      DeployedModel deployedModel = deployModelResponse.getDeployedModel();
      System.out.println("\tDeployed Model");
      System.out.format("\t\tid: %s\n", deployedModel.getId());
      System.out.format("\t\tmodel: %s\n", deployedModel.getModel());
      System.out.format("\t\tDisplay Name: %s\n", deployedModel.getDisplayName());
      System.out.format("\t\tCreate Time: %s\n", deployedModel.getCreateTime());

      DedicatedResources dedicatedResources = deployedModel.getDedicatedResources();
      System.out.println("\t\tDedicated Resources");
      System.out.format("\t\t\tMin Replica Count: %s\n", dedicatedResources.getMinReplicaCount());

      MachineSpec machineSpec = dedicatedResources.getMachineSpec();
      System.out.println("\t\t\tMachine Spec");
      System.out.format("\t\t\t\tMachine Type: %s\n", machineSpec.getMachineType());
      System.out.format("\t\t\t\tAccelerator Type: %s\n", machineSpec.getAcceleratorType());
      System.out.format("\t\t\t\tAccelerator Count: %s\n", machineSpec.getAcceleratorCount());

      AutomaticResources automaticResources = deployedModel.getAutomaticResources();
      System.out.println("\t\tAutomatic Resources");
      System.out.format("\t\t\tMin Replica Count: %s\n", automaticResources.getMinReplicaCount());
      System.out.format("\t\t\tMax Replica Count: %s\n", automaticResources.getMaxReplicaCount());
    }
  }
}

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח.

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

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

// const modelId = "YOUR_MODEL_ID";
// const endpointId = 'YOUR_ENDPOINT_ID';
// const deployedModelDisplayName = 'YOUR_DEPLOYED_MODEL_DISPLAY_NAME';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

const modelName = `projects/${project}/locations/${location}/models/${modelId}`;
const endpoint = `projects/${project}/locations/${location}/endpoints/${endpointId}`;
// Imports the Google Cloud Endpoint Service Client library
const {EndpointServiceClient} = require('@google-cloud/aiplatform');

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

// Instantiates a client
const endpointServiceClient = new EndpointServiceClient(clientOptions);

async function deployModel() {
  // Configure the parent resource
  // key '0' assigns traffic for the newly deployed model
  // Traffic percentage values must add up to 100
  // Leave dictionary empty if endpoint should not accept any traffic
  const trafficSplit = {0: 100};
  const deployedModel = {
    // format: 'projects/{project}/locations/{location}/models/{model}'
    model: modelName,
    displayName: deployedModelDisplayName,
    automaticResources: {minReplicaCount: 1, maxReplicaCount: 1},
  };
  const request = {
    endpoint,
    deployedModel,
    trafficSplit,
  };

  // Get and print out a list of all the endpoints for this resource
  const [response] = await endpointServiceClient.deployModel(request);
  console.log(`Long running operation : ${response.name}`);

  // Wait for operation to complete
  await response.promise();
  const result = response.result;

  console.log('Deploy model response');
  const modelDeployed = result.deployedModel;
  console.log('\tDeployed model');
  if (!modelDeployed) {
    console.log('\t\tId : {}');
    console.log('\t\tModel : {}');
    console.log('\t\tDisplay name : {}');
    console.log('\t\tCreate time : {}');

    console.log('\t\tDedicated resources');
    console.log('\t\t\tMin replica count : {}');
    console.log('\t\t\tMachine spec {}');
    console.log('\t\t\t\tMachine type : {}');
    console.log('\t\t\t\tAccelerator type : {}');
    console.log('\t\t\t\tAccelerator count : {}');

    console.log('\t\tAutomatic resources');
    console.log('\t\t\tMin replica count : {}');
    console.log('\t\t\tMax replica count : {}');
  } else {
    console.log(`\t\tId : ${modelDeployed.id}`);
    console.log(`\t\tModel : ${modelDeployed.model}`);
    console.log(`\t\tDisplay name : ${modelDeployed.displayName}`);
    console.log(`\t\tCreate time : ${modelDeployed.createTime}`);

    const dedicatedResources = modelDeployed.dedicatedResources;
    console.log('\t\tDedicated resources');
    if (!dedicatedResources) {
      console.log('\t\t\tMin replica count : {}');
      console.log('\t\t\tMachine spec {}');
      console.log('\t\t\t\tMachine type : {}');
      console.log('\t\t\t\tAccelerator type : {}');
      console.log('\t\t\t\tAccelerator count : {}');
    } else {
      console.log(
        `\t\t\tMin replica count : \
          ${dedicatedResources.minReplicaCount}`
      );
      const machineSpec = dedicatedResources.machineSpec;
      console.log('\t\t\tMachine spec');
      console.log(`\t\t\t\tMachine type : ${machineSpec.machineType}`);
      console.log(
        `\t\t\t\tAccelerator type : ${machineSpec.acceleratorType}`
      );
      console.log(
        `\t\t\t\tAccelerator count : ${machineSpec.acceleratorCount}`
      );
    }

    const automaticResources = modelDeployed.automaticResources;
    console.log('\t\tAutomatic resources');
    if (!automaticResources) {
      console.log('\t\t\tMin replica count : {}');
      console.log('\t\t\tMax replica count : {}');
    } else {
      console.log(
        `\t\t\tMin replica count : \
          ${automaticResources.minReplicaCount}`
      );
      console.log(
        `\t\t\tMax replica count : \
          ${automaticResources.maxReplicaCount}`
      );
    }
  }
}
deployModel();

Python

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

def deploy_model_with_automatic_resources_sample(
    project,
    location,
    model_name: str,
    endpoint: Optional[aiplatform.Endpoint] = None,
    deployed_model_display_name: Optional[str] = None,
    traffic_percentage: Optional[int] = 0,
    traffic_split: Optional[Dict[str, int]] = None,
    min_replica_count: int = 1,
    max_replica_count: int = 1,
    metadata: Optional[Sequence[Tuple[str, str]]] = (),
    sync: bool = True,
):
    """
    model_name: A fully-qualified model resource name or model ID.
          Example: "projects/123/locations/us-central1/models/456" or
          "456" when project and location are initialized or passed.
    """

    aiplatform.init(project=project, location=location)

    model = aiplatform.Model(model_name=model_name)

    model.deploy(
        endpoint=endpoint,
        deployed_model_display_name=deployed_model_display_name,
        traffic_percentage=traffic_percentage,
        traffic_split=traffic_split,
        min_replica_count=min_replica_count,
        max_replica_count=max_replica_count,
        metadata=metadata,
        sync=sync,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    return model

איך משנים את הגדרות ברירת המחדל של רישום מסקנות

קבלת סטטוס פעולה

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

ביצוע הסקה אונליין באמצעות המודל שפרסתם

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

המסוף

משתמשים במסוף Google Cloud כדי לבקש הסקה אונליין. צריך לפרוס את המודל בנקודת קצה.

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

    כניסה לדף Models

  2. ברשימת המודלים, לוחצים על שם המודל כדי לבקש מסקנות.

  3. בוחרים בכרטיסייה Deploy & test (פריסה ובדיקה).

  4. בקטע Test your model (בדיקת המודל), מוסיפים פריטי בדיקה כדי לבקש הסקה.

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

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

    אחרי שההסקה מסתיימת, Gemini Enterprise Agent Platform מחזירה את התוצאות במסוף.

API

משתמשים ב-Agent Platform API כדי לבקש הסקה אונליין. צריך לפרוס את המודל בנקודת קצה. דוגמה מפורטת יותר זמינה במחברת הדרכה בנושא חיזוי אונליין באמצעות מודל AutoML לסיווג תמונות.

קבלת מסקנות לגבי אצווה

כדי לשלוח בקשה להסקת מסקנות באצווה, צריך לציין מקור קלט ופורמט פלט שבו Gemini Enterprise Agent Platform ישמור את תוצאות ההסקה. כדי להסיק מסקנות באצווה עבור סוג המודל של תמונות AutoML, צריך קובץ קלט JSON Lines ושם של קטגוריה של Cloud Storage לאחסון הפלט.

הדרישות לגבי נתוני הקלט

בקלט של בקשות באצווה מציינים את הפריטים שרוצים לשלוח למודל כדי להסיק מסקנות. במודלים של סיווג תמונות, אפשר להשתמש בקובץ JSON Lines כדי לציין רשימה של תמונות להסקת מסקנות, ואז לאחסן את קובץ JSON Lines בקטגוריה של Cloud Storage. בדוגמה הבאה מוצגת שורה אחת בקובץ JSON Lines של קלט:

{"content": "gs://sourcebucket/datasets/images/source_image.jpg", "mimeType": "image/jpeg"}

שליחת בקשה להסקת מסקנות באצווה

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

מסוף Google Cloud

משתמשים במסוף Google Cloud כדי לבקש הסקה באצווה.

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

    כניסה לדף Batch predictions

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

    1. מזינים שם להסקת המסקנות באצווה.
    2. בשדה שם המודל, בוחרים את שם המודל שרוצים להשתמש בו להסקת המסקנות של הקבוצה הזו.
    3. בקטע Source path (נתיב המקור), מציינים את המיקום ב-Cloud Storage שבו נמצא קובץ הקלט של JSON Lines.
    4. בנתיב היעד, מציינים מיקום ב-Cloud Storage שבו יישמרו התוצאות של ההסקה באצווה. פורמט הפלט נקבע לפי היעד של המודל. מודלים של AutoML למטרות של אובייקטים בתמונות יוצרים קובצי JSON Lines.

API

אפשר להשתמש ב-Agent Platform API כדי לשלוח בקשות להסקת מסקנות באצווה.

REST

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

  • LOCATION_ID: האזור שבו המודל מאוחסן ועבודת ההסקה באצווה מבוצעת. לדוגמה, us-central1.
  • PROJECT_ID:
  • BATCH_JOB_NAME: השם המוצג של המשימה באצווה
  • MODEL_ID: המזהה של המודל שבו רוצים להשתמש כדי להסיק מסקנות
  • THRESHOLD_VALUE (אופציונלי): Gemini Enterprise Agent Platform מחזירה רק הסקות עם ציוני מהימנות שלפחות הערך הזה. ערך ברירת המחדל הוא 0.0.
  • MAX_PREDICTIONS (אופציונלי): Gemini Enterprise Agent Platform מחזירה עד מספר ההסקות הזה, החל מההסקות עם ציוני המהימנות הכי גבוהים. ערך ברירת המחדל הוא 10.
  • URI: ה-URI של Cloud Storage שבו נמצא קובץ ה-JSON Lines של הקלט.
  • BUCKET: הקטגוריה של Cloud Storage
  • PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי

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

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs

גוף בקשת JSON:

{
    "displayName": "BATCH_JOB_NAME",
    "model": "projects/PROJECT/locations/LOCATION/models/MODEL_ID",
    "modelParameters": {
      "confidenceThreshold": THRESHOLD_VALUE,
      "maxPredictions": MAX_PREDICTIONS
    },
    "inputConfig": {
        "instancesFormat": "jsonl",
        "gcsSource": {
            "uris": ["URI"],
        },
    },
    "outputConfig": {
        "predictionsFormat": "jsonl",
        "gcsDestination": {
            "outputUriPrefix": "OUTPUT_BUCKET",
        },
    },
}

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

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_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"

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_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/batchPredictionJobs/BATCH_JOB_ID",
  "displayName": "BATCH_JOB_NAME",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "gcsSource": {
      "uris": [
        "CONTENT"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "BUCKET"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
  "modelDisplayName": "MODEL_NAME",
  "modelObjective": "MODEL_OBJECTIVE"
}

אפשר לשלוח שאילתות לגבי הסטטוס של משימה באצווה באמצעות BATCH_JOB_ID עד שהמשימה state תהיה JOB_STATE_SUCCEEDED.

Python

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

def create_batch_prediction_job_sample(
    project: str,
    location: str,
    model_resource_name: str,
    job_display_name: str,
    gcs_source: Union[str, Sequence[str]],
    gcs_destination: str,
    sync: bool = True,
):
    aiplatform.init(project=project, location=location)

    my_model = aiplatform.Model(model_resource_name)

    batch_prediction_job = my_model.batch_predict(
        job_display_name=job_display_name,
        gcs_source=gcs_source,
        gcs_destination_prefix=gcs_destination,
        sync=sync,
    )

    batch_prediction_job.wait()

    print(batch_prediction_job.display_name)
    print(batch_prediction_job.resource_name)
    print(batch_prediction_job.state)
    return batch_prediction_job

אחזור תוצאות של הסקה בקבוצות

‫Gemini Enterprise Agent Platform שולחת את פלט ההסקה של אצווה ליעד שצוין.

כשמשימת הסקת מסקנות באצווה מסתיימת, הפלט של הסקת המסקנות מאוחסן בקטגוריה של Cloud Storage שציינתם בבקשה.

דוגמה לתוצאות של הסקת מסקנות באצווה

הדוגמה הבאה מציגה תוצאות של הסקה בקבוצה ממודל לסיווג תמונות.

{
  "instance": {"content": "gs://bucket/image.jpg", "mimeType": "image/jpeg"},
  "prediction": {
    "ids": [1, 2],
    "displayNames": ["cat", "dog"],
    "confidences": [0.7, 0.5]
  }
}