Bagikan melalui


Menyebarkan model kustom

Artikel ini menjelaskan dukungan untuk menyebarkan model kustom menggunakan Databricks Model Serving. Ini juga menyediakan detail tentang opsi pengelogan model dan jenis komputasi yang didukung, cara mengemas dependensi model untuk penyajian, serta pembuatan dan penskalaan titik akhir.

Apa itu model kustom?

Model Serving dapat menyebarkan model Python apa pun sebagai API tingkat produksi. Databricks mengacu pada model seperti model kustom. Model ML ini dapat dilatih menggunakan pustaka ML standar seperti transformator scikit-learn, XGBoost, PyTorch, dan HuggingFace dan dapat menyertakan kode Python apa pun.

Untuk menyebarkan model kustom,

  1. Catat model atau kode dalam format MLflow, menggunakan rasa bawaan MLflow asli atau pyfunc.
  2. Setelah model dicatat, daftarkan di Unity Catalog (disarankan) atau registri ruang kerja.
  3. Dari sini, Anda dapat membuat model yang melayani titik akhir untuk menyebarkan dan mengkueri model Anda.
    1. Lihat Membuat titik akhir penyajian model kustom
    2. Lihat Kueri yang melayani titik akhir untuk model kustom.

Untuk tutorial lengkap tentang cara menyajikan model kustom di Databricks, lihat Tutorial penyajian model.

Databricks juga mendukung penyajian model fondasi untuk aplikasi AI generatif, lihat API Model Foundation dan Model eksternal untuk model dan penawaran komputasi yang didukung.

Penting

Jika Anda mengandalkan Anaconda, tinjau ketentuan pemberitahuan layanan untuk informasi tambahan.

Model ML log

Ada berbagai metode untuk mencatat model ML Anda untuk penyajian model. Daftar berikut ini meringkas metode dan contoh yang didukung.

  • Autologging Metode ini diaktifkan secara otomatis saat menggunakan Databricks Runtime untuk ML.

    import mlflow
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.datasets import load_iris
    
    iris = load_iris()
    model = RandomForestRegressor()
    model.fit(iris.data, iris.target)
    
  • Log menggunakan rasa bawaan MLflow. Anda dapat menggunakan metode ini jika Anda ingin mencatat model secara manual untuk kontrol yang lebih rinci.

    import mlflow
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.datasets import load_iris
    
    iris = load_iris()
    model = RandomForestClassifier()
    model.fit(iris.data, iris.target)
    
    with mlflow.start_run():
        mlflow.sklearn.log_model(model, "random_forest_classifier")
    
  • Pengelogan kustom dengan pyfunc. Anda dapat menggunakan metode ini untuk menyebarkan model kode python arbitrer atau menyebarkan kode tambahan bersama model Anda.

      import mlflow
      import mlflow.pyfunc
    
      class Model(mlflow.pyfunc.PythonModel):
          def predict(self, context, model_input):
              return model_input * 2
    
      with mlflow.start_run():
          mlflow.pyfunc.log_model("custom_model", python_model=Model())
    
  • Unduh dari HuggingFace. Anda dapat mengunduh model langsung dari Hugging Face dan mencatat model tersebut untuk penyajian. Misalnya, lihat Contoh buku catatan.

Contoh tanda tangan dan input

Menambahkan contoh tanda tangan dan input ke MLflow disarankan. Tanda tangan diperlukan untuk pengelogan model ke Unity Catalog.

Berikut ini adalah contoh tanda tangan:

from mlflow.models.signature import infer_signature

signature = infer_signature(training_data, model.predict(training_data))
mlflow.sklearn.log_model(model, "model", signature=signature)

Berikut ini adalah contoh input:


input_example = {"feature1": 0.5, "feature2": 3}
mlflow.sklearn.log_model(model, "model", input_example=input_example)

Tipe komputasi

Catatan

Penyajian model GPU ada di Pratinjau Umum.

Databricks Model Serving menyediakan berbagai opsi CPU dan GPU untuk menyebarkan model Anda. Saat menyebarkan dengan GPU, penting untuk memastikan bahwa kode Anda disiapkan sehingga prediksi dijalankan pada GPU, menggunakan metode yang disediakan oleh kerangka kerja Anda. MLflow melakukan ini secara otomatis untuk model yang dicatat dengan rasa PyTorch atau Transformers.

jenis beban kerja Instans GPU memory
CPU 4GB per konkurensi
GPU_SMALL 1xT4 16GB
GPU_LARGE 1xA100 80GB
GPU_LARGE_2 2xA100 160GB

Kontainer penyebaran dan dependensi

Selama penyebaran, kontainer tingkat produksi dibangun dan disebarkan sebagai titik akhir. Kontainer ini mencakup pustaka yang diambil secara otomatis atau ditentukan dalam model MLflow.

Model yang melayani kontainer tidak berisi dependensi yang telah diinstal sebelumnya, yang mungkin menyebabkan kesalahan dependensi jika tidak semua dependensi yang diperlukan disertakan dalam model. Saat mengalami masalah penyebaran model, Databricks menyarankan Anda menguji model secara lokal.

Dependensi paket dan kode

Pustaka kustom atau privat dapat ditambahkan ke penyebaran Anda. Lihat Menggunakan pustaka Python kustom dengan Model Serving.

Untuk model rasa asli MLflow, dependensi paket yang diperlukan diambil secara otomatis.

Untuk model kustom pyfunc , dependensi dapat ditambahkan secara eksplisit.

Anda dapat menambahkan dependensi paket menggunakan:

  • Parameter pip_requirements :

    mlflow.sklearn.log_model(model, "sklearn-model", pip_requirements = ["scikit-learn", "numpy"])
    
  • Parameter conda_env :

    
    conda_env = {
        'channels': ['defaults'],
        'dependencies': [
            'python=3.7.0',
            'scikit-learn=0.21.3'
        ],
        'name': 'mlflow-env'
    }
    
    mlflow.sklearn.log_model(model, "sklearn-model", conda_env = conda_env)
    
  • Untuk menyertakan persyaratan tambahan di luar apa yang diambil secara otomatis, gunakan extra_pip_requirements.

    mlflow.sklearn.log_model(model, "sklearn-model", extra_pip_requirements = ["sklearn_req"])
    

Jika Anda memiliki dependensi kode, ini dapat ditentukan menggunakan code_path.

  mlflow.sklearn.log_model(model, "sklearn-model", code_path=["path/to/helper_functions.py"],)

Validasi dependensi

Sebelum menyebarkan model MLflow kustom, ada baiknya untuk memverifikasi bahwa model mampu dilayani. MLflow menyediakan API yang memungkinkan validasi artefak model yang mensimulasikan lingkungan penyebaran dan memungkinkan pengujian dependensi yang dimodifikasi.

Ada dua API validasi pra-penyebaran MLflow Python API dan MLflow CLI.

Anda dapat menentukan hal berikut menggunakan salah satu API ini.

  • Model model_uri yang disebarkan untuk memodelkan penyajian.
  • Salah satu hal berikut ini:
    • input_data dalam format yang diharapkan untuk mlflow.pyfunc.PyFuncModel.predict() panggilan model.
    • input_path yang menentukan file yang berisi data input yang akan dimuat dan digunakan untuk panggilan ke predict.
  • content_type dalam csv atau json format.
  • output_path Opsional untuk menulis prediksi ke file. Jika Anda menghilangkan parameter ini, prediksi akan dicetak ke stdout.
  • Manajer lingkungan, env_manager, yang digunakan untuk membangun lingkungan untuk melayani:
    • Default 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 di lingkungan Anda dengan lingkungan virtual menggunakan install_mlflow. Pengaturan ini default ke False.
  • Apakah akan memperbarui dan menguji versi dependensi paket yang berbeda untuk pemecahan masalah atau penelusuran kesalahan. Anda dapat menentukan ini sebagai daftar penggantian dependensi string atau penambahan menggunakan argumen penimpaan, 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"],
)

Pembaruan dependensi

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 th MLflow Python API tanpa harus mencatat model lain.

Contoh berikut menunjukkan cara memperbarui pip_requirements.txt model yang dicatat di tempat.

Anda dapat memperbarui definisi yang ada dengan versi paket tertentu atau menambahkan persyaratan yang tidak ada ke pip_requirements.txt file. 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"],
)

Ekspektasi dan batasan

Bagian berikut menjelaskan ekspektasi dan batasan yang diketahui untuk melayani model kustom menggunakan Model Serving.

Ekspektasi pembuatan dan pembaruan titik akhir

Catatan

Informasi di bagian ini tidak berlaku untuk titik akhir yang melayani model fondasi.

Menyebarkan versi model yang baru terdaftar melibatkan pengemasan model dan lingkungan modelnya dan menyediakan titik akhir model itu sendiri. Proses ini dapat memakan waktu sekitar 10 menit.

Azure Databricks melakukan pembaruan titik akhir tanpa waktu henti dengan menjaga konfigurasi titik akhir yang ada tetap aktif hingga yang baru siap. Melakukannya mengurangi risiko gangguan untuk titik akhir yang sedang digunakan.

Jika komputasi model membutuhkan waktu lebih dari 120 detik, permintaan akan kehabisan waktu. Jika Anda yakin komputasi model Anda akan memakan waktu lebih dari 120 detik, hubungi tim akun Azure Databricks Anda.

Databricks melakukan pembaruan dan pemeliharaan sistem nol-downtime sesekali pada titik akhir Model Serving yang ada. Selama pemeliharaan, Databricks memuat ulang model dan menandai titik akhir sebagai Gagal jika model gagal dimuat ulang. Pastikan model yang disesuaikan kuat dan dapat dimuat ulang kapan saja.

Ekspektasi penskalaan titik akhir

Catatan

Informasi di bagian ini tidak berlaku untuk titik akhir yang melayani model fondasi.

Melayani titik akhir secara otomatis diskalakan berdasarkan lalu lintas dan kapasitas unit konkurensi yang disediakan.

  • Konkurensi yang disediakan: Jumlah maksimum permintaan paralel yang dapat ditangani sistem. Perkirakan konkurensi yang diperlukan menggunakan rumus: konkurensi yang disediakan = kueri per detik (QPS) * waktu eksekusi model (s).
  • Perilaku penskalakan: Titik akhir segera ditingkatkan dengan peningkatan lalu lintas dan penurunan skala setiap lima menit untuk mencocokkan lalu lintas yang berkurang.
  • Skala ke nol: Titik akhir dapat menurunkan skala menjadi nol setelah 30 menit tidak aktif. Permintaan pertama setelah penskalaan ke nol mengalami "cold start," yang mengarah ke latensi yang lebih tinggi. Untuk aplikasi yang sensitif terhadap latensi, pertimbangkan strategi untuk mengelola fitur ini secara efektif.

Batasan beban kerja GPU

Berikut ini adalah batasan untuk melayani titik akhir dengan beban kerja GPU:

  • Pembuatan gambar kontainer untuk penyajian GPU membutuhkan waktu lebih lama daripada pembuatan gambar untuk penyajian CPU karena ukuran model dan peningkatan persyaratan penginstalan untuk model yang disajikan pada GPU.
  • Saat menyebarkan model yang sangat besar, proses penyebaran mungkin waktu habis jika build kontainer dan penyebaran model melebihi durasi 60 menit. Jika ini terjadi, memulai percobaan kembali proses harus berhasil menyebarkan model.
  • Penskalaan otomatis untuk penyajian GPU membutuhkan waktu lebih lama daripada untuk penyajian CPU.
  • Kapasitas GPU tidak dijamin saat menskalakan ke nol. Titik akhir GPU mungkin mengharapkan latensi ekstra tinggi untuk permintaan pertama setelah penskalaan ke nol.
  • Fungsionalitas ini tidak tersedia di northcentralus.

Pembaruan lisensi Anaconda

Pemberitahuan berikut adalah untuk pelanggan yang mengandalkan Anaconda.

Penting

Anaconda Inc. memperbarui ketentuan layanan untuk alur anaconda.org. Berdasarkan persyaratan layanan baru, Anda mungkin memerlukan lisensi komersial jika Anda mengandalkan pengemasan dan distribusi Anaconda. Lihat FAQ Anaconda Commercial Edition untuk informasi lebih lanjut. Penggunaan Anda atas setiap saluran Anaconda diatur oleh persyaratan layanan mereka.

Model MLflow yang dicatat sebelum v1.18 (Databricks Runtime 8.3 ML atau lebih lama) secara default dicatat dengan saluran conda defaults (https://repo.anaconda.com/pkgs/) sebagai dependensi. Karena perubahan lisensi ini, Databricks telah menghentikan penggunaan saluran defaults untuk model yang dicatat menggunakan MLflow v1.18 dan di atasnya. Saluran default yang dicatat sekarang adalah conda-forge, yang menunjuk pada komunitas yang dikelola https://conda-forge.org/.

Jika Anda mencatat model sebelum MLflow v1.18 tanpa mengecualikan saluran defaults dari lingkungan conda untuk model tersebut, model tersebut mungkin memiliki dependensi pada saluran defaults yang mungkin tidak Anda maksudkan. Untuk mengonfirmasi secara manual apakah model memiliki dependensi ini, Anda dapat memeriksa nilai channel dalam file conda.yaml yang dikemas dengan model yang dicatat. Misalnya, conda.yaml model dengan defaults dependensi saluran mungkin terlihat seperti ini:

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

Karena Databricks tidak dapat menentukan apakah penggunaan Anda atas repositori Anaconda untuk berinteraksi dengan model Anda diizinkan berdasarkan hubungan Anda dengan Anaconda, Databricks tidak memaksa pelanggannya untuk membuat perubahan apa pun. Jika penggunaan repositori Anaconda.com Anda melalui penggunaan Databricks diizinkan berdasarkan ketentuan Anaconda, Anda tidak perlu mengambil tindakan apa pun.

Jika Anda ingin mengubah saluran yang digunakan di lingkungan model, Anda dapat mendaftarkan ulang model ke registri model dengan baru conda.yaml. Anda dapat melakukannya dengan menentukan saluran di parameter conda_env dari log_model().

Untuk informasi selengkapnya tentang log_model() API, lihat dokumentasi MLflow untuk ragam model yang sedang Anda kerjakan, misalnya, log_model untuk scikit-learn.

Untuk informasi selengkapnya tentang conda.yaml file, lihat dokumentasi MLflow.

Sumber Daya Tambahan: