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:

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:


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

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

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. 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: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Catatan

    Pembuatan otomatis dan scoring_scriptenvironment hanya didukung untuk pyfunc ragam model. Untuk menggunakan ragam model yang berbeda, lihat Menyesuaikan penyebaran model MLflow.

  4. 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
    
  5. 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 perintah az ml online-endpoint update --traffic. Untuk informasi selengkapnya tentang cara memperbarui lalu lintas, lihat Memperbarui lalu lintas secara progresif.

  6. 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 perintah az 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:

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

    Cuplikan layar memperlihatkan folder tempat artefak model ditempatkan.

  2. Buat skrip penilaian. Perhatikan bagaimana nama model folder yang sebelumnya Anda identifikasi disertakan dalam init() 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+.

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

  4. 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
    
  5. 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