Eseguire il deployment di un modello in un endpoint

Devi eseguire il deployment di un modello in un endpoint prima di poterlo utilizzare per fornire previsioni online. Il deployment di un modello associa risorse fisiche per fornire previsioni online con bassa latenza.

Questa pagina descrive i passaggi da seguire per eseguire il deployment di un modello in un endpoint utilizzando la previsione online.

Prima di iniziare

Prima di eseguire il deployment del modello su un endpoint, esporta gli artefatti del modello per la previsione e assicurati di soddisfare tutti i prerequisiti indicati in quella pagina.

Crea un pool di risorse

Una risorsa personalizzata ResourcePool ti consente di avere un controllo granulare sul comportamento del modello. Puoi definire impostazioni come le seguenti:

  • Configurazioni di scalabilità automatica.
  • Il tipo di macchina, che definisce i requisiti di CPU e memoria.
  • Opzioni di acceleratore come le risorse GPU.

Il tipo di macchina è essenziale per la richiesta di specifica del pool di nodi che invii per creare il cluster di previsione.

Per il pool di risorse del modello sottoposto a deployment, il conteggio e il tipo di acceleratore determinano l'utilizzo della GPU. Il tipo di macchina determina solo le risorse di CPU e memoria richieste. Per questo motivo, quando includi gli acceleratori GPU nella specifica ResourcePool, il campo machineType controlla i requisiti di CPU e memoria per il modello, mentre il campo acceleratorType controlla la GPU. Inoltre, il campo acceleratorCount controlla il numero di slice di GPU.

Per creare una risorsa personalizzata ResourcePool:

  1. Crea un file YAML che definisca la risorsa personalizzata ResourcePool. Gli esempi seguenti contengono file YAML per pool di risorse con acceleratori GPU (modelli basati su GPU) e senza acceleratori GPU (modelli basati su CPU):

    Modelli basati su GPU

      apiVersion: prediction.aiplatform.gdc.goog/v1
      kind: ResourcePool
      metadata:
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
      spec:
        resourcePoolID: RESOURCE_POOL_NAME
        enableContainerLogging: false
        dedicatedResources:
          machineSpec:
            # The system adds computing overhead to the nodes for mandatory components.
            # Choose a machineType value that allocates fewer CPU and memory resources
            # than those used by the nodes in the prediction cluster.
            machineType: a2-highgpu-1g-gdc
            acceleratorType: nvidia-a100-80gb
            # The accelerator count is a slice of the requested virtualized GPUs.
            # The value corresponds to one-seventh of 80 GB of GPUs for each count.
            acceleratorCount: 2
          autoscaling:
            minReplica: 2
            maxReplica: 10
    

    Modelli basati su CPU

      apiVersion: prediction.aiplatform.gdc.goog/v1
      kind: ResourcePool
      metadata:
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
      spec:
        resourcePoolID: RESOURCE_POOL_NAME
        enableContainerLogging: false
        dedicatedResources:
          machineSpec:
            # The system adds computing overhead to the nodes for mandatory components.
            # Choose a machineType value that allocates fewer CPU and memory resources
            # than those used by the nodes in the prediction cluster.
            machineType: n2-highcpu-8-gdc
          autoscaling:
            minReplica: 2
            maxReplica: 10
    

    Sostituisci quanto segue:

    • RESOURCE_POOL_NAME: il nome che vuoi assegnare al file di definizione ResourcePool.
    • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto associato al cluster di previsione.

    Modifica i valori nei campi dedicatedResources in base alle tue esigenze di risorse e a ciò che è disponibile nel cluster di previsione.

  2. Applica il file di definizione ResourcePool al cluster di previsione:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f RESOURCE_POOL_NAME.yaml
    

    Sostituisci quanto segue:

    • PREDICTION_CLUSTER_KUBECONFIG: il percorso del file kubeconfig nel cluster di previsione.
    • RESOURCE_POOL_NAME: il nome del file di definizione ResourcePool.

Quando crei la risorsa personalizzata ResourcePool, l'API Kubernetes e il servizio webhook convalidano il file YAML e segnalano l'esito positivo o negativo. L'operatore di previsione esegue il provisioning e riserva le risorse dal pool di risorse quando esegui il deployment dei modelli su un endpoint.

Esegui il deployment del modello in un endpoint

Se hai un pool di risorse, puoi eseguire il deployment di più modelli in un endpoint e di un modello in più endpoint. Esegui il deployment di un modello di previsione che ha come target container supportati. A seconda che l'endpoint esista già o meno, scegli uno dei due metodi seguenti:

Eseguire il deployment di un modello in un nuovo endpoint

Per eseguire il deployment di un modello di previsione in un nuovo endpoint:

  1. Crea un file YAML che definisca una risorsa personalizzata DeployedModel:

    TensorFlow

    Il seguente file YAML mostra una configurazione di esempio per un modello TensorFlow:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      # The endpoint path structure is endpoints/<endpoint-id>
      endpointPath: endpoints/PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket/tensorflow
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: img-detection-model
        modelDisplayName: my_img_detection_model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/img-detection-model/1
        # The model version ID must match the name of the first folder in
        # the artifactLocation bucket, inside the 'tensorflow' folder.
        # For example, if the bucket path is
        # s3://my-prediction-bucket/tensorflow/1/,
        # then the value for the model version ID is "1".
        modelVersionID: "1"
        modelContainerSpec:
          args:
          - --model_config_file=/models/models.config
          - --rest_api_port=8080
          - --port=8500
          - --file_system_poll_wait_seconds=30
          - --model_config_file_poll_wait_seconds=30
          command:
          - /bin/tensorflow_model_server
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/tf2-cpu.2-14:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/tf2-gpu.2-14:latest
          imageURI: gcr.io/aiml/prediction/containers/tf2-gpu.2-14:latest
          ports:
          - 8080
          grpcPorts:
          - 8500
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

    Sostituisci quanto segue:

    • DEPLOYED_MODEL_NAME: il nome che vuoi assegnare al file di definizione DeployedModel.
    • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto associato al cluster di previsione.
    • PREDICTION_ENDPOINT: il nome che vuoi assegnare al nuovo endpoint, ad esempio my-img-prediction-endpoint.
    • PATH_TO_MODEL: il percorso del modello nel bucket di archiviazione.
    • RESOURCE_POOL_NAME: il nome che hai assegnato al file di definizione ResourcePool quando hai creato un pool di risorse per ospitare il modello.

    Modifica i valori nei campi rimanenti in base al modello di previsione.

    PyTorch

    Il seguente file YAML mostra una configurazione di esempio per un modello PyTorch:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      endpointPath: PREDICTION_ENDPOINT
      endpointInfo:
        id: PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket/pytorch
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: "pytorch"
        modelDisplayName: my-pytorch-model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/pytorch/1
        modelVersionID: "1"
        modelContainerSpec:
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/pytorch-cpu.2-4:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/pytorch-gpu.2-4:latest
          imageURI: gcr.io/aiml/prediction/containers/pytorch-cpu.2-4:latest
          ports:
          - 8080
          grpcPorts:
          - 7070
      sharesResourcePool: false
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

    Sostituisci quanto segue:

    • DEPLOYED_MODEL_NAME: il nome che vuoi assegnare al file di definizione DeployedModel.
    • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto associato al cluster di previsione.
    • PREDICTION_ENDPOINT: il nome che vuoi assegnare al nuovo endpoint, ad esempio my-img-prediction-endpoint.
    • PATH_TO_MODEL: il percorso del modello nel bucket di archiviazione.
    • RESOURCE_POOL_NAME: il nome che hai assegnato al file di definizione ResourcePool quando hai creato un pool di risorse per ospitare il modello.

    Modifica i valori nei campi rimanenti in base al modello di previsione.

  2. Applica il file di definizione DeployedModel al cluster di previsione:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Sostituisci quanto segue:

    • PREDICTION_CLUSTER_KUBECONFIG: il percorso del file kubeconfig nel cluster di previsione.
    • DEPLOYED_MODEL_NAME: il nome del file di definizione DeployedModel.

    Quando crei la risorsa personalizzata DeployedModel, l'API Kubernetes e il servizio webhook convalidano il file YAML e segnalano l'esito positivo o negativo. L'operatore di previsione riconcilia la risorsa personalizzata DeployedModel e la pubblica nel cluster di previsione.

  3. Crea un file YAML che definisca una risorsa personalizzata Endpoint.

    Il seguente file YAML mostra una configurazione di esempio:

    apiVersion: aiplatform.gdc.goog/v1
    kind: Endpoint
    metadata:
      name: ENDPOINT_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      createDns: true
      id: PREDICTION_ENDPOINT
      destinations:
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_2
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
    

    Sostituisci quanto segue:

    • ENDPOINT_NAME: il nome che vuoi assegnare al file di definizione Endpoint.
    • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto associato al cluster di previsione.
    • PREDICTION_ENDPOINT: il nome del nuovo endpoint. Hai definito questo nome nel file di definizione DeployedModel.
    • DEPLOYED_MODEL_NAME: il nome che hai assegnato al file di definizione DeployedModel.

    Puoi avere una o più destinazioni serviceRef. Se hai un secondo oggetto serviceRef, aggiungilo al file YAML nel campo destinations e sostituisci DEPLOYED_MODEL_NAME_2 con il nome che hai assegnato al secondo file di definizione DeployedModel che hai creato. Continua ad aggiungere o rimuovere oggetti serviceRef in base alle tue esigenze, a seconda del numero di modelli che stai eseguendo il deployment.

    Imposta i campi trafficPercentage in base a come vuoi suddividere il traffico tra i modelli su questo endpoint. Modifica i valori nei campi rimanenti in base alle configurazioni degli endpoint.

  4. Applica il file di definizione Endpoint al cluster di previsione:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Sostituisci ENDPOINT_NAME con il nome del file di definizione Endpoint.

Per ottenere il percorso dell'URL dell'endpoint per il modello di previsione, esegui questo comando:

kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'

Sostituisci quanto segue:

  • PREDICTION_CLUSTER_KUBECONFIG: il percorso del file kubeconfig nel cluster di previsione.
  • PREDICTION_ENDPOINT: il nome del nuovo endpoint.
  • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto di previsione.

Eseguire il deployment di un modello in un endpoint esistente

Puoi eseguire il deployment di un modello su un endpoint esistente solo se in precedenza avevi eseguito il deployment di un altro modello su quell'endpoint quando era nuovo. Il sistema richiede questo passaggio precedente per creare l'endpoint.

Per eseguire il deployment di un modello di previsione in un endpoint esistente:

  1. Crea un file YAML che definisca una risorsa personalizzata DeployedModel.

    Il seguente file YAML mostra una configurazione di esempio:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      # The endpoint path structure is endpoints/<endpoint-id>
      endpointPath: endpoints/PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket/tensorflow
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: img-detection-model-v2
        modelDisplayName: my_img_detection_model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/img-detection-model/2
        # The model version ID must match the name of the first folder in
        # the artifactLocation bucket,
        # inside the 'tensorflow' folder.
        # For example, if the bucket path is
        # s3://my-prediction-bucket/tensorflow/2/,
        # then the value for the model version ID is "2".
        modelVersionID: "2"
        modelContainerSpec:
          args:
          - --model_config_file=/models/models.config
          - --rest_api_port=8080
          - --port=8500
          - --file_system_poll_wait_seconds=30
          - --model_config_file_poll_wait_seconds=30
          command:
          - /bin/tensorflow_model_server
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/tf2-cpu.2-6:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/tf2-gpu.2-6:latest
          imageURI: gcr.io/aiml/prediction/containers/tf2-gpu.2-6:latest
          ports:
          - 8080
          grpcPorts:
          - 8500
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

    Sostituisci quanto segue:

    • DEPLOYED_MODEL_NAME: il nome che vuoi assegnare al file di definizione DeployedModel.
    • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto associato al cluster di previsione.
    • PREDICTION_ENDPOINT: il nome dell'endpoint esistente, ad esempio my-img-prediction-endpoint.
    • PATH_TO_MODEL: il percorso del modello nel bucket di archiviazione.
    • RESOURCE_POOL_NAME: il nome che hai assegnato al file di definizione ResourcePool quando hai creato un pool di risorse per ospitare il modello.

    Modifica i valori nei campi rimanenti in base al modello di previsione.

  2. Applica il file di definizione DeployedModel al cluster di previsione:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Sostituisci quanto segue:

    • PREDICTION_CLUSTER_KUBECONFIG: il percorso del file kubeconfig nel cluster di previsione.
    • DEPLOYED_MODEL_NAME: il nome del file di definizione DeployedModel.

    Quando crei la risorsa personalizzata DeployedModel, l'API Kubernetes e il servizio webhook convalidano il file YAML e segnalano l'esito positivo o negativo. L'operatore di previsione riconcilia la risorsa personalizzata DeployedModel e la pubblica nel cluster di previsione.

  3. Mostra i dettagli della risorsa personalizzata Endpoint esistente:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG describe -f ENDPOINT_NAME.yaml
    

    Sostituisci ENDPOINT_NAME con il nome del file di definizione Endpoint.

  4. Aggiorna il file YAML della definizione di risorsa personalizzata Endpoint aggiungendo un nuovo oggetto serviceRef nel campo destinations. Nel nuovo oggetto, includi il nome del servizio appropriato in base alla risorsa personalizzata DeployedModel appena creata.

    Il seguente file YAML mostra una configurazione di esempio:

    apiVersion: aiplatform.gdc.goog/v1
    kind: Endpoint
    metadata:
      name: ENDPOINT_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      createDns: true
      id: PREDICTION_ENDPOINT
      destinations:
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 40
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_2
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_3
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 10
          grpcPort: 8501
          httpPort: 8081
    

    Sostituisci quanto segue:

    • ENDPOINT_NAME: il nome del file di definizione Endpoint esistente.
    • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto associato al cluster di previsione.
    • PREDICTION_ENDPOINT: il nome dell'endpoint esistente. Hai fatto riferimento a questo nome nel file di definizione DeployedModel.
    • DEPLOYED_MODEL_NAME: il nome di un file di definizione DeployedModel creato in precedenza.
    • DEPLOYED_MODEL_NAME_2: il nome che hai assegnato al file di definizione DeployedModel appena creato.

    Puoi avere una o più destinazioni serviceRef. Se hai un terzo oggetto serviceRef, aggiungilo al file YAML nel campo destinations e sostituisci DEPLOYED_MODEL_NAME_3 con il nome che hai assegnato al terzo file di definizione DeployedModel che hai creato. Continua ad aggiungere o rimuovere oggetti serviceRef in base alle tue esigenze, a seconda del numero di modelli che stai eseguendo il deployment.

    Imposta i campi trafficPercentage in base a come vuoi suddividere il traffico tra i modelli di questo endpoint. Modifica i valori nei campi rimanenti in base alle configurazioni degli endpoint.

  5. Applica il file di definizione Endpoint al cluster di previsione:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Sostituisci ENDPOINT_NAME con il nome del file di definizione Endpoint.

Per ottenere il percorso dell'URL dell'endpoint per il modello di previsione, esegui questo comando:

kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'

Sostituisci quanto segue:

  • PREDICTION_CLUSTER_KUBECONFIG: il percorso del file kubeconfig nel cluster di previsione.
  • PREDICTION_ENDPOINT: il nome dell'endpoint.
  • PROJECT_NAMESPACE: il nome dello spazio dei nomi del progetto di previsione.