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

Официальная документация описывает Connexion следующим образом:

Connexion - это фреймворк поверх« Flask , который автоматически обрабатывает HTTP-запросы на основе спецификации OpenAPI 2.0 (ранее известной как Swagger Spec) вашего API, описанного в формате YAML ».

Это означает, что вы определяете свой API, используя определение swagger, а Connexion сопоставляет конечные точки с вашими функциями Python, а Connexion гарантирует, что ваш API будет работать так, как вы его определили.

Connexion «автоматически» возьмет на себя следующие задачи:

  • Предоставление пользовательского интерфейса веб-консоли Swagger для интерактивной документации и экспериментирование с конечными точками API через него
  • OAuth 2 аутентификация на основе токенов
  • Управление версиями API
  • Автоматическая сериализация полезной нагрузки
  • Автоматическая проверка запросов и параметров конечных точек в соответствии с вашей спецификацией

Это отличный способ с минимальными усилиями заставить ваш классификатор работать над производством.

Чтобы начать использовать Connexion, мы выполним следующие шаги:

1. Обучение классификатору

В качестве примера давайте сначала создадим простой классификатор обучения Scikit. Мы собираемся обучить очень простой классификатор новостей, используя набор данных «20 групп новостей».

После обучения модели мы будем настраивать ее для использования нашим REST API.

2. Создание REST API

Начать работу с Connexion очень просто. Пример приложения с хорошей документацией можно найти в этом репозитории: https://github.com/hjacobs/connexion-example

2.1 Установка Connexion:

$ pip install connexion

2.2 Определение нашего API:

swagger: '2.0'
info:
  title: News classifier
  version: "0.1"
consumes:
  - application/json
produces:
  - application/json
paths:
  /predictions:
    post:
      operationId: app.post_predictions
      summary: Predicts categories of the given news articles
      parameters:
        - name: query
          in: body
          schema:
            type: array
            items:
              $ref: '#/definitions/Query'
      responses:
        200:
          description: Returns predicted categories
          schema:
            type: array
            items:
              $ref: '#/definitions/Prediction'
definitions:
  Prediction:
      type: object
      required:
        - category
        - text
      properties:
        category:
          type: string
          description: Predicted category of a news article
          example: "talk.politics.misc"
          readOnly: true
        text:
          type: string
          description: query text
          example: "Ronaldo scored 3 goals against Napoli"
          readOnly: true
  Query:
     type: object
     required:
       - text
     properties:
       text:
         type: string
         description: text to predict

У нас есть конечная точка с именем / predictions. Он получит список моделей запроса в качестве входных данных и создаст список моделей прогнозирования. Мы сохраняем этот файл как «swagger.yaml».

2.3 Импортируйте соединение и зарегистрируйте наш файл Swagger:

import connexion
app = connexion.App(__name__)
app.add_api('swagger.yaml')

2.3 Запуск приложения на простом сервере с помощью gevent

if __name__ == '__main__':
    app.run(port=8080, server='gevent')

2.5 Импорт нашего классификатора

from sklearn.externals import joblib

classifier = joblib.load('./classifier/model.pkl')

2.6 Определение конечной точки нашего прогноза

def post_predictions(query):
    predictions = []
    for item in query:
        text = item['text']
        category = classifier.predict([text])[0]
        predictions.append({"category": category, "text": text})
    return predictions

Как вы можете видеть здесь, имя метода соответствует свойству «operationId» в нашем определении swagger. Вот и все. Теперь мы можем протестировать наш API с помощью простых запросов curl после запуска нашего приложения, используя следующую команду:

./app.py

Теперь мы можем протестировать наш API с помощью простого запроса curl

➜  ~ curl --request POST \
--url http://localhost:8080/predictions \
--header 'content-type: application/json' \
--data '[{"text": "Angela Merkel just walked into her fourth term as chancellor of Germany.Her party, the Christian Democrats (CDU), picked up 32.5 percent of the votes in Sunday's election, according to the first exit polls issued at 6 pm German local time."}]'
[
{
"category": "talk.politics.misc",
"text": "Angela Merkel just walked into her fourth term as chancellor of Germany.Her party, the Christian Democrats (CDU), picked up 32.5 percent of the votes in Sunday's election, according to the first exit polls issued at 6 pm German local time."
}
]

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

Мы можем поэкспериментировать и изучить другие возможности Connexion.

Использование интерфейса Swagger:

Если вы откроете браузер и перейдете по адресу http: // localhost: 8080 / ui /, вы сможете увидеть пользовательский интерфейс Swagger.

Здесь вы можете поиграть и протестировать свой API, отправить образцы запросов, проверить входные данные и т. Д.

Использование другой серверной части:

По умолчанию соединение использует флеш-сервер, но мы также можем использовать Tornado или gevent в качестве бэкэнда. Чтобы использовать Торнадо:

app.run(port=8080, server='tornado')

Аутентификация и авторизация OAuth 2:

Если мы установим переменную среды TOKENINFO_URL или включим x-tokenInfoUrl в наш файл swagger, Connexion защитит наши конечные точки. Более подробную информацию об этом можно найти в этом репо.

Ресурсы:

Исходный код примера: https://github.com/elvinx/connexion-example

Ссылка на репозиторий Connexion на github: https://github.com/zalando/connexion

Официальная документация Connexion: https://connexion.readthedocs.io/en/latest/