Összetevőktől modellekig az MLflow-ban

Az alábbi cikk az MLflow-összetevő és az MLflow-modell közötti különbségeket, valamint az egyikről a másikra való áttérést ismerteti. Azt is ismerteti, hogy az Azure Machine Tanulás hogyan használja az MLflow-modell koncepcióját az egyszerűsített üzembehelyezési munkafolyamatok engedélyezéséhez.

Mi a különbség egy összetevő és egy modell között?

Ha nem ismeri az MLflow-t, előfordulhat, hogy nem ismeri a naplózási összetevők vagy fájlok és az MLflow-modellek naplózása közötti különbséget. A kettő között alapvető különbségek vannak:

Műtermék

Az összetevő minden olyan fájl, amely egy kísérlet futtatásából vagy feladatából generált (és rögzített) fájlt. Az összetevők jelölhetnek egy pickle-fájlként szerializált modellt, egy PyTorch- vagy TensorFlow-modell súlyát, vagy akár egy lineáris regresszió együtthatóit tartalmazó szövegfájlt is. Egyes összetevőknek semmi köze sem lehet magához a modellhez; ehelyett tartalmazhatnak konfigurációkat a modell futtatásához, az adatok előfeldolgozásához vagy a mintaadatokhoz stb. Az összetevők különböző formátumúak lehetnek.

Előfordulhat, hogy már naplózott összetevőket:

filename = 'model.pkl'
with open(filename, 'wb') as f:
  pickle.dump(model, f)

mlflow.log_artifact(filename)

Modell

Az MLflow-modell szintén összetevő. Azonban erősebb feltételezéseket teszünk az ilyen típusú összetevőkről. Az ilyen feltételezések egyértelmű szerződést biztosítanak a mentett fájlok és azok jelentése között. Amikor a modelleket összetevőkként (egyszerű fájlokként) naplózza, tudnia kell, hogy a modellszerkesztő mit jelentett az egyes fájlokhoz, hogy tudja, hogyan töltheti be a modellt következtetés céljából. Éppen ellenkezőleg, az MLflow-modellek az MLmodel formátumban megadott szerződéssel tölthetők be.

Az Azure Machine Tanulás naplózási modelljei a következő előnyökkel járnak:

  • Valós idejű vagy kötegelt végpontokon is üzembe helyezheti őket pontozószkript vagy környezet megadása nélkül.
  • Modellek üzembe helyezésekor az üzembe helyezések automatikusan létrehoznak egy swaggert, és a Tesztelés funkció az Azure Machine Tanulás Studióban használható.
  • A modelleket közvetlenül folyamatbemenetként használhatja.
  • A Felelős AI-irányítópultot a modellekkel együtt használhatja.

A modelleket az MLflow SDK használatával naplózhatja:

import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")

Az MLmodel formátum

Az MLflow az MLmodel formátumot alkalmazza az összetevők és az általuk képviselt elemek közötti szerződés létrehozásához. Az MLmodel formátum egy mappában tárolja az objektumokat. Ezek között az eszközök között van egy fájl neve MLmodel. Ez a fájl a modell betöltésének és felhasználásának egyetlen forrása.

Az alábbi képernyőképen egy minta MLflow-modell mappája látható az Azure Machine Tanulás Studióban. A modell egy úgynevezett mappába credit_defaults_modelkerül. A mappa elnevezésére nincs konkrét követelmény. A mappa a többi modellösszetevő között tartalmazza a MLmodel fájlt.

A screenshot showing assets of a sample MLflow model, including the MLmodel file.

Az alábbi kód egy példa arra, hogy a betanított fastai számítógépes látásmodell fájlja hogyan MLmodel néz ki:

MLmodel

artifact_path: classifier
flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Modellízek

Figyelembe véve a számos használható gépi tanulási keretrendszert, az MLflow bevezette az íz fogalmát, hogy egyedi szerződést biztosítson az összes gépi tanulási keretrendszerben való munkához. Az ízek azt jelzik, hogy mire számíthatunk egy adott keretrendszerrel létrehozott modell esetében. A TensorFlow például saját ízvilágú, amely meghatározza a TensorFlow-modellek megőrzésének és betöltésének módját. Mivel minden modell-íz azt jelzi, hogyan őrizhető meg és tölthető be a modell egy adott keretrendszerhez, az MLmodel formátum nem kényszerít egyetlen szerializálási mechanizmust, amelyet minden modellnek támogatnia kell. Ez a döntés lehetővé teszi, hogy minden íz olyan módszereket használjon, amelyek a legjobb teljesítményt vagy a legjobb támogatást nyújtják az ajánlott eljárásoknak megfelelően – anélkül, hogy veszélyeztetnék az MLmodel szabványsal való kompatibilitást.

Az alábbi kód egy példa egy flavors modell szakaszára fastai .

flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12

Modell aláírása

A modell aláírása az MLflow-ban a modell specifikációjának fontos része, mivel adatszerződésként szolgál a modell és a modellt futtató kiszolgáló között. A modellajánlással elemezhető és kényszeríthető a modell bemeneti típusai az üzembe helyezéskor. Ha rendelkezésre áll aláírás, az MLflow kényszeríti a bemeneti típusokat, amikor adatokat küld a modellnek. További információ: MLflow-aláírás kényszerítése.

Az aláírások akkor jelennek meg, amikor a modellek naplózásra kerülnek, és a fájl szakaszában signatureMLmodel megmaradnak. Az MLflow autolog funkciója automatikusan az aláírásokat a lehető legjobb módon vonja le. Előfordulhat azonban, hogy manuálisan kell naplóznia a modelleket, ha a következtetett aláírások nem a szükségesek. További információ: Modellek naplózása aláírásokkal.

Kétféle aláírás létezik:

  • Oszlopalapú aláírás: Ez az aláírás táblázatos adatokon működik. Az ilyen típusú aláírással rendelkező modellek esetében az MLflow bemenetként látja el pandas.DataFrame az objektumokat.
  • Tensor-alapú aláírás: Ez az aláírás n dimenziós tömbökkel vagy tenzorokkal működik. Az ilyen aláírással rendelkező modellek esetében az MLflow bemenetként (vagy numpy.ndarray a nevesített tenzorok esetében szótárként) szolgálnumpy.ndarray.

Az alábbi példa egy számítógépes látásmodellnek felel meg, amely betanított.fastai Ez a modell kap egy kötegnyi képet, amely alakzatok (300, 300, 3) tenzoraként jelenik meg az RGB-ábrázolásukkal (aláíratlan egész számok). A modell két osztályhoz tartozó előrejelzési kötegeket (valószínűségeket) ad ki.

MLmodel

signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Tipp.

Az Azure Machine Tanulás létrehoz egy Swagger-fájlt egy MLflow-modell üzembe helyezéséhez egy elérhető aláírással. Így egyszerűbben tesztelheti az üzembe helyezéseket az Azure Machine Tanulás studióval.

Modellkörnyezet

A futtatandó modell követelményei a conda.yaml fájlban vannak megadva. Az MLflow automatikusan észleli a függőségeket, vagy manuálisan jelezheti őket a mlflow.<flavor>.log_model() metódus meghívásával. Ez utóbbi akkor lehet hasznos, ha a környezetében található kódtárak nem azok, amelyeket használni szeretne.

Az alábbi kód egy példa a keretrendszerrel fastai létrehozott modellhez használt környezetre:

conda.yaml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - astunparse==1.6.3
  - cffi==1.15.0
  - configparser==3.7.4
  - defusedxml==0.7.1
  - fastai==2.4.1
  - google-api-core==2.7.1
  - ipython==8.2.0
  - psutil==5.9.0
name: mlflow-env

Megjegyzés:

Mi a különbség az MLflow-környezet és az Azure Machine Tanulás környezet között?

Míg egy MLflow-környezet a modell szintjén működik, az Azure Machine Tanulás környezet a munkaterület szintjén (regisztrált környezetek esetén) vagy a feladatok/üzembe helyezések szintjén (névtelen környezetek esetén) működik. Ha MLflow-modelleket helyez üzembe az Azure Machine Tanulás, a modell környezete létrejön, és az üzembe helyezéshez használatos. Másik lehetőségként felülbírálhatja ezt a viselkedést az Azure Machine Tanulás CLI 2-vel, és MLflow-modelleket helyezhet üzembe egy adott Azure Machine Tanulás-környezettel.

Függvény előrejelzése

Minden MLflow-modell tartalmaz egy függvényt predict . Ezt a függvényt akkor hívjuk meg, ha a modell üzembe helyezése kód nélküli üzembe helyezési felülettel történik. A predict függvény eredménye (például osztályok, valószínűségek vagy előrejelzés) a betanításhoz használt keretrendszertől (vagyis az íztől) függ. Olvassa el az egyes ízek dokumentációját, hogy megtudja, mit térnek vissza.

Ugyanezekben az esetekben előfordulhat, hogy testre kell szabnia ezt a predict függvényt a következtetés végrehajtásának módosításához. Ilyen esetekben más viselkedésű modelleket kell naplóznia az előrejelzési módszerben, vagy naplóznia kell egy egyéni modell ízét.

Munkafolyamatok MLflow-modellek betöltéséhez

Az MLflow-modellként létrehozott modelleket több helyről is betöltheti, például:

  • közvetlenül abból a futtatásból, ahol a modelleket naplózták
  • a fájlrendszerből, ahol a modellek mentésre kerülnek
  • a modellregisztrációs adatbázisból, ahol a modellek regisztrálva vannak.

Az MLflow konzisztens módon tölti be ezeket a modelleket a helytől függetlenül.

A modellek betöltéséhez két munkafolyamat érhető el:

  • Töltse vissza ugyanazokat az objektumokat és típusokat, amelyeket naplózott: A modelleket az MLflow SDK használatával töltheti be, és beszerezheti a modell egy példányát a betanítási kódtárhoz tartozó típusokkal. Egy ONNX-modell például egy ModelProto ideig egy scikit-learn használatával betanított döntésifa-modellt ad vissza.DecisionTreeClassifier Ugyanazzal mlflow.<flavor>.load_model() a modellobjektummal és a naplózott típusokkal tölthető be.

  • Töltsön vissza egy modellt a következtetés futtatásához: Az MLflow SDK-val tölthet be modelleket, és beszerezhet egy burkolót, ahol az MLflow garantálja, hogy lesz függvény predict . Nem számít, hogy milyen ízt használ, minden MLflow-modellnek van függvénye predict . Továbbá az MLflow garantálja, hogy ez a függvény meghívható a típus pandas.DataFrameargumentumaival numpy.ndarray, vagy dict[string, numpyndarray] (a modell aláírásától függően). Az MLflow kezeli a modell által várt bemeneti típusra való típusátalakítást. A modell terhelésének visszatöltésére használható mlflow.pyfunc.load_model() a következtetés futtatásához.