Aracılığıyla paylaş


Toplu dağıtımlarda çıktıları özelleştirme

ŞUNLAR IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v2 (geçerli)Python SDK azure-ai-ml v2 (geçerli)

Bu kılavuzda özel çıkışlar ve dosyalar oluşturan dağıtımların nasıl oluşturulacağı açıklanmaktadır. Bazen toplu çıkarım işlerinden çıktı olarak yazılanlar üzerinde daha fazla denetime ihtiyacınız vardır. Bu durumlar aşağıdaki durumları içerir:

  • Tahminlerin çıkışta nasıl yazıldığından denetleyebilirsiniz. Örneğin, veriler tablosalsa tahmini özgün verilere eklemek istersiniz.
  • Tahminlerinizi toplu dağıtımlar tarafından desteklenen dosya biçiminden farklı bir dosya biçiminde yazmanız gerekir.
  • Modeliniz, çıktıyı tablo biçiminde yazabilen üretken bir modeldir. Örneğin, çıktı olarak görüntü üreten modeller.
  • Modeliniz tek bir dosya yerine birden çok tablosal dosya oluşturur. Örneğin, birden çok senaryo göz önünde bulundurularak tahmin gerçekleştiren modeller.

Toplu dağıtımlar, toplu dağıtım işinin çıkışına doğrudan yazmanıza izin vererek işlerin çıktısının denetimini almanıza olanak tanır. Bu öğreticide, toplu çıkarım gerçekleştirmek için modeli dağıtmayı ve tahminleri özgün giriş verilerine ekleyerek çıkışları parquet biçiminde yazmayı öğreneceksiniz.

Bu örnek hakkında

Bu örnekte toplu çıkarım gerçekleştirmek ve tahminlerinizin çıkışta nasıl yazılacağı özelleştirmek için modeli nasıl dağıtabileceğiniz gösterilmektedir. Model, UCI Kalp Hastalığı veri kümesini temel alır. Veritabanı 76 öznitelik içerir, ancak bu örnekte bunların 14'ünün alt kümesi kullanılır. Model, bir hastada kalp hastalığının varlığını tahmin etmeye çalışır. 0 'dan (iletişim durumu yok) 1'e (iletişim durumu) değerlenen tamsayıdır.

Model bir XGBBoost sınıflandırıcı kullanılarak eğitildi ve gerekli tüm ön işleme bir scikit-learn işlem hattı olarak paketlendi ve bu da modeli ham verilerden tahminlere giden uçtan uca bir işlem hattı haline getirdi.

Bu makaledeki örnek, 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 önce depoyu kopyalayın ve ardından dizinleri klasöre değiştirin:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Bu örnekteki dosyalar şunlardır:

cd endpoints/batch/deploy-models/custom-outputs-parquet

Jupyter not defterinde birlikte izleme

Bu örneği izlemek için kullanabileceğiniz bir Jupyter not defteri vardır. Kopyalanan depoda custom-output-batch.ipynb adlı not defterini açın.

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

Özel çıkışla toplu dağıtım oluşturma

Bu örnekte, toplu dağıtım işinin çıkış klasörüne doğrudan yazabilen bir dağıtım oluşturursunuz. Dağıtım, özel parquet dosyaları yazmak için bu özelliği kullanır.

Modeli kaydedin

Kayıtlı modelleri yalnızca toplu iş uç noktası kullanarak dağıtabilirsiniz. Bu durumda, depoda modelin yerel bir kopyası zaten vardır, bu nedenle modeli yalnızca çalışma alanında kayıt defterinde yayımlamanız gerekir. Dağıtmaya çalıştığınız model zaten kayıtlıysa bu adımı atlayabilirsiniz.

MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"

Puanlama betiği oluşturma

Toplu dağıtım tarafından sağlanan giriş verilerini okuyabilen ve modelin puanlarını döndürebilen bir puanlama betiği oluşturmanız gerekir. Ayrıca doğrudan işin çıkış klasörüne de yazacaksınız. Özetle, önerilen puanlama betiği aşağıdaki gibi yapar:

  1. Giriş verilerini CSV dosyaları olarak okur.
  2. Giriş verileri üzerinde bir MLflow modeli predict işlevi çalıştırır.
  3. Tahminleri giriş verileriyle birlikte öğesine pandas.DataFrame ekler.
  4. Verileri giriş dosyası olarak adlandırılan ancak biçiminde bir dosyaya parquet yazar.

kod/batch_driver.py

import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List


def init():
    global model
    global output_path

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # It is the path to the model folder
    # Please provide your model's folder name if there's one:
    output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
    model_path = os.environ["AZUREML_MODEL_DIR"]
    model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]

    with open(model_file, "rb") as file:
        model = pickle.load(file)


def run(mini_batch: List[str]):
    for file_path in mini_batch:
        data = pd.read_csv(file_path)
        pred = model.predict(data)

        data["prediction"] = pred

        output_file_name = Path(file_path).stem
        output_file_path = os.path.join(output_path, output_file_name + ".parquet")
        data.to_parquet(output_file_path)

    return mini_batch

Açıklamalar:

  • Ortam değişkeninin AZUREML_BI_OUTPUT_PATH dağıtım işinin çıkış yoluna erişmek için nasıl kullanıldığına dikkat edin.
  • işlevi, init() daha sonra nereye yazılması gerektiğini bilmek için kullanılabilecek adlı output_path bir genel değişkeni doldurur.
  • yöntemi, run işlenen dosyaların listesini döndürür. İşlevin bir list veya pandas.DataFrame nesnesi döndürmesi run gerekir.

Uyarı

Tüm toplu iş yürütücülerinin aynı anda bu yola yazma erişimi olduğunu dikkate alın. Bu, eşzamanlılığı hesaba eklemeniz gerektiği anlamına gelir. Bu durumda, çıkış klasörünün adı olarak giriş dosyası adını kullanarak her yürütücüsünün kendi dosyasını yazdığından emin olun.

Uç noktayı oluşturma

Şimdi modelin dağıtıldığı adlı bir toplu iş uç noktası heart-classifier-batch oluşturursunuz.

  1. Uç noktanın adına karar verin. Uç noktanın adı uç noktanızla ilişkili URI'de görünür, bu nedenle toplu uç nokta adlarının bir Azure bölgesinde benzersiz olması gerekir. Örneğin, içinde westus2adı mybatchendpoint olan tek bir toplu iş uç noktası olabilir.

    Bu durumda, uç noktanın adını bir değişkene yerleştirerek daha sonra kolayca başvurabilirsiniz.

    ENDPOINT_NAME="heart-classifier-custom"
    
  2. Toplu iş uç noktanızı yapılandırın.

    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: heart-classifier-batch
    description: A heart condition classifier for batch inference
    auth_mode: aad_token
    
  3. Uç noktayı oluşturun:

    az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    

Dağıtımı oluşturma

Önceki puanlama betiğini kullanarak dağıtım oluşturmak için sonraki adımları izleyin:

  1. İlk olarak, puanlama betiğinin yürütülebileceği bir ortam oluşturun:

    Azure Machine Learning CLI için ek adım gerekmez. Ortam tanımı dağıtım dosyasına eklenir.

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. Dağıtımı oluşturun. output_action Artık olarak ayarlandığına SUMMARY_ONLYdikkat edin.

    Not

    Bu örnekte adlı batch-clusterbir işlem kümeniz olduğu varsayılır. Bu adı uygun şekilde değiştirin.

    Oluşturulan uç nokta altında yeni bir dağıtım oluşturmak için aşağıdaki gibi bir YAML yapılandırması 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: heart-classifier-batch
    name: classifier-xgboost-custom
    description: A heart condition classifier based on XGBoost and Scikit-Learn pipelines that append predictions on parquet files.
    type: model
    model: azureml:heart-classifier-sklpipe@latest
    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: summary_only
      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.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Bu noktada toplu iş uç noktamız kullanılmaya hazırdır.

Dağıtımı test etme

Uç noktanızı test etmek için bu depoda bulunan ve modelle birlikte kullanılabilen etiketlenmemiş verilerin bir örneğini kullanın. 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üklersiniz. Puanlama için uç noktayı çağırmak için kullanılabilecek bir veri varlığı oluşturacaksınız. Ancak, toplu iş uç noktalarının birden çok konum türüne yerleştirilebilen verileri kabul ettiğini unutmayın.

  1. Depolama hesabından alınan verilerle uç noktayı çağırın:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
    

    Not

    Yardımcı program jq her yüklemede yüklü olmayabilir. GitHub'da yönergeler alabilirsiniz.

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

Çıkışları analiz etme

İş, oluşturulan tüm dosyaların yerleştirildiği adlı score adlandırılmış bir çıkış oluşturur. Dizine doğrudan, her giriş dosyası için bir dosya yazdığınızdan, aynı sayıda dosya olmasını bekleyebilirsiniz. Bu özel örnekte çıkış dosyalarını girişlerle aynı şekilde adlandırın, ancak bir parquet uzantısına sahiptirler.

Not

Çıkış klasörüne bir dosya predictions.csv de eklendiğini fark edin. Bu dosya, işlenen dosyaların özetini içerir.

İş adını kullanarak işin sonuçlarını indirebilirsiniz:

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

az ml job download --name $JOB_NAME --output-name score --download-path ./

Dosya indirildikten sonra, sık kullandığınız aracı kullanarak dosyayı açabilirsiniz. Aşağıdaki örnek, veri çerçevesini kullanarak Pandas tahminleri yükler.

import pandas as pd
import glob

output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score

Çıkış aşağıdaki gibi görünür:

yaş Seks ... Tufan Tahmin
63 1 ... Sabit 0
67 1 ... Normal 1
67 1 ... Tersinir 0
37 1 ... Normal 0

Kaynakları temizleme

Toplu iş uç noktasını ve temel alınan tüm dağıtımları silmek için aşağıdaki kodu çalıştırın. Toplu puanlama işleri silinmez.

az ml batch-endpoint delete --name $ENDPOINT_NAME --yes