Toplu iş modeli dağıtımlarıyla görüntü işleme
ŞUNLAR IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v2 (geçerli)Python SDK azure-ai-ml v2 (geçerli)
Toplu iş modeli dağıtımları tablosal verileri işlemek için, ancak görüntüler gibi diğer dosya türlerini işlemek için de kullanılabilir. Bu dağıtımlar hem MLflow hem de özel modellerde desteklenir. Bu öğreticide, görüntüleri ImageNet taksonomisine göre sınıflandırırken modelin nasıl dağıtılacağını öğreneceğiz.
Bu örnek hakkında
Birlikte çalışacağız model, RestNet mimarisi (Derin Artık Ağlarda Kimlik Eşlemeleri) ile birlikte TensorFlow kullanılarak oluşturulmuştu. Bu modelin bir örneği buradan indirilebilir. Model, dağıtım için göz önünde bulundurulması gereken aşağıdaki sınırlamalara sahiptir:
- 244x244 boyutlu görüntülerle (tensorları
(224, 224, 3)
) çalışır. - Girişlerin aralığına
[0,1]
ölçeklendirilmesini gerektirir.
Bu makaledeki bilgiler, azureml-examples deposunda yer alan kod örneklerini temel alır. YAML ve diğer dosyaları kopyalamak/yapıştırmak zorunda kalmadan komutları yerel olarak çalıştırmak için depoyu kopyalayın ve ardından Azure CLI kullanıyorsanız veya sdk/python/endpoints/batch/deploy-models/imagenet-classifier
Python için SDK'mızı kullanıyorsanız dizinleri cli/endpoints/batch/deploy-models/imagenet-classifier
olarak değiştirin.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/imagenet-classifier
Jupyter Notebooks'ta takip edin
Jupyter Not Defteri'nde bu örneği izleyebilirsiniz. Kopyalanan depoda not defterini açın: imagenet-classifier-batch.ipynb.
Önkoşullar
Bu makaledeki adımları takip etmeden önce aşağıdaki önkoşullara sahip olduğunuzdan emin olun:
Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun. Azure Machine Learning'in ücretsiz veya ücretli sürümünü deneyin.
Azure Machine Learning çalışma alanı. Yoksa, azure machine learning çalışma alanlarını yönetme makalesindeki adımları kullanarak bir tane oluşturun.
Çalışma alanında aşağıdaki izinlere sahip olduğunuzdan emin olun:
Toplu iş uç noktalarını ve dağıtımlarını oluşturma veya yönetme: İzin veren
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
bir Sahip, Katkıda Bulunan veya Özel rol kullanın.Çalışma alanı kaynak grubunda ARM dağıtımları oluşturma: Çalışma alanının dağıtıldığı kaynak grubunda izin veren
Microsoft.Resources/deployments/write
bir Sahip, Katkıda Bulunan veya Özel rol kullanın.
Azure Machine Learning ile çalışmak için aşağıdaki yazılımı yüklemeniz gerekir:
Azure CLI ve
ml
Azure Machine Learning uzantısı.az extension add -n ml
Not
Batch Uç Noktaları için işlem hattı bileşeni dağıtımları, Azure CLI uzantısının
ml
2.7 sürümünde kullanıma sunulmuştur. Son sürümünü almak için kullanınaz extension update --name ml
.
Çalışma alanınıza bağlanma
Çalışma alanı Azure Machine Learning'in en üst düzey kaynağıdır. Azure Machine Learning'i kullanırken oluşturduğunuz tüm yapıtlarla çalışmak için merkezi bir konum sağlar. Bu bölümde, dağıtım görevlerini gerçekleştirdiğiniz çalışma alanına bağlanacağız.
Abonelik kimliğiniz, çalışma alanınız, konumunuz ve kaynak grubunuzun değerlerini aşağıdaki kodda geçirin:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Toplu dağıtımlarla görüntü sınıflandırma
Bu örnekte, belirli bir görüntüyü ImageNet taksonomisine göre sınıflandırabilen bir derin öğrenme modeli dağıtmayı öğreneceğiz.
Uç noktayı oluşturma
İlk olarak, modeli barındıracak uç noktayı oluşturalım:
Uç noktanın adına karar verin:
ENDPOINT_NAME="imagenet-classifier-batch"
Aşağıdaki YAML dosyası bir toplu iş uç noktasını tanımlar:
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
Uç noktayı oluşturmak için aşağıdaki kodu çalıştırın.
az ml batch-endpoint create --file endpoint.yml --name $ENDPOINT_NAME
Modeli kaydetme
Model dağıtımları yalnızca kayıtlı modelleri dağıtabilir, bu nedenle kaydetmemiz gerekir. Dağıtmaya çalıştığınız model zaten kayıtlıysa bu adımı atlayabilirsiniz.
Modelin bir kopyası indirilir:
Modeli kaydedin:
Puanlama betiği oluşturma
Toplu dağıtım tarafından sağlanan görüntüleri okuyabilen ve modelin puanlarını döndürebilen bir puanlama betiği oluşturmamız gerekir. Aşağıdaki betik:
- içinde
tensorflow
modülünü kullanarakkeras
modeli yükleyen birinit
işlevi gösterir. - Toplu dağıtımın sağladığı her mini toplu iş için yürütülen bir
run
işlevi gösterir. - İşlev,
run
dosyanın bir kerede bir görüntüsünü okur - yöntemi,
run
görüntüleri model için beklenen boyutlara göre yeniden boyutlandırıyor. - yöntemi,
run
görüntüleri modelin beklediği aralık[0,1]
etki alanına yeniden ölçekler. - Tahminlerle ilişkili sınıfları ve olasılıkları döndürür.
kod/dosyaya göre puan/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)
İpucu
Görüntüler dağıtım tarafından mini toplu işlerle sağlansa da, bu puanlama betiği her seferinde bir görüntüyü işler. Bu, toplu işlemin tamamını yüklemeye ve bir kerede modele göndermeye çalışmak toplu iş yürütücüsunda yüksek bellek baskısına neden olabileceğinden (OOM exeptions) yaygın bir desendir. Ancak, bunu yapmanın puanlama görevinde yüksek aktarım hızına olanak sağladığı bazı durumlar vardır. Yüksek GPU kullanımı elde etmek istediğimiz bir GPU donanımı üzerinden toplu dağıtım örneği için bu durum söz konusudur. Bundan yararlanan bir puanlama betiği örneği için bkz . Yüksek aktarım hızı dağıtımları .
Not
Oluşturucu bir model (dosya oluşturan bir model) dağıtmaya çalışıyorsanız, birden çok dosya üreten modellerin dağıtımı bölümünde açıklandığı gibi puanlama betiğinin nasıl yazıldığını okuyun.
Dağıtımı oluşturma
Puanlama betiği oluşturulduktan sonra bunun için bir toplu dağıtım oluşturmanın zamanı geldi. Oluşturmak için aşağıdaki adımları izleyin:
Dağıtımı oluşturabildiğimiz bir işlem kümesi oluşturduğunuzdan emin olun. Bu örnekte adlı
gpu-cluster
bir işlem kümesi kullanacağız. Gerekli olmasa da, işlemeyi hızlandırmak için GPU'ları kullanırız.Dağıtımı hangi ortamda çalıştıracağımızı belirtmemiz gerekir. Bizim örneğimizde modelimiz üzerinde
TensorFlow
çalışır. Azure Machine Learning'de gerekli yazılımların yüklü olduğu bir ortam zaten vardır, bu nedenle bu ortamı yeniden kullanabiliriz. Bir dosyaya yalnızca birkaç bağımlılıkconda.yml
ekleyeceğiz.Şimdi dağıtımı oluşturalım.
Oluşturulan uç nokta altında yeni bir dağıtım oluşturmak için aşağıdakine benzer bir
YAML
yapılandırma oluşturun. Ek özellikler için tam toplu iş uç noktası YAML şemasını denetleyebilirsiniz.$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
Ardından, aşağıdaki komutla dağıtımı oluşturun:
az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-default
Bir uç noktanın içinde belirli bir dağıtımı çağırabilirsiniz ancak genellikle uç noktanın kendisini çağırmak ve hangi dağıtımın kullanılacağına uç noktanın karar vermesine izin vermek istersiniz. Bu tür bir dağıtım "varsayılan" dağıtım olarak adlandırılır. Bu, kullanıcının uç noktayı çağırmasıyla yapılan sözleşmeyi değiştirmeden varsayılan dağıtımı değiştirme ve dolayısıyla dağıtımı sunan modeli değiştirme olanağı sunar. Varsayılan dağıtımı güncelleştirmek için aşağıdaki yönergeyi kullanın:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Bu noktada toplu iş uç noktamız kullanılmaya hazırdır.
Dağıtımı test etme
Uç noktamızı test etmek için özgün ImageNet veri kümesindeki 1000 görüntüden oluşan bir örnek kullanacağız. Batch uç noktaları yalnızca bulutta bulunan ve Azure Machine Learning çalışma alanından erişilebilen verileri işleyebilir. Bu örnekte bunu bir Azure Machine Learning veri deposuna yükleyeceğiz. Özellikle puanlama için uç noktayı çağırmak için kullanılabilecek bir veri varlığı oluşturacağız. Ancak, toplu iş uç noktalarının birden çok konum türüne yerleştirilebilen verileri kabul ettiğini unutmayın.
şimdi ilişkili örnek verileri indirelim:
Şimdi yeni indirilen verilerden veri varlığını oluşturalım
içinde
YAML
bir veri varlığı tanımı oluşturun: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
Ardından veri varlığını oluşturun:
az ml data create -f imagenet-sample-unlabeled.yml
Veriler karşıya yüklendiğine ve kullanılmaya hazır olduğuna göre şimdi uç noktayı çağıralım:
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)
İpucu
Çağırma işleminde dağıtım adını göstermediğimize dikkat edin. Bunun nedeni uç noktanın işi otomatik olarak varsayılan dağıtıma yönlendirmesidir. Uç noktamızın yalnızca bir dağıtımı olduğundan, bu varsayılan dağıtımdır. bağımsız değişkenini/parametresini
deployment_name
belirterek belirli bir dağıtımı hedefleyebilirsiniz.Komut döndürüldüğü anda bir toplu iş başlatılır. İş bitene kadar işin durumunu izleyebilirsiniz:
Dağıtım tamamlandıktan sonra tahminleri indirebilirsiniz:
Çıkış tahminleri aşağıdaki gibi görünür. Okuyucunun kolaylık sağlaması için tahminlerin etiketlerle birleştirildiğine dikkat edin. Bunu başarma hakkında daha fazla bilgi edinmek için ilişkili not defterine bakın.
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
dosyası class Olasılık etiket n02088094_Afghan_hound. JPEG 161 0.994745 Afgan tazı n02088238_basset 162 0.999397 basset n02088364_beagle. JPEG 165 0.366914 bluetick n02088466_bloodhound. JPEG 164 0.926464 Bloodhound ... ... ... ...
Yüksek aktarım hızı dağıtımları
Daha önce de belirtildiği gibi, yeni oluşturduğumuz dağıtım, toplu dağıtım bir toplu iş sağlarken bile her seferinde bir görüntüyü işler. Çoğu durumda bu en iyi yaklaşımdır çünkü modellerin nasıl yürütülür ve olası bellek dışı sorunları önler. Ancak bazılarında, temel alınan donanımın kullanımını mümkün olduğunca doygun hale getirmek isteyebiliriz. Örneğin GPU'lar böyledir.
Bu gibi durumlarda, veri toplu işleminin tamamında çıkarım yapmak isteyebiliriz. Bu, görüntü kümesinin tamamını belleğe yükleyip doğrudan modele göndermek anlamına gelir. Aşağıdaki örnek, TensorFlow
toplu görüntüleri okumak ve hepsini bir kerede puanlar. Ayrıca işlem hattının tamamının kullanılmakta olan cihazda (CPU/GPU) gerçekleşmesi için tüm verileri ön işleme yapmak için ops kullanır TensorFlow
.
Uyarı
Bazı modellerin bellek tüketimi açısından girişlerin boyutuyla doğrusal olmayan bir ilişkisi vardır. Batch'i yeniden (bu örnekte olduğu gibi) veya bellek yetersiz özel durumlarını önlemek için toplu iş dağıtımı tarafından oluşturulan toplu işlemlerin boyutunu küçültün.
Puanlama betiği oluşturuluyor:
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"] )
İpucu
- Bu betiğin toplu iş dağıtımı tarafından gönderilen mini toplu işlemden bir tensor veri kümesi oluşturduğuna dikkat edin. Bu veri kümesi, işleviyle
decode_img
işlemi kullanılarakmap
model için beklenen tensorları almak üzere önceden işlenmiştir. - Veri kümesi yeniden toplu olarak oluşturulur (16) verileri modele gönderir. Belleğe yükleyebileceğiniz ve modele aynı anda ne kadar bilgi gönderebileceğinizi denetlemek için bu parametreyi kullanın. GPU üzerinde çalışıyorsanız, OOM özel durumu almadan hemen önce GPU'nun maksimum kullanımını elde etmek için bu parametreyi dikkatlice ayarlamanız gerekir.
- Tahminler hesaplandıktan sonra, tensor'lar olarak
numpy.ndarray
dönüştürülür.
- Bu betiğin toplu iş dağıtımı tarafından gönderilen mini toplu işlemden bir tensor veri kümesi oluşturduğuna dikkat edin. Bu veri kümesi, işleviyle
Şimdi dağıtımı oluşturalım.
Oluşturulan uç nokta altında yeni bir dağıtım oluşturmak için aşağıdakine benzer bir
YAML
yapılandırma oluşturun. Ek özellikler için tam toplu iş uç noktası YAML şemasını denetleyebilirsiniz.$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
Ardından, aşağıdaki komutla dağıtımı oluşturun:
az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
Bu yeni dağıtımı daha önce gösterilen örnek verilerle kullanabilirsiniz. Bu dağıtımı çağırmak için çağırma yönteminde dağıtımın adını belirtmeniz veya varsayılan dağıtım olarak ayarlamanız gerektiğini unutmayın.
Görüntüleri işleyen MLflow modelleriyle ilgili dikkat edilmesi gerekenler
Batch Uç Noktaları'ndaki MLflow modelleri, görüntülerin giriş verileri olarak okunmasını destekler. MLflow dağıtımları puanlama betiği gerektirmediğinden, bunları kullanırken aşağıdaki noktaları göz önünde bulundurun:
- Desteklenen görüntü dosyaları şunlardır:
.png
,.jpg
,.jpeg
,.tiff
ve.gif
.bmp
. - MLflow modelleri, giriş görüntüsünün boyutlarıyla eşleşecek bir
np.ndarray
giriş olarak almayı beklemelidir. Her toplu işlemde birden çok görüntü boyutunu desteklemek için, toplu iş yürütücüsü görüntü dosyası başına bir kez MLflow modelini çağırır. - MLflow modellerinin bir imza eklemesi kesinlikle önerilir ve bunu yaparlarsa türünde
TensorSpec
olmalıdır. Girişler, varsa tensor'un şekliyle eşleşecek şekilde yeniden şekillendirilir. Kullanılabilir imza yoksa, türünnp.uint8
tensorları çıkarılır. - İmza içeren ve görüntülerin değişken boyutunu işlemesi beklenen modeller için, bunu garanti eden bir imza ekleyin. Örneğin, aşağıdaki imza örneği 3 kanallı görüntü toplu işlemine izin verir.
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)
Jupyter not defteri imagenet-classifier-mlflow.ipynb içinde çalışan bir örnek bulabilirsiniz. Toplu dağıtımlarda MLflow modellerini kullanma hakkında daha fazla bilgi için bkz . Toplu dağıtımlarda MLflow modellerini kullanma.