У меня довольно сложная лямбда-функция AWS, которая загружает данные из сегмента S3, загружает обученную модель Keras из того же сегмента, использует модель для выполнения прогноза и отправляет этот прогноз обратно в другую лямбда-функцию. Это планируется запускать каждую минуту.
Я заметил, что заметил постоянное увеличение продолжительности функции, пока мой порог тайм-аута 10 секунд не достигнут. Затем функции снова запускаются в следующую минуту, выполнение снова приостанавливается примерно на 2 секунды и постепенно увеличивается, пока не истечет время ожидания.
Я не могу точно понять, что вызывает это (это не происходит ни с одной из моих других функций, включая те, которые также читают / пишут в S3), поэтому я в растерянности - и очень хотел бы исправить это если возможно. Я обновил вопрос, включив в него упрощенную версию кода, которая показана ниже:
import json
import os
import boto3
import numpy as np
import pandas as pd
import keras
from keras.models import Model, load_model
from keras.layers import Input, Dense, Flatten, Dropout
from keras.activations import sigmoid
from keras import initializers
from keras.optimizers import RMSprop
"""
.... functions for defining my ML model, loading & preparing data,
train/test split and prediction
"""
def handler(event, context):
"""
Returns a dict of expected returns per instrument
"""
## Initialise the connection to S3
s3 = boto3.resource('s3')
## Download the latest trained model from s3
s3.Object('data', 'Model.h5').download_file('/tmp/model.h5')
## Download latest data from s3
s3.Object('data', 'prices.csv').download_file('/tmp/prices.csv')
s3_data = pd.read_csv('/tmp/prices.csv',index_col='time')
## Load Data
X_train, Y_train, X_test, Y_test = load_data(filename='/tmp/prices.csv', Ys=instruments, test_size=1)
latest_data = X_test.tail(1) # Get most recent record
## Load model into Keras
model = load_model('/tmp/model.h5')
## Model Prediction
ys = predict_from_data(latest_data, model)
## Convert expected returns to dict
forecasts = pd.DataFrame( dict( {y:ys[:,i] for i,y in enumerate(instruments)}) )
return forecasts.to_dict(orient='records')[0]
В чем может быть причина, и какое может быть решение, чтобы предотвратить такое поведение? Могу ли я предотвратить повторное использование контейнера и каждый раз принудительно запускать холодный запуск (и, если возможно, действительно ли это будет наилучшим способом оптимизации производительности?)