Google Appengine упрощает создание масштабируемых веб-приложений, устраняя необходимость в традиционных Dev Opps. Ниже мы будем использовать pandas и scikit-learn для обучения модели на Iris Data и создания API для классификации входящих данных. После настройки приложения мы развернем его в облаке и запустим нагрузочный тест, чтобы продемонстрировать возможности автомасштабирования Appengine.

Чтобы настроить наше приложение, нам понадобятся два файла: app.yaml, который настраивает наше приложение и определяет наши обработчики URL-адресов, и файл main.py, который определяет наше приложение flask.

# app.yaml
runtime: python37
service: iris
handlers:
- url: /(.*)
 script: main.app
 secure: always

Выше мы настроили наше приложение для направления всех запросов к объекту app, созданному в main.py, у нас будут две конечные точки: одна, которая обучает модель и сохраняет ее, а другая делает прогноз на основе обученной модели.

# main.py
@app.route('/train_model')
def train_model():
    """
    Get iris data, fit logistic regression save model as .pkl file
    """
    ...
@app.route('/predict', methods=[POST])
    """
    take the post data pass into the model saved above and 
    return predicted classification 
    """
    ...

В этом примере игрушки мы загружаем набор данных Iris с помощью Scikit learn и сохраняем обученную модель в виде файла pickle. Хотя мы используем логистическую регрессию ниже, в нашем распоряжении есть все возможности Scikit learn и Pandas для оптимизации нашего алгоритма.

Appengine разработан для масштабируемых веб-приложений, а не для обучения моделей машинного обучения, как мы делаем ниже, однако, если мы сгенерируем этот .pkl файл в appengine или с помощью какой-либо другой задачи, мы рассмотрим, как мы можем использовать его в Интернете. просьба делать прогнозы в реальном времени.

Загрузите данные Iris в DataFrame

from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(data= np.c_[iris[‘data’], iris[‘target’]],
 columns=iris[‘feature_names’] + [‘target’])

Обучите модель с помощью логистической регрессии

TRAIN_PCT = 0.7
split_pt = int(TRAIN_PCT * len(df))
# get the train / test data
train_x = df[:split_pt].drop(u'target', 1)
train_y = df[:split_pt].target
test_x = df[split_pt:].drop(u'target', 1)
test_y = df[split_pt:].target
# initialize model & perform fit
model = LR()
model.fit(train_x, train_y)

Сохраните модель как файл .pkl

Ниже мы берем объект модели, созданный из набора поезд / тест, и сохраняем его в файловой системе. В процессе производства мы сохраняли бы этот файл в облачном хранилище Google и загружали его с прогнозами, но пока мы сохраним файл локально и будем использовать его для прогнозов ниже.
pickle.dump (model, MODEL_NAME + ' .pkl, 'wb'))

pickle.dump(model, MODEL_NAME + '.pkl, 'wb'))

Давайте воспользуемся нашим приложением flask для обучения этой модели и сохраним результат, нажав:

Http: // localhost: 8080 / train_model

В среде выполнения python3.7 мы сообщаем нашему развертыванию, какие пакеты нам нужны в нашем requirements.txt файле, войдем в gcloud через командную строку и развернем приложение с помощью одной команды:

$ gcloud auth login
$ gcloud config set project <your-project-id>
$ gcloud app deploy app.yaml

Проверьте проверку работоспособности на странице https://iris-dot-your-project-id.appspot.com/ok.

Обратите внимание, что в нашем app.yaml у нас есть service: iris, что дает указанный выше URL. В производственной среде мы могли бы настроить service: default, что позволило бы нам использовать https://your-project-id.appspot.com/ в качестве рабочего URL-адреса.

Эта конструкция развертывания машинного обучения позволит вам масштабировать ваши приложения вместе с трафиком. Нет SSH-подключения к машинам, настройки балансировщиков нагрузки или работы с файлами журналов. Мы просто устанавливаем наши параметры масштабирования в нашем app.yaml и настраиваем их в соответствии с нашими SLA.

instance_class: F2
automatic_scaling:
- target_cpu_utilization: 0.65
- min_instances: 2
- min_pending_latency: 30ms
- max_pending_latency: automatic
- max_concurrent_requests: 80

Используя платформу нагрузочного тестирования BlazeMeter, мы попадаем в приложение с конечной точкой, которая генерирует случайные значения характеристик и использует модель, которую мы определили выше, для прогнозирования класса.

@app.route('/predict_random', methods=['GET'])
def predict_random():
    features = ['s_length', 's_width', 'p_length', 'pe_width']
    data = [[get_rand_float() for x in range(len(features))]]
    filename = '{model_name}.pkl'.format(model_name=MODEL_NAME)
    loaded_model = pickle.load(open(filename, 'rb'))
    test_df = pd.DataFrame(data, columns=features)
    predictions = loaded_model.predict(test_df)
 
    return jsonify({'predicted_class': predictions[0]})

В этой конечной точке мы генерируем случайные данные для передачи в качестве входных данных в модель. В реальном варианте использования мы могли бы представить, как вводить данные в модель из параметров запросаPOST, но для демонстрации возможностей автомасштабирования подойдут случайные значения.

Как мы видим, у нас есть некоторые сбои, которые, согласно журналам, указывают на то, что не было достаточного количества экземпляров для обслуживания запроса. Это означает, что при нашей конфигурации автомасштабирования трафик увеличивается быстрее, чем способность Appengine создавать новые экземпляры. Мы можем легко исправить это и настроить наше приложение для обработки еще большего количества запросов, настроив параметры масштабирования. Просто добавив min_instances: 5 к нашему app.yaml, мы сможем справиться с еще большей нагрузкой, чем раньше, без ошибок.

Изучение приборной панели Appengine показывает нам, как этот нагрузочный тест повлиял на автомасштабирование. Без какого-либо вмешательства Appengine создал более 20 экземпляров и автоматически направил трафик.

Подобный сервис можно использовать в режиме реального времени для информирования систем о решениях и контента, который они представляют пользователям.

  • Реклама. Например, если интернет-магазин модной одежды может проанализировать файл cookie пользователя на набор функций и получить прогноз на основе пола на основе ранее обученной модели, приложение может использовать это прогноз для управления домом. страница на основе предполагаемого пола пользователя.
  • Алгоритмическая торговля. Хедж-фонды и банки тратят миллиарды на обслуживание инфраструктуры, которая позволяет проводить статистический анализ и алгоритмическую торговлю. Используя инфраструктуру Google, мы можем масштабировать и отвечать на запросы с помощью шкалы Google. Превосходная модель, созданная небольшой командой, может конкурировать с гигантами отрасли без предварительных затрат на установку серверов и виртуальных машин.

Для задач машинного обучения, требующих высокой пропускной способности и прогнозов в реальном времени, подобный API позволяет нам передать нашу инфраструктуру на аутсорсинг и сосредоточиться на науке.

Если вы начинаете новые проекты или хотите, наконец, развернуть ту модель, которую вы использовали на своем ноутбуке, стандартная среда выполнения python3 appengine - отличный вариант, однако в ней отсутствуют несколько критически важных элементов инфраструктуры, доступных в среде python2, в частности. Очереди задач и Хранилище данных.

Настройка фреймворка для развертывания моделей машинного обучения с использованием Appengine, Python3, Pandas и Scikit позволяет нам сосредоточиться на науке и забыть об инфраструктуре.

Имея несколько файлов конфигурации, приложение Flask и файл требований, мы можем запустить наши эксперименты в облаке за считанные минуты. Если вы специалист по данным и разочарованы тем, что инженерные группы доводят ваши модели до производства, использование этого подхода позволяет удалить этот шаг в жизненном цикле разработки алгоритма.

Исходный код этого приложения можно найти в образце кода в репозитории github, а для получения дополнительной информации о среде выполнения python3 обратитесь к документации.

Https://github.com/enhance-analytics/ae-ml

Enhance Analytics - это компания, занимающаяся разработкой и аналитикой данных, базирующаяся в Нью-Йорке. Мы работаем с Data Scientists, чтобы воплотить идеи в жизнь, и вместе с руководителями вырабатываем стратегию того, как эффективно использовать их данные.