Κοινή χρήση μέσω


Συμπεραίωση ONNX στο Spark

Σε αυτό το παράδειγμα, εκπαιδεύετε ένα μοντέλο LightGBM και μετατρέπετε το μοντέλο σε μορφή ONNX . Μετά τη μετατροπή του, χρησιμοποιείτε το μοντέλο για να συμπεράνετε ορισμένα δεδομένα δοκιμής στο Spark.

Αυτό το παράδειγμα χρησιμοποιεί τα ακόλουθα πακέτα και εκδόσεις Python:

  • onnxmltools==1.7.0
  • lightgbm==3.2.1

Προαπαιτούμενα στοιχεία

  • Επισυνάψτε το σημειωματάριό σας σε ένα lakehouse. Στην αριστερή πλευρά, επιλέξτε Προσθήκη για να προσθέσετε μια υπάρχουσα λίμνη ή να δημιουργήσετε μια λίμνη.
  • Ίσως χρειαστεί να εγκαταστήσετε onnxmltools προσθέτοντας !pip install onnxmltools==1.7.0 ένα κελί κώδικα και, στη συνέχεια, εκτελώντας το κελί.

Φόρτωση του παραδείγματος δεδομένων

Για να φορτώσετε τα δεδομένα παραδείγματος, προσθέστε τα παρακάτω παραδείγματα κώδικα σε κελιά στο σημειωματάριό σας και, στη συνέχεια, εκτελέστε τα κελιά:

from pyspark.sql import SparkSession

# Bootstrap Spark Session
spark = SparkSession.builder.getOrCreate()

from synapse.ml.core.platform import *
df = (
    spark.read.format("csv")
    .option("header", True)
    .option("inferSchema", True)
    .load(
        "wasbs://publicwasb@mmlspark.blob.core.windows.net/company_bankruptcy_prediction_data.csv"
    )
)

display(df)

Το αποτέλεσμα θα πρέπει να μοιάζει με τον παρακάτω πίνακα, αν και οι τιμές και ο αριθμός των γραμμών μπορεί να διαφέρουν:

Αναλογία κάλυψης τόκων Σημαία καθαρού εισοδήματος Ίδια κεφάλαια προς ευθύνη
0.5641 1.0 0.0165
0.5702 1.0 0.0208
0.5673 1.0 0.0165

Χρήση LightGBM για την εκπαίδευση ενός μοντέλου

from pyspark.ml.feature import VectorAssembler
from synapse.ml.lightgbm import LightGBMClassifier

feature_cols = df.columns[1:]
featurizer = VectorAssembler(inputCols=feature_cols, outputCol="features")

train_data = featurizer.transform(df)["Bankrupt?", "features"]

model = (
    LightGBMClassifier(featuresCol="features", labelCol="Bankrupt?")
    .setEarlyStoppingRound(300)
    .setLambdaL1(0.5)
    .setNumIterations(1000)
    .setNumThreads(-1)
    .setMaxDeltaStep(0.5)
    .setNumLeaves(31)
    .setMaxDepth(-1)
    .setBaggingFraction(0.7)
    .setFeatureFraction(0.7)
    .setBaggingFreq(2)
    .setObjective("binary")
    .setIsUnbalance(True)
    .setMinSumHessianInLeaf(20)
    .setMinGainToSplit(0.01)
)

model = model.fit(train_data)

Μετατροπή του μοντέλου σε μορφή ONNX

Ο ακόλουθος κώδικας εξάγει το εκπαιδευμένο μοντέλο σε έναν προωθητή LightGBM και, στη συνέχεια, το μετατρέπει σε μορφή ONNX:

import lightgbm as lgb
from lightgbm import Booster, LGBMClassifier


def convertModel(lgbm_model: LGBMClassifier or Booster, input_size: int) -> bytes:
    from onnxmltools.convert import convert_lightgbm
    from onnxconverter_common.data_types import FloatTensorType

    initial_types = [("input", FloatTensorType([-1, input_size]))]
    onnx_model = convert_lightgbm(
        lgbm_model, initial_types=initial_types, target_opset=9
    )
    return onnx_model.SerializeToString()


booster_model_str = model.getLightGBMBooster().modelStr().get()
booster = lgb.Booster(model_str=booster_model_str)
model_payload_ml = convertModel(booster, len(feature_cols))

Μετά τη μετατροπή, φορτώστε το ωφέλιμο φορτίο ONNX σε ένα ONNXModel και εξετάστε τις εισόδους και εξόδους του μοντέλου:

from synapse.ml.onnx import ONNXModel

onnx_ml = ONNXModel().setModelPayload(model_payload_ml)

print("Model inputs:" + str(onnx_ml.getModelInputs()))
print("Model outputs:" + str(onnx_ml.getModelOutputs()))

Αντιστοιχίστε την είσοδο μοντέλου στο όνομα στήλης του πλαισίου δεδομένων εισόδου (FeedDict) και αντιστοιχίστε τα ονόματα στηλών του πλαισίου δεδομένων εξόδου στις εξόδους μοντέλου (FetchDict).

onnx_ml = (
    onnx_ml.setDeviceType("CPU")
    .setFeedDict({"input": "features"})
    .setFetchDict({"probability": "probabilities", "prediction": "label"})
    .setMiniBatchSize(5000)
)

Χρήση του μοντέλου για συμπεραίωση

Για την εκτέλεση συμπερασμάτων με το μοντέλο, ο ακόλουθος κώδικας δημιουργεί δεδομένα δοκιμής και μετασχηματίζει τα δεδομένα μέσω του μοντέλου ONNX.

from pyspark.ml.feature import VectorAssembler
import pandas as pd
import numpy as np

n = 1000 * 1000
m = 95
test = np.random.rand(n, m)
testPdf = pd.DataFrame(test)
cols = list(map(str, testPdf.columns))
testDf = spark.createDataFrame(testPdf)
testDf = testDf.union(testDf).repartition(200)
testDf = (
    VectorAssembler()
    .setInputCols(cols)
    .setOutputCol("features")
    .transform(testDf)
    .drop(*cols)
    .cache()
)

display(onnx_ml.transform(testDf))

Το αποτέλεσμα θα πρέπει να μοιάζει με τον παρακάτω πίνακα, αν και οι τιμές και ο αριθμός των γραμμών μπορεί να διαφέρουν:

Ευρετήριο Δυνατότητες Πρόβλεψη Πιθανότητα
1 "{"type":1,"values":[0.105... 0 "{"0":0.835...
2 "{"type":1,"values":[0.814... 0 "{"0":0.658...