ValueError при публикации в API машинного обучения на AWS Lambda с использованием Zappa - PullRequest
0 голосов
/ 14 апреля 2020

Цель моего проекта - развернуть 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), не беспокоясь о проблемах архитектуры

...