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.
  • 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:

  1. Uç noktanın adını belirtin.

    ENDPOINT_NAME="imagenet-classifier-batch"
    
  2. 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.

  1. Modelin bir kopyasını indirin.

    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şturun.

  • yöntemi, init içindeki modülünü keras tensorflowkullanarak 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:

  1. Dağıtımı oluşturabileceğiniz bir işlem kümesi oluşturduğunuzdan emin olun. Bu örnekte adlı gpu-clusterbir işlem kümesi kullanın. Gerekli olmasa da GPU'ları kullanmak işlemeyi hızlandırır.

  2. 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.

    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. 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
    
  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 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.

  1. İlişkili örnek verileri indirin.

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip
    unzip imagenet-1000.zip -d data
    

    Not

    Yerel olarak yüklemediyseniz wget yükleyin veya .zip dosyasını almak için bir tarayıcı kullanın.

  2. İndirilen verilerden veri varlığını oluşturun.

    1. 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
      
    2. Veri varlığını oluşturun.

      az ml data create -f imagenet-sample-unlabeled.yml
      
  3. Veriler karşıya yüklenip kullanılmaya hazır olduğunda uç noktayı çağırın.

    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 yüklü değilse bkz . Jq'yi indirme.


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

  1. 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
    
  2. Dağıtım tamamlandıktan sonra tahminleri indirin.

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

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

  1. 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_imgişlemi kullanılarak map 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.ndarraydönüştürülür.
  2. Dağıtımı oluşturun.

    1. 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
    
    1. 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
    
  3. 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 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