Menyebarkan dan menjalankan model MLflow dalam pekerjaan Spark
Dalam artikel ini, pelajari cara menyebarkan dan menjalankan model MLflow Anda dalam pekerjaan Spark untuk melakukan inferensi atas data dalam jumlah besar atau sebagai bagian dari pekerjaan perselisihan data.
Tentang contoh ini
Contoh ini menunjukkan bagaimana Anda dapat menyebarkan model MLflow yang terdaftar di Azure Pembelajaran Mesin ke pekerjaan Spark yang berjalan di kluster Spark terkelola (pratinjau), Azure Databricks, atau Azure Synapse Analytics, untuk melakukan inferensi atas data dalam jumlah besar.
Model ini didasarkan pada 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). Ini telah dilatih menggunakan pengklasifikasi XGBBoost
dan semua pra-pemrosesan yang diperlukan telah dipaketkan sebagai scikit-learn
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 file, kloning repositori, lalu ubah direktori menjadi sdk/using-mlflow/deploy
.
git clone https://github.com/Azure/azureml-examples --depth 1
cd sdk/python/using-mlflow/deploy
Prasyarat
Sebelum mengikuti langkah-langkah dalam artikel ini, pastikan Anda memiliki prasyarat berikut:
Instal paket
mlflow
MLflow SDK dan plug-in Azure Pembelajaran Mesinazureml-mlflow
untuk MLflow:pip install mlflow azureml-mlflow
Tip
Anda dapat menggunakan
mlflow-skinny
paket, yang merupakan paket MLflow ringan tanpa penyimpanan SQL, server, UI, atau dependensi ilmu data.mlflow-skinny
disarankan untuk pengguna yang terutama membutuhkan kemampuan pelacakan dan pengelogan MLflow tanpa mengimpor rangkaian fitur lengkap, termasuk penyebaran.Ruang kerja Azure Machine Learning. Untuk membuat ruang kerja, lihat tutorial Membuat sumber daya pembelajaran mesin. Tinjau izin akses yang Anda butuhkan untuk melakukan operasi MLflow di ruang kerja Anda.
Jika Anda melakukan pelacakan jarak jauh (yaitu, melacak eksperimen yang berjalan di luar Azure Pembelajaran Mesin), konfigurasikan MLflow untuk mengarahkan ke URI pelacakan ruang kerja Azure Pembelajaran Mesin Anda. Untuk informasi selengkapnya tentang cara menyambungkan MLflow ke ruang kerja Anda, lihat Mengonfigurasi MLflow untuk Azure Pembelajaran Mesin.
- Anda harus memiliki model MLflow yang terdaftar di ruang kerja Anda. Terutama, contoh ini akan mendaftarkan model yang dilatih untuk himpunan data Diabetes.
Menyambungkan ke ruang kerja Anda
Pertama, mari kita sambungkan ke ruang kerja Azure Pembelajaran Mesin tempat model Anda terdaftar.
Pelacakan sudah dikonfigurasi untuk Anda. Kredensial default Anda juga akan digunakan saat bekerja dengan MLflow.
Mendaftarkan model
Kita memerlukan model yang terdaftar di registri Azure Pembelajaran Mesin untuk melakukan inferensi. 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 anda coba sebarkan sudah terdaftar.
model_name = 'heart-classifier'
model_local_path = "model"
registered_model = mlflow_client.create_model_version(
name=model_name, source=f"file://{model_local_path}"
)
version = registered_model.version
Atau, jika model Anda dicatat di dalam eksekusi, Anda dapat mendaftarkannya secara langsung.
Tip
Untuk mendaftarkan model, Anda harus mengetahui lokasi tempat model disimpan. Jika Anda menggunakan autolog
fitur MLflow, jalur akan bergantung pada jenis dan kerangka kerja model yang digunakan. Sebaiknya periksa output pekerjaan untuk mengidentifikasi nama folder ini. Anda dapat mencari folder yang berisi nama file MLModel
. Jika Anda mencatat model Anda secara manual log_model
, maka jalurnya adalah argumen yang Anda berikan ke metode tersebut. Sebagai contoh, jika Anda mencatat model menggunakan mlflow.sklearn.log_model(my_model, "classifier")
, maka jalur tempat model disimpan adalah classifier
.
model_name = 'heart-classifier'
registered_model = mlflow_client.create_model_version(
name=model_name, source=f"runs://{RUN_ID}/{MODEL_PATH}"
)
version = registered_model.version
Catatan
Jalur MODEL_PATH
adalah lokasi di mana model telah disimpan dalam eksekusi.
Dapatkan data input untuk dinilai
Kita akan memerlukan beberapa data input untuk dijalankan atau pekerjaan. Dalam contoh ini, kita akan mengunduh data sampel dari internet dan menempatkannya di penyimpanan bersama yang digunakan oleh kluster Spark.
import urllib
urllib.request.urlretrieve("https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv", "/tmp/data")
Pindahkan data ke akun penyimpanan yang dipasang yang tersedia untuk seluruh kluster.
dbutils.fs.mv("file:/tmp/data", "dbfs:/")
Penting
Kode sebelumnya menggunakan dbutils
, yang merupakan alat yang tersedia di kluster Azure Databricks. Gunakan alat yang sesuai tergantung pada platform yang Anda gunakan.
Data input kemudian ditempatkan di folder berikut:
input_data_path = "dbfs:/data"
Menjalankan model di kluster Spark
Bagian berikut menjelaskan cara menjalankan model MLflow yang terdaftar di Azure Pembelajaran Mesin dalam pekerjaan Spark.
Pastikan pustaka berikut diinstal di kluster:
- mlflow<3,>=2.1 - cloudpickle==2.2.0 - scikit-learn==1.2.0 - xgboost==1.7.2
Kita akan menggunakan notebook untuk menunjukkan cara membuat rutinitas penilaian dengan model MLflow yang terdaftar di Azure Pembelajaran Mesin. Buat buku catatan dan gunakan PySpark sebagai bahasa default.
Impor namespace yang diperlukan:
import mlflow import pyspark.sql.functions as f
Konfigurasikan URI model. URI berikut membawa model bernama
heart-classifier
dalam versi terbarunya.model_uri = "models:/heart-classifier/latest"
Muat model sebagai fungsi UDF. Fungsi yang ditentukan pengguna (UDF) adalah fungsi yang ditentukan oleh pengguna, memungkinkan logika kustom digunakan kembali di lingkungan pengguna.
predict_function = mlflow.pyfunc.spark_udf(spark, model_uri, result_type='double')
Tip
Gunakan argumen
result_type
untuk mengontrol jenis yang dikembalikan olehpredict()
fungsi.Baca data yang ingin Anda nilai:
df = spark.read.option("header", "true").option("inferSchema", "true").csv(input_data_path).drop("target")
Dalam kasus kami, data input dalam
CSV
format dan ditempatkan di folderdbfs:/data/
. Kami juga menghilangkan kolomtarget
karena himpunan data ini berisi variabel target untuk diprediksi. Dalam skenario produksi, data Anda tidak akan memiliki kolom ini.Jalankan fungsi
predict_function
dan tempatkan prediksi pada kolom baru. Dalam hal ini, kami menempatkan prediksi di kolompredictions
.df.withColumn("predictions", score_function(*df.columns))
Tip
Menerima
predict_function
sebagai argumen yang diperlukan kolom. Dalam kasus kami, semua kolom bingkai data diharapkan oleh model dan karenanyadf.columns
digunakan. Jika model Anda memerlukan subset kolom, Anda dapat memperkenalkannya secara manual. Jika model Anda memiliki tanda tangan, jenis harus kompatibel antara input dan jenis yang diharapkan.Anda dapat menulis prediksi Anda kembali ke penyimpanan:
scored_data_path = "dbfs:/scored-data" scored_data.to_csv(scored_data_path)
Menjalankan model dalam pekerjaan Spark mandiri di Azure Pembelajaran Mesin
Azure Pembelajaran Mesin mendukung pembuatan pekerjaan Spark mandiri, dan pembuatan komponen Spark yang dapat digunakan kembali yang dapat digunakan di alur Azure Pembelajaran Mesin. Dalam contoh ini, kita akan menyebarkan pekerjaan penilaian yang berjalan di Azure Pembelajaran Mesin pekerjaan Spark mandiri dan menjalankan model MLflow untuk melakukan inferensi.
Catatan
Untuk mempelajari selengkapnya tentang pekerjaan Spark di Azure Pembelajaran Mesin, lihat Mengirimkan pekerjaan Spark di Azure Pembelajaran Mesin (pratinjau).
Pekerjaan Spark memerlukan skrip Python yang mengambil argumen. Buat skrip penilaian:
score.py
import argparse parser = argparse.ArgumentParser() parser.add_argument("--model") parser.add_argument("--input_data") parser.add_argument("--scored_data") args = parser.parse_args() print(args.model) print(args.input_data) # Load the model as an UDF function predict_function = mlflow.pyfunc.spark_udf(spark, args.model, env_manager="conda") # Read the data you want to score df = spark.read.option("header", "true").option("inferSchema", "true").csv(input_data).drop("target") # Run the function `predict_function` and place the predictions on a new column scored_data = df.withColumn("predictions", score_function(*df.columns)) # Save the predictions scored_data.to_csv(args.scored_data)
Skrip di atas mengambil tiga argumen
--model
,--input_data
dan--scored_data
. Dua yang pertama adalah input dan mewakili model yang ingin kita jalankan dan data input, yang terakhir adalah output dan itu adalah folder output tempat prediksi akan ditempatkan.Tip
Penginstalan paket Python: Skrip penilaian sebelumnya memuat model MLflow ke dalam fungsi UDF, tetapi menunjukkan parameter
env_manager="conda"
. Ketika parameter ini diatur, MLflow akan memulihkan paket yang diperlukan seperti yang ditentukan dalam definisi model di lingkungan terisolasi di mana hanya fungsi UDF yang berjalan. Untuk detail selengkapnya lihatmlflow.pyfunc.spark_udf
dokumentasi.Buat definisi pekerjaan:
mlflow-score-spark-job.yml
$schema: http://azureml/sdk-2-0/SparkJob.json type: spark code: ./src entry: file: score.py conf: spark.driver.cores: 1 spark.driver.memory: 2g spark.executor.cores: 2 spark.executor.memory: 2g spark.executor.instances: 2 inputs: model: type: mlflow_model path: azureml:heart-classifier@latest input_data: type: uri_file path: https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv mode: direct outputs: scored_data: type: uri_folder args: >- --model ${{inputs.model}} --input_data ${{inputs.input_data}} --scored_data ${{outputs.scored_data}} identity: type: user_identity resources: instance_type: standard_e4s_v3 runtime_version: "3.2"
Tip
Untuk menggunakan kumpulan Synapse Spark terlampir, tentukan
compute
properti dalam contoh file spesifikasi YAML yang ditunjukkan di atas alih-alihresources
properti.File YAML yang ditunjukkan di atas dapat digunakan dalam perintah, dengan
--file
parameter , untuk membuat pekerjaan Spark mandiri seperti yang ditunjukkanaz ml job create
:az ml job create -f mlflow-score-spark-job.yml