Bagikan melalui


Gambaran umum model kustom

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

Apa itu model kustom?

Model Melayani dapat menyebarkan model Python atau kode kustom apa pun sebagai API tingkat produksi menggunakan sumber daya komputasi CPU atau GPU. 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 dasar untuk aplikasi AI generatif, lihat Foundation Model API dan Model eksternal untuk model dan penawaran komputasi yang didukung.

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)
    
  • Catat menggunakan varian 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())
    

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, Anda harus 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.

Tipe beban kerja Instans GPU Memory
CPU 4GB per konkurensi
GPU_SMALL 1xT4 16GB
GPU_LARGE 1xA100 80GB
GPU_LARGE_2 2xA100 160GB
GPU_LARGE_4 4xA100 320GB

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. Gambar dasar mungkin mencakup beberapa dependensi tingkat sistem, tetapi dependensi tingkat aplikasi harus ditentukan secara eksplisit dalam model MLflow Anda.

Jika tidak semua dependensi yang diperlukan disertakan dalam model, Anda mungkin mengalami kesalahan dependensi selama penyebaran. 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. Untuk informasi terperinci tentang persyaratan pengelogan dan praktik terbaik, lihat dokumentasi Model MLflow dan referensi MLflow Python API.

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"],)

Untuk informasi tentang memvalidasi dan memperbarui dependensi sebelum penyebaran, lihat Validasi pra-penyebaran untuk Model Melayani.

Ekspektasi dan batasan

Catatan

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

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

Ekspektasi pembuatan dan pembaruan endpoint

  • Waktu penyebaran: Menyebarkan versi model yang baru terdaftar melibatkan pengemasan model dan lingkungan modelnya dan memprovisikan titik akhir model itu sendiri. Proses ini dapat memakan waktu sekitar 10 menit, tetapi mungkin memakan waktu lebih lama tergantung pada kompleksitas model, ukuran, dan dependensi.
  • Pembaruan waktu henti nol: 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. Selama proses pembaruan ini, Anda ditagih untuk konfigurasi titik akhir lama dan baru hingga transisi selesai.
  • Batas waktu permintaan: Jika komputasi model membutuhkan waktu lebih dari 297 detik, permintaan akan kehabisan waktu.

Penting

Databricks melakukan pembaruan dan pemeliharaan sistem nol-downtime sesekali pada titik akhir Model Serving yang ada. Selama pemeliharaan, Databricks memuat ulang model. Jika model gagal dimuat ulang, pembaruan titik akhir ditandai sebagai gagal dan konfigurasi titik akhir yang ada terus melayani permintaan. Pastikan model yang disesuaikan kuat dan dapat dimuat ulang kapan saja.

Ekspektasi penskalaan titik akhir

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). Untuk memvalidasi konfigurasi konkurensi Anda, lihat Pengujian beban untuk melayani titik akhir.
  • Perilaku penskalakan: Titik akhir segera ditingkatkan dengan peningkatan lalu lintas dan penurunan skala setiap lima menit untuk mencocokkan lalu lintas yang berkurang.
  • Skalakan ke nol: Skala ke nol adalah fitur opsional untuk titik akhir yang memungkinkannya 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. Peningkatan skala dari nol biasanya membutuhkan waktu 10-20 detik, tetapi terkadang dapat memakan waktu beberapa menit. Tidak ada SLA dalam skala yang dimulai dari latensi nol.
  • Pengoptimalan rute: Untuk QPS tinggi dan kasus penggunaan latensi rendah, pengoptimalan rute adalah opsi optimal dan direkomendasikan untuk meningkatkan performa.
  • Penyebaran yang dioptimalkan tanpa server: Untuk kecepatan penyebaran titik akhir yang lebih cepat, gunakan penyebaran yang dioptimalkan tanpa server.

Peringatan

Skala ke nol tidak boleh digunakan untuk beban kerja produksi yang memerlukan waktu aktif yang konsisten atau waktu respons yang dijamin. Untuk aplikasi atau titik akhir yang sensitif terhadap latensi yang membutuhkan ketersediaan berkelanjutan, nonaktifkan skala ke nol.

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 habis waktu jika pembuatan kontainer dan penyebaran model melebihi durasi 60 menit, atau pembuatan kontainer mungkin gagal dengan kesalahan "Tidak ada ruang tersisa di perangkat" karena keterbatasan penyimpanan. Untuk model bahasa besar, gunakan API Model Foundation sebagai gantinya.
  • 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.

Pemberitahuan lisensi Anaconda untuk model-model lama

Catatan

Bagian ini hanya berlaku untuk model yang dicatat dengan MLflow v1.17 atau yang lebih lama (Databricks Runtime 8.3 ML atau yang lebih lama). Jika Anda menggunakan versi yang lebih baru, Anda dapat melewati bagian ini.

Pemberitahuan berikut ditujukan untuk pelanggan yang mengandalkan Anaconda dengan model lama.

Penting

Anaconda Inc. memperbarui ketentuan layanan untuk alur anaconda.org. Berdasarkan ketentuan 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, model conda.yaml dengan saluran yang memiliki ketergantungan defaults 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 Anda atas repositori Anaconda.com melalui penggunaan Databricks diizinkan berdasarkan persyaratan 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: