Slackbot
10/04/2022, 4:57 PMTim Liu
10/04/2022, 5:15 PMTim Liu
10/04/2022, 5:16 PMShiva Charan Velichala
10/04/2022, 5:32 PMnontemporal_feature_dimension = 500
temporal_feature_dimension = 500 dataset = tf.data.Dataset.range(1)
dataset = dataset.map(lambda x: {"nontemporal_features": np.random.rand(1, nontemporal_feature_dimension),
"temporal_features": np.random.rand(1, np.random.randint(400, high=1000),
temporal_feature_dimension)})
Shiva Charan Velichala
10/04/2022, 5:44 PMShiva Charan Velichala
10/04/2022, 8:08 PMSean
10/04/2022, 9:51 PMShiva Charan Velichala
10/04/2022, 10:05 PMsaved_model = bentoml.tensorflow.save_model("lstm_bento", model)
print(f"Model saved: {saved_model}")
Shiva Charan Velichala
10/04/2022, 10:07 PMSean
10/04/2022, 11:42 PMShiva Charan Velichala
10/04/2022, 11:46 PMShiva Charan Velichala
10/05/2022, 2:47 PMShiva Charan Velichala
10/06/2022, 2:16 PMSean
10/06/2022, 5:39 PMShiva Charan Velichala
10/06/2022, 6:10 PMShiva Charan Velichala
10/06/2022, 6:10 PMShiva Charan Velichala
10/06/2022, 6:14 PMSean
10/06/2022, 6:37 PMShiva Charan Velichala
10/06/2022, 6:39 PMShiva Charan Velichala
10/06/2022, 9:24 PMSean
10/06/2022, 9:33 PMSean
10/06/2022, 11:59 PMSean
10/07/2022, 12:17 AMSean
10/07/2022, 1:00 AMtrain.py
, we made two changes.
1. Use bentoml.keras
instead of bentoml.tensorflow
module since the model is Keras
2. We commented out the metrics
argument in model.compile
since metrics doesn’t get saved and loaded well.
import timeit
start_time = timeit.default_timer()
import tensorflow as tf
import numpy as np
import bentoml
nontemporal_feature_dimension = 500
temporal_feature_dimension = 500
class PatientAUC(tf.keras.metrics.AUC):
def update_state(self, y_true, y_pred, sample_weight=None):
y_true = tf.reduce_any(y_true, axis=-1)
y_pred = tf.reduce_max(y_pred, axis=-2)
super().update_state(y_true, y_pred, sample_weight=None)
def build_model(nontemporal_feature_dimension, temporal_feature_dimension, hidden_size=64):
nontemporal_features = tf.keras.Input(shape=(nontemporal_feature_dimension), name="nontemporal_features")
temporal_features = tf.keras.Input(shape=(None, temporal_feature_dimension), name="temporal_features")
if nontemporal_feature_dimension == 0:
x = tf.keras.layers.LSTM(hidden_size, return_sequences=True)(temporal_features)
else:
nt_embed_h = tf.keras.layers.Dense(hidden_size)(nontemporal_features)
nt_embed_c = tf.keras.layers.Dense(hidden_size)(nontemporal_features)
initial_state = [nt_embed_h, nt_embed_c]
x = tf.keras.layers.LSTM(hidden_size, return_sequences=True)(temporal_features, initial_state=initial_state)
y = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(1, activation='sigmoid'))(x)
model = tf.keras.Model([nontemporal_features, temporal_features], y)
return model
model = build_model(nontemporal_feature_dimension, temporal_feature_dimension)
model.compile(
optimizer='adam',
loss='binary_crossentropy',
# metrics=[
# tf.keras.metrics.AUC(curve='ROC', name='AUROC'),
# tf.keras.metrics.AUC(curve='PR', name='AUPRC'),
# PatientAUC(curve='ROC', name='PatientAUROC'),
# PatientAUC(curve='PR', name='PatientAUPRC')
# ],
)
dataset = tf.data.Dataset.range(50)
dataset = dataset.map(lambda x: {"nontemporal_features": np.random.rand(1, nontemporal_feature_dimension),
"temporal_features": np.random.rand(1, np.random.randint(400, high=1000),
temporal_feature_dimension)})
start_time = timeit.default_timer()
# predictions = model.predict(dataset, batch_size=1, workers=64, use_multiprocessing=True)
# print(predictions)
elapsed = timeit.default_timer() - start_time
print(elapsed)
bentoml.keras.save_model(name="lstm_keras_test4", model=model, signatures={"predict": {"batchable": False}} )
# start_time = timeit.default_timer()
# for patient in feature_list:
# predictions = model.predict(dataset, batch_size=1, workers=1, use_multiprocessing=False)
Sean
10/07/2022, 1:18 AMservice.py
side, we have to make two changes.
1. Change the runner initialization to using bentoml.keras
instead of bentoml.tensorflow
2. Convert the input to Tensor type instead of the current example input.Shiva Charan Velichala
10/07/2022, 2:57 PMShiva Charan Velichala
10/07/2022, 2:57 PMSean
10/07/2022, 9:08 PMSean
10/10/2022, 10:30 PMShiva Charan Velichala
10/10/2022, 10:46 PMShiva Charan Velichala
10/11/2022, 5:50 PMShiva Charan Velichala
10/11/2022, 8:00 PMTim Liu
10/11/2022, 9:07 PMShiva Charan Velichala
10/11/2022, 9:09 PMTim Liu
10/11/2022, 9:11 PMTim Liu
10/11/2022, 9:12 PMShiva Charan Velichala
10/11/2022, 9:12 PMTim Liu
10/11/2022, 9:13 PMShiva Charan Velichala
10/11/2022, 9:20 PMShiva Charan Velichala
10/11/2022, 9:20 PMTim Liu
10/11/2022, 9:22 PMShiva Charan Velichala
10/11/2022, 9:26 PMTim Liu
10/11/2022, 9:36 PMShiva Charan Velichala
10/11/2022, 9:37 PMTim Liu
10/11/2022, 10:03 PMShiva Charan Velichala
10/11/2022, 10:04 PMTim Liu
10/11/2022, 10:09 PMShiva Charan Velichala
10/11/2022, 10:18 PMShiva Charan Velichala
10/11/2022, 10:18 PMTim Liu
10/11/2022, 11:21 PMmodel = bentoml.framework.load_model(model_tag)
model.predict(data)
runner = bentoml.framework.get(model_tag).to_runner()
runner.init_local()
runner.predict.run(data)
Try timing these 2 methods, if one or the other isn't about 30ms, I think we can narrow down where the issue isTim Liu
10/11/2022, 11:23 PMShiva Charan Velichala
10/12/2022, 2:13 PMShiva Charan Velichala
10/12/2022, 2:13 PMShiva Charan Velichala
10/12/2022, 2:13 PMShiva Charan Velichala
10/12/2022, 2:13 PMShiva Charan Velichala
10/12/2022, 2:37 PMTim Liu
10/12/2022, 4:55 PM