Déployer un modèle sur un point de terminaison

Vous devez déployer un modèle sur un point de terminaison avant de pouvoir l'utiliser pour diffuser des prédictions en ligne. Le déploiement d'un modèle associe des ressources physiques pour diffuser des prédictions en ligne avec une faible latence.

Cette page décrit la procédure à suivre pour déployer un modèle sur un point de terminaison à l'aide de la prédiction en ligne.

Avant de commencer

Avant de déployer votre modèle sur un point de terminaison, exportez vos artefacts de modèle pour la prédiction et assurez-vous de remplir tous les prérequis de cette page.

Créer un pool de ressources

Une ressource personnalisée ResourcePool vous permet de contrôler précisément le comportement de votre modèle. Vous pouvez définir des paramètres tels que les suivants :

  • Configurations de l'autoscaling.
  • Le type de machine, qui définit les exigences en termes de processeur et de mémoire.
  • Options d'accélérateur telles que les ressources GPU.

Le type de machine est essentiel pour la requête de spécification du pool de nœuds que vous envoyez pour créer le cluster de prédiction.

Pour le pool de ressources du modèle déployé, le nombre et le type d'accélérateurs déterminent l'utilisation du GPU. Le type de machine ne détermine que les ressources de processeur et de mémoire demandées. Pour cette raison, lorsque vous incluez des accélérateurs GPU dans la spécification ResourcePool, le champ machineType contrôle les exigences en termes de processeur et de mémoire pour le modèle, tandis que le champ acceleratorType contrôle le GPU. De plus, le champ acceleratorCount contrôle le nombre de tranches de GPU.

Pour créer une ressource personnalisée ResourcePool :

  1. Créez un fichier YAML définissant la ressource personnalisée ResourcePool. Les exemples suivants contiennent des fichiers YAML pour les pools de ressources avec des accélérateurs GPU (modèles basés sur GPU) et sans accélérateurs GPU (modèles basés sur CPU) :

    Modèles basés sur des 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
    

    Modèles basés sur le processeur

      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
    

    Remplacez les éléments suivants :

    • RESOURCE_POOL_NAME : nom que vous souhaitez donner au fichier de définition ResourcePool.
    • PROJECT_NAMESPACE : nom de l'espace de noms du projet associé au cluster de prédiction.

    Modifiez les valeurs des champs dedicatedResources en fonction de vos besoins en ressources et de ce qui est disponible dans votre cluster de prédiction.

  2. Appliquez le fichier de définition ResourcePool au cluster de prédiction :

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f RESOURCE_POOL_NAME.yaml
    

    Remplacez les éléments suivants :

    • PREDICTION_CLUSTER_KUBECONFIG : chemin d'accès au fichier kubeconfig dans le cluster de prédiction.
    • RESOURCE_POOL_NAME : nom du fichier de définition ResourcePool.

Lorsque vous créez la ressource personnalisée ResourcePool, l'API Kubernetes et le service de webhook valident le fichier YAML et signalent la réussite ou l'échec de l'opération. L'opérateur de prédiction provisionne et réserve vos ressources à partir du pool de ressources lorsque vous déployez vos modèles sur un point de terminaison.

Déployer votre modèle sur un point de terminaison

Si vous disposez d'un pool de ressources, vous pouvez déployer plusieurs modèles sur un point de terminaison et un modèle sur plusieurs points de terminaison. Déployez un modèle de prédiction ciblant les conteneurs compatibles. Selon que le point de terminaison existe déjà ou non, choisissez l'une des deux méthodes suivantes :

Déployer un modèle sur un nouveau point de terminaison

Pour déployer un modèle de prédiction sur un nouveau point de terminaison, procédez comme suit :

  1. Créez un fichier YAML définissant une ressource personnalisée DeployedModel :

    TensorFlow

    Le fichier YAML suivant montre un exemple de configuration pour un modèle 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
    

    Remplacez les éléments suivants :

    • DEPLOYED_MODEL_NAME : nom que vous souhaitez donner au fichier de définition DeployedModel.
    • PROJECT_NAMESPACE : nom de l'espace de noms du projet associé au cluster de prédiction.
    • PREDICTION_ENDPOINT : nom que vous souhaitez attribuer au nouveau point de terminaison, par exemple my-img-prediction-endpoint.
    • PATH_TO_MODEL : chemin d'accès à votre modèle dans le bucket de stockage.
    • RESOURCE_POOL_NAME : nom que vous avez attribué au fichier de définition ResourcePool lorsque vous avez créé un pool de ressources pour héberger le modèle.

    Modifiez les valeurs des autres champs en fonction de votre modèle de prédiction.

    PyTorch

    Le fichier YAML suivant montre un exemple de configuration pour un modèle 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
    

    Remplacez les éléments suivants :

    • DEPLOYED_MODEL_NAME : nom que vous souhaitez donner au fichier de définition DeployedModel.
    • PROJECT_NAMESPACE : nom de l'espace de noms du projet associé au cluster de prédiction.
    • PREDICTION_ENDPOINT : nom que vous souhaitez attribuer au nouveau point de terminaison, par exemple my-img-prediction-endpoint.
    • PATH_TO_MODEL : chemin d'accès à votre modèle dans le bucket de stockage.
    • RESOURCE_POOL_NAME : nom que vous avez attribué au fichier de définition ResourcePool lorsque vous avez créé un pool de ressources pour héberger le modèle.

    Modifiez les valeurs des autres champs en fonction de votre modèle de prédiction.

  2. Appliquez le fichier de définition DeployedModel au cluster de prédiction :

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Remplacez les éléments suivants :

    • PREDICTION_CLUSTER_KUBECONFIG : chemin d'accès au fichier kubeconfig dans le cluster de prédiction.
    • DEPLOYED_MODEL_NAME : nom du fichier de définition DeployedModel.

    Lorsque vous créez la ressource personnalisée DeployedModel, l'API Kubernetes et le service de webhook valident le fichier YAML et indiquent si l'opération a réussi ou échoué. L'opérateur de prédiction réconcilie la ressource personnalisée DeployedModel et la diffuse dans le cluster de prédiction.

  3. Créez un fichier YAML définissant une ressource personnalisée Endpoint.

    Le fichier YAML suivant montre un exemple de configuration :

    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
    

    Remplacez les éléments suivants :

    • ENDPOINT_NAME : nom que vous souhaitez attribuer au fichier de définition Endpoint.
    • PROJECT_NAMESPACE : nom de l'espace de noms du projet associé au cluster de prédiction.
    • PREDICTION_ENDPOINT : nom du nouveau point de terminaison. Vous avez défini ce nom dans le fichier de définition DeployedModel.
    • DEPLOYED_MODEL_NAME : nom que vous avez donné au fichier de définition DeployedModel.

    Vous pouvez définir une ou plusieurs destinations serviceRef. Si vous avez un deuxième objet serviceRef, ajoutez-le au fichier YAML dans le champ destinations et remplacez DEPLOYED_MODEL_NAME_2 par le nom que vous avez donné au deuxième fichier de définition DeployedModel que vous avez créé. Continuez à ajouter ou à supprimer des objets serviceRef selon vos besoins, en fonction du nombre de modèles que vous déployez.

    Définissez les champs trafficPercentage en fonction de la façon dont vous souhaitez répartir le trafic entre les modèles de ce point de terminaison. Modifiez les valeurs des champs restants en fonction de la configuration de vos points de terminaison.

  4. Appliquez le fichier de définition Endpoint au cluster de prédiction :

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Remplacez ENDPOINT_NAME par le nom du fichier de définition Endpoint.

Pour obtenir le chemin d'URL du point de terminaison du modèle de prédiction, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • PREDICTION_CLUSTER_KUBECONFIG : chemin d'accès au fichier kubeconfig dans le cluster de prédiction.
  • PREDICTION_ENDPOINT : nom du nouveau point de terminaison.
  • PROJECT_NAMESPACE : nom de l'espace de noms du projet de prédiction.

Déployer un modèle sur un point de terminaison existant

Vous ne pouvez déployer un modèle sur un point de terminaison existant que si vous avez déjà déployé un autre modèle sur ce point de terminaison lorsqu'il était nouveau. Le système a besoin de cette étape précédente pour créer le point de terminaison.

Pour déployer un modèle de prédiction sur un point de terminaison existant, procédez comme suit :

  1. Créez un fichier YAML définissant une ressource personnalisée DeployedModel.

    Le fichier YAML suivant montre un exemple de configuration :

    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
    

    Remplacez les éléments suivants :

    • DEPLOYED_MODEL_NAME : nom que vous souhaitez donner au fichier de définition DeployedModel.
    • PROJECT_NAMESPACE : nom de l'espace de noms du projet associé au cluster de prédiction.
    • PREDICTION_ENDPOINT : nom du point de terminaison existant, tel que my-img-prediction-endpoint.
    • PATH_TO_MODEL : chemin d'accès à votre modèle dans le bucket de stockage.
    • RESOURCE_POOL_NAME : nom que vous avez attribué au fichier de définition ResourcePool lorsque vous avez créé un pool de ressources pour héberger le modèle.

    Modifiez les valeurs des champs restants en fonction de votre modèle de prédiction.

  2. Appliquez le fichier de définition DeployedModel au cluster de prédiction :

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Remplacez les éléments suivants :

    • PREDICTION_CLUSTER_KUBECONFIG : chemin d'accès au fichier kubeconfig dans le cluster de prédiction.
    • DEPLOYED_MODEL_NAME : nom du fichier de définition DeployedModel.

    Lorsque vous créez la ressource personnalisée DeployedModel, l'API Kubernetes et le service de webhook valident le fichier YAML et indiquent si l'opération a réussi ou échoué. L'opérateur de prédiction réconcilie la ressource personnalisée DeployedModel et la diffuse dans le cluster de prédiction.

  3. Affichez les détails de la ressource personnalisée Endpoint existante :

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG describe -f ENDPOINT_NAME.yaml
    

    Remplacez ENDPOINT_NAME par le nom du fichier de définition Endpoint.

  4. Mettez à jour le fichier YAML de la définition de ressource personnalisée Endpoint en ajoutant un nouvel objet serviceRef au champ destinations. Sur le nouvel objet, incluez le nom de service approprié en fonction de la ressource personnalisée DeployedModel que vous venez de créer.

    Le fichier YAML suivant montre un exemple de configuration :

    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
    

    Remplacez les éléments suivants :

    • ENDPOINT_NAME : nom du fichier de définition Endpoint existant.
    • PROJECT_NAMESPACE : nom de l'espace de noms du projet associé au cluster de prédiction.
    • PREDICTION_ENDPOINT : nom du point de terminaison existant. Vous avez fait référence à ce nom dans le fichier de définition DeployedModel.
    • DEPLOYED_MODEL_NAME : nom d'un fichier de définition DeployedModel créé précédemment.
    • DEPLOYED_MODEL_NAME_2 : nom que vous avez donné au fichier de définition DeployedModel nouvellement créé.

    Vous pouvez définir une ou plusieurs destinations serviceRef. Si vous avez un troisième objet serviceRef, ajoutez-le au fichier YAML dans le champ destinations et remplacez DEPLOYED_MODEL_NAME_3 par le nom que vous avez donné au troisième fichier de définition DeployedModel que vous avez créé. Continuez à ajouter ou à supprimer des objets serviceRef selon vos besoins, en fonction du nombre de modèles que vous déployez.

    Définissez les champs trafficPercentage en fonction de la façon dont vous souhaitez répartir le trafic entre les modèles de ce point de terminaison. Modifiez les valeurs des champs restants en fonction de la configuration de vos points de terminaison.

  5. Appliquez le fichier de définition Endpoint au cluster de prédiction :

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Remplacez ENDPOINT_NAME par le nom du fichier de définition Endpoint.

Pour obtenir le chemin d'URL du point de terminaison du modèle de prédiction, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • PREDICTION_CLUSTER_KUBECONFIG : chemin d'accès au fichier kubeconfig dans le cluster de prédiction.
  • PREDICTION_ENDPOINT : nom du point de terminaison.
  • PROJECT_NAMESPACE : nom de l'espace de noms du projet de prédiction.