Цель моего проекта - развернуть API машинного обучения на AWS Lambda и AWS API Gateway с использованием AWS EC2, чтобы получить необходимую вычислительную мощность для обучения некоторым моделям машинного обучения, а сейчас давайте предположим, что я ' Я тестирую свой проект на своем локальном Windows ноутбуке.
Я пытаюсь запустить простой проект машинного обучения, используя Zappa для Python, используя следующий учебник: https://medium.com/@patrickmichelberger / how -в-Deploy-а-бессерверной-машина обучения-microservice-с- aws -lambda- aws -api-шлюз-и-d5b8cbead846 . Мой файл app.py выглядит следующим образом:
from flask import Flask, request, json
import boto3
import pickle
BUCKET_NAME = 'my-bucket'
MODEL_FILE_NAME = 'model.pkl'
app = Flask(__name__)
S3 = boto3.client('s3', region_name='us-east-2')
def load_model(key):
# Load model from S3 bucket
response = S3.get_object(Bucket=BUCKET_NAME, Key=key)
# Load pickle model
model_str = response['Body'].read()
model = pickle.loads(model_str)
return model
@app.route('/', methods=['POST'])
def index():
# Parse request body for model input
body_dict = request.get_json(silent=True)
data = body_dict['data']
# Load model
model = load_model(MODEL_FILE_NAME)
# Make prediction
prediction = model.predict(data).tolist()
# Respond with prediction result
result = {'prediction': prediction}
return json.dumps(result)
if __name__ == '__main__':
# listen on all IPs
app.run(host='0.0.0.0')
Существует блокнот main.ipynb, который прогнозирует результаты для набора данных iris.
from sklearn import datasets
from sklearn.ensemble import GradientBoostingClassifier
import pickle
# import data
iris = datasets.load_iris()
X = iris.data[:, :2] # we only take the first two features.
Y = iris.target
# init model
clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=2, random_state=0)
# fit model
clf.fit(X, Y)
# save model
with open('model.pkl','wb') as fout:
pickle.dump(clf,fout)
И, наконец, у меня есть настройка virtualenv со всеми необходимыми библиотеками, включая Zappa.
Выходная модель (model.pkl) загружается в мое собственное хранилище S3 с помощью командной строки Windows. Когда я запускаю flask запускаю и отправляю запрос, модель прогнозирует и возвращает выходные данные без каких-либо проблем.
Так что, пока это работает, я решил попробовать загрузить модель в Lambda и API Gateway с использованием Zappa (я уже установил свои AWS учетные данные с помощью библиотеки awscli). Заппа развертывает эту функцию без каких-либо проблем, но когда я пытаюсь использовать Postman для отправки POST-запроса на сервер, я получаю ошибку 500. В частности, когда я получаю доступ к журналам Cloudwatch, я вижу следующую ошибку:
ValueError: Несоответствие типа буфера, ожидаемое SIZE_t, но полученное значение int
Это происходит в: model = pickle.loads (model_str) .
Теперь я много отлаживал и видел много вопросов о стековом потоке по этой проблеме (где в большинстве случаев ошибка отсутствует ' ожидал SIZE_t, но получил int ', но' ожидал SIZE_t, но получил long long '), и я продолжаю слышать, что это из-за различий в архитектуре ЦП и способе генерации и загрузки моделей. Но тогда мой вопрос (если мы не можем решить эту ошибку): как мы можем сохранить модели на вычислительном экземпляре и запустить их в производство, используя Lambda и API Gateway (или любой другой продукт, обслуживающий API), не беспокоясь о проблемах архитектуры