Tutoriel sur les conteneurs Edge

Après avoir créé un modèle AutoML Vision Edge et l'avoir exporté vers un bucket Google Cloud Storage, vous pouvez utiliser les services RESTful avec vos modèles AutoML Vision Edge et vos images Docker TF Serving.

Objectifs du tutoriel

Les conteneurs Docker peuvent vous aider à déployer facilement des modèles Edge sur différents appareils. Vous pouvez exécuter les modèles Edge en appelant des API REST à partir de conteneurs dans le langage de votre choix, avec l'avantage supplémentaire de ne pas avoir à installer de dépendances ou à trouver les versions appropriées de TensorFlow.

Dans ce tutoriel, vous expérimenterez pas à pas l'exécution de modèles Edge sur des appareils à l'aide de conteneurs Docker.

Plus précisément, ce tutoriel vous guidera à travers trois étapes :

  1. Obtenir des conteneurs préconfigurés
  2. Exécuter des conteneurs avec des modèles Edge pour démarrer les API REST
  3. Faire des prédictions

De nombreux appareils ne disposent que de processeurs, tandis que certains peuvent s'appuyer sur des GPU pour obtenir des prédictions plus rapides. Nous proposons donc des tutoriels avec des conteneurs de processeur et de GPU préconfigurés.

Objectifs

Dans ce tutoriel d'introduction détaillé, vous allez utiliser des exemples de code pour effectuer les opérations suivantes :

  1. Obtenir le conteneur Docker
  2. Démarrer les API REST à l'aide de conteneurs Docker avec des modèles Edge
  3. Faire des prédictions pour obtenir des résultats analysés

Avant de commencer

Pour réaliser ce tutoriel, vous devez effectuer les opérations suivantes :

  1. Entraîner un modèle Edge exportable. Suivez le guide de démarrage rapide sur les modèles d'appareils Edge pour entraîner un modèle Edge.
  2. Exporter un modèle AutoML Vision Edge. Ce modèle sera diffusé avec des conteneurs en tant qu'API REST.
  3. Installer Docker. Il s'agit du logiciel requis pour exécuter les conteneurs Docker.
  4. (Facultatif) Installer NVIDIA Docker et le pilote NVIDIA. Il s'agit d'une étape facultative si vous possédez des appareils avec GPU et que vous souhaitez obtenir des prédictions plus rapides.
  5. Préparer des images de test. Ces images seront envoyées dans les requêtes pour obtenir les résultats analysés.

Les détails concernant l'exportation de modèles et l'installation des logiciels nécessaires se trouvent dans la section suivante.

Exporter le modèle AutoML Vision Edge

Après avoir entraîné un modèle Edge, vous pouvez l'exporter vers différents appareils.

Les conteneurs acceptent les modèles TensorFlow, qui sont nommés saved_model.pb lors de l'exportation.

Pour exporter un modèle AutoML Vision Edge pour les conteneurs, sélectionnez l'onglet Container (Conteneur) dans l'interface utilisateur, puis exportez le modèle vers ${YOUR_MODEL_PATH} sur Google Cloud Storage. Ce modèle exporté sera diffusé ultérieurement avec des conteneurs en tant qu'API REST.

Option d'exportation vers un conteneur

Pour télécharger le modèle exporté en local, exécutez la commande suivante.

Où :

  • ${YOUR_MODEL_PATH} est l'emplacement du modèle sur Google Cloud Storage (par exemple, gs://my-bucket-vcm/models/edge/ICN4245971651915048908/2020-01-20_01-27-14-064_tf-saved-model/)
  • ${YOUR_LOCAL_MODEL_PATH} est le chemin d'accès local vers lequel vous souhaitez télécharger votre modèle (par exemple, /tmp)
gsutil cp ${YOUR_MODEL_PATH} ${YOUR_LOCAL_MODEL_PATH}/saved_model.pb

Installer Docker

Docker est un logiciel utilisé pour déployer et exécuter des applications à l'intérieur de conteneurs.

Installez Docker Community Edition (CE) sur votre système. Vous l'utiliserez pour diffuser les modèles Edge en tant qu'API REST.

Installer le pilote NVIDIA et NVIDIA DOCKER (facultatif, pour les GPU uniquement)

Certains appareils disposent de GPU pour fournir des prédictions plus rapides. Le conteneur Docker de GPU est directement compatible avec les GPU NVIDIA.

Pour exécuter des conteneurs de GPU, vous devez installer le pilote NVIDIA et NVIDIA Docker sur votre système.

Exécuter l'inférence de modèle à l'aide du processeur

Cette section vous donne des instructions pas à pas pour exécuter des inférences de modèle à l'aide de conteneurs de processeur. Vous allez utiliser le logiciel Docker installé pour obtenir et exécuter le conteneur de processeur afin de diffuser les modèles Edge exportés en tant qu'API REST, puis envoyer des requêtes d'image de test aux API REST afin d'obtenir les résultats analysés.

Extraire l'image Docker

Tout d'abord, vous allez utiliser Docker pour obtenir un conteneur de processeur préconfiguré. Le conteneur de processeur préconfiguré possède déjà l'ensemble de l'environnement permettant de diffuser les modèles Edge exportés, mais celui-ci ne contient pas encore de modèles Edge.

Le conteneur de processeur préconfiguré est stocké dans Google Container Registry. Avant de demander le conteneur, définissez une variable d'environnement pour l'emplacement du conteneur dans Google Container Registry :

export CPU_DOCKER_GCR_PATH=gcr.io/cloud-devrel-public-resources/gcloud-container-1.14.0:latest

Après avoir défini la variable d'environnement pour le chemin d'accès Container Registry, exécutez la ligne de commande suivante pour obtenir le conteneur de processeur :

sudo docker pull ${CPU_DOCKER_GCR_PATH}

Exécuter le conteneur Docker

Après avoir obtenu le conteneur existant, vous allez exécuter ce conteneur de processeur pour diffuser les inférences de modèle Edge avec les API REST.

Avant de démarrer le conteneur de processeur, vous devez définir des variables système :

  • ${CONTAINER_NAME} : chaîne indiquant le nom du conteneur lors de son exécution, par exemple CONTAINER_NAME=automl_high_accuracy_model_cpu
  • ${PORT} : numéro indiquant le port de votre appareil qui acceptera ensuite les appels d'API REST, tel que PORT=8501

Après avoir défini les variables, exécutez Docker en ligne de commande pour diffuser les inférences de modèle Edge avec les API REST :

sudo docker run --rm --name ${CONTAINER_NAME} -p ${PORT}:8501 -v ${YOUR_MODEL_PATH}:/tmp/mounted_model/0001 -t ${CPU_DOCKER_GCR_PATH}

Une fois le conteneur exécuté, les API REST sont prêtes pour diffusion sur http://localhost:${PORT}/v1/models/default:predict. La section suivante explique comment envoyer des requêtes de prédiction à cet emplacement.

Envoyer une requête de prédiction

Maintenant que le conteneur s'exécute correctement, vous pouvez envoyer une requête de prédiction sur une image de test aux API REST.

Ligne de commande

Le corps de la requête de ligne de commande contient image_bytes encodé en base64 ainsi qu'une chaîne key identifiant l'image concernée. Pour en savoir plus sur l'encodage d'images, consultez la page Encodage Base64. Le format du fichier de requête JSON est le suivant :

/tmp/request.json
{
  "instances":
  [
    {
      "image_bytes":
      {
        "b64": "/9j/7QBEUGhvdG9zaG9...base64-encoded-image-content...fXNWzvDEeYxxxzj/Coa6Bax//Z"
      },
      "key": "your-chosen-image-key"
    }
  ]
}

Après avoir créé un fichier de requête JSON local, vous pouvez envoyer votre requête de prédiction.

Exécutez la commande suivante pour envoyer la requête de prédiction :

curl -X POST -d  @/tmp/request.json http://localhost:${PORT}/v1/models/default:predict
Réponse

La sortie obtenue doit ressembler à ceci :

{
    "predictions": [
        {
            "labels": ["Good", "Bad"],
            "scores": [0.665018, 0.334982]
        }
    ]
}

Python

Pour en savoir plus, consultez la documentation de référence de l'API AutoML Vision en langage Python.

Pour vous authentifier auprès d'AutoML Vision, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

import base64
import cv2
import io
import json

import requests

def preprocess_image(image_file_path, max_width, max_height):
    """Preprocesses input images for AutoML Vision Edge models.

    Args:
        image_file_path: Path to a local image for the prediction request.
        max_width: The max width for preprocessed images. The max width is 640
            (1024) for AutoML Vision Image Classfication (Object Detection)
            models.
        max_height: The max width for preprocessed images. The max height is
            480 (1024) for AutoML Vision Image Classfication (Object
            Detetion) models.
    Returns:
        The preprocessed encoded image bytes.
    """
    # cv2 is used to read, resize and encode images.
    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 85]
    im = cv2.imread(image_file_path)
    [height, width, _] = im.shape
    if height > max_height or width > max_width:
        ratio = max(height / float(max_width), width / float(max_height))
        new_height = int(height / ratio + 0.5)
        new_width = int(width / ratio + 0.5)
        resized_im = cv2.resize(
            im, (new_width, new_height), interpolation=cv2.INTER_AREA
        )
        _, processed_image = cv2.imencode(".jpg", resized_im, encode_param)
    else:
        _, processed_image = cv2.imencode(".jpg", im, encode_param)
    return base64.b64encode(processed_image).decode("utf-8")

def container_predict(image_file_path, image_key, port_number=8501):
    """Sends a prediction request to TFServing docker container REST API.

    Args:
        image_file_path: Path to a local image for the prediction request.
        image_key: Your chosen string key to identify the given image.
        port_number: The port number on your device to accept REST API calls.
    Returns:
        The response of the prediction request.
    """
    # AutoML Vision Edge models will preprocess the input images.
    # The max width and height for AutoML Vision Image Classification and
    # Object Detection models are 640*480 and 1024*1024 separately. The
    # example here is for Image Classification models.
    encoded_image = preprocess_image(
        image_file_path=image_file_path, max_width=640, max_height=480
    )

    # The example here only shows prediction with one image. You can extend it
    # to predict with a batch of images indicated by different keys, which can
    # make sure that the responses corresponding to the given image.
    instances = {
        "instances": [{"image_bytes": {"b64": str(encoded_image)}, "key": image_key}]
    }

    # This example shows sending requests in the same server that you start
    # docker containers. If you would like to send requests to other servers,
    # please change localhost to IP of other servers.
    url = "http://localhost:{}/v1/models/default:predict".format(port_number)

    response = requests.post(url, data=json.dumps(instances))
    print(response.json())

Exécuter l'inférence de modèle à l'aide de conteneurs de GPU (facultatif)

Cette section vous montre comment exécuter des inférences de modèle à l'aide de conteneurs de GPU. Ce processus ressemble beaucoup à l'exécution d'inférences de modèle à l'aide d'un processeur. Les principales différences sont le chemin d'accès au conteneur de GPU et la façon dont vous démarrez les conteneurs de GPU.

Extraire l'image Docker

Tout d'abord, vous allez utiliser Docker pour obtenir un conteneur de GPU préconfiguré. Le conteneur de GPU préconfiguré possède déjà l'environnement permettant de diffuser les modèles Edge exportés avec les GPU, mais celui-ci ne contient pas encore de modèles Edge ni de pilotes.

Le conteneur de processeur préconfiguré est stocké dans Google Container Registry. Avant de demander le conteneur, définissez une variable d'environnement pour l'emplacement du conteneur dans Google Container Registry :

export GPU_DOCKER_GCR_PATH=gcr.io/cloud-devrel-public-resources/gcloud-container-1.14.0-gpu:latest

Exécutez la ligne de commande suivante pour obtenir le conteneur de GPU :

sudo docker pull ${GPU_DOCKER_GCR_PATH}

Exécuter le conteneur Docker

À cette étape, vous allez exécuter le conteneur de GPU pour diffuser les inférences de modèle Edge avec les API REST. Vous devez installer le pilote NVIDIA et Docker comme mentionné ci-dessus. Vous devez également définir les variables système suivantes :

  • ${CONTAINER_NAME} : chaîne indiquant le nom du conteneur lors de son exécution, par exemple CONTAINER_NAME=automl_high_accuracy_model_gpu
  • ${PORT} : numéro indiquant le port de votre appareil qui acceptera ensuite les appels d'API REST, tel que PORT=8502

Après avoir défini les variables, exécutez Docker en ligne de commande pour diffuser les inférences de modèle Edge avec les API REST :

sudo docker run --runtime=nvidia --rm --name "${CONTAINER_NAME}" -v \
${YOUR_MODEL_PATH}:/tmp/mounted_model/0001 -p \
${PORT}:8501 -t ${GPU_DOCKER_GCR_PATH}

Une fois le conteneur exécuté, les API REST sont prêtes pour diffusion sur http://localhost:${PORT}/v1/models/default:predict. La section suivante explique comment envoyer des requêtes de prédiction à cet emplacement.

Envoyer une requête de prédiction

Maintenant que le conteneur s'exécute correctement, vous pouvez envoyer une requête de prédiction sur une image de test aux API REST.

Ligne de commande

Le corps de la requête de ligne de commande contient image_bytes encodé en base64 ainsi qu'une chaîne key identifiant l'image concernée. Pour en savoir plus sur l'encodage d'images, consultez la page Encodage Base64. Le format du fichier de requête JSON est le suivant :

/tmp/request.json
{
  "instances":
  [
    {
      "image_bytes":
      {
        "b64": "/9j/7QBEUGhvdG9zaG9...base64-encoded-image-content...fXNWzvDEeYxxxzj/Coa6Bax//Z"
      },
      "key": "your-chosen-image-key"
    }
  ]
}

Après avoir créé un fichier de requête JSON local, vous pouvez envoyer votre requête de prédiction.

Exécutez la commande suivante pour envoyer la requête de prédiction :

curl -X POST -d  @/tmp/request.json http://localhost:${PORT}/v1/models/default:predict
Réponse

La sortie obtenue doit ressembler à ceci :

{
    "predictions": [
        {
            "labels": ["Good", "Bad"],
            "scores": [0.665018, 0.334982]
        }
    ]
}

Python

Pour en savoir plus, consultez la documentation de référence de l'API AutoML Vision en langage Python.

Pour vous authentifier auprès d'AutoML Vision, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

import base64
import cv2
import io
import json

import requests

def preprocess_image(image_file_path, max_width, max_height):
    """Preprocesses input images for AutoML Vision Edge models.

    Args:
        image_file_path: Path to a local image for the prediction request.
        max_width: The max width for preprocessed images. The max width is 640
            (1024) for AutoML Vision Image Classfication (Object Detection)
            models.
        max_height: The max width for preprocessed images. The max height is
            480 (1024) for AutoML Vision Image Classfication (Object
            Detetion) models.
    Returns:
        The preprocessed encoded image bytes.
    """
    # cv2 is used to read, resize and encode images.
    encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 85]
    im = cv2.imread(image_file_path)
    [height, width, _] = im.shape
    if height > max_height or width > max_width:
        ratio = max(height / float(max_width), width / float(max_height))
        new_height = int(height / ratio + 0.5)
        new_width = int(width / ratio + 0.5)
        resized_im = cv2.resize(
            im, (new_width, new_height), interpolation=cv2.INTER_AREA
        )
        _, processed_image = cv2.imencode(".jpg", resized_im, encode_param)
    else:
        _, processed_image = cv2.imencode(".jpg", im, encode_param)
    return base64.b64encode(processed_image).decode("utf-8")

def container_predict(image_file_path, image_key, port_number=8501):
    """Sends a prediction request to TFServing docker container REST API.

    Args:
        image_file_path: Path to a local image for the prediction request.
        image_key: Your chosen string key to identify the given image.
        port_number: The port number on your device to accept REST API calls.
    Returns:
        The response of the prediction request.
    """
    # AutoML Vision Edge models will preprocess the input images.
    # The max width and height for AutoML Vision Image Classification and
    # Object Detection models are 640*480 and 1024*1024 separately. The
    # example here is for Image Classification models.
    encoded_image = preprocess_image(
        image_file_path=image_file_path, max_width=640, max_height=480
    )

    # The example here only shows prediction with one image. You can extend it
    # to predict with a batch of images indicated by different keys, which can
    # make sure that the responses corresponding to the given image.
    instances = {
        "instances": [{"image_bytes": {"b64": str(encoded_image)}, "key": image_key}]
    }

    # This example shows sending requests in the same server that you start
    # docker containers. If you would like to send requests to other servers,
    # please change localhost to IP of other servers.
    url = "http://localhost:{}/v1/models/default:predict".format(port_number)

    response = requests.post(url, data=json.dumps(instances))
    print(response.json())

Résumé

Dans ce tutoriel, vous avez découvert l'exécution de modèles Edge à l'aide de conteneurs Docker de processeur ou de GPU. Vous pouvez désormais déployer cette solution basée sur des conteneurs sur d'autres appareils.

Étapes suivantes