Menyebarkan model kustom
Artikel ini menjelaskan dukungan untuk menyebarkan model kustom menggunakan Mosaic AI 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,
- Catat model atau kode dalam format MLflow, menggunakan rasa bawaan MLflow asli atau pyfunc.
- Setelah model dicatat, daftarkan di Unity Catalog (disarankan) atau registri ruang kerja.
- Dari sini, Anda dapat membuat model yang melayani titik akhir untuk menyebarkan dan mengkueri model Anda.
Untuk tutorial lengkap tentang cara menyajikan model kustom di Databricks, lihat Tutorial penyajian model.
Databricks juga mendukung penyajian model AI generatif 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
Mosaic AI 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 untukmlflow.pyfunc.PyFuncModel.predict()
panggilan model.input_path
yang menentukan file yang berisi data input yang akan dimuat dan digunakan untuk panggilan kepredict
.
content_type
dalamcsv
ataujson
format.output_path
Opsional untuk menulis prediksi ke file. Jika Anda menghilangkan parameter ini, prediksi akan dicetak kestdout
.- 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.
- Default adalah
- Apakah akan menginstal versi MLflow saat ini yang ada di lingkungan Anda dengan lingkungan virtual menggunakan
install_mlflow
. Pengaturan ini default keFalse
. - 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 atau model eksternal.
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 atau model eksternal.
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:
- Membuat model kustom yang melayani titik akhir
- Kueri yang melayani titik akhir untuk model kustom
- Menggunakan pustaka Python kustom dengan Model Serving
- Mengemas artefak kustom untuk Model Serving
- Menyebarkan kode Python dengan Model Serving
- Mengonfigurasi pengoptimalan rute pada titik akhir penyajian
- Mengonfigurasi akses ke sumber daya dari titik akhir penyajian model