Menyebarkan model MLflow dalam penyebaran batch
BERLAKU UNTUK:Ekstensi ml Azure CLI v2 (saat ini)Python SDK azure-ai-ml v2 (saat ini)
Dalam artikel ini, pelajari cara menyebarkan model MLflow ke Azure Pembelajaran Mesin untuk kedua inferensi batch menggunakan titik akhir batch. Saat menyebarkan model MLflow ke titik akhir batch, Azure Pembelajaran Mesin:
- Menyediakan gambar dasar MLflow/lingkungan yang dikumpulkan yang berisi dependensi yang diperlukan untuk menjalankan pekerjaan Azure Pembelajaran Mesin Batch.
- Membuat alur pekerjaan batch dengan skrip penilaian untuk Anda yang dapat digunakan untuk memproses data menggunakan paralelisasi.
Catatan
Untuk informasi selengkapnya tentang jenis file input yang didukung dan detail tentang cara kerja model MLflow, lihat Pertimbangan saat menyebarkan ke inferensi batch.
Tentang contoh ini
Contoh ini menunjukkan bagaimana Anda dapat menyebarkan model MLflow ke titik akhir batch untuk melakukan prediksi batch. Contoh ini menggunakan model MLflow berdasarkan Himpunan Data Penyakit Jantung UCI. Database berisi 76 atribut, tetapi kami 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 telah dilatih menggunakan pengklasifikasi XGBBoost
dan semua prapemrosedaan yang diperlukan telah 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/heart-classifier-mlflow
Ikuti di Jupyter Notebooks
Anda bisa mengikuti sampel ini di buku catatan berikut. Di repositori kloning, buka notebook: mlflow-for-batch-tabular.ipynb.
Prasyarat
Sebelum mengikuti langkah-langkah dalam artikel ini, pastikan Anda memiliki prasyarat berikut:
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. Jika Anda tidak memilikinya, gunakan langkah-langkah dalam artikel Mengelola ruang kerja Azure Pembelajaran Mesin untuk membuatnya.
Pastikan Anda memiliki izin berikut di ruang kerja:
Membuat atau mengelola titik akhir dan penyebaran batch: Gunakan peran Pemilik, Kontributor, atau Kustom yang memungkinkan
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
.Membuat penyebaran ARM 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.
Anda perlu menginstal perangkat lunak berikut untuk bekerja dengan Azure Pembelajaran Mesin:
Azure CLI dan
ml
ekstensi untuk Azure Pembelajaran Mesin.az extension add -n ml
Catatan
Penyebaran komponen alur untuk Titik Akhir Batch diperkenalkan dalam ekstensi versi 2.7
ml
untuk Azure CLI. Gunakanaz extension update --name ml
untuk mendapatkan versi terakhirnya.
Menyambungkan ke ruang kerja Anda
Ruang kerja adalah sumber daya tingkat teratas untuk Azure Machine Learning, menyediakan tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat Anda menggunakan Azure Machine Learning. Di bagian ini, kita akan menyambungkan ke ruang kerja tempat Anda akan melakukan tugas penyebaran.
Teruskan nilai untuk ID langganan, ruang kerja, lokasi, dan grup sumber daya Anda dalam kode berikut:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Langkah-langkah
Ikuti langkah-langkah ini untuk menyebarkan model MLflow ke titik akhir batch untuk menjalankan inferensi batch melalui data baru:
Titik Akhir Batch hanya dapat menyebarkan model terdaftar. Dalam hal ini, kita sudah memiliki salinan lokal model di repositori, jadi kita hanya perlu menerbitkan model ke registri di ruang kerja. Anda dapat melewati langkah ini jika model yang coba Anda sebarkan sudah terdaftar.
Sebelum bergerak maju, kita perlu memastikan penyebaran batch yang akan kita buat dapat berjalan pada beberapa infrastruktur (komputasi). Penyebaran batch dapat berjalan pada komputasi Azure Pembelajaran Mesin apa pun yang sudah ada di ruang kerja. Itu berarti bahwa beberapa penyebaran batch dapat berbagi infrastruktur komputasi yang sama. Dalam contoh ini, kita akan mengerjakan kluster komputasi Azure Pembelajaran Mesin yang disebut
cpu-cluster
. Mari kita verifikasi komputasi ada di ruang kerja atau membuatnya sebaliknya.Sekarang saatnya untuk membuat titik akhir dan penyebaran batch. Mari kita mulai dengan titik akhir terlebih dahulu. Titik akhir hanya memerlukan nama dan deskripsi untuk dibuat. Nama titik akhir akan berakhir di URI yang terkait dengan titik akhir Anda. Karena itu, nama titik akhir batch harus unik dalam wilayah Azure. Misalnya, hanya ada satu titik akhir batch dengan nama
mybatchendpoint
diwestus2
.Buat titik akhir:
Untuk membuat titik akhir baru, buat
YAML
konfigurasi seperti berikut ini: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
Kemudian, buat titik akhir dengan perintah berikut:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Sekarang, mari buat penyebaran. Model MLflow tidak mengharuskan Anda menunjukkan lingkungan atau skrip penilaian saat membuat penyebaran seperti yang dibuat untuk Anda. Namun, Anda dapat menentukannya jika Anda ingin menyesuaikan bagaimana penyebaran melakukan inferensi.
Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat
YAML
konfigurasi seperti berikut ini. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.deployment-simple/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-mlflow description: A heart condition classifier based on XGBoost type: model model: azureml:heart-classifier-mlflow@latest compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: append_row output_file_name: predictions.csv 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-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Penting
Konfigurasikan
timeout
dalam penyebaran Anda berdasarkan berapa lama waktu yang dibutuhkan model Anda untuk menjalankan inferensi pada satu batch. Semakin besar ukuran batch, semakin lama nilai ini harus. Remeber yangmini_batch_size
menunjukkan jumlah file dalam batch, bukan jumlah sampel. Saat bekerja dengan data tabular, setiap file mungkin berisi beberapa baris yang akan meningkatkan waktu yang diperlukan titik akhir batch untuk memproses setiap file. Gunakan nilai tinggi pada kasus tersebut untuk menghindari kesalahan waktu habis.Meskipun Anda dapat memanggil penyebaran tertentu di dalam titik akhir, Anda biasanya ingin memanggil titik akhir itu sendiri dan membiarkan titik akhir memutuskan penyebaran mana yang akan digunakan. Penyebaran tersebut diberi nama penyebaran "default". Ini memberi Anda kemungkinan mengubah penyebaran default dan karenanya mengubah model yang melayani penyebaran tanpa mengubah kontrak dengan pengguna yang memanggil titik akhir. Gunakan instruksi berikut untuk memperbarui penyebaran default:
Pada titik ini, titik akhir batch kami siap digunakan.
Menguji penyebaran
Untuk menguji titik akhir kami, kita akan menggunakan sampel data tanpa label yang terletak di repositori ini dan yang dapat digunakan dengan model. Titik akhir batch hanya dapat memproses data yang terletak di cloud dan yang dapat diakses dari ruang kerja Azure Pembelajaran Mesin. Dalam contoh ini, kita akan mengunggahnya ke penyimpanan data Azure Pembelajaran Mesin. Terutama, kita 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 berbagai lokasi.
Mari kita buat aset data terlebih dahulu. Aset data ini terdiri dari folder dengan beberapa file CSV yang ingin kita proses secara paralel menggunakan titik akhir batch. Anda dapat melewati langkah ini adalah data Anda sudah terdaftar sebagai aset data atau Anda ingin menggunakan jenis input yang berbeda.
a. Buat definisi aset data di
YAML
:heart-dataset-unlabeled.yml
$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json name: heart-dataset-unlabeled description: An unlabeled dataset for heart classification. type: uri_folder path: data
b. Buat aset data:
az ml data create -f heart-dataset-unlabeled.yml
Sekarang setelah data diunggah dan siap digunakan, mari kita panggil titik akhir:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
Catatan
Utilitas
jq
mungkin tidak diinstal pada setiap penginstalan. Anda bisa mendapatkan instruksi penginstalan di tautan ini.Tip
Perhatikan bagaimana kami tidak menunjukkan nama penyebaran dalam operasi pemanggilan. Itu karena titik akhir secara otomatis merutekan pekerjaan ke penyebaran default. Karena titik akhir kami hanya memiliki satu penyebaran, maka titik akhir tersebut adalah yang default. Anda dapat menargetkan penyebaran tertentu dengan menunjukkan argumen/parameter
deployment_name
.Pekerjaan batch dimulai segera setelah perintah kembali. Anda dapat memantau status pekerjaan hingga selesai:
Menganalisis output
Prediksi output dihasilkan dalam predictions.csv
file seperti yang ditunjukkan dalam konfigurasi penyebaran. Pekerjaan menghasilkan output bernama yang disebut score
tempat file ini ditempatkan. Hanya satu file yang dihasilkan per pekerjaan batch.
File disusun sebagai berikut:
Ada satu baris per setiap titik data yang dikirim ke model. Untuk data tabular, itu berarti bahwa file (
predictions.csv
) berisi satu baris untuk setiap baris yang ada di setiap file yang diproses. Untuk jenis data lainnya (misalnya gambar, audio, teks), ada satu baris per setiap file yang diproses.Kolom berikut berada dalam file (berurutan):
row
(opsional), indeks baris yang sesuai dalam file data input. Ini hanya berlaku jika data input bersifat tabular. Prediksi dikembalikan dalam urutan yang sama dengan yang muncul di file input sehingga Anda dapat mengandalkan nomor baris agar sesuai dengan prediksi yang sesuai.prediction
, prediksi yang terkait dengan data input. Nilai ini dikembalikan "apa adanya" yang disediakan oleh fungsi modelpredict().
.file_name
, nama file tempat data dibaca. Dalam data tabular, gunakan bidang ini untuk mengetahui prediksi mana yang termasuk dalam data input mana.
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
score = pd.read_csv(
"named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)
Outputnya terlihat sebagai berikut:
baris | prediction | file |
---|---|---|
0 | 0 | heart-unlabeled-0.csv |
1 | 1 | heart-unlabeled-0.csv |
2 | 0 | heart-unlabeled-0.csv |
... | ... | ... |
307 | 0 | heart-unlabeled-3.csv |
Tip
Perhatikan bahwa dalam contoh ini data input adalah data tabular dalam CSV
format dan ada 4 file input yang berbeda (heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv dan heart-unlabeled-3.csv).
Pertimbangan saat menyebarkan ke inferensi batch
Azure Pembelajaran Mesin mendukung penyebaran model MLflow ke titik akhir batch tanpa menunjukkan skrip penilaian. Ini mewakili cara mudah untuk menyebarkan model yang memerlukan pemrosesan data dalam jumlah besar secara batch. Azure Pembelajaran Mesin menggunakan informasi dalam spesifikasi model MLflow untuk mengatur proses inferensi.
Cara pekerjaan didistribusikan pada pekerja
Titik Akhir Batch mendistribusikan pekerjaan di tingkat file, untuk data terstruktur dan tidak terstruktur. Sebagai konsekuensinya, hanya file URI dan folder URI yang didukung untuk fitur ini. Setiap pekerja memproses batch file Mini batch size
pada satu waktu. Untuk data tabular, titik akhir batch tidak memperhitungkan jumlah baris di dalam setiap file saat mendistribusikan pekerjaan.
Peringatan
Struktur folder berlapis tidak dijelajahi selama inferensi. Jika Anda mempartisi data menggunakan folder, pastikan untuk meratakan struktur sebelumnya.
Penyebaran batch akan memanggil predict
fungsi model MLflow sekali per file. Untuk file CSV yang berisi beberapa baris, ini dapat memberlakukan tekanan memori dalam komputasi yang mendasar dan dapat meningkatkan waktu yang diperlukan model untuk mencetak satu file (khususnya untuk model mahal seperti model bahasa besar). Jika Anda menemukan beberapa pengecualian di luar memori atau entri waktu habis dalam log, pertimbangkan untuk memisahkan data dalam file yang lebih kecil dengan lebih sedikit baris atau menerapkan batching pada tingkat baris di dalam skrip model/penilaian.
Dukungan jenis file
Jenis data berikut didukung untuk inferensi batch saat menyebarkan model MLflow tanpa lingkungan dan skrip penilaian. Jika Anda ingin memproses jenis file yang berbeda, atau menjalankan inferensi dengan cara yang berbeda yang dilakukan titik akhir batch secara default, Anda selalu dapat membuat penyebaran dengan skrip penilaian seperti yang dijelaskan dalam Menggunakan model MLflow dengan skrip penilaian.
Ekstensi {i>file | Jenis yang dikembalikan sebagai input model | Persyaratan tanda tangan |
---|---|---|
.csv , , .parquet .pqt |
pd.DataFrame |
ColSpec . Jika tidak disediakan, penentuan jenis kolom tidak diberlakukan. |
.png , , .jpg .jpeg , .tiff , , .bmp ,.gif |
np.ndarray |
TensorSpec . Input dibentuk ulang agar sesuai dengan bentuk tensor jika tersedia. Jika tidak ada tanda tangan yang tersedia, tensor jenis np.uint8 disimpulkan. Untuk panduan tambahan, baca Pertimbangan untuk model MLflow yang memproses gambar. |
Peringatan
Perhatikan bahwa setiap file yang tidak didukung yang mungkin ada dalam data input akan membuat pekerjaan gagal. Anda akan melihat entri kesalahan sebagai berikut: "ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro'. Tipe file 'avro' tidak didukung.".
Penerapan tanda tangan untuk model MLflow
Jenis data input diberlakukan oleh pekerjaan penyebaran batch saat membaca data menggunakan tanda tangan model MLflow yang tersedia. Ini berarti bahwa input data Anda harus mematuhi jenis yang ditunjukkan dalam tanda tangan model. Jika data tidak dapat diurai seperti yang diharapkan, pekerjaan akan gagal dengan pesan kesalahan yang mirip dengan yang berikut: "ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.csv'. Pengecualian: literal tidak valid untuk int() dengan basis 10: 'value'".
Tip
Tanda tangan dalam model MLflow bersifat opsional tetapi sangat didorong karena memberikan cara mudah untuk mendeteksi masalah kompatibilitas data secara dini. Untuk informasi selengkapnya tentang cara mencatat model dengan tanda tangan, baca Model pengelogan dengan tanda tangan, lingkungan, atau sampel kustom.
Anda dapat memeriksa tanda tangan model model Anda dengan membuka file yang MLmodel
terkait dengan model MLflow Anda. Untuk detail selengkapnya tentang cara kerja tanda tangan di MLflow lihat Tanda Tangan di MLflow.
Dukungan flavor
Penyebaran batch hanya mendukung penyebaran model MLflow dengan pyfunc
rasa. Jika Anda perlu menyebarkan rasa yang berbeda, lihat Menggunakan model MLflow dengan skrip penilaian.
Menyesuaikan penyebaran model MLflow dengan skrip penilaian
Model MLflow dapat disebarkan ke titik akhir batch tanpa menunjukkan skrip penilaian dalam definisi penyebaran. Namun, Anda dapat ikut serta untuk menunjukkan file ini (biasanya disebut sebagai driver batch) untuk menyesuaikan bagaimana inferensi dijalankan.
Anda biasanya akan memilih alur kerja ini saat:
- Anda perlu memproses jenis file yang tidak didukung oleh penyebaran batch penyebaran MLflow.
- Anda perlu menyesuaikan cara model dijalankan, misalnya, menggunakan rasa tertentu untuk memuatnya dengan
mlflow.<flavor>.load()
. - Anda perlu melakukan pemrosesan pra/pos dalam rutinitas penilaian Anda ketika tidak dilakukan oleh model itu sendiri.
- Output model tidak dapat diwakili dengan baik dalam data tabular. Misalnya, ini adalah tensor yang mewakili gambar.
- Model Anda tidak dapat memproses setiap file sekaligus karena kendala memori dan perlu membacanya dalam gugus.
Penting
Jika Anda memilih untuk menunjukkan skrip penilaian untuk penyebaran model MLflow, Anda juga harus menentukan lingkungan tempat penyebaran akan berjalan.
Langkah-langkah
Gunakan langkah-langkah berikut untuk menyebarkan model MLflow dengan skrip penilaian kustom.
Identifikasi folder tempat model MLflow Anda ditempatkan.
a. Buka portal Azure Pembelajaran Mesin.
b. Buka bagian Model.
c. Pilih model yang ingin Anda sebarkan dan klik pada tab Artefak.
d. Catat folder yang ditampilkan. Folder ini ditunjukkan ketika model terdaftar.
Buat skrip penilaian. Perhatikan bagaimana nama
model
folder yang Anda identifikasi sebelumnya telah disertakaninit()
dalam fungsi .deployment-custom/code/batch_driver.py
# Copyright (c) Microsoft. All rights reserved. # Licensed under the MIT license. import os import glob import mlflow import pandas as pd import logging def init(): global model global model_input_types global model_output_names # 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 model_path = glob.glob(os.environ["AZUREML_MODEL_DIR"] + "/*/")[0] # Load the model, it's input types and output names model = mlflow.pyfunc.load(model_path) if model.metadata and model.metadata.signature: if model.metadata.signature.inputs: model_input_types = dict( zip( model.metadata.signature.inputs.input_names(), model.metadata.signature.inputs.pandas_types(), ) ) if model.metadata.signature.outputs: if model.metadata.signature.outputs.has_input_names(): model_output_names = model.metadata.signature.outputs.input_names() elif len(model.metadata.signature.outputs.input_names()) == 1: model_output_names = ["prediction"] else: logging.warning( "Model doesn't contain a signature. Input data types won't be enforced." ) def run(mini_batch): print(f"run method start: {__file__}, run({len(mini_batch)} files)") data = pd.concat( map( lambda fp: pd.read_csv(fp).assign(filename=os.path.basename(fp)), mini_batch ) ) if model_input_types: data = data.astype(model_input_types) # Predict over the input data, minus the column filename which is not part of the model. pred = model.predict(data.drop("filename", axis=1)) if pred is not pd.DataFrame: if not model_output_names: model_output_names = ["pred_col" + str(i) for i in range(pred.shape[1])] pred = pd.DataFrame(pred, columns=model_output_names) return pd.concat([data, pred], axis=1)
Mari kita buat lingkungan tempat skrip penilaian dapat dijalankan. Karena model kami adalah MLflow, persyaratan conda juga ditentukan dalam paket model (untuk detail selengkapnya tentang model MLflow dan file yang disertakan di dalamnya lihat Format MLmodel). Kita kemudian akan membangun lingkungan menggunakan dependensi conda dari file. Namun, kita juga perlu menyertakan paket
azureml-core
yang diperlukan untuk Penyebaran Batch.Tip
Jika model Anda sudah terdaftar di registri > model, Anda dapat mengunduh/menyalin file yang
conda.yml
terkait dengan model Anda dengan membuka Model studio> Azure Pembelajaran Mesin Pilih model Anda dari daftar > Artefak. Buka folder akar di navigasi dan pilih file yangconda.yml
tercantum. Klik Unduh atau salin kontennya.Penting
Contoh ini menggunakan lingkungan conda yang ditentukan di
/heart-classifier-mlflow/environment/conda.yaml
. File ini dibuat dengan menggabungkan file dependensi conda MLflow asli dan menambahkan paketazureml-core
. Anda tidak dapat menggunakanconda.yml
file dari model secara langsung.Definisi lingkungan akan disertakan dalam definisi penyebaran itu sendiri sebagai lingkungan anonim. Anda akan melihat di baris berikut dalam penyebaran:
environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml
Konfigurasikan penyebaran:
Untuk membuat penyebaran baru di bawah titik akhir yang dibuat, buat
YAML
konfigurasi seperti berikut ini. Anda dapat memeriksa skema YAML titik akhir batch lengkap untuk properti tambahan.deployment-custom/deployment.yml
$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 type: model model: azureml:heart-classifier-mlflow@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: append_row output_file_name: predictions.csv retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Mari kita buat penyebaran sekarang:
Pada titik ini, titik akhir batch kami siap digunakan.
Membersihkan sumber daya
Jalankan kode berikut untuk menghapus titik akhir batch dan semua penyebaran yang mendasarinya. Pekerjaan penilaian batch tidak akan dihapus.
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes