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)

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

Prasyarat

  • Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

  • Ruang kerja Azure Machine Learning. Untuk membuat ruang kerja, lihat Mengelola ruang kerja Azure Pembelajaran Mesin.

  • Izin berikut di ruang kerja Azure Pembelajaran Mesin:

    • Untuk membuat atau mengelola titik akhir dan penyebaran batch: Gunakan Pemilik, Kontributor, atau peran kustom yang telah diberi Microsoft.MachineLearningServices/workspaces/batchEndpoints/* izin.
    • Untuk membuat penyebaran Azure Resource Manager di grup sumber daya ruang kerja: Gunakan Peran Pemilik, Kontributor, atau kustom yang telah diberi Microsoft.Resources/deployments/write izin di grup sumber daya tempat ruang kerja disebarkan.
  • Azure Pembelajaran Mesin CLI atau Azure Pembelajaran Mesin SDK untuk Python:

    Jalankan perintah berikut untuk menginstal Azure CLI dan mlekstensi untuk Azure Pembelajaran Mesin:

    az extension add -n ml
    

    Penyebaran komponen alur untuk titik akhir batch diperkenalkan dalam ekstensi versi 2.7 ml untuk Azure CLI. az extension update --name ml Gunakan perintah untuk mendapatkan versi terbaru.


Menyambungkan ke ruang kerja Anda

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

Dalam perintah berikut, masukkan ID langganan, nama ruang kerja, nama grup sumber daya, dan lokasi Anda:

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

Tentang sampel ini

Artikel ini menggunakan model yang dibuat menggunakan TensorFlow bersama dengan arsitektur RestNet. Untuk informasi selengkapnya, lihat Pemetaan Identitas di Deep Residual Networks. Anda dapat mengunduh https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip. Model memiliki batasan berikut:

  • 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. Ubah direktori menjadi 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 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.

Klasifikasi gambar dengan penyebaran batch

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

Membuat titik akhir

Buat titik akhir yang menghosting model:

  1. Tentukan nama titik akhir.

    ENDPOINT_NAME="imagenet-classifier-batch"
    
  2. Buat file YAML berikut untuk menentukan titik akhir batch, bernama 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
    

    Untuk membuat titik akhir, jalankan kode berikut:

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

Mendaftarkan model

Penyebaran model hanya dapat menyebarkan model terdaftar. Anda perlu mendaftarkan model. Anda dapat melewati langkah ini jika model yang coba Anda sebarkan sudah terdaftar.

  1. Unduh salinan model.

    wget "${IMAGENET_SAMPLE_URI_BASE}/model.zip"
    unzip model.zip -d .
    
  2. Daftarkan modelnya.

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

Membuat skrip penilaian

Buat skrip penilaian yang dapat membaca gambar yang disediakan oleh penyebaran batch dan mengembalikan skor model.

  • Metode memuat init model menggunakan keras modul di tensorflow.
  • Metode ini run berjalan untuk setiap batch mini yang disediakan penyebaran batch.
  • Metode membaca run 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.
  • Skrip mengembalikan kelas dan probabilitas yang terkait dengan prediksi.

Kode ini adalah file 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)

Petunjuk / Saran

Meskipun gambar disediakan dalam batch mini oleh penyebaran, skrip penilaian ini memproses satu gambar pada satu waktu. Ini adalah pola umum karena mencoba memuat seluruh batch dan mengirimkannya ke model sekaligus dapat mengakibatkan tekanan memori tinggi pada eksekutor batch (pengecualian OOM).

Ada kasus tertentu di mana melakukannya memungkinkan throughput tinggi dalam tugas penilaian. Ini adalah kasus untuk penyebaran batch melalui perangkat keras GPU tempat Anda ingin mencapai pemanfaatan GPU yang tinggi. Untuk skrip penilaian yang memanfaatkan pendekatan ini, lihat Penyebaran throughput tinggi.

Catatan

Jika Anda ingin menyebarkan model generatif, yang menghasilkan file, pelajari cara menulis skrip penilaian: Menyesuaikan output dalam penyebaran batch.

Membuat penyebaran

Setelah Anda membuat skrip penilaian, buat penyebaran batch untuk skrip tersebut. Gunakan prosedur berikut:

  1. Pastikan Anda memiliki kluster komputasi yang dibuat tempat Anda dapat membuat penyebaran. Dalam contoh ini, gunakan kluster komputasi bernama gpu-cluster. Meskipun tidak diperlukan, menggunakan GPU mempercepat pemrosesan.

  2. Menunjukkan lingkungan mana yang akan menjalankan penyebaran. Dalam contoh ini, model berjalan pada TensorFlow. Azure Pembelajaran Mesin sudah memiliki lingkungan dengan perangkat lunak yang diperlukan terinstal, sehingga Anda dapat menggunakan kembali lingkungan ini. Anda perlu menambahkan beberapa dependensi dalam file conda.yml .

    Definisi lingkungan 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. Buat penyebaran.

    Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat YAML konfigurasi seperti contoh berikut. Untuk properti lain, lihat skema YAML titik akhir batch lengkap.

    $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
    

    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 disebut penyebaran default .

    Pendekatan ini memungkinkan Anda mengubah penyebaran default dan mengubah model yang melayani penyebaran tanpa mengubah kontrak dengan pengguna yang memanggil titik akhir. Gunakan kode berikut untuk memperbarui penyebaran default:

    az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
    

Titik akhir batch Anda siap digunakan.

Menguji penyebarannya

Untuk menguji titik akhir, gunakan sampel 1.000 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. Unggah ke penyimpanan data Azure Pembelajaran Mesin. Buat aset data yang dapat digunakan untuk memanggil titik akhir untuk penilaian.

Catatan

Titik akhir batch menerima data yang dapat ditempatkan di beberapa jenis lokasi.

  1. Unduh data sampel terkait.

    wget "${IMAGENET_SAMPLE_URI_BASE}/imagenet-1000.zip"
    unzip imagenet-1000.zip -d data
    

    Catatan

    Jika Anda belum wget menginstalnya secara lokal, instal atau gunakan browser untuk mendapatkan file .zip .

  2. Buat aset data dari data yang diunduh.

    1. Buat definisi aset data dalam file yang YAML disebut 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
      
    2. Buat aset data.

      az ml data create -f imagenet-sample-unlabeled.yml
      
  3. Saat data diunggah dan siap digunakan, panggil titik akhir.

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

    Catatan

    Jika utilitas jq tidak diinstal, lihat Mengunduh jq.


Petunjuk / Saran

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

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

    az ml job show -n $JOB_NAME --web
    
  2. Setelah penyebaran selesai, unduh prediksi.

    Untuk mengunduh prediksi, gunakan perintah berikut:

    az ml job download --name $JOB_NAME --output-name score --download-path ./
    
  3. Prediksi terlihat seperti output berikut. Prediksi dikombinasikan dengan label untuk kenyamanan pembaca. Untuk mempelajari selengkapnya tentang cara mencapai efek ini, 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
    
    berkas 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 anjing pelacak
    ... ... ... ...

Penyebaran throughput tinggi

Seperti disebutkan sebelumnya, penyebaran memproses satu gambar dalam satu waktu, bahkan ketika penyebaran batch menyediakan batch dari mereka. Dalam kebanyakan kasus, pendekatan ini adalah yang terbaik. Ini menyederhanakan bagaimana model berjalan dan menghindari kemungkinan masalah di luar memori. Namun, dalam kasus lain tertentu, Anda mungkin ingin menjenuhkan sebanyak mungkin perangkat keras yang mendasar. Situasi ini adalah GPU kasus, misalnya.

Pada kasus tersebut, Anda mungkin ingin melakukan inferensi pada seluruh batch data. Pendekatan 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 apa pun. Seluruh alur terjadi pada perangkat yang sama yang digunakan (CPU/GPU).

Peringatan

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

  1. Buat kode skrip penilaian/skor-demi-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"]
        )
    
    • Skrip ini membangun 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) untuk 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 perlu menyetel parameter ini dengan hati-hati untuk mencapai penggunaan maksimum GPU tepat sebelum mendapatkan pengecualian OOM.
    • Setelah prediksi dihitung, tensor dikonversi ke numpy.ndarray.
  2. Buat penyebaran.

    1. Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat YAML konfigurasi seperti contoh berikut. Untuk properti lain, lihat skema YAML titik akhir batch lengkap.
    $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
    
    1. 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, tunjukkan nama penyebaran dalam metode pemanggilan atau atur 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 sebagai input yang cocok dengan dimensi gambar input. Untuk mendukung beberapa ukuran gambar pada setiap batch, pelaksana batch memanggil model MLflow sekali per file gambar.
  • Model MLflow sangat dianjurkan untuk menyertakan tanda tangan. Jika mereka melakukannya, itu 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, sertakan tanda tangan yang dapat menjaminnya. Misalnya, contoh tanda tangan berikut 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, lihat Menggunakan model MLflow dalam penyebaran batch.

Langkah berikutnya