Tutorial container Edge

Setelah membuat model AutoML Vision Edge dan mengekspornya ke bucket Google Cloud Storage, Anda dapat menggunakan layanan RESTful dengan Model AutoML Vision Edge danImage Docker Penyaluran TF.

Hal yang akan Anda buat

Container Docker dapat membantu Anda men-deploy model edge dengan mudah di perangkat yang berbeda. Anda dapat menjalankan model edge dengan memanggil REST API dari container dengan bahasa apa pun yang Anda inginkan, dengan manfaat tambahan karena tidak perlu menginstal dependensi atau menemukan versi TensorFlow yang tepat.

Dalam tutorial ini, Anda akan memiliki pengalaman langkah demi langkah dalam menjalankan model edge di perangkat menggunakan container Docker.

Secara khusus, tutorial ini akan memandu Anda melalui tiga langkah:

  1. Mendapatkan container yang telah dibangun sebelumnya.
  2. Menjalankan container dengan model Edge untuk memulai REST API.
  3. Membuat prediksi.

Banyak perangkat hanya memiliki CPU, sementara beberapa perangkat mungkin memiliki GPU untuk mendapatkan prediksi yang lebih cepat. Jadi, kami menyediakan tutorial dengan container CPU dan GPU yang telah dibangun sebelumnya.

Tujuan

Dalam panduan pengantar menyeluruh ini, Anda akan menggunakan contoh kode untuk:

  1. Mendapatkan container Docker.
  2. Mulai REST API menggunakan container Docker dengan model edge.
  3. Membuat prediksi untuk mendapatkan hasil yang dianalisis.

Sebelum memulai

Untuk menyelesaikan tutorial ini, Anda harus:

  1. Latih model Edge yang dapat diekspor. Ikuti panduan memulai model perangkat Edge untuk melatih model Edge.
  2. Ekspor model AutoML Vision Edge. Model ini akan disalurkan dengan container sebagai REST API.
  3. Instal Docker. Ini adalah perangkat lunak yang diperlukan untuk menjalankan container Docker.
  4. (Opsional) Instal Docker dan driver NVIDIA. Ini adalah langkah opsional jika Anda memiliki perangkat dengan GPU dan ingin mendapatkan prediksi yang lebih cepat.
  5. Menyiapkan image pengujian. Gambar-gambar ini akan dikirim dalam permintaan untuk mendapatkan hasil yang dianalisis.

Detail untuk mengekspor model dan menginstal software yang diperlukan dapat dilihat di bagian berikut.

Ekspor Model AutoML Vision Edge

Setelah melatih model Edge, Anda dapat mengekspornya ke perangkat yang berbeda.

Container mendukung model TensorFlow, yang bernama saved_model.pb saat diekspor.

Untuk mengekspor model AutoML Vision Edge untuk container, pilih tab Container di UI, lalu ekspor model ke ${YOUR_MODEL_PATH} di Google Cloud Storage. Model yang diekspor ini akan ditayangkan dengan container sebagai REST API nanti.

Opsi ekspor ke container

Untuk mendownload model yang diekspor secara lokal, jalankan perintah berikut.

Dengan keterangan:

  • ${YOUR_MODEL_PATH} - Lokasi model di Google Cloud Storage (misalnya, gs://my-bucket-vcm/models/edge/ICN4245971651915048908/2020-01-20_01-27-14-064_tf-saved-model/)
  • ${YOUR_LOCAL_MODEL_PATH} - Jalur lokal tempat Anda ingin mendownload model (misalnya, /tmp).
gsutil cp ${YOUR_MODEL_PATH} ${YOUR_LOCAL_MODEL_PATH}/saved_model.pb

Instal Docker

Docker adalah software yang digunakan untuk men-deploy dan menjalankan aplikasi di dalam container.

Instal Docker Community Edition (CE) di sistem Anda. Anda akan menggunakannya untuk menyalurkan model Edge sebagai REST API.

Menginstal Driver NVIDIA dan NVIDIA DOCKER (opsional - khusus untuk GPU)

Beberapa perangkat memiliki GPU untuk memberikan prediksi yang lebih cepat. Container Docker GPU disediakan untuk mendukung GPU NVIDIA.

Untuk menjalankan container GPU, Anda harus menginstal driver NVIDIA dan NVIDIA Docker di sistem Anda.

Menjalankan inferensi model menggunakan CPU

Bagian ini memberikan petunjuk langkah demi langkah untuk menjalankan inferensi model menggunakan container CPU. Anda akan menggunakan Docker yang terinstal untuk mendapatkan dan menjalankan container CPU guna menyalurkan model Edge yang diekspor sebagai REST API, lalu mengirim permintaan gambar pengujian ke REST API untuk mendapatkan hasil yang dianalisis.

Mengambil image Docker

Pertama, Anda akan menggunakan Docker untuk mendapatkan container CPU yang telah dibangun sebelumnya. CPU container yang telah dibangun sebelumnya sudah memiliki keseluruhan lingkungan untuk menyalurkan model Edge yang diekspor, yang belum berisi model Edge apa pun.

Container CPU yang telah dibangun sebelumnya disimpan di Google Container Registry. Sebelum meminta container, tetapkan variabel lingkungan untuk lokasi container di Google Container Registry:

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

Setelah menetapkan variabel lingkungan untuk jalur Container Registry, jalankan command line berikut untuk mendapatkan container CPU:

sudo docker pull ${CPU_DOCKER_GCR_PATH}

Menjalankan container Docker

Setelah mendapatkan container yang ada, Anda akan menjalankan container CPU ini untuk menayangkan inferensi model Edge dengan REST API.

Sebelum memulai container CPU, Anda harus menetapkan variabel sistem:

  • ${CONTAINER_NAME} - String yang menunjukkan nama container saat dijalankan, misalnya CONTAINER_NAME=automl_high_accuracy_model_cpu.
  • ${PORT} - Nomor yang menunjukkan port di perangkat Anda untuk menerima panggilan REST API nanti, seperti PORT=8501.

Setelah menetapkan variabel, jalankan Docker di command line untuk menyalurkan inferensi model Edge dengan REST API:

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

Setelah container berhasil berjalan, REST API siap disalurkan di http://localhost:${PORT}/v1/models/default:predict. Bagian berikut menjelaskan cara mengirim permintaan prediksi ke lokasi ini.

Mengirim permintaan prediksi

Setelah container berhasil berjalan, Anda dapat mengirim permintaan prediksi pada gambar pengujian ke REST API.

Command-line

Isi permintaan command line berisi berenkode base64 image_bytes dan string key untuk mengidentifikasi gambar yang diberikan. Lihat topik Encoding Base64 untuk mengetahui informasi selengkapnya tentang encoding gambar. Format file JSON yang diminta adalah sebagai berikut:

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

Setelah membuat file permintaan JSON lokal, Anda dapat mengirim permintaan prediksi.

Gunakan perintah berikut untuk mengirim permintaan prediksi:

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

Anda akan melihat output yang mirip dengan berikut ini:

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

Python

Untuk mengetahui informasi selengkapnya, lihat AutoML Vision Python dokumentasi referensi API.

Untuk melakukan autentikasi ke AutoML Vision, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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())

Menjalankan Inferensi Model Menggunakan Container GPU (opsional)

Bagian ini menunjukkan cara menjalankan inferensi model menggunakan container GPU. Proses ini sangat mirip dengan menjalankan inferensi model menggunakan CPU. Perbedaan utamanya adalah jalur container GPU dan cara memulai container GPU.

Mengambil image Docker

Pertama, Anda akan menggunakan Docker untuk mendapatkan container GPU yang telah dibangun sebelumnya. Container GPU telah dibangun sebelumnya sudah memiliki lingkungan untuk menyalurkan model Edge yang diekspor dengan GPU, yang belum berisi model Edge, atau driver apapun.

Container CPU yang telah dibangun sebelumnya disimpan di Google Container Registry. Sebelum meminta container, tetapkan variabel lingkungan untuk lokasi container di Google Container Registry:

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

Jalankan command line berikut untuk mendapatkan container GPU:

sudo docker pull ${GPU_DOCKER_GCR_PATH}

Menjalankan container Docker

Langkah ini akan menjalankan container GPU untuk menyalurkan inferensi model Edge dengan REST API. Anda harus menginstal driver dan docker NVIDIA seperti yang disebutkan di atas. Anda juga harus menetapkan variabel sistem berikut ini:

  • ${CONTAINER_NAME} - String yang menunjukkan nama container saat dijalankan, misalnya CONTAINER_NAME=automl_high_accuracy_model_gpu.
  • ${PORT} - Nomor yang menunjukkan port di perangkat Anda untuk menerima panggilan REST API nanti, seperti PORT=8502.

Setelah menetapkan variabel, jalankan Docker di command line untuk menyalurkan inferensi model Edge dengan REST API:

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}

Setelah container berhasil berjalan, REST API siap ditayangkan di http://localhost:${PORT}/v1/models/default:predict. Bagian berikut menjelaskan cara mengirim permintaan prediksi ke lokasi ini.

Mengirim permintaan prediksi

Setelah container berhasil berjalan, Anda dapat mengirim permintaan prediksi pada gambar pengujian ke REST API.

Command-line

Isi permintaan command line berisi berenkode base64 image_bytes dan string key untuk mengidentifikasi gambar yang diberikan. Lihat topik Encoding Base64 untuk mengetahui informasi selengkapnya tentang encoding gambar. Format file JSON yang diminta adalah sebagai berikut:

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

Setelah membuat file permintaan JSON lokal, Anda dapat mengirim permintaan prediksi.

Gunakan perintah berikut untuk mengirim permintaan prediksi:

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

Anda akan melihat output yang mirip dengan berikut ini:

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

Python

Untuk mengetahui informasi selengkapnya, lihat AutoML Vision Python dokumentasi referensi API.

Untuk melakukan autentikasi ke AutoML Vision, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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())

Ringkasan

Dalam tutorial ini, Anda telah mempelajari cara menjalankan model Edge menggunakan container Docker CPU atau GPU. Sekarang Anda dapat men-deploy solusi berbasis container ini di lebih banyak perangkat.

Apa Selanjutnya