Validasi pra-penyebaran untuk Model Serving

Panduan dalam artikel ini dapat membantu Anda mengonfirmasi bahwa model Anda dan semua dependensinya kompatibel dengan lingkungan penyajian sebelum Anda menyebarkan, sehingga Anda dapat menangkap masalah selama pengembangan alih-alih menunggu proses penyebaran titik akhir. Databricks merekomendasikan untuk melalui langkah-langkah validasi ini untuk memastikan pengalaman pengembangan yang lebih baik saat menggunakan penyajian model. Mulailah dengan menguji prediksi, cara paling langsung untuk memastikan bahwa model Anda dan dependensinya berfungsi di lingkungan yang mensimulasikan proses serving.

Menguji prediksi sebelum penyebaran

Sebelum menyebarkan model Anda ke titik akhir penyajian, uji prediksi offline dengan lingkungan virtual menggunakan contoh mlflow.models.predict dan input. MLflow menyediakan API validasi yang mensimulasikan lingkungan penyebaran dan memungkinkan pengujian dependensi yang dimodifikasi. Dengan setelan default env_manager="virtualenv", MLflow membangun ulang dependensi model Anda yang dicatat dalam lingkungan terisolasi yang mensimulasikan runtime penyajian, sehingga dependensi yang hilang, bertentangan dengan paket lain, atau gagal diinstal akan terdeteksi di sini, bukan saat penerapan endpoint.

Ada dua opsi validasi pra-penyebaran: MLflow Python API dan MLflow CLI. Lihat dokumentasi MLflow untuk menguji prediksi untuk panduan yang lebih rinci.

Anda dapat menentukan parameter berikut:

  • Model model_uri yang disebarkan untuk memodelkan penyajian.
  • Salah satu hal berikut ini:
    • input_data dalam format yang diharapkan untuk panggilan mlflow.pyfunc.PyFuncModel.predict() pada model.
    • input_path yang menentukan file yang berisi data input yang akan dimuat dan digunakan untuk panggilan ke predict.
  • content_type dalam format csv atau json.
  • Sebuah output_path opsional untuk menulis prediksi ke berkas. Jika Anda menghilangkan parameter ini, prediksi akan dicetak ke stdout.
  • Manajer lingkungan sistem, env_manager, yang digunakan untuk membangun lingkungan sistem untuk menjalankan:
    • Defaultnya adalah virtualenv. Direkomendasikan untuk melayani validasi.
    • local tersedia, tetapi berpotensi rawan kesalahan untuk melayani validasi. Umumnya hanya digunakan untuk penelusuran kesalahan cepat.
  • Apakah akan menginstal versi MLflow saat ini yang ada dalam lingkungan Anda menggunakan lingkungan virtual dengan install_mlflow. Pengaturan ini secara default adalah False.
  • Apakah perlu memperbarui dan menguji versi dependensi paket yang berbeda untuk pemecahan masalah atau pengecekan kesalahan. Anda dapat menentukan ini sebagai daftar dependensi string yang akan diganti atau ditambahkan menggunakan argumen override, pip_requirements_override.

Contohnya:

import mlflow

run_id = "..."
model_uri = f"runs:/{run_id}/model"

mlflow.models.predict(
  model_uri=model_uri,
  input_data={"col1": 34.2, "col2": 11.2, "col3": "green"},
  content_type="json",
  env_manager="virtualenv",
  install_mlflow=False,
  pip_requirements_override=["pillow==10.3.0", "scipy==1.13.0"],
)

Memperbarui dependensi model

Jika ada masalah dengan dependensi yang ditentukan dengan model yang dicatat, Anda dapat memperbarui persyaratan dengan menggunakan MLflow CLI atau mlflow.models.model.update_model_requirements() di MLflow Python API tanpa harus mencatat model lain.

Contoh berikut menunjukkan cara memperbarui pip_requirements.txt dari model yang dicatat secara langsung.

Anda dapat memperbarui definisi yang ada dengan versi paket tertentu atau menambahkan persyaratan yang tidak ada ke file pip_requirements.txt. File ini berada dalam artefak model MLflow di lokasi yang ditentukan model_uri .

from mlflow.models.model import update_model_requirements

update_model_requirements(
  model_uri=model_uri,
  operation="add",
  requirement_list=["pillow==10.2.0", "scipy==1.12.0"],
)

Memvalidasi input model sebelum penyebaran

Model yang melayani titik akhir mengharapkan format khusus input JSON. Anda dapat memvalidasi bahwa input model Anda berfungsi pada titik akhir penyajian sebelum penyebaran menggunakan validate_serving_input di MLflow.

Berikut ini adalah contoh kode yang dihasilkan secara otomatis di tab artefak eksekusi jika model Anda dicatat dengan contoh input yang valid.

from mlflow.models import validate_serving_input

model_uri = 'runs:/<run_id>/<artifact_path>'

serving_payload = """{
 "messages": [
   {
     "content": "How many product categories are there?",
     "role": "user"
   }
 ]
}
"""

# Validate the serving payload works on the model
validate_serving_input(model_uri, serving_payload)

Anda juga dapat menguji contoh input apa pun terhadap model yang dicatat dengan menggunakan convert_input_example_to_serving_input API untuk menghasilkan input penyajian JSON yang valid.

from mlflow.models import validate_serving_input
from mlflow.models import convert_input_example_to_serving_input

model_uri = 'runs:/<run_id>/<artifact_path>'

# Define INPUT_EXAMPLE with your own input example to the model
# A valid input example is a data instance suitable for pyfunc prediction

serving_payload = convert_input_example_to_serving_input(INPUT_EXAMPLE)

# Validate the serving payload works on the model
validate_serving_input(model_uri, serving_payload)

Uji penyajian model secara manual

Anda dapat menguji perilaku penyajian model secara manual menggunakan langkah-langkah berikut:

  1. Buka notebook dan lampirkan ke kluster All-Purpose yang menggunakan versi Databricks Runtime, bukan Databricks Runtime untuk Pembelajaran Mesin.
  2. Muat model menggunakan MLflow dan coba debugging dari sana.

Anda juga dapat memuat model secara lokal di PC dan debug dari sana. Muat model Anda secara lokal menggunakan yang berikut ini:

import os
import mlflow

os.environ["MLFLOW_TRACKING_URI"] = "databricks://PROFILE"

ARTIFACT_URI = "model_uri"
if '.' in ARTIFACT_URI:
    mlflow.set_registry_uri('databricks-uc')
local_path = mlflow.artifacts.download_artifacts(ARTIFACT_URI)
print(local_path)

conda env create -f local_path/artifact_path/conda.yaml
conda activate mlflow-env

mlflow.pyfunc.load_model(local_path/artifact_path)