שימוש בקונטיינר מותאם אישית להסקת מסקנות

כדי להתאים אישית את האופן שבו Agent Platform מפיק מסקנות אונליין מהמודל המותאם אישית שאומן, אפשר לציין מאגר תגים מותאם אישית במקום מאגר תגים מוכן מראש כשיוצרים משאב Model. כשמשתמשים במאגר תגים בהתאמה אישית, Agent Platform מריץ מאגר Docker לבחירתכם בכל צומת של הסקה.

כדאי להשתמש במאגר תגים בהתאמה אישית מהסיבות הבאות:

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

במדריך הזה מוסבר איך ליצור מודל שמשתמש בקונטיינר מותאם אישית. הוא לא מספק הוראות מפורטות לגבי עיצוב ויצירה של קובץ אימג' לקונטיינר של Docker.

הכנת קובץ אימג' של קונטיינר

כדי ליצור Model שמשתמש בקונטיינר בהתאמה אישית, צריך לספק קובץ אימג' של קונטיינר Docker כבסיס לקונטיינר הזה. קובץ אימג' של קונטיינר זה חייב לעמוד בדרישות שמתוארות במאמר בנושא דרישות לגבי קונטיינר בהתאמה אישית.

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

יצירת קובץ אימג' של קונטיינר

מעצבים ויוצרים קובץ אימג' של קונטיינר Docker שעומד בדרישות של קובץ אימג' של קונטיינר.

כדי ללמוד את היסודות של עיצוב ויצירה של קובץ אימג' של קונטיינר Docker, אפשר לקרוא את המדריך לתחילת העבודה של Docker.

העברת קובץ האימג' של הקונטיינר אל Artifact Registry

מעבירים בדחיפה את קובץ אימג' של קונטיינר למאגר Artifact Registry.

איך מעבירים קובץ אימג' של קונטיינר ל-Artifact Registry

יצירת Model

כדי ליצור Model שמשתמש במאגר תגים בהתאמה אישית, אפשר לבצע אחת מהפעולות הבאות:

בסעיפים הבאים מוסבר איך להגדיר את שדות ה-API שקשורים למאגרי תגים בהתאמה אישית כשיוצרים Model באחת מהדרכים האלה.

שדות API שקשורים לקונטיינרים

כשיוצרים את Model, חשוב להגדיר את containerSpecהשדה עם פרטי מאגר התגים המותאם אישית ולא עם מאגר תגים מוכן מראש.

חובה לציין ModelContainerSpecהודעה בשדה Model.containerSpec. בהודעה הזו אפשר לציין את שדות המשנה הבאים:

imageUri (חובה)

ה-URI של קובץ אימג' של קונטיינר ב-Artifact Registry.

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-image-uri כדי לציין את השדה הזה.

command (אופציונלי)

מערך של קובץ הפעלה וארגומנטים לשינוי ההוראה ENTRYPOINT של מאגר התגים. מידע נוסף על הפורמט של השדה הזה ועל האינטראקציה שלו עם השדה args זמין בהפניית ה-API בנושא ModelContainerSpec.

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-command כדי לציין את השדה הזה.

args (אופציונלי)

מערך של קובץ הפעלה וארגומנטים לביטול ברירת המחדל של הקטע CMD של הקונטיינר. מידע נוסף על הפורמט של השדה הזה ועל האינטראקציה שלו עם השדה command זמין בהפניה ל-API של ModelContainerSpec.

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-args כדי לציין את השדה הזה.

ports (אופציונלי)

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

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-ports כדי לציין את השדה הזה.

env (אופציונלי)

מערך של משתני סביבה שההוראה ENTRYPOINT של הקונטיינר, וגם השדות command ו-args, יכולים להפנות אליהם. מידע נוסף על האופן שבו שדות אחרים יכולים להפנות למשתני הסביבה האלה זמין בהפניית ה-API ל-ModelContainerSpec.

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-env-vars כדי לציין את השדה הזה.

healthRoute (אופציונלי)

הנתיב בשרת ה-HTTP של קונטיינר שבו רוצים ש-Agent Platform תשלח בדיקות תקינות.

אם לא מציינים את השדה הזה, כשפורסים את Model כDeployedModel למשאב Endpoint, ברירת המחדל היא /v1/endpoints/ENDPOINT/deployedModels/DEPLOYED_MODEL, כאשר ENDPOINT מוחלף בפלח האחרון של השדה name של Endpoint (אחרי endpoints/), ו-DEPLOYED_MODEL מוחלף בהשדה id של DeployedModel.

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-health-route כדי לציין את השדה הזה.

predictRoute (אופציונלי)

הנתיב בשרת ה-HTTP של הקונטיינר שבו רוצים ש-Agent Platform תעביר בקשות היקש.

אם לא מציינים את השדה הזה, כשפורסים את Model כDeployedModel למשאב Endpoint, ברירת המחדל היא /v1/endpoints/ENDPOINT/deployedModels/DEPLOYED_MODEL:predict, כאשר ENDPOINT מוחלף בפלח האחרון של השדה name של Endpoint (אחרי endpoints/), ו-DEPLOYED_MODEL מוחלף בהשדה id של DeployedModel.

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-predict-route כדי לציין את השדה הזה.

invokeRoutePrefix (אופציונלי)

מפעילים את קידומת המסלול עבור הקונטיינר המותאם אישית. הגדרת השדה הזה ל-‎"/*"‎ מאפשרת ניתוב שרירותי של המודל. אחרי הפריסה, אפשר לגשת לכל נתיב שאינו נתיב הבסיס בשרת המודל באמצעות קריאה ל-HTTP של invoke. לדוגמה, ‎/invoke/foo/bar יועבר כ-‎/foo/bar לשרת המודל. התכונה הזו נמצאת בשלב של Public Preview. כדי ליצור מודל עם הפעלה, פועלים לפי ההוראות לשימוש בנתיבים מותאמים אישית שרירותיים.

sharedMemorySizeMb (אופציונלי)

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

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

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-shared-memory-size-mb כדי לציין את השדה הזה.

startupProbe (אופציונלי)

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

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-startup-probe-exec, --container-startup-probe-period-seconds, --container-startup-probe-timeout-seconds כדי לציין את השדה הזה.

healthProbe (אופציונלי)

המפרט של בקשה לבדיקת תקינות (probe) שבודקת אם קונטיינר מוכן לקבל תעבורת נתונים.

אם אתם משתמשים בפקודה gcloud ai models upload, אתם יכולים להשתמש בדגל --container-health-probe-exec, --container-health-probe-period-seconds, --container-health-probe-timeout-seconds כדי לציין את השדה הזה.

בנוסף למשתנים שאתם מגדירים בשדה Model.containerSpec.env, Agent Platform מגדירה כמה משתנים אחרים על סמך ההגדרה שלכם. מידע נוסף על השימוש במשתני הסביבה האלה בשדות האלה ובהוראה ENTRYPOINT של הקונטיינר

דוגמאות לייבוא מודלים

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

gcloud

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

gcloud ai models upload \
  --region=LOCATION \
  --display-name=MODEL_NAME \
  --container-image-uri=IMAGE_URI \
  --container-command=COMMAND \
  --container-args=ARGS \
  --container-ports=PORTS \
  --container-env-vars=ENV \
  --container-health-route=HEALTH_ROUTE \
  --container-predict-route=PREDICT_ROUTE \
  --container-shared-memory-size-mb=SHARED_MEMORY_SIZE \
  --container-startup-probe-exec=STARTUP_PROBE_EXEC \
  --container-startup-probe-period-seconds=STARTUP_PROBE_PERIOD \
  --container-startup-probe-timeout-seconds=STARTUP_PROBE_TIMEOUT \
  --container-health-probe-exec=HEALTH_PROBE_EXEC \
  --container-health-probe-period-seconds=HEALTH_PROBE_PERIOD \
  --container-health-probe-timeout-seconds=HEALTH_PROBE_TIMEOUT \
  --artifact-uri=PATH_TO_MODEL_ARTIFACT_DIRECTORY

חובה להשתמש בדגל --container-image-uri, וכל הדגלים האחרים שמתחילים ב---container- הם אופציונליים. מידע על הערכים של השדות האלה מופיע בקטע הקודם במדריך הזה.

Java

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

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


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.Model;
import com.google.cloud.aiplatform.v1.ModelContainerSpec;
import com.google.cloud.aiplatform.v1.ModelServiceClient;
import com.google.cloud.aiplatform.v1.ModelServiceSettings;
import com.google.cloud.aiplatform.v1.UploadModelOperationMetadata;
import com.google.cloud.aiplatform.v1.UploadModelResponse;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class UploadModelSample {
  public static void main(String[] args)
      throws InterruptedException, ExecutionException, TimeoutException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String modelDisplayName = "YOUR_MODEL_DISPLAY_NAME";
    String metadataSchemaUri =
        "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml";
    String imageUri = "YOUR_IMAGE_URI";
    String artifactUri = "gs://your-gcs-bucket/artifact_path";
    uploadModel(project, modelDisplayName, metadataSchemaUri, imageUri, artifactUri);
  }

  static void uploadModel(
      String project,
      String modelDisplayName,
      String metadataSchemaUri,
      String imageUri,
      String artifactUri)
      throws IOException, InterruptedException, ExecutionException, 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";
      LocationName locationName = LocationName.of(project, location);

      ModelContainerSpec modelContainerSpec =
          ModelContainerSpec.newBuilder().setImageUri(imageUri).build();

      Model model =
          Model.newBuilder()
              .setDisplayName(modelDisplayName)
              .setMetadataSchemaUri(metadataSchemaUri)
              .setArtifactUri(artifactUri)
              .setContainerSpec(modelContainerSpec)
              .build();

      OperationFuture<UploadModelResponse, UploadModelOperationMetadata> uploadModelResponseFuture =
          modelServiceClient.uploadModelAsync(locationName, model);
      System.out.format(
          "Operation name: %s\n", uploadModelResponseFuture.getInitialFuture().get().getName());
      System.out.println("Waiting for operation to finish...");
      UploadModelResponse uploadModelResponse = uploadModelResponseFuture.get(5, TimeUnit.MINUTES);

      System.out.println("Upload Model Response");
      System.out.format("Model: %s\n", uploadModelResponse.getModel());
    }
  }
}

Node.js

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

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

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 */

// const modelDisplayName = 'YOUR_MODEL_DISPLAY_NAME';
// const metadataSchemaUri = 'YOUR_METADATA_SCHEMA_URI';
// const imageUri = 'YOUR_IMAGE_URI';
// const artifactUri = 'YOUR_ARTIFACT_URI';
// 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 uploadModel() {
  // Configure the parent resources
  const parent = `projects/${project}/locations/${location}`;
  // Configure the model resources
  const model = {
    displayName: modelDisplayName,
    metadataSchemaUri: '',
    artifactUri: artifactUri,
    containerSpec: {
      imageUri: imageUri,
      command: [],
      args: [],
      env: [],
      ports: [],
      predictRoute: '',
      healthRoute: '',
    },
  };
  const request = {
    parent,
    model,
  };

  console.log('PARENT AND MODEL');
  console.log(parent, model);
  // Upload Model request
  const [response] = await modelServiceClient.uploadModel(request);
  console.log(`Long running operation : ${response.name}`);

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

  console.log('Upload model response ');
  console.log(`\tModel : ${result.model}`);
}
uploadModel();

Python

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

from typing import Dict, Optional, Sequence

from google.cloud import aiplatform
from google.cloud.aiplatform import explain


def upload_model_sample(
    project: str,
    location: str,
    display_name: str,
    serving_container_image_uri: str,
    artifact_uri: Optional[str] = None,
    serving_container_predict_route: Optional[str] = None,
    serving_container_health_route: Optional[str] = None,
    description: Optional[str] = None,
    serving_container_command: Optional[Sequence[str]] = None,
    serving_container_args: Optional[Sequence[str]] = None,
    serving_container_environment_variables: Optional[Dict[str, str]] = None,
    serving_container_ports: Optional[Sequence[int]] = None,
    instance_schema_uri: Optional[str] = None,
    parameters_schema_uri: Optional[str] = None,
    prediction_schema_uri: Optional[str] = None,
    explanation_metadata: Optional[explain.ExplanationMetadata] = None,
    explanation_parameters: Optional[explain.ExplanationParameters] = None,
    sync: bool = True,
):

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

    model = aiplatform.Model.upload(
        display_name=display_name,
        artifact_uri=artifact_uri,
        serving_container_image_uri=serving_container_image_uri,
        serving_container_predict_route=serving_container_predict_route,
        serving_container_health_route=serving_container_health_route,
        instance_schema_uri=instance_schema_uri,
        parameters_schema_uri=parameters_schema_uri,
        prediction_schema_uri=prediction_schema_uri,
        description=description,
        serving_container_command=serving_container_command,
        serving_container_args=serving_container_args,
        serving_container_environment_variables=serving_container_environment_variables,
        serving_container_ports=serving_container_ports,
        explanation_metadata=explanation_metadata,
        explanation_parameters=explanation_parameters,
        sync=sync,
    )

    model.wait()

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

לקבלת הקשר נוסף, אפשר לקרוא את המדריך לייבוא מודלים.

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

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

מידע על הדרישות לגבי בקשות ותגובות של תחזיות עבור מאגרי תגים מותאמים אישית

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