Menyebarkan model MLflow ke titik akhir online
BERLAKU UNTUK: Ekstensi ml Azure CLI v2 (saat ini)
Dalam artikel ini, pelajari cara menyebarkan model MLflow ke titik akhir online untuk inferensi real-time. Saat menyebarkan model MLflow ke titik akhir online, Anda tidak perlu menentukan skrip penilaian atau lingkungan—fungsi ini dikenal sebagai penyebaran tanpa kode.
Untuk penyebaran tanpa kode, Azure Pembelajaran Mesin:
- Menginstal paket Python secara dinamis yang disediakan dalam
conda.yaml
file. Oleh karena itu, dependensi diinstal selama runtime kontainer. - Menyediakan gambar dasar MLflow/lingkungan yang dikumpulkan yang berisi item berikut:
azureml-inference-server-http
mlflow-skinny
- Skrip penilaian untuk inferensi.
Tip
Ruang kerja tanpa akses jaringan publik: Sebelum Anda dapat menyebarkan model MLflow ke titik akhir online tanpa konektivitas keluar, Anda harus mengemas model (pratinjau). Dengan menggunakan kemasan model, Anda dapat menghindari kebutuhan akan koneksi internet, yang diwajibkan azure Pembelajaran Mesin untuk menginstal paket Python yang diperlukan secara dinamis untuk model MLflow.
Tentang contoh
Contoh menunjukkan bagaimana Anda dapat menyebarkan model MLflow ke titik akhir online untuk melakukan prediksi. Contoh menggunakan model MLflow yang didasarkan pada himpunan data Diabetes. Himpunan data ini berisi 10 variabel dasar: usia, jenis kelamin, indeks massa tubuh, tekanan darah rata-rata, dan enam pengukuran serum darah yang diperoleh dari 442 pasien diabetes. Ini juga berisi respons minat, ukuran kuantitatif perkembangan penyakit satu tahun setelah garis besar.
Model ini dilatih menggunakan scikit-learn
regresi, dan semua praproses yang diperlukan telah dipaketkan sebagai alur, menjadikan model ini alur end-to-end yang beralih dari data mentah ke prediksi.
Informasi 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, kloning repositori, lalu ubah direktori menjadi cli
, jika Anda menggunakan Azure CLI. Jika Anda menggunakan Azure Pembelajaran Mesin SDK untuk Python, ubah direktori menjadi sdk/python/endpoints/online/mlflow
.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Ikuti di Jupyter Notebook
Anda dapat mengikuti langkah-langkah untuk menggunakan Azure Pembelajaran Mesin Python SDK dengan membuka buku catatan Sebarkan model MLflow ke titik akhir online di repositori kloning.
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.
Kontrol akses berbasis peran Azure (Azure RBAC) digunakan untuk memberikan akses ke operasi di Azure Machine Learning. Untuk melakukan langkah-langkah dalam artikel ini, akun pengguna Anda harus diberi peran pemilik atau kontributor untuk ruang kerja Azure Pembelajaran Mesin, atau peran kustom yang memungkinkan
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
. Untuk informasi selengkapnya tentang peran, lihat Mengelola akses ke ruang kerja Azure Pembelajaran Mesin.Anda harus memiliki model MLflow yang terdaftar di ruang kerja Anda. Artikel ini mendaftarkan model yang dilatih untuk himpunan data Diabetes di ruang kerja.
Selain itu, Anda perlu:
- Instal Azure CLI dan
ml
ekstensi ke Azure CLI. Untuk informasi selengkapnya tentang menginstal CLI, lihat Menginstal dan menyiapkan CLI (v2).
- Instal Azure CLI dan
Menyambungkan ke ruang kerja Anda
Pertama, sambungkan ke ruang kerja Azure Pembelajaran Mesin tempat Anda akan bekerja.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Mendaftarkan model
Anda hanya dapat menyebarkan model terdaftar ke titik akhir online. 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='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
Bagaimana jika model Anda dicatat di dalam eksekusi?
Jika model Anda dicatat di dalam eksekusi, Anda dapat mendaftarkannya secara langsung.
Untuk mendaftarkan model, Anda perlu mengetahui lokasi penyimpanannya. Jika Anda menggunakan fitur MLflow autolog
, jalur ke model bergantung pada jenis model dan kerangka kerja. Anda harus memeriksa output pekerjaan untuk mengidentifikasi nama folder model. Folder ini berisi file bernama MLModel
.
Jika Anda menggunakan log_model
metode untuk mencatat model Anda secara manual, teruskan jalur ke model sebagai argumen ke metode . Misalnya, jika Anda mencatat model, menggunakan mlflow.sklearn.log_model(my_model, "classifier")
, maka jalur tempat model disimpan disebut classifier
.
Gunakan Azure Pembelajaran Mesin CLI v2 untuk membuat model dari output pekerjaan pelatihan. Dalam contoh berikut, model bernama $MODEL_NAME
terdaftar menggunakan artefak pekerjaan dengan ID $RUN_ID
. Jalur tempat model disimpan adalah $MODEL_PATH
.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Catatan
Jalur $MODEL_PATH
adalah lokasi di mana model telah disimpan dalam eksekusi.
Menyebarkan model MLflow ke titik akhir online
Konfigurasikan titik akhir tempat model akan disebarkan. Contoh berikut mengonfigurasi nama dan mode autentikasi titik akhir:
Atur nama titik akhir dengan menjalankan perintah berikut (ganti
YOUR_ENDPOINT_NAME
dengan nama unik):export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Konfigurasikan titik akhir:
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
Buat titik akhir:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
Konfigurasikan penyebaran. Penyebaran adalah kumpulan sumber daya yang diperlukan untuk menghosting model yang melakukan inferensi aktual.
sklearn-deployment.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-deployment endpoint_name: my-endpoint model: name: mir-sample-sklearn-ncd-model version: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Catatan
Pembuatan otomatis dan
scoring_script
environment
hanya didukung untukpyfunc
ragam model. Untuk menggunakan ragam model yang berbeda, lihat Menyesuaikan penyebaran model MLflow.Buat penyebaran:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Jika titik akhir Anda tidak memiliki konektivitas keluar, gunakan kemasan model (pratinjau) dengan menyertakan bendera
--with-package
:az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Tetapkan semua lalu lintas ke penyebaran. Sejauh ini, titik akhir memiliki satu penyebaran, tetapi tidak ada lalu lintas yang ditetapkan untuk itu.
Langkah ini tidak diperlukan di Azure CLI, karena Anda menggunakan
--all-traffic
bendera selama pembuatan. Jika Anda perlu mengubah lalu lintas, Anda dapat menggunakan perintahaz ml online-endpoint update --traffic
. Untuk informasi selengkapnya tentang cara memperbarui lalu lintas, lihat Memperbarui lalu lintas secara progresif.Perbarui konfigurasi titik akhir:
Langkah ini tidak diperlukan di Azure CLI, karena Anda menggunakan
--all-traffic
bendera selama pembuatan. Jika Anda perlu mengubah lalu lintas, Anda dapat menggunakan perintahaz ml online-endpoint update --traffic
. Untuk informasi selengkapnya tentang cara memperbarui lalu lintas, lihat Memperbarui lalu lintas secara progresif.
Memanggil titik akhir
Setelah penyebaran siap, Anda dapat menggunakannya untuk melayani permintaan. Salah satu cara untuk menguji penyebaran adalah dengan menggunakan kemampuan pemanggilan bawaan dalam klien penyebaran yang Anda gunakan. JSON berikut adalah permintaan sampel untuk penyebaran.
sample-request-sklearn.json
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
Catatan
input_data
digunakan dalam contoh ini, alih-alih digunakan dalam penyajian inputs
MLflow. Ini karena Azure Pembelajaran Mesin memerlukan format input yang berbeda untuk dapat secara otomatis menghasilkan kontrak swagger untuk titik akhir. Untuk informasi selengkapnya tentang format input yang diharapkan, lihat Perbedaan antara model yang disebarkan di Azure Pembelajaran Mesin dan server bawaan MLflow.
Kirim permintaan ke titik akhir sebagai berikut:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Responsnya mirip dengan teks berikut:
[
11633.100167144921,
8522.117402884991
]
Penting
Untuk penyebaran tanpa kode MLflow, pengujian melalui titik akhir lokal saat ini tidak didukung.
Menyesuaikan penyebaran model MLflow
Anda tidak perlu menentukan skrip penilaian dalam definisi penyebaran model MLflow ke titik akhir online. Namun, Anda dapat memilih untuk melakukannya dan menyesuaikan bagaimana inferensi dijalankan.
Anda biasanya ingin menyesuaikan penyebaran model MLflow Anda saat:
- Model tidak memiliki
PyFunc
rasa di atasnya. - Anda perlu menyesuaikan cara model dijalankan, misalnya, untuk menggunakan rasa tertentu untuk memuat model, menggunakan
mlflow.<flavor>.load_model()
. - Anda perlu melakukan pemrosesan pra/pasca 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.
Penting
Jika Anda memilih untuk menentukan skrip penilaian untuk penyebaran model MLflow, Anda juga harus menentukan lingkungan tempat penyebaran akan berjalan.
Langkah-langkah
Untuk menyebarkan model MLflow dengan skrip penilaian kustom:
Identifikasi folder tempat model MLflow Anda berada.
a. Buka studio Azure Machine Learning.
b. Buka bagian Model .
c. Pilih model yang ingin Anda sebarkan dan buka tab Artefaknya.
d. Catat folder yang ditampilkan. Folder ini ditentukan ketika model didaftarkan.
Buat skrip penilaian. Perhatikan bagaimana nama
model
folder yang sebelumnya Anda identifikasi disertakan dalaminit()
fungsi .Tip
Skrip penilaian berikut disediakan sebagai contoh tentang cara melakukan inferensi dengan model MLflow. Anda dapat menyesuaikan skrip ini dengan kebutuhan Anda atau mengubah salah satu bagiannya untuk mencerminkan skenario Anda.
score.py
import logging import os import json import mlflow from io import StringIO from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json def init(): global model global input_schema # "model" is the path of the mlflow artifacts when the model was registered. For automl # models, this is generally "mlflow-model". model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model") model = mlflow.pyfunc.load_model(model_path) input_schema = model.metadata.get_input_schema() def run(raw_data): json_data = json.loads(raw_data) if "input_data" not in json_data.keys(): raise Exception("Request must contain a top level key named 'input_data'") serving_input = json.dumps(json_data["input_data"]) data = infer_and_parse_json_input(serving_input, input_schema) predictions = model.predict(data) result = StringIO() predictions_to_json(predictions, result) return result.getvalue()
Peringatan
Saran MLflow 2.0: Skrip penilaian yang disediakan akan berfungsi dengan MLflow 1.X dan MLflow 2.X. Namun, perhatikan bahwa format input/output yang diharapkan pada versi tersebut mungkin bervariasi. Periksa definisi lingkungan yang digunakan untuk memastikan Anda menggunakan versi MLflow yang diharapkan. Perhatikan bahwa MLflow 2.0 hanya didukung di Python 3.8+.
Buat lingkungan tempat skrip penilaian dapat dijalankan. Karena model adalah model MLflow, persyaratan conda juga ditentukan dalam paket model. Untuk detail selengkapnya tentang file yang disertakan dalam model MLflow lihat Format MLmodel. Anda kemudian akan membangun lingkungan menggunakan dependensi conda dari file. Namun, Anda juga perlu menyertakan paket
azureml-inference-server-http
, yang diperlukan untuk penyebaran online di Azure Pembelajaran Mesin.File definisi conda adalah sebagai berikut:
conda.yml
channels: - conda-forge dependencies: - python=3.9 - pip - pip: - mlflow - scikit-learn==1.2.2 - cloudpickle==2.2.1 - psutil==5.9.4 - pandas==2.0.0 - azureml-inference-server-http name: mlflow-env
Catatan
Paket
azureml-inference-server-http
telah ditambahkan ke file dependensi conda asli.Anda akan menggunakan file dependensi conda ini untuk membuat lingkungan:
Lingkungan akan dibuat sebaris dalam konfigurasi penyebaran.
Buat penyebaran:
Buat file konfigurasi penyebaran deployment.yml:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-diabetes-custom endpoint_name: my-endpoint model: azureml:sklearn-diabetes@latest environment: image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04 conda_file: sklearn-diabetes/environment/conda.yml code_configuration: code: sklearn-diabetes/src scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1
Buat penyebaran:
az ml online-deployment create -f deployment.yml
Setelah penyebaran Anda selesai, siap untuk melayani permintaan. Salah satu cara untuk menguji penyebaran adalah dengan menggunakan file permintaan sampel bersama dengan
invoke
metode .sample-request-sklearn.json
{"input_data": { "columns": [ "age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6" ], "data": [ [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ], [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0] ], "index": [0,1] }}
Kirim permintaan ke titik akhir sebagai berikut:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Responsnya mirip dengan teks berikut:
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
Peringatan
Saran MLflow 2.0: Di MLflow 1.X,
predictions
kunci akan hilang.
Membersihkan sumber daya
Setelah Anda selesai menggunakan titik akhir, hapus sumber daya terkait:
az ml online-endpoint delete --name $ENDPOINT_NAME --yes