MLflow-modellek üzembe helyezése és futtatása Spark-feladatokban
Ebből a cikkből megtudhatja, hogyan helyezheti üzembe és futtathatja az MLflow-modellt Spark-feladatokban, hogy következtetéseket hajthat végre nagy mennyiségű adat vagy adatátrendező feladatok részeként.
A példa ismertetése
Ez a példa bemutatja, hogyan helyezhet üzembe egy Azure Machine-Tanulás regisztrált MLflow-modellt felügyelt Spark-fürtökben (előzetes verzió), Azure Databricksben vagy Azure Synapse Analyticsben futó Spark-feladatokra, hogy nagy mennyiségű adatra következtethessenek.
A modell az UCI szívbetegségek adatkészletén alapul. Az adatbázis 76 attribútumot tartalmaz, de 14 részhalmazt használunk. A modell megpróbálja megjósolni a szívbetegség jelenlétét egy betegben. Az egész szám értéke 0 (nincs jelenlét) és 1 (jelenlét). A betanítás egy XGBBoost
osztályozóval történt, és az összes szükséges előfeldolgozás folyamatként scikit-learn
lett csomagolva, így ez a modell egy teljes körű folyamat, amely a nyers adatoktól az előrejelzésekig tart.
A cikkben szereplő információk az azureml-examples adattárban található kódmintákon alapulnak . Ha helyileg szeretné futtatni a parancsokat fájlok másolása/beillesztése nélkül, klónozza az adattárat, majd módosítsa a könyvtárakat a következőre sdk/using-mlflow/deploy
: .
git clone https://github.com/Azure/azureml-examples --depth 1
cd sdk/python/using-mlflow/deploy
Előfeltételek
A cikkben ismertetett lépések végrehajtása előtt győződjön meg arról, hogy rendelkezik a következő előfeltételekkel:
Telepítse az MLflow SDK-csomagot
mlflow
és az Azure Machine Tanulás beépülő modult az MLflow-hozazureml-mlflow
.pip install mlflow azureml-mlflow
Tipp.
Használhatja a
mlflow-skinny
csomagot, amely egy egyszerű MLflow-csomag SQL Storage, kiszolgáló, felhasználói felület vagy adatelemzési függőségek nélkül.mlflow-skinny
Azoknak a felhasználóknak ajánlott, akiknek elsősorban az MLflow nyomkövetési és naplózási képességeire van szükségük anélkül, hogy importálni kellene a teljes szolgáltatáscsomagot, beleértve az üzembe helyezéseket is.Egy Azure Machine Learning-munkaterület. Létrehozhat egyet a Gépi tanulási erőforrások létrehozása oktatóanyagot követve.
- Megtekintheti, hogy milyen hozzáférési engedélyekre van szüksége az MLflow-műveletek munkaterületen való végrehajtásához.
Ha távoli nyomkövetést végez (vagyis az Azure Machine Tanulás kívül futó nyomkövetési kísérleteket), az MLflow konfigurálása az Azure Machine Tanulás-munkaterület nyomon követésére mutató URI-jára mutat. További információ az MLflow munkaterülethez való csatlakoztatásáról: MLflow konfigurálása az Azure Machine Tanulás.
- A munkaterületen MLflow-modellnek kell lennie. Ez a példa különösen a Diabetes-adatkészlethez betanított modellt fogja regisztrálni.
Csatlakozás a munkaterülethez
Először csatlakozzunk az Azure Machine Tanulás munkaterülethez, ahol a modell regisztrálva van.
A nyomkövetés már konfigurálva van. Az alapértelmezett hitelesítő adatok az MLflow használatakor is használhatók.
A modell regisztrálása
A következtetés végrehajtásához egy, az Azure Machine Tanulás beállításjegyzékében regisztrált modellre van szükségünk. Ebben az esetben már van egy helyi példánya a modellnek az adattárban, ezért csak a munkaterületen lévő beállításjegyzékben kell közzétenni a modellt. Ezt a lépést kihagyhatja, ha az üzembe helyezni kívánt modell már regisztrálva van.
model_name = 'heart-classifier'
model_local_path = "model"
registered_model = mlflow_client.create_model_version(
name=model_name, source=f"file://{model_local_path}"
)
version = registered_model.version
Ha a modellt futtatás közben naplózták, közvetlenül is regisztrálhatja.
Tipp.
A modell regisztrálásához ismernie kell a modell tárolási helyét. Ha az MLflow szolgáltatást használja autolog
, az elérési út a használt modell típusától és keretrendszerétől függ. Javasoljuk, hogy ellenőrizze a feladatok kimenetét, hogy azonosítsa a mappa nevét. Megkeresheti azt a mappát, amely egy nevű MLModel
fájlt tartalmaz. Ha manuálisan log_model
naplózja a modelleket, akkor az elérési út az az argumentum, amelyet az ilyen metódusnak ad át. Ha például naplózza a modellt a használatával mlflow.sklearn.log_model(my_model, "classifier")
, akkor a rendszer a modell tárolási útvonalát használja classifier
.
model_name = 'heart-classifier'
registered_model = mlflow_client.create_model_version(
name=model_name, source=f"runs://{RUN_ID}/{MODEL_PATH}"
)
version = registered_model.version
Feljegyzés
Az elérési út MODEL_PATH
az a hely, ahol a modellt futtatáskor tárolták.
Bemeneti adatok lekérése pontszámhoz
Szükségünk lesz néhány bemeneti adatra a futtatáshoz vagy a feladatok futtatásához. Ebben a példában letöltjük a mintaadatokat az internetről, és a Spark-fürt által használt megosztott tárolóba helyezzük.
import urllib
urllib.request.urlretrieve("https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv", "/tmp/data")
Helyezze át az adatokat egy csatlakoztatott tárfiókba, amely a teljes fürt számára elérhető.
dbutils.fs.mv("file:/tmp/data", "dbfs:/")
Fontos
Az előző kód az Azure Databricks-fürtben elérhető eszközt használja dbutils
. A használt platformtól függően használja a megfelelő eszközt.
A bemeneti adatok ezután a következő mappába kerülnek:
input_data_path = "dbfs:/data"
A modell futtatása Spark-fürtökben
A következő szakasz bemutatja, hogyan futtathat Azure Machine-Tanulás Spark-feladatokban regisztrált MLflow-modelleket.
Győződjön meg arról, hogy a következő kódtárak vannak telepítve a fürtben:
- mlflow<3,>=2.1 - cloudpickle==2.2.0 - scikit-learn==1.2.0 - xgboost==1.7.2
Egy jegyzetfüzet segítségével bemutatjuk, hogyan hozhat létre pontozási rutint egy Azure Machine-Tanulás regisztrált MLflow-modellel. Hozzon létre egy jegyzetfüzetet, és használja a PySparkot alapértelmezett nyelvként.
Importálja a szükséges névtereket:
import mlflow import pyspark.sql.functions as f
Konfigurálja a modell URI-t. Az alábbi URI egy, a legújabb verzióban elnevezett
heart-classifier
modellt hoz létre.model_uri = "models:/heart-classifier/latest"
Töltse be a modellt UDF-függvényként. A felhasználó által definiált függvény (UDF) egy felhasználó által definiált függvény, amely lehetővé teszi az egyéni logika újbóli használatát a felhasználói környezetben.
predict_function = mlflow.pyfunc.spark_udf(spark, model_uri, result_type='double')
Tipp.
Az argumentum
result_type
segítségével szabályozhatja a függvény által visszaadott típustpredict()
.Olvassa el a pontozáshoz használni kívánt adatokat:
df = spark.read.option("header", "true").option("inferSchema", "true").csv(input_data_path).drop("target")
Esetünkben a bemeneti adatok formátuma
CSV
és a mappábadbfs:/data/
kerül. Az oszlopottarget
is elvetjük, mivel ez az adatkészlet tartalmazza az előrejelezendő célváltozót. Éles helyzetekben az adatok nem rendelkeznek ezzel az oszloppal.Futtassa a függvényt
predict_function
, és helyezze az előrejelzéseket egy új oszlopra. Ebben az esetben az előrejelzéseket az oszlopbapredictions
helyezzük.df.withColumn("predictions", score_function(*df.columns))
Tipp.
A
predict_function
fogadás argumentumként a szükséges oszlopokat foglalja össze. Esetünkben az adatkeret összes oszlopát a modell elvárja, ezértdf.columns
használja. Ha a modellnek szüksége van az oszlopok egy részhalmazára, manuálisan is bevezetheti őket. Ha a modell rendelkezik aláírással, a típusoknak kompatibilisnek kell lenniük a bemenetek és a várt típusok között.Az előrejelzéseket visszaírhatja a tárolóba:
scored_data_path = "dbfs:/scored-data" scored_data.to_csv(scored_data_path)
A modell futtatása önálló Spark-feladatban az Azure Machine Tanulás
Az Azure Machine Tanulás támogatja az önálló Spark-feladat létrehozását, valamint az Azure Machine Tanulás folyamatokban használható újrafelhasználható Spark-összetevő létrehozását. Ebben a példában üzembe helyezünk egy hatókörkezelési feladatot, amely az Azure Machine Tanulás önálló Spark-feladatban fut, és egy MLflow-modellt futtat a következtetés végrehajtásához.
Feljegyzés
Az Azure Machine-Tanulás Spark-feladatokról az Azure Machine Tanulás Spark-feladatok elküldése (előzetes verzió) című témakörben olvashat bővebben.
A Spark-feladatokhoz argumentumokat tartalmazó Python-szkript szükséges. Pontozószkript létrehozása:
score.py
import argparse parser = argparse.ArgumentParser() parser.add_argument("--model") parser.add_argument("--input_data") parser.add_argument("--scored_data") args = parser.parse_args() print(args.model) print(args.input_data) # Load the model as an UDF function predict_function = mlflow.pyfunc.spark_udf(spark, args.model, env_manager="conda") # Read the data you want to score df = spark.read.option("header", "true").option("inferSchema", "true").csv(input_data).drop("target") # Run the function `predict_function` and place the predictions on a new column scored_data = df.withColumn("predictions", score_function(*df.columns)) # Save the predictions scored_data.to_csv(args.scored_data)
A fenti szkript három argumentumot
--model
--input_data
--scored_data
és . Az első kettő bemenet, és a futtatni kívánt modellt és a bemeneti adatokat jelöli, az utolsó egy kimenet, és ez az a kimeneti mappa, ahol az előrejelzések lesznek elhelyezve.Tipp.
Python-csomagok telepítése: Az előző pontozó szkript betölti az MLflow-modellt egy UDF-függvénybe, de a paramétert
env_manager="conda"
jelzi. Ha ez a paraméter be van állítva, az MLflow visszaállítja a modelldefinícióban megadott szükséges csomagokat egy elszigetelt környezetben, ahol csak az UDF-függvény fut. További részletekért lásd a dokumentációtmlflow.pyfunc.spark_udf
.Feladatdefiníció létrehozása:
mlflow-score-spark-job.yml
$schema: http://azureml/sdk-2-0/SparkJob.json type: spark code: ./src entry: file: score.py conf: spark.driver.cores: 1 spark.driver.memory: 2g spark.executor.cores: 2 spark.executor.memory: 2g spark.executor.instances: 2 inputs: model: type: mlflow_model path: azureml:heart-classifier@latest input_data: type: uri_file path: https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv mode: direct outputs: scored_data: type: uri_folder args: >- --model ${{inputs.model}} --input_data ${{inputs.input_data}} --scored_data ${{outputs.scored_data}} identity: type: user_identity resources: instance_type: standard_e4s_v3 runtime_version: "3.2"
Tipp.
Csatolt Synapse Spark-készlet használatához tulajdonság helyett
resources
a fenti YAML-specifikációs mintafájlban definiáljoncompute
tulajdonságot.A fent látható YAML-fájlok a
az ml job create
paraméterrel--file
együtt használhatók önálló Spark-feladat létrehozásához a következő módon:az ml job create -f mlflow-score-spark-job.yml