Моя стратегия оценки заключается в использовании набора моделей случайных лесов, каждая из которых касается некоторого подмножества данных (например, RF_A, если функция == A).Это было сказано в поисках завершенности, так как я не думаю, что это повлияет на мою проблему.
Моя стратегия развертывания:
- Fit: вернуть рассол, содержащий словарь подходящих sklearn моделей Random Forest
- Развернуть: загрузить эти словари в память.
- Вывод: 1) сопоставляет каждое наблюдение с правильной моделью в уже загруженном словаре 2) для каждого наблюдения вычисляет прогнозы, данные каждым деревом в порядкедля расчета элементарного доверительного интервала http://blog.datadive.net/prediction-intervals-for-random-forests/ Обратите внимание, что эта последняя операция занимает больше всего времени в выводе, и время пропорционально количеству деревьев в моем RF (loop wrt trees).
Мой код (мой пользовательский код в lib):
import argparse
import os
import sys
import pandas as pd
from sklearn.externals import joblib
module_path = os.path.abspath('/opt/ml/code')
if module_path not in sys.path:
sys.path.append(module_path)
from lib import training, prediction
from data.transactions import raw
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--output-data-dir', type=str, default=os.environ['SM_OUTPUT_DATA_DIR'])
parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
args = parser.parse_args()
grid_models_dict =\
training.train_models_in_dict(raw_training_data=raw)
joblib.dump(grid_models_dict, os.path.join(args.model_dir, "model"))
def model_fn(model_dir):
grid_models_dict = joblib.load(os.path.join(model_dir, "model"))
return grid_models_dict
def predict_fn(input_data, model):
predicted = prediction.predict(input_data, model)
return predicted
Моя проблема:
Скажем, у меня есть два сценария развертывания: один с 100 деревьями / RF и один с 300 деревьями/RF.
Подгонка выполняется без проблем.На S3: сжатые 100 деревьев / РЧ-рассол - 261 Мо и сжатые 300 деревьев / РЧ - 784 Мо.
Развертывание выполняется с некоторыми проблемами: некоторый тайм-аут с некоторыми рабочими с 300 деревьями / РЧ уже сообщалосьawslabs / amazon-sagemaker-examples # 556, но он разворачивается в конце.
Прогноз выполняется:
- с 100 деревьями / RF за 500 мс, всегда, сто же самое наблюдение
с 300 деревьями / RF: на бумаге, с тем же наблюдением, из-за моей природы предсказания, которая является для петли относительно деревьев, я должен был предсказать менее чем за 1 секунду.
с 300 деревьями / РФ, на практике с одним и тем же наблюдением: 1) иногда (33% случаев) за 700 мс, 2) иногда (33% случаев) вОт 40 до 50 секунд, 3) и иногда (в 33% случаев) возникает ошибка тайм-аута (тайм-аут вывода ограничен 60 секундами)
Такое поведение сохраняется при развертывании в большем/ недавняя машина.(ml.t2.xlarge to ml.c5.4xlarge)
Я предполагаю, что существует механизм перестановки памяти или что память контейнера не полностью выделена мне лично после определенного порога.
Есть ли какое-либо решение для последовательного прогнозирования с более чем 100деревьями / RF?
Заранее спасибо.
О проблеме также сообщалось здесь: https://github.com/aws/sagemaker-python-sdk/issues/681