Bagikan melalui


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 Mesin azureml-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.

  1. Pastikan pustaka berikut diinstal di kluster:

    - mlflow<3,>=2.1
    - cloudpickle==2.2.0
    - scikit-learn==1.2.0
    - xgboost==1.7.2
    
  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.

  3. Impor namespace yang diperlukan:

    import mlflow
    import pyspark.sql.functions as f
    
  4. Konfigurasikan URI model. URI berikut membawa model bernama heart-classifier dalam versi terbarunya.

    model_uri = "models:/heart-classifier/latest"
    
  5. 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 oleh predict() fungsi.

  6. 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 folder dbfs:/data/. Kami juga menghilangkan kolom target karena himpunan data ini berisi variabel target untuk diprediksi. Dalam skenario produksi, data Anda tidak akan memiliki kolom ini.

  7. Jalankan fungsi predict_function dan tempatkan prediksi pada kolom baru. Dalam hal ini, kami menempatkan prediksi di kolom predictions.

    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 karenanya df.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.

  8. 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).

  1. 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 lihat mlflow.pyfunc.spark_udf dokumentasi.

  2. 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-alih resources properti.

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

Langkah berikutnya