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)
Tablosal verileri işlemek için toplu iş modeli dağıtımlarını, ancak görüntüler gibi diğer dosya türlerini de kullanabilirsiniz. Bu dağıtımlar hem MLflow hem de özel modellerde desteklenir. Bu makalede, görüntüleri ImageNet taksonomisine göre sınıflandırmak için bir model dağıtmayı öğreneceksiniz.
Önkoşullar
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ı. Çalışma alanı oluşturmak için bkz . Azure Machine Learning çalışma alanlarını yönetme.
Machine Learning ç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 Azure Resource Manager 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.
- Toplu iş uç noktalarını ve dağıtımlarını oluşturma veya yönetme: İzin veren
Machine Learning ile çalışmak için aşağıdaki yazılımı yükleyin:
Azure CLI'yi ve Azure Machine Learning uzantısını
ml
yüklemek için aşağıdaki komutu çalıştırın:az extension add -n ml
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.az extension update --name ml
En son sürümü almak için komutunu kullanın.
Çalışma alanınıza bağlanma
Çalışma alanı Machine Learning için en üst düzey kaynaktır. Machine Learning'i kullanırken oluşturduğunuz tüm yapıtlarla çalışmak için merkezi bir yer sağlar. Bu bölümde, dağıtım görevlerinizi gerçekleştirdiğiniz çalışma alanına bağlanacaksınız.
Aşağıdaki komutta abonelik kimliğiniz, çalışma alanınız, konumunuz ve kaynak grubunuzun değerlerini girin:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Bu örnek hakkında
Bu makalede, RestNet mimarisiyle birlikte TensorFlow kullanılarak oluşturulmuş bir model kullanılır. Daha fazla bilgi için bkz . Derin Artık Ağlarda Kimlik Eşlemeleri. Bu modelin bir örneğini indirebilirsiniz. Model aşağıdaki kısıtlamalara 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. Python için SDK kullanıyorsanız Azure CLI veya sdk/python/endpoints/batch/deploy-models/imagenet-classifier 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.
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ı öğreneceksiniz.
Uç noktayı oluşturma
Modeli barındıran uç noktayı oluşturun:
Uç noktanın adını belirtin.
ENDPOINT_NAME="imagenet-classifier-batch"
endpoint.yml adlı toplu iş uç noktasını tanımlamak için aşağıdaki YAML dosyasını oluşturun:
$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 kaydedin
Model dağıtımları yalnızca kayıtlı modelleri dağıtabilir. Modeli kaydetmeniz gerekir. Dağıtmaya çalıştığınız model zaten kayıtlıysa bu adımı atlayabilirsiniz.
Modelin bir kopyasını indirin.
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şturun.
- yöntemi,
init
içindeki modülünükeras
tensorflow
kullanarak modeli yükler. - yöntemi,
run
toplu iş dağıtımının sağladığı her mini toplu iş için çalışır. - yöntemi,
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. - Betik, tahminlerle ilişkili sınıfları ve olasılıkları döndürür.
Bu kod, kod/dosyaya göre puan/batch_driver.py dosyasıdır:
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. Toplu işlemin tamamını yükleyip bir kerede modele göndermeye çalışmak toplu iş yürütücüsü üzerinde yüksek bellek baskısına neden olabileceğinden bu yaygın bir desendir (OOM özel durumları).
Bunu yaptığınızda puanlama görevinde yüksek aktarım hızının etkinleştirildiği bazı durumlar vardır. Yüksek GPU kullanımı elde etmek istediğiniz GPU donanımı üzerinden toplu dağıtımlar için bu durum söz konusudur. Bu yaklaşımdan yararlanan bir puanlama betiği için bkz . Yüksek aktarım hızı dağıtımları.
Not
Dosya oluşturan bir oluşturucu model dağıtmak istiyorsanız puanlama betiği yazmayı öğrenin: Toplu dağıtımlarda çıktıları özelleştirme.
Dağıtımı oluşturma
Puanlama betiğini oluşturduktan sonra, bunun için bir toplu dağıtım oluşturun. Aşağıdaki yordamı kullanın:
Dağıtımı oluşturabileceğiniz bir işlem kümesi oluşturduğunuzdan emin olun. Bu örnekte adlı
gpu-cluster
bir işlem kümesi kullanın. Gerekli olmasa da GPU'ları kullanmak işlemeyi hızlandırır.Dağıtımın çalıştırıldığı ortamı belirtin. Bu örnekte model ü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 kullanabilirsiniz. conda.yml dosyasına birkaç bağımlılık eklemeniz gerekir.Dağıtımı oluşturun.
Oluşturulan uç nokta altında yeni bir dağıtım oluşturmak için aşağıdaki örneğe benzer bir
YAML
yapılandırma oluşturun. Diğer özellikler için tam toplu iş uç noktası YAML şemasına bakın.$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
Dağıtımı aşağıdaki komutla 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 dağıtım, varsayılan dağıtım olarak adlandırılır.
Bu yaklaşım, kullanıcının uç noktayı çağırmasıyla yapılan sözleşmeyi değiştirmeden varsayılan dağıtımı değiştirmenize ve dağıtıma hizmet eden modeli değiştirmenize olanak tanır. Varsayılan dağıtımı güncelleştirmek için aşağıdaki kodu kullanın:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Toplu iş uç noktanız kullanılmaya hazır.
Dağıtımı test etme
Uç noktayı test için özgün ImageNet veri kümesindeki 1.000 görüntüden oluşan bir örnek kullanın. Batch uç noktaları yalnızca bulutta bulunan ve Azure Machine Learning çalışma alanından erişilebilen verileri işleyebilir. Azure Machine Learning veri deposuna yükleyin. Puanlama için uç noktayı çağırmak için kullanılabilecek bir veri varlığı oluşturun.
Not
Batch uç noktaları, birden çok konum türüne yerleştirilebilen verileri kabul eder.
İlişkili örnek verileri indirin.
İndirilen verilerden veri varlığını oluşturun.
imagenet-sample-unlabeled.yml adlı bir
YAML
dosyada veri varlığı tanımı oluşturun:$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
Veri varlığını oluşturun.
az ml data create -f imagenet-sample-unlabeled.yml
Veriler karşıya yüklenip kullanılmaya hazır olduğunda uç noktayı çağırın.
İpucu
Çağırma işleminde dağıtım adını belirtemezsiniz. Bunun nedeni uç noktanın işi otomatik olarak varsayılan dağıtıma yönlendirmesidir. Uç nokta yalnızca bir dağıtıma sahip olduğundan, bu varsayılandı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 indirin.
Tahminler aşağıdaki çıkışa benzer. Tahminler, okuyucunun kolaylık sağlaması için etiketlerle birleştirilir. Bu etkiyi elde etme 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ısı 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 belirtildiği gibi, toplu dağıtım bir toplu iş sağladığında bile dağıtım her seferinde bir görüntüyü işler. Çoğu durumda bu yaklaşım en iyisidir. Modellerin çalışma şeklini basitleştirir ve olası bellek dışı sorunları önler. Ancak, diğer bazı durumlarda, temel alınan donanımı mümkün olduğunca doyurmak isteyebilirsiniz. Bu durum, örneğin GPU'lar söz konusudur.
Bu gibi durumlarda, veri toplu işleminin tamamında çıkarım yapmak isteyebilirsiniz. Bu yaklaşım, 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 tüm veri ön işleme işlemlerini yapmak için ops kullanır TensorFlow
. İşlem hattının tamamı kullanılmakta olan aynı cihazda (CPU/GPU) gerçekleşir.
Uyarı
Bazı modellerin bellek tüketimi açısından girişlerin boyutuyla doğrusal olmayan bir ilişkisi vardır. Yetersiz bellek özel durumlarını önlemek için yeniden toplu iş yapın (bu örnekte olduğu gibi) veya toplu iş dağıtımı tarafından oluşturulan toplu işlemlerin boyutunu azaltın.
Puanlama betiği kodunu/score-by-batch/batch_driver.py oluşturun:
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"] )
- Bu betik, toplu iş dağıtımı tarafından gönderilen mini toplu işlemden bir tensor veri kümesi oluşturur. 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, verileri modele göndermek için yeniden toplu olarak (16) oluşturulur. 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 betik, toplu iş dağıtımı tarafından gönderilen mini toplu işlemden bir tensor veri kümesi oluşturur. Bu veri kümesi, işleviyle
Dağıtımı oluşturun.
- Oluşturulan uç nokta altında yeni bir dağıtım oluşturmak için aşağıdaki örneğe benzer bir
YAML
yapılandırma oluşturun. Diğer özellikler için tam toplu iş uç noktası YAML şemasına bakın.
$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
- Dağıtımı aşağıdaki komutla oluşturun:
az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
- Oluşturulan uç nokta altında yeni bir dağıtım oluşturmak için aşağıdaki örneğe benzer bir
Bu yeni dağıtımı daha önce gösterilen örnek verilerle kullanabilirsiniz. Bu dağıtımı çağırmak için çağrı yöntemindeki dağıtımın adını veya varsayılan dağıtım olarak ayarlamayı 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, .bmp ve .gif.
- MLflow modelleri, giriş görüntüsünün boyutlarıyla eşleşen bir
np.ndarray
giriş olarak almayı beklemelidir. Toplu iş yürütücüsü, her toplu işlemde birden çok görüntü boyutunu desteklemek için MLflow modelini görüntü dosyası başına bir kez çağırır. - MLflow modellerinin imza eklemesi kesinlikle önerilir. 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.