Хорошо, поэтому подход, описанный в этом ответе с лучом, работал.
Создал такой класс, который загружает модель при инициализации и предоставляет функцию run
для выполнения прогнозирования :
import tensorflow as tf
import ray
ray.init()
@ray.remote
class MyModel(object):
def __init__(self, field, saved_model_path):
self.field = field
# load the model once in the constructor
self.predictor_fn = tf.contrib.predictor.from_saved_model(saved_model_path)
def run(self, df_feature, *args):
# ...
# code to perform prediction using self.predictor_fn
# ...
return self.field, list_pred_string, list_pred_proba
Затем использовал приведенное выше в основном модуле как:
# form a dictionary with key 'field' and value MyModel
model_dict = {}
for field in fields:
export_dir = f"saved_model/{field}"
subdirs = [x for x in Path(export_dir).iterdir()
if x.is_dir() and 'temp' not in str(x)]
latest = str(sorted(subdirs)[-1])
model_dict[field] = MyModel.remote(field, latest)
Затем использовал приведенный выше словарь моделей для таких прогнозов:
results = ray.get([model_dict[field].run.remote(df_feature) for field in fields])
Обновление:
Хотя этот подход работает, было обнаружено, что запуск оценщиков параллельно с многопроцессорной обработкой выполняется быстрее, чем запуск предикторов параллельно с Ray. Это особенно актуально для документов больших размеров. Похоже, что подход предиктора может хорошо работать для небольшого количества измерений и когда входные данные невелики. Возможно, подход, подобный упомянутому здесь , может быть лучше для нашего варианта использования.