Bagikan melalui


Pemrosesan gambar dengan penyebaran model batch

BERLAKU UNTUK:Ekstensi ml Azure CLI v2 (saat ini)Python SDK azure-ai-ml v2 (saat ini)

Penyebaran model batch dapat digunakan untuk memproses data tabular, tetapi juga jenis file lainnya seperti gambar. Penyebaran tersebut didukung dalam model MLflow dan kustom. Dalam tutorial ini, kita akan mempelajari cara menyebarkan model yang mengklasifikasikan gambar sesuai dengan taksonomi ImageNet.

Tentang sampel ini

Model yang akan kita kerjakan dibangun menggunakan TensorFlow bersama dengan arsitektur RestNet (Pemetaan Identitas di Deep Residual Networks). Sampel model ini dapat diunduh dari sini. Model ini memiliki batasan berikut yang penting untuk diingat untuk penyebaran:

  • Ini bekerja dengan gambar ukuran 244x244 (tensor (224, 224, 3)).
  • Ini memerlukan input untuk diskalakan ke rentang [0,1].

Informasi dalam artikel ini didasarkan pada sampel kode yang terkandung dalam repositori azureml-examples. Untuk menjalankan perintah secara lokal tanpa harus menyalin/menempelkan YAML dan file lainnya, kloning repositori, lalu ubah direktori ke cli/endpoints/batch/deploy-models/imagenet-classifier jika Anda menggunakan Azure CLI atau sdk/python/endpoints/batch/deploy-models/imagenet-classifier jika Anda menggunakan SDK kami untuk Python.

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/imagenet-classifier

Ikuti di Jupyter Notebooks

Anda dapat mengikuti sampel ini di Jupyter Notebook. Di repositori kloning, buka notebook: imagenet-classifier-batch.ipynb.

Prasyarat

Sebelum mengikuti langkah-langkah dalam artikel ini, pastikan Anda memiliki prasyarat berikut:

  • Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai. Coba versi gratis atau berbayar Azure Machine Learning.

  • Ruang kerja Azure Machine Learning. Jika Anda tidak memilikinya, gunakan langkah-langkah dalam artikel Mengelola ruang kerja Azure Pembelajaran Mesin untuk membuatnya.

  • Pastikan Anda memiliki izin berikut di ruang kerja:

    • Membuat atau mengelola titik akhir dan penyebaran batch: Gunakan peran Pemilik, Kontributor, atau Kustom yang memungkinkan Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • Membuat penyebaran ARM di grup sumber daya ruang kerja: Gunakan peran Pemilik, Kontributor, atau Kustom yang memungkinkan Microsoft.Resources/deployments/write dalam grup sumber daya tempat ruang kerja disebarkan.

  • Anda perlu menginstal perangkat lunak berikut untuk bekerja dengan Azure Pembelajaran Mesin:

    Azure CLI dan mlekstensi untuk Azure Pembelajaran Mesin.

    az extension add -n ml
    

    Catatan

    Penyebaran komponen alur untuk Titik Akhir Batch diperkenalkan dalam ekstensi versi 2.7 ml untuk Azure CLI. Gunakan az extension update --name ml untuk mendapatkan versi terakhirnya.

Menyambungkan ke ruang kerja Anda

Ruang kerja adalah sumber daya tingkat teratas untuk Azure Machine Learning, menyediakan tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat Anda menggunakan Azure Machine Learning. Di bagian ini, kita akan menyambungkan ke ruang kerja tempat Anda akan melakukan tugas penyebaran.

Teruskan nilai untuk ID langganan, ruang kerja, lokasi, dan grup sumber daya Anda dalam kode berikut:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Klasifikasi gambar dengan penyebaran batch

Dalam contoh ini, kita akan mempelajari cara menyebarkan model pembelajaran mendalam yang dapat mengklasifikasikan gambar tertentu sesuai dengan taksonomi ImageNet.

Membuat titik akhir

Pertama, mari kita buat titik akhir yang akan menghosting model:

Tentukan nama titik akhir:

ENDPOINT_NAME="imagenet-classifier-batch"

File YAML berikut mendefinisikan titik akhir batch:

endpoint.yml

$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
name: imagenet-classifier-batch
description: A batch endpoint for performing image classification using a TFHub model ImageNet model.
auth_mode: aad_token

Jalankan kode berikut untuk membuat titik akhir.

az ml batch-endpoint create --file endpoint.yml  --name $ENDPOINT_NAME

Mendaftarkan model

Penyebaran model hanya dapat menyebarkan model terdaftar sehingga kita perlu mendaftarkannya. Anda dapat melewati langkah ini jika model yang anda coba sebarkan sudah terdaftar.

  1. Mengunduh salinan model:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip
    unzip model.zip -d .
    
  2. Daftarkan model:

    MODEL_NAME='imagenet-classifier'
    az ml model create --name $MODEL_NAME --path "model"
    

Membuat skrip penilaian

Kita perlu membuat skrip penilaian yang dapat membaca gambar yang disediakan oleh penyebaran batch dan mengembalikan skor model. Skrip berikut:

  • init Menunjukkan fungsi yang memuat model menggunakan keras modul di tensorflow.
  • run Menunjukkan fungsi yang dijalankan untuk setiap batch mini yang disediakan penyebaran batch.
  • Fungsi run membaca satu gambar file pada satu waktu
  • Metode mengubah run ukuran gambar ke ukuran yang diharapkan untuk model.
  • Metode ini run menskalakan ulang gambar ke domain rentang [0,1] , yang diharapkan model.
  • Ini mengembalikan kelas dan probabilitas yang terkait dengan prediksi.

code/score-by-file/batch_driver.py

import os
import numpy as np
import pandas as pd
import tensorflow as tf
from os.path import basename
from PIL import Image
from tensorflow.keras.models import load_model


def init():
    global model
    global input_width
    global input_height

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    # load the model
    model = load_model(model_path)
    input_width = 244
    input_height = 244


def run(mini_batch):
    results = []

    for image in mini_batch:
        data = Image.open(image).resize(
            (input_width, input_height)
        )  # Read and resize the image
        data = np.array(data) / 255.0  # Normalize
        data_batch = tf.expand_dims(
            data, axis=0
        )  # create a batch of size (1, 244, 244, 3)

        # perform inference
        pred = model.predict(data_batch)

        # Compute probabilities, classes and labels
        pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
        pred_class = tf.math.argmax(pred, axis=-1).numpy()

        results.append([basename(image), pred_class[0], pred_prob])

    return pd.DataFrame(results)

Tip

Meskipun gambar disediakan dalam batch mini oleh penyebaran, skrip penilaian ini memproses satu gambar pada satu waktu. Ini adalah pola umum seperti mencoba memuat seluruh batch dan mengirimkannya ke model sekaligus dapat mengakibatkan tekanan memori tinggi pada eksekutor batch (eksekusi OOM). Namun, ada kasus tertentu di mana melakukannya memungkinkan throughput tinggi dalam tugas penilaian. Ini adalah kasus untuk instans penyebaran batch melalui perangkat keras GPU di mana kita ingin mencapai pemanfaatan GPU yang tinggi. Lihat Penyebaran throughput tinggi untuk contoh skrip penilaian yang memanfaatkannya.

Catatan

Jika Anda mencoba menyebarkan model generatif (model yang menghasilkan file), baca cara menulis skrip penilaian seperti yang dijelaskan di Penyebaran model yang menghasilkan beberapa file.

Membuat penyebaran

Salah satu skrip penilaian dibuat, saatnya untuk membuat penyebaran batch untuk itu. Ikuti langkah-langkah berikut untuk membuatnya:

  1. Pastikan Anda memiliki kluster komputasi yang dibuat di mana kami dapat membuat penyebaran. Dalam contoh ini kita akan menggunakan kluster komputasi bernama gpu-cluster. Meskipun tidak diperlukan, kami menggunakan GPU untuk mempercepat pemrosesan.

  2. Kita perlu menunjukkan lingkungan mana yang akan kita jalankan penyebarannya. Dalam kasus kami, model kami berjalan pada TensorFlow. Azure Pembelajaran Mesin sudah memiliki lingkungan dengan perangkat lunak yang diperlukan yang terinstal, sehingga kami dapat menggunakan kembali lingkungan ini. Kami hanya akan menambahkan beberapa dependensi dalam conda.yml file.

    Definisi lingkungan akan disertakan dalam file penyebaran.

    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
    
  3. Sekarang, mari buat penyebaran.

    Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat YAML konfigurasi seperti berikut ini. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: imagenet-classifier-batch
    name: imagenet-classifier-resnetv2
    description: A ResNetV2 model architecture for performing ImageNet classification in batch
    type: model
    model: azureml:imagenet-classifier@latest
    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code/score-by-file
      scoring_script: batch_driver.py
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 1
      mini_batch_size: 5
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    

    Kemudian, buat penyebaran dengan perintah berikut:

    az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  4. Meskipun Anda dapat memanggil penyebaran tertentu di dalam titik akhir, Anda biasanya ingin memanggil titik akhir itu sendiri, dan membiarkan titik akhir memutuskan penyebaran mana yang akan digunakan. Penyebaran tersebut diberi nama penyebaran "default". Ini memberi Anda kemungkinan mengubah penyebaran default - dan karenanya mengubah model yang melayani penyebaran - tanpa mengubah kontrak dengan pengguna yang memanggil titik akhir. Gunakan instruksi berikut untuk memperbarui penyebaran default:

    az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
    
  5. Pada titik ini, titik akhir batch kami siap digunakan.

Menguji penyebaran

Untuk menguji titik akhir, kita akan menggunakan sampel 1000 gambar dari himpunan data ImageNet asli. Titik akhir batch hanya dapat memproses data yang terletak di cloud dan yang dapat diakses dari ruang kerja Azure Pembelajaran Mesin. Dalam contoh ini, kita akan mengunggahnya ke penyimpanan data Azure Pembelajaran Mesin. Terutama, kita akan membuat aset data yang dapat digunakan untuk memanggil titik akhir untuk penilaian. Namun, perhatikan bahwa titik akhir batch menerima data yang dapat ditempatkan di beberapa jenis lokasi.

  1. Mari kita unduh data sampel terkait:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip
    unzip imagenet-1000.zip -d data
    
  2. Sekarang, mari kita buat aset data dari data yang baru saja diunduh

    Buat definisi aset data di YAML:

    imagenet-sample-unlabeled.yml

    $schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
    name: imagenet-sample-unlabeled
    description: A sample of 1000 images from the original ImageNet dataset. Download content from https://azuremlexampledata.blob.core.windows.net/data/imagenet-1000.zip.
    type: uri_folder
    path: data
    

    Kemudian, buat aset data:

    az ml data create -f imagenet-sample-unlabeled.yml
    
  3. Sekarang setelah data diunggah dan siap digunakan, mari kita panggil titik akhir:

    JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)
    

    Catatan

    Utilitas jq mungkin tidak diinstal pada setiap penginstalan. Anda bisa mendapatkan instruksi di tautan ini.

    Tip

    Perhatikan bagaimana kami tidak menunjukkan nama penyebaran dalam operasi pemanggilan. Itu karena titik akhir secara otomatis merutekan pekerjaan ke penyebaran default. Karena titik akhir kami hanya memiliki satu penyebaran, maka titik akhir tersebut adalah yang default. Anda dapat menargetkan penyebaran tertentu dengan menunjukkan argumen/parameter deployment_name.

  4. Pekerjaan batch dimulai segera setelah perintah kembali. Anda dapat memantau status pekerjaan hingga selesai:

    az ml job show -n $JOB_NAME --web
    
  5. Setelah penyebaran selesai, kita dapat mengunduh prediksi:

    Untuk mengunduh prediksi, gunakan perintah berikut:

    az ml job download --name $JOB_NAME --output-name score --download-path ./
    
  6. Prediksi output akan terlihat seperti berikut ini. Perhatikan bahwa prediksi telah dikombinasikan dengan label untuk kenyamanan pembaca. Untuk mengetahui selengkapnya tentang cara mencapainya, lihat buku catatan terkait.

    import pandas as pd
    score = pd.read_csv("named-outputs/score/predictions.csv", header=None,  names=['file', 'class', 'probabilities'], sep=' ')
    score['label'] = score['class'].apply(lambda pred: imagenet_labels[pred])
    score
    
    file kelas Probabilitas label
    n02088094_Afghan_hound. JPEG 161 0.994745 Anjing Afghanistan
    n02088238_basset 162 0.999397 Basset
    n02088364_beagle. JPEG 165 0.366914 bluetick
    n02088466_bloodhound. JPEG 164 0.926464 bloodhound
    ... ... ... ...

Penyebaran throughput tinggi

Seperti disebutkan sebelumnya, penyebaran yang baru saja kita buat memproses satu gambar per waktu, bahkan ketika penyebaran batch menyediakan batch dari mereka. Dalam kebanyakan kasus, ini adalah pendekatan terbaik karena menyederhanakan bagaimana model dijalankan dan menghindari kemungkinan masalah di luar memori. Namun, pada orang lain tertentu kita mungkin ingin menjenuhkan sebanyak mungkin pemanfaatan perangkat keras yang mendasar. Ini adalah GPU kasus misalnya.

Pada kasus tersebut, kita mungkin ingin melakukan inferensi pada seluruh batch data. Itu menyiratkan pemuatan seluruh set gambar ke memori dan mengirimkannya langsung ke model. Contoh berikut menggunakan TensorFlow untuk membaca batch gambar dan menilai semuanya sekaligus. Ini juga menggunakan ops TensorFlow untuk melakukan pra-pemrosesan data sehingga seluruh alur akan terjadi pada perangkat yang sama yang digunakan (CPU/GPU).

Peringatan

Beberapa model memiliki hubungan non-linier dengan ukuran input dalam hal konsumsi memori. Batch lagi (seperti yang dilakukan dalam contoh ini) atau kurangi ukuran batch yang dibuat oleh penyebaran batch untuk menghindari pengecualian di luar memori.

  1. Membuat skrip penilaian:

    code/score-by-batch/batch_driver.py

    import os
    import numpy as np
    import pandas as pd
    import tensorflow as tf
    from tensorflow.keras.models import load_model
    
    
    def init():
        global model
        global input_width
        global input_height
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    
        # load the model
        model = load_model(model_path)
        input_width = 244
        input_height = 244
    
    
    def decode_img(file_path):
        file = tf.io.read_file(file_path)
        img = tf.io.decode_jpeg(file, channels=3)
        img = tf.image.resize(img, [input_width, input_height])
        return img / 255.0
    
    
    def run(mini_batch):
        images_ds = tf.data.Dataset.from_tensor_slices(mini_batch)
        images_ds = images_ds.map(decode_img).batch(64)
    
        # perform inference
        pred = model.predict(images_ds)
    
        # Compute probabilities, classes and labels
        pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
        pred_class = tf.math.argmax(pred, axis=-1).numpy()
    
        return pd.DataFrame(
            [mini_batch, pred_prob, pred_class], columns=["file", "probability", "class"]
        )
    

    Tip

    • Perhatikan bahwa skrip ini membuat himpunan data tensor dari batch mini yang dikirim oleh penyebaran batch. Himpunan data ini telah diproscesikan sebelumnya untuk mendapatkan tensor yang diharapkan untuk model menggunakan map operasi dengan fungsi decode_img.
    • Himpunan data di-batch lagi (16) mengirim data ke model. Gunakan parameter ini untuk mengontrol berapa banyak informasi yang dapat Anda muat ke dalam memori dan mengirim ke model sekaligus. Jika berjalan pada GPU, Anda harus menyetel parameter ini dengan hati-hati untuk mencapai pemanfaatan maksimum GPU tepat sebelum mendapatkan pengecualian OOM.
    • Setelah prediksi dihitung, tensor dikonversi ke numpy.ndarray.
  2. Sekarang, mari buat penyebaran.

    Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat YAML konfigurasi seperti berikut ini. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: imagenet-classifier-batch
    name: imagenet-classifier-resnetv2
    description: A ResNetV2 model architecture for performing ImageNet classification in batch
    type: model
    model: azureml:imagenet-classifier@latest
    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code/score-by-batch
      scoring_script: batch_driver.py
    resources:
      instance_count: 2
    tags:
      device_acceleration: CUDA
      device_batching: 16
    settings:
      max_concurrency_per_instance: 1
      mini_batch_size: 5
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    

    Kemudian, buat penyebaran dengan perintah berikut:

    az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Anda dapat menggunakan penyebaran baru ini dengan data sampel yang ditunjukkan sebelumnya. Ingatlah bahwa untuk memanggil penyebaran ini, Anda harus menunjukkan nama penyebaran dalam metode pemanggilan atau mengaturnya sebagai yang default.

Pertimbangan untuk model MLflow yang memproses gambar

Model MLflow di Titik Akhir Batch mendukung pembacaan gambar sebagai data input. Karena penyebaran MLflow tidak memerlukan skrip penilaian, memiliki pertimbangan berikut saat menggunakannya:

  • File gambar yang didukung meliputi: .png, , .jpg.jpeg, .tiff, .bmp dan .gif.
  • Model MLflow harus mengharapkan untuk menerima np.ndarray input sebagai yang akan cocok dengan dimensi gambar input. Untuk mendukung beberapa ukuran gambar pada setiap batch, eksekutor batch akan memanggil model MLflow sekali per file gambar.
  • Model MLflow sangat dianjurkan untuk menyertakan tanda tangan, dan jika mereka melakukannya harus berjenis TensorSpec. Input dibentuk ulang agar sesuai dengan bentuk tensor jika tersedia. Jika tidak ada tanda tangan yang tersedia, tensor jenis np.uint8 disimpulkan.
  • Untuk model yang menyertakan tanda tangan dan diharapkan untuk menangani ukuran variabel gambar, lalu sertakan tanda tangan yang dapat menjaminnya. Misalnya, contoh tanda tangan berikut akan memungkinkan batch dari 3 gambar yang disalurkan.
import numpy as np
import mlflow
from mlflow.models.signature import ModelSignature
from mlflow.types.schema import Schema, TensorSpec

input_schema = Schema([
  TensorSpec(np.dtype(np.uint8), (-1, -1, -1, 3)),
])
signature = ModelSignature(inputs=input_schema)

(...)

mlflow.<flavor>.log_model(..., signature=signature)

Anda dapat menemukan contoh kerja di jupyter notebook imagenet-classifier-mlflow.ipynb. Untuk informasi selengkapnya tentang cara menggunakan model MLflow dalam penyebaran batch baca Menggunakan model MLflow dalam penyebaran batch.

Langkah berikutnya