Share via


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.

  • 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ű MLModelfájlt tartalmaz. Ha manuálisan log_modelnapló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.

  1. 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
    
  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.

  3. Importálja a szükséges névtereket:

    import mlflow
    import pyspark.sql.functions as f
    
  4. 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"
    
  5. 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ípust predict() .

  6. 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ába dbfs:/data/kerül. Az oszlopot target 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.

  7. Futtassa a függvényt predict_function , és helyezze az előrejelzéseket egy új oszlopra. Ebben az esetben az előrejelzéseket az oszlopba predictionshelyezzü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ért df.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.

  8. 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.

  1. 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ót mlflow.pyfunc.spark_udf .

  2. 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áljon compute tulajdonságot.

  3. 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
    

Következő lépések