Od artefaktů po modely v MLflow

Následující článek vysvětluje rozdíly mezi artefaktem MLflow a modelem MLflow a postupem přechodu z jednoho na druhý. Vysvětluje také, jak Azure Machine Učení používá koncept modelu MLflow k umožnění zjednodušených pracovních postupů nasazení.

Jaký je rozdíl mezi artefaktem a modelem?

Pokud MLflow neznáte, možná si nejste vědomi rozdílu mezi artefakty protokolování nebo soubory a protokolováním modelů MLflow. Mezi těmito dvěma způsoby jsou některé základní rozdíly:

Artefakt

Artefakt je libovolný soubor vygenerovaný (a zachycený) ze spuštění nebo úlohy experimentu. Artefakt může představovat model serializovaný jako soubor pickle, váhy modelu PyTorch nebo TensorFlow nebo dokonce textový soubor obsahující koeficienty lineární regrese. Některé artefakty také nemusí mít nic společného se samotným modelem; Místo toho mohou obsahovat konfigurace pro spuštění modelu nebo předběžné zpracování informací nebo ukázkových dat atd. Artefakty můžou být v různých formátech.

Možná jste už artefakty protokolování:

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

mlflow.log_artifact(filename)

Model

Model v MLflow je také artefakt. Nicméně, děláme silnější předpoklady o tomto typu artefaktu. Takové předpoklady poskytují jasný kontrakt mezi uloženými soubory a tím, co znamenají. Při protokolování modelů jako artefaktů (jednoduchých souborů) potřebujete vědět, co tvůrce modelů pro každý z těchto souborů znamenal, abyste věděli, jak model načíst pro odvozování. Naopak modely MLflow lze načíst pomocí kontraktu zadaného ve formátu MLmodel.

V azure Machine Učení mají modely protokolování následující výhody:

  • Můžete je nasadit do koncových bodů v reálném čase nebo dávkovém režimu bez poskytnutí hodnoticího skriptu nebo prostředí.
  • Při nasazování modelů mají nasazení automaticky vygenerovaný swagger a funkci Test je možné použít v studio Azure Machine Learning.
  • Modely můžete použít přímo jako vstupy kanálu.
  • Řídicí panel Zodpovědné AI můžete použít s vašimi modely.

Modely můžete protokolovat pomocí sady MLflow SDK:

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

Formát MLmodel

MLflow přijímá formát MLmodel jako způsob, jak vytvořit kontrakt mezi artefakty a tím, co představují. Formát MLmodel ukládá prostředky do složky. Mezi těmito prostředky je soubor s názvem MLmodel. Tento soubor je jediným zdrojem pravdy o tom, jak lze model načíst a použít.

Následující snímek obrazovky ukazuje ukázkovou složku modelu MLflow v studio Azure Machine Learning. Model se umístí do složky s názvem credit_defaults_model. Pro pojmenování této složky neexistuje žádný konkrétní požadavek. Složka obsahuje MLmodel soubor mimo jiné artefakty modelu.

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

Následující kód je příkladem toho, jak MLmodel může vypadat soubor pro model počítačového zpracování obrazu natrénovaný fastai pomocí:

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]}
            }]'

Varianty modelů

Vzhledem k velkému počtu architektur strojového učení, které lze použít, MLflow zavedl koncept příchutě jako způsob, jak poskytnout jedinečný kontrakt pro práci napříč všemi architekturami strojového učení. Příchuť označuje, co očekávat pro daný model vytvořený pomocí konkrétní architektury. TensorFlow má například vlastní příchuť, která určuje, jak se má model TensorFlow zachovat a načíst. Vzhledem k tomu, že každá varianta modelu označuje, jak zachovat a načíst model pro danou architekturu, formát MLmodel nevynucuje jediný mechanismus serializace, který musí podporovat všechny modely. Toto rozhodnutí umožňuje jednotlivým variantám používat metody, které poskytují nejlepší výkon nebo nejlepší podporu podle jejich osvědčených postupů – bez ohrožení kompatibility se standardem MLmodel.

Následující kód je příkladem oddílu flavors modelu 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

Podpis modelu

Podpis modelu v MLflow je důležitou součástí specifikace modelu, protože slouží jako datový kontrakt mezi modelem a serverem, na kterém je model spuštěný. Podpis modelu je také důležitý pro analýzu a vynucování vstupních typů modelu v době nasazení. Pokud je podpis dostupný, MLflow vynucuje při odeslání dat do modelu vstupní typy. Další informace najdete v tématu Vynucení podpisu MLflow.

Podpisy se označují, když se modely zaprotokolují a jsou trvalé v signature části MLmodel souboru. Funkce autologu v MLflow automaticky odvozuje podpisy nejlepším způsobem. Modely ale budete muset protokolovat ručně, pokud odvozené podpisy nejsou ty, které potřebujete. Další informace naleznete v tématu Jak protokolovat modely s podpisy.

Existují dva typy podpisů:

  • Podpis založený na sloupcích: Tento podpis pracuje s tabulkovou daty. Pro modely s tímto typem podpisu poskytuje pandas.DataFrame MLflow objekty jako vstupy.
  • Podpis založený na tensoru: Tento podpis funguje s ndimenzionálními poli nebo tensory. Pro modely s tímto podpisem MLflow dodává numpy.ndarray vstupy (nebo slovník numpy.ndarray v případě pojmenovaných tensorů).

Následující příklad odpovídá modelu počítačového zpracování obrazu natrénovaného fastaipomocí . Tento model obdrží dávku obrázků reprezentovaných jako tensory obrazce (300, 300, 3) s reprezentací RGB (bez znaménka celých čísel). Model vypíše dávky předpovědí (pravděpodobností) pro dvě třídy.

MLmodel

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

Tip

Azure Machine Učení vygeneruje soubor swaggeru pro nasazení modelu MLflow s dostupným podpisem. To usnadňuje testování nasazení pomocí studio Azure Machine Learning.

Modelové prostředí

V souboru se zadají conda.yaml požadavky na spuštění modelu. MLflow dokáže automaticky rozpoznat závislosti nebo je můžete ručně označit voláním mlflow.<flavor>.log_model() metody. To druhé může být užitečné, pokud knihovny zahrnuté ve vašem prostředí nejsou ty, které jste chtěli použít.

Následující kód je příkladem prostředí použitého pro model vytvořený pomocí fastai architektury:

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

Poznámka:

Jaký je rozdíl mezi prostředím MLflow a prostředím azure Machine Učení?

Zatímco prostředí MLflow funguje na úrovni modelu, prostředí Azure Machine Učení funguje na úrovni pracovního prostoru (pro registrovaná prostředí) nebo úlohy nebo nasazení (pro anonymní prostředí). Když nasadíte modely MLflow ve službě Azure Machine Učení, prostředí modelu se sestaví a použije k nasazení. Toto chování můžete také přepsat pomocí Azure Machine Učení CLI v2 a nasadit modely MLflow pomocí konkrétního prostředí azure machine Učení.

Predikce funkce

Všechny modely MLflow obsahují predict funkci. Tato funkce se volá, když se model nasadí pomocí prostředí bez nasazení kódu. predict To, co funkce vrátí (například třídy, pravděpodobnosti nebo prognózu), závisí na rozhraní (tj. příchutě) použitém pro trénování. Přečtěte si dokumentaci jednotlivých příchutí, abyste věděli, co vrací.

Ve stejných případech může být potřeba přizpůsobit tuto predict funkci, aby se změnil způsob, jakým se odvozuje. V takových případech potřebujete protokolovat modely s jiným chováním v predikční metodě nebo protokolovat příchuť vlastního modelu.

Pracovní postupy pro načítání modelů MLflow

Modely vytvořené jako modely MLflow můžete načíst z několika umístění, mezi které patří:

  • přímo ze spuštění, ve kterém byly modely zaprotokolovány
  • ze systému souborů, kde jsou modely uloženy
  • z registru modelů, ve kterém jsou modely registrovány.

MLflow poskytuje konzistentní způsob, jak tyto modely načíst bez ohledu na umístění.

Pro načítání modelů jsou k dispozici dva pracovní postupy:

  • Načtěte zpět stejný objekt a typy, které byly zaznamenány: Pomocí sady MLflow SDK můžete načíst modely a získat instanci modelu s typy patřícími do trénovací knihovny. Například model ONNX vrací ModelProto nějakou dobu, kdy model rozhodovacího stromu natrénovaný pomocí scikit-learn vrátí DecisionTreeClassifier objekt. Slouží mlflow.<flavor>.load_model() k načtení stejného objektu modelu a typů, které byly zaznamenány.

  • Načtení zpět modelu pro spuštění odvozování: Modely můžete načíst pomocí sady MLflow SDK a získat obálku, kde MLflow zaručuje, že bude predict funkce. Nezáleží na tom, jakou příchuť používáte, každý model MLflow má predict funkci. MLflow navíc zaručuje, že tuto funkci lze volat pomocí argumentů typu pandas.DataFrame, numpy.ndarraynebo dict[string, numpyndarray] (v závislosti na podpisu modelu). MLflow zpracovává převod typu na vstupní typ, který model očekává. Slouží mlflow.pyfunc.load_model() k načtení modelu pro spuštění odvozování.