ONNX tutorial with TensorFlow
Install necessary libraries
import pandas as pd
import turboml as tb
!pip install -U tensorflow tf2onnx onnx==1.14.1 scikit-learn
Tensorflow - Standard Model Training
The following blocks of code define a standard tensorflow training code. This is completely independent of TurboML.
import tf2onnx.convert
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
transactions = pd.read_csv("data/transactions.csv").reset_index()
labels = pd.read_csv("data/labels.csv").reset_index()
joined_df = pd.merge(transactions, labels, on="index", how="right")
joined_df
X = joined_df.drop("is_fraud", axis=1)
numerical_fields = [
"transactionAmount",
"localHour",
"isProxyIP",
"digitalItemCount",
"physicalItemCount",
]
feats = X[numerical_fields]
targets = joined_df["is_fraud"].astype(int)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
feats, targets, test_size=0.2, random_state=42
)
model = Sequential()
model.add(Dense(64, activation="relu", input_shape=(X_train.shape[1],)))
model.add(Dense(64, activation="relu"))
model.add(Dense(2, activation="softmax"))
model.summary()
model.compile(
optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]
)
num_epochs = 10
model.fit(X_train, y_train, epochs=num_epochs, batch_size=64, verbose=1)
_, accuracy = model.evaluate(X_test, y_test)
print("Accuracy:", accuracy)
Export model to ONNX format
Exporting a model to ONNX format depends on the framework. Tutorials for different frameworks can be found at https://github.com/onnx/tutorials#converting-to-onnx-format (opens in a new tab)
onnx_model_path = "tensorflow_model.onnx"
input_signature = [
tf.TensorSpec([1, len(numerical_fields)], tf.float32, name="keras_tensor")
]
model.output_names = ["output"]
onnx_model, _ = tf2onnx.convert.from_keras(model, input_signature, opset=13)
onnx_model_bytes = onnx_model.SerializeToString()
Create an ONNX model with TurboML
Now that we've converted the model to ONNX format, we can deploy it with TurboML.
try:
transactions = tb.PandasDataset(
dataset_name="transactions_onnx_tf",
key_field="index",
dataframe=transactions,
upload=True,
)
except:
transactions = tb.PandasDataset(dataset_name="transactions_onnx_tf")
try:
labels = tb.PandasDataset(
dataset_name="labels", key_field="index", dataframe=labels, upload=True
)
except:
labels = tb.PandasDataset(dataset_name="labels")
features = transactions.get_input_fields(numerical_fields=numerical_fields)
label = labels.get_label_field(label_field="is_fraud")
tb.set_onnx_model("tensorflowmodel", onnx_model_bytes)
onnx_model = tb.ONNX(model_save_name="tensorflowmodel")
deployed_model = onnx_model.deploy("onnx_model_tf", input=features, labels=label)
deployed_model.add_metric("WindowedAUC")
model_auc_scores = deployed_model.get_evaluation("WindowedAUC")
plt.plot([model_auc_score.metric for model_auc_score in model_auc_scores])