Aracılığıyla paylaş


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 mlAzure 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ın az 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.

  1. Modelin bir kopyası indirilir:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip
    unzip model.zip -d .
    
  2. Modeli kaydedin:

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

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 tensorflowmodülünü kullanarak keras modeli yükleyen bir init 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:

  1. Dağıtımı oluşturabildiğimiz bir işlem kümesi oluşturduğunuzdan emin olun. Bu örnekte adlı gpu-clusterbir işlem kümesi kullanacağız. Gerekli olmasa da, işlemeyi hızlandırmak için GPU'ları kullanırız.

  2. 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ık conda.yml ekleyeceğiz.

    Ortam tanımı dağıtım dosyasına eklenir.

    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
    
  3. Ş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
    
  4. 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
    
  5. 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.

  1. şimdi ilişkili örnek verileri indirelim:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip
    unzip imagenet-1000.zip -d data
    
  2. Şimdi yeni indirilen verilerden veri varlığını oluşturalım

    içinde YAMLbir 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
    
  3. 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)
    

    Not

    Yardımcı program jq her yüklemede yüklü olmayabilir. Bu bağlantıda yönergeler alabilirsiniz.

    İ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_namebelirterek belirli bir dağıtımı hedefleyebilirsiniz.

  4. Komut döndürüldüğü anda bir toplu iş başlatılır. İş bitene kadar işin durumunu izleyebilirsiniz:

    az ml job show -n $JOB_NAME --web
    
  5. Dağıtım tamamlandıktan sonra tahminleri indirebilirsiniz:

    Tahminleri indirmek için aşağıdaki komutu kullanın:

    az ml job download --name $JOB_NAME --output-name score --download-path ./
    
  6. Çı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.

  1. 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_imgişlemi kullanılarak map 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.ndarraydönüştürülür.
  2. Ş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
    
  3. 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, .tiffve .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 TensorSpecolmalıdır. Girişler, varsa tensor'un şekliyle eşleşecek şekilde yeniden şekillendirilir. Kullanılabilir imza yoksa, türün np.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.

Sonraki adımlar