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
ml
ekstensi 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. Gunakanaz 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.
Mengunduh salinan model:
Daftarkan 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 menggunakankeras
modul ditensorflow
.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:
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.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 dalamconda.yml
file.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
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
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.
Mari kita unduh data sampel terkait:
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
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
.Pekerjaan batch dimulai segera setelah perintah kembali. Anda dapat memantau status pekerjaan hingga selesai:
Setelah penyebaran selesai, kita dapat mengunduh prediksi:
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.
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 fungsidecode_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
.
- 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
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
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 jenisnp.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.