Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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/writeizin di grup sumber daya tempat ruang kerja disebarkan.
- Untuk membuat atau mengelola titik akhir dan penyebaran batch: Gunakan Pemilik, Kontributor, atau peran kustom yang telah diberi
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 mlPenyebaran komponen alur untuk titik akhir batch diperkenalkan dalam ekstensi versi 2.7
mluntuk Azure CLI.az extension update --name mlGunakan 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:
Tentukan nama titik akhir.
ENDPOINT_NAME="imagenet-classifier-batch"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_tokenUntuk 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.
Unduh salinan model.
Daftarkan modelnya.
Membuat skrip penilaian
Buat skrip penilaian yang dapat membaca gambar yang disediakan oleh penyebaran batch dan mengembalikan skor model.
- Metode memuat
initmodel menggunakankerasmodul ditensorflow. - Metode ini
runberjalan untuk setiap batch mini yang disediakan penyebaran batch. - Metode membaca
runsatu gambar file pada satu waktu. - Metode mengubah
runukuran gambar ke ukuran yang diharapkan untuk model. - Metode ini
runmenskalakan 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:
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.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 .Buat penyebaran.
Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat
YAMLkonfigurasi 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: infoBuat penyebaran dengan perintah berikut:
az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-defaultMeskipun 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.
Unduh data sampel terkait.
Buat aset data dari data yang diunduh.
Buat definisi aset data dalam file yang
YAMLdisebut 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: dataBuat aset data.
az ml data create -f imagenet-sample-unlabeled.yml
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
jqtidak 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.
Pekerjaan batch dimulai segera setelah perintah kembali. Anda dapat memantau status pekerjaan hingga selesai.
Setelah penyebaran selesai, unduh prediksi.
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]) scoreberkas 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.
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
mapoperasi dengan fungsidecode_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.
- 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
Buat penyebaran.
- Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat
YAMLkonfigurasi 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- Buat penyebaran dengan perintah berikut:
az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default- Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat
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.ndarraysebagai 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 jenisnp.uint8disimpulkan. - 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.