Egyéni modellek áttekintése

Ez a cikk az egyéni modelleknek a Mozaik AI-modell-szolgáltatással való támogatását ismerteti. Részletes információkat nyújt a támogatott modellnaplózási lehetőségekről és számítási típusokról, a modell függőségeinek a szolgáltatáshoz való csomagolásáról, valamint a végpontok létrehozásával és skálázásával kapcsolatos elvárásokról.

Mik azok az egyéni modellek?

A modellkiszolgáló bármilyen Python-modellt vagy egyéni kódot üzembe helyezhet éles szintű API-ként CPU- vagy GPU-számítási erőforrások használatával. A Databricks olyan modellekre hivatkozik, mint az egyéni modellek. Ezek az ML-modellek szabványos ML-kódtárak, például scikit-learn, XGBoost, PyTorch és HuggingFace transzformátorok használatával taníthatók be, és bármilyen Python-kódot tartalmazhatnak.

Egy egyéni modell üzembe helyezéséhez

  1. A modellt vagy a kódot naplózhatja MLflow formátumban, MLflow beépített natív 'flavors' vagy pyfunc használatával.
  2. A modell naplózása után regisztrálja a Unity Katalógusban (ajánlott) vagy a munkaterület-beállításjegyzékben.
  3. Innen létrehozhat egy végpontot kiszolgáló modellt a modell üzembe helyezéséhez és lekérdezéséhez.
    1. Lásd: Végpontokat kiszolgáló egyéni modell létrehozása
    2. Lásd: Az egyéni modellek végpontjait kiszolgáló lekérdezés.

Az egyéni modellek Databricksen való kiszolgálásáról szóló teljes oktatóanyagért tekintse meg a Modellkiszolgáló oktatóanyagot.

A Databricks támogatja a generatív AI-alkalmazások alapmodelljeinek kiszolgálását is, lásd: Foundation Model API-k és Külső modellek támogatott modellekhez és számítási ajánlatokhoz.

Log ML-modellek

Az ML-modell naplózására különböző módszerek állnak rendelkezésre a modell kiszolgálásához. Az alábbi lista a támogatott módszereket és példákat foglalja össze.

  • Az automatikus naplózás ez a módszer automatikusan engedélyezve van, amikor a Databricks ML futtatókörnyezetet használják.

    import mlflow
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.datasets import load_iris
    
    iris = load_iris()
    model = RandomForestRegressor()
    model.fit(iris.data, iris.target)
    
  • Naplózás az MLflow beépített sajátosságainak használatával. Ezt a módszert akkor használhatja, ha manuálisan szeretné naplózni a modellt a részletesebb vezérlés érdekében.

    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")
    
  • Egyéni naplózás pyfunc Ezzel a módszerrel tetszőleges Python-kódmodelleket helyezhet üzembe, vagy további kódot helyezhet üzembe a modell mellett.

      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())
    

Aláírási és bemeneti példák

Ajánlott aláírási és bemeneti példát hozzáadni az MLflow-hoz. A modellek Unity-katalógusba való naplózásához aláírásokra van szükség.

Az alábbiakban egy aláírási példa látható:

from mlflow.models.signature import infer_signature

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

Az alábbi példa egy bemeneti példa:


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

Számítási típus

A Modellkiszolgáló számos cpu- és GPU-lehetőséget kínál a modell üzembe helyezéséhez. GPU-val történő üzembe helyezéskor meg kell győződnie arról, hogy a kód be van állítva, hogy az előrejelzések a GPU-n fussanak a keretrendszer által biztosított módszerekkel. Az MLflow ezt automatikusan elvégzi a PyTorch- vagy Transformers-ízekkel naplózott modellek esetében.

A CPU_MEDIUM és CPU_LARGE munkaterhelés típusok bétaverzióban érhetők el, és lehetővé teszik, hogy az egyidejűséget nagyobb memóriára cserélje feldolgozóegységenként ugyanazon a CPU-hardveren. Akkor használja őket, ha a modellnek több memóriára van szüksége, mint amennyit a standard CPU biztosít.

Terhelés típusa GPU-példány Memory
CPU Egyidejűségenként 4 GB
CPU_MEDIUM (bétaverzió) Egyidejűségenként 8 GB
CPU_LARGE (bétaverzió) Egyidejű felhasználónként 16 GB
GPU_SMALL 1xT4 Egyidejűségenként 16 GB
GPU_LARGE 1xA100 Egyidejűségenként 80 GB
GPU_LARGE_2 2xA100 Egyidejűségenként 160 GB
GPU_LARGE_4 4xA100 320 GB egyidejűség

Telepítési konténer és függőségek

Az üzembe helyezés során egy termelési szintű tárolót építünk ki és telepítünk mint végpont. Ez a tároló tartalmazza az MLflow-modellben automatikusan rögzített vagy megadott kódtárakat. Az alaprendszerkép tartalmazhat rendszerszintű függőségeket, de az alkalmazásszintű függőségeket kifejezetten meg kell adni az MLflow-modellben.

Ha nem minden szükséges függőség szerepel a modellben, az üzembe helyezés során függőségi hibák fordulhatnak elő. Amikor modelltelepítési problémákba ütközik, a Databricks azt javasolja, hogy helyileg tesztelje a modellt.

Csomag- és kódfüggőségek

Egyéni vagy privát könyvtárak is hozzáadhatók a deployáláshoz. Lásd: Egyéni Python-kódtárak használata modellkiszolgálóval.

Natív MLflow-modellek esetén a rendszer automatikusan rögzíti a szükséges csomagfüggőségeket.

Egyéni pyfunc modellek esetén a függőségek explicit módon hozzáadhatók. A naplózási követelményekkel és az ajánlott eljárásokkal kapcsolatos részletes információkért tekintse meg az MLflow Models dokumentációját és az MLflow Python API-referenciáját.

Csomagfüggőségeket a következő módon vehet fel:

  • A pip_requirements paraméter:

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

    
    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)
    
  • Ha további követelményeket szeretne belefoglalni az automatikusan rögzített elemeken kívülre, használja a következőt extra_pip_requirements: .

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

Ha kódfüggőségekkel rendelkezik, ezek a következővel code_pathadhatók meg: .

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

A függőségek üzembe helyezés előtti érvényesítéséről és frissítéséről további információt a Modellkiszolgáló üzembe helyezés előtti ellenőrzése című témakörben talál.

Elvárások és korlátozások

Megjegyzés

Az ebben a szakaszban szereplő információk nem vonatkoznak az alapmodelleket vagy külső modelleket kiszolgáló végpontokra.

A következő szakaszok ismert elvárásokat és korlátozásokat írnak le az egyéni modellek modellkiszolgálóval való kiszolgálására vonatkozóan.

Végpontok létrehozásának és frissítésének elvárásai

  • Üzembe helyezési idő: Az újonnan regisztrált modellverzió üzembe helyezése magában foglalja a modell és a modellkörnyezet csomagolását, valamint magát a modellvégpont kiépítését. Ez a folyamat körülbelül 10 percet vehet igénybe, de a modell összetettségétől, méretétől és függőségeitől függően hosszabb időt is igénybe vehet.
  • Nulla állásidő-frissítések: Az Azure Databricks a végpontok nulla állásidejű frissítését hajtja végre a meglévő végpontkonfiguráció fenntartásával, amíg az új készen nem áll. Ez csökkenti a használatban lévő végpontok megszakításának kockázatát. A frissítési folyamat során a rendszer mind a régi, mind az új végpontkonfigurációért díjat számít fel, amíg az átmenet be nem fejeződik.
  • Kérelem időtúllépése: Ha a modell számítása 297 másodpercnél hosszabb időt vesz igénybe, a kérések időtúllépést érnek el.

Fontos

A Databricks időnként nulla állásidős rendszerfrissítéseket és karbantartást végez a meglévő Modellszolgáltatás-végpontokon. A karbantartás során a Databricks újra betölti a modelleket. Ha egy modell nem töltődik be újra, a végpontfrissítés sikertelenként van megjelölve, és a meglévő végpontkonfiguráció továbbra is kiszolgálja a kéréseket. Győződjön meg arról, hogy a testreszabott modellek robusztusak, és bármikor újra betölthetnek.

A végpontok skálázási elvárásai

A végpontok kiszolgálása automatikusan méretezhető a forgalom és a kiépített egyidejűségi egységek kapacitása alapján.

  • Kiosztott egyidejűség: A rendszer által kezelhető párhuzamos kérelmek maximális száma. Becsülje meg a szükséges egyidejűséget a következő képlet használatával: kiosztott egyidejűség = lekérdezések másodpercenként (QPS) * modell végrehajtási ideje (s). Az egyidejűségi konfiguráció ellenőrzéséhez tekintse meg a végpontok kiszolgálására vonatkozó terheléstesztelést.
  • Skálázási viselkedés: A végpontok szinte azonnal felskálázhatók a megnövekedett forgalommal, és öt percenként leskálázhatók a csökkentett forgalomnak megfelelően.
  • Skálázás nullára: A nullára skálázás a végpontok opcionális funkciója, amely lehetővé teszi számukra, hogy 30 perc inaktivitás után nullára skálázhatók. A nullára történő skálázás utáni első kérés "hidegindítást" tapasztal, ami nagyobb késést eredményez. A nulláról való felskálázás általában 10–20 másodpercet vesz igénybe, de néha perceket is igénybe vehet. A zéró késésű skálázáshoz nincs SLA.
  • Útvonaloptimalizálás: A magas QPS és az alacsony késésű használati esetek esetében az útvonal-optimalizálás az optimális és ajánlott lehetőség a teljesítmény javítása érdekében.
  • Kiszolgáló nélküli optimalizált üzemelő példányok: A végpontok gyorsabb üzembe helyezéséhez használjon kiszolgáló nélküli optimalizált üzemelő példányokat.

Figyelmeztetés

A nullára skálázás nem használható olyan éles számítási feladatokhoz, amelyek konzisztens üzemidőt vagy garantált válaszidőt igényelnek. A folyamatos rendelkezésre állást igénylő késésre érzékeny alkalmazások vagy végpontok esetében tiltsa le a skálázást nullára.

GPU-számítási feladatok korlátozásai

A végpontok GPU-számítási feladatokkal való kiszolgálásának korlátozásai a következők:

  • A GPU-kiszolgáló tárolólemezképének létrehozása hosszabb időt vesz igénybe, mint a rendszerkép létrehozása a cpu-kiszolgáláshoz a modell mérete és a GPU-n kiszolgált modellek megnövekedett telepítési követelményei miatt.
  • Nagyon nagy modellek üzembe helyezésekor előfordulhat, hogy az üzembe helyezési folyamat időtúllépést okoz, ha a tároló összeállítása és a modell üzembe helyezése meghaladja a 60 perces időtartamot, vagy a tároló buildelése a tárolási korlátozások miatt meghiúsulhat a "Nincs szabad hely az eszközön" hibával. Nagy nyelvi modellek esetén használja inkább az Foundation Model API-kat .
  • A GPU-kiszolgálás automatikus skálázása hosszabb időt vesz igénybe, mint a CPU-kiszolgáláshoz.
  • A GPU-kapacitás nem garantált nullára való skálázáskor. A GPU-végpontok további nagy késésre számíthatnak az első kérésnél a nullára való skálázás után.

Anaconda licencelési értesítése régebbi modellekhez

Megjegyzés

Ez a szakasz csak az MLflow 1.17-es vagy korábbi verziójával (Databricks Runtime 8.3 ML vagy korábbi) naplózott modellekre vonatkozik. Ha újabb verziót használ, kihagyhatja ezt a szakaszt.

Az alábbi értesítés az Anacondára támaszkodó, örökölt modellekkel rendelkező ügyfelek számára szól.

Fontos

Az Anaconda Inc. frissítette anaconda.org csatornákra vonatkozó szolgáltatási feltételeit. Az új szolgáltatási feltételek alapján kereskedelmi licencre lehet szükség, ha az Anaconda csomagolására és terjesztésére támaszkodik. További információért tekintse meg az Anaconda Commercial Edition gyakori kérdéseit . Az Anaconda-csatornák használatára a szolgáltatási feltételek vonatkoznak.

Az 1.18-as verzió előtt naplózott MLflow-modellek (Databricks Runtime 8.3 ML vagy korábbi) alapértelmezés szerint függőségként lettek naplózva a conda defaults csatornával (https://repo.anaconda.com/pkgs/). A licencmódosítás miatt a Databricks leállította a csatorna használatát az defaults MLflow 1.18-s vagy újabb verziójával naplózott modellekhez. Az alapértelmezett naplózott csatorna most már a közösség által felügyelt https://conda-forge.org/-re mutat.

Ha az MLflow 1.18-a előtt naplózott egy modellt anélkül, hogy kizárta volna a defaults csatornát a modell Conda-környezetéből, előfordulhat, hogy a modell függőségben van a defaults nem kívánt csatornától. Ha manuálisan szeretné ellenőrizni, hogy egy modell rendelkezik-e ezzel a függőséggel, megvizsgálhatja channel a conda.yaml naplózott modellbe csomagolt fájl értékét. Például egy csatornafüggőséggel rendelkező conda.yaml modell defaults a következőképpen nézhet ki:

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

Mivel a Databricks nem tudja megállapítani, hogy az Anaconda-adattár használata engedélyezett-e a modellek kezeléséhez az Anacondával való kapcsolat alatt, a Databricks nem kényszeríti az ügyfeleket semmilyen módosításra. Ha a Anaconda.com adattár használata a Databricks használatával engedélyezett az Anaconda feltételei szerint, nem kell semmilyen lépést tennie.

Ha módosítani szeretné a modell környezetében használt csatornát, újra regisztrálhatja a modellt a modellregisztrációs adatbázisba egy új conda.yamlbeállításjegyzékben. Ezt úgy teheti meg, hogy megadja a csatornát a conda_env paraméterben log_model().

Az log_model() API-val kapcsolatos további információkért tekintse meg az MLflow dokumentációját a dolgozott modellaromáról, például a scikit-learn esetén a log_model.

A fájlokról conda.yaml további információt az MLflow dokumentációjában talál.

További erőforrások