Bagikan melalui


Menyesuaikan output dalam penyebaran batch

BERLAKU UNTUK:Ekstensi ml Azure CLI v2 (saat ini)Python SDK azure-ai-ml v2 (saat ini)

Panduan ini menjelaskan cara membuat penyebaran yang menghasilkan output dan file kustom. Terkadang Anda memerlukan kontrol lebih atas apa yang ditulis sebagai output dari pekerjaan inferensi batch. Kasus-kasus ini mencakup situasi berikut:

  • Anda perlu mengontrol bagaimana prediksi ditulis dalam output. Misalnya, Anda ingin menambahkan prediksi ke data asli jika data bersifat tabular.
  • Anda perlu menulis prediksi Anda dalam format file yang berbeda dari yang didukung out-of-the-box dengan penyebaran batch.
  • Model Anda adalah model generatif yang tidak dapat menulis output dalam format tabular. Misalnya, model yang menghasilkan gambar sebagai output.
  • Model Anda menghasilkan beberapa file tabular alih-alih satu file. Misalnya, model yang melakukan prakiraan dengan mempertimbangkan beberapa skenario.

Penyebaran batch memungkinkan Anda mengontrol output pekerjaan dengan memungkinkan Anda menulis langsung ke output pekerjaan penyebaran batch. Dalam tutorial ini, Anda mempelajari cara menyebarkan model untuk melakukan inferensi batch dan menulis output dalam format parket dengan menambahkan prediksi ke data input asli.

Tentang sampel ini

Contoh ini menunjukkan bagaimana Anda dapat menyebarkan model untuk melakukan inferensi batch dan menyesuaikan bagaimana prediksi Anda ditulis dalam output. Model ini didasarkan pada himpunan data Penyakit Jantung UCI. Database berisi 76 atribut, tetapi contoh ini menggunakan subset 14 di antaranya. Model ini mencoba memprediksi adanya penyakit jantung pada pasien. Bilangan bulat bernilai dari 0 (tanpa kehadiran) hingga 1 (kehadiran).

Model ini dilatih menggunakan pengklasifikasi XGBBoost dan semua pra-pemrosesan yang diperlukan dipaketkan sebagai scikit-learn alur, menjadikan model ini alur end-to-end yang beralih dari data mentah ke prediksi.

Contoh dalam artikel ini didasarkan pada sampel kode yang terkandung dalam repositori azureml-examples . Untuk menjalankan perintah secara lokal tanpa harus menyalin/menempelkan YAML dan file lainnya, pertama-tama kloning repositori lalu ubah direktori ke folder:

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

File untuk contoh ini ada di:

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

Ikuti di buku catatan Jupyter

Ada notebook Jupyter yang bisa Anda gunakan untuk mengikuti contoh ini. Di repositori kloning, buka buku catatan yang disebut custom-output-batch.ipynb.

Prasyarat

  • Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai. Coba versi gratis atau berbayar Azure Machine Learning.

  • Ruang kerja Azure Machine Learning. Untuk membuat ruang kerja, lihat Mengelola ruang kerja Azure Pembelajaran Mesin.

  • Pastikan Anda memiliki izin berikut di ruang kerja Pembelajaran Mesin:

    • Membuat atau mengelola titik akhir dan penyebaran batch: Gunakan peran Pemilik, Kontributor, atau Kustom yang memungkinkan Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.
    • Membuat penyebaran Azure Resource Manager di grup sumber daya ruang kerja: Gunakan peran Pemilik, Kontributor, atau Kustom yang memungkinkan Microsoft.Resources/deployments/write dalam grup sumber daya tempat ruang kerja disebarkan.
  • Instal perangkat lunak berikut untuk bekerja dengan Pembelajaran Mesin:

    Jalankan perintah berikut untuk menginstal Azure CLI dan ml ekstensi untuk Azure Pembelajaran Mesin:

    az extension add -n ml
    

    Penyebaran komponen alur untuk Titik Akhir Batch diperkenalkan dalam versi 2.7 ml ekstensi untuk Azure CLI. az extension update --name ml Gunakan perintah untuk mendapatkan versi terbaru.


Menyambungkan ke ruang kerja Anda

Ruang kerja adalah sumber daya tingkat atas untuk Pembelajaran Mesin. Ini menyediakan tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat Anda menggunakan Pembelajaran Mesin. Di bagian ini, Anda menyambungkan ke ruang kerja tempat Anda melakukan tugas penyebaran.

Dalam perintah berikut, masukkan nilai untuk ID langganan, ruang kerja, lokasi, dan grup sumber daya Anda:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Membuat penyebaran batch dengan output kustom

Dalam contoh ini, Anda membuat penyebaran yang dapat menulis langsung ke folder output dari pekerjaan penyebaran batch. Penyebaran menggunakan fitur ini untuk menulis file parket kustom.

Mendaftarkan model

Anda hanya dapat menyebarkan model terdaftar menggunakan titik akhir batch. Dalam hal ini, Anda sudah memiliki salinan lokal model di repositori, jadi Anda hanya perlu menerbitkan model ke registri di ruang kerja. Anda dapat melewati langkah ini jika model yang coba Anda sebarkan sudah terdaftar.

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

Membuat skrip penilaian

Anda perlu membuat skrip penilaian yang dapat membaca data input yang disediakan oleh penyebaran batch dan mengembalikan skor model. Anda juga akan menulis langsung ke folder output pekerjaan. Singkatnya, skrip penilaian yang diusulkan melakukan sebagai berikut:

  1. Membaca data input sebagai file CSV.
  2. Menjalankan fungsi model predict MLflow melalui data input.
  3. Menambahkan prediksi ke pandas.DataFrame bersama dengan data input.
  4. Menulis data dalam file bernama sebagai file input, tetapi dalam parquet format.

code/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

Keterangan:

  • Perhatikan bagaimana variabel AZUREML_BI_OUTPUT_PATH lingkungan digunakan untuk mendapatkan akses ke jalur output pekerjaan penyebaran.
  • Fungsi ini init() mengisi variabel global yang disebut output_path yang dapat digunakan nanti untuk mengetahui di mana harus menulis.
  • Metode mengembalikan run daftar file yang diproses. Fungsi diperlukan run untuk mengembalikan list objek atau pandas.DataFrame .

Peringatan

Mempertimbangkan bahwa semua pelaksana batch memiliki akses tulis ke jalur ini secara bersamaan. Ini berarti Bahwa Anda perlu memperhitungkan konkurensi. Dalam hal ini, pastikan bahwa setiap eksekutor menulis filenya sendiri dengan menggunakan nama file input sebagai nama folder output.

Membuat titik akhir

Anda sekarang membuat titik akhir batch bernama heart-classifier-batch tempat model disebarkan.

  1. Tentukan nama titik akhir. Nama titik akhir muncul di URI yang terkait dengan titik akhir Anda, sehingga nama titik akhir batch harus unik dalam wilayah Azure. Misalnya, hanya ada satu titik akhir batch dengan nama mybatchendpoint di westus2.

    Dalam hal ini, letakkan nama titik akhir dalam variabel sehingga Anda dapat dengan mudah mereferensikannya nanti.

    ENDPOINT_NAME="heart-classifier-custom"
    
  2. Konfigurasikan titik akhir batch Anda.

    File YAML berikut mendefinisikan titik akhir batch:

    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. Buat titik akhir:

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

Membuat penyebaran

Ikuti langkah-langkah berikutnya untuk membuat penyebaran menggunakan skrip penilaian sebelumnya:

  1. Pertama, buat lingkungan tempat skrip penilaian dapat dijalankan:

    Tidak ada langkah tambahan yang diperlukan untuk Azure Pembelajaran Mesin CLI. Definisi lingkungan disertakan dalam file penyebaran.

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. Buat penyebaran. Perhatikan bahwa output_action sekarang diatur ke SUMMARY_ONLY.

    Catatan

    Contoh ini mengasumsikan Anda memiliki kluster komputasi dengan nama batch-cluster. Ubah nama yang sesuai.

    Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat konfigurasi YAML seperti berikut ini. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.

    $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
    

    Kemudian, buat penyebaran dengan perintah berikut:

    az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Pada titik ini, titik akhir batch kami siap digunakan.

Menguji penyebarannya

Untuk menguji titik akhir Anda, gunakan sampel data tanpa label yang terletak di repositori ini, yang dapat digunakan dengan model. Titik akhir batch hanya dapat memproses data yang terletak di cloud dan dapat diakses dari ruang kerja Azure Pembelajaran Mesin. Dalam contoh ini, Anda mengunggahnya ke penyimpanan data Azure Pembelajaran Mesin. Anda akan membuat aset data yang dapat digunakan untuk memanggil titik akhir untuk penilaian. Namun, perhatikan bahwa titik akhir batch menerima data yang dapat ditempatkan di beberapa jenis lokasi.

  1. Panggil titik akhir dengan data dari akun penyimpanan:

    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)
    

    Catatan

    Utilitas jq mungkin tidak diinstal pada setiap penginstalan. Anda bisa mendapatkan instruksi tentang GitHub.

  2. Pekerjaan batch dimulai segera setelah perintah kembali. Anda dapat memantau status pekerjaan hingga selesai:

    az ml job show -n $JOB_NAME --web
    

Menganalisis output

Pekerjaan ini menghasilkan output bernama yang disebut score tempat semua file yang dihasilkan ditempatkan. Karena Anda menulis ke direktori secara langsung, satu file per setiap file input, maka Anda dapat mengharapkan untuk memiliki jumlah file yang sama. Dalam contoh khusus ini, beri nama file output sama dengan input, tetapi memiliki ekstensi parket.

Catatan

Perhatikan bahwa file predictions.csv juga disertakan dalam folder output. File ini berisi ringkasan file yang diproses.

Anda dapat mengunduh hasil pekerjaan dengan menggunakan nama pekerjaan:

Untuk mengunduh prediksi, gunakan perintah berikut:

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

Setelah file diunduh, Anda dapat membukanya menggunakan alat favorit Anda. Contoh berikut memuat prediksi menggunakan Pandas dataframe.

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

Outputnya terlihat sebagai berikut:

usia Jenis Kelamin ... thal prediction
63 1 ... Teratasi 0
67 1 ... normal 1
67 1 ... Reversibel 0
37 1 ... normal 0

Membersihkan sumber daya

Jalankan kode berikut untuk menghapus titik akhir batch dan semua penyebaran yang mendasarinya. Pekerjaan penilaian batch tidak dihapus.

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