Как обеспечить согласованность кода между производственной средой и средой разработки моделей? - PullRequest
0 голосов
/ 14 сентября 2018

Я создаю безсерверное приложение, чтобы делать некоторые прогнозы. Простая архитектура приведена ниже:

RAW Data -> Feature extractor -> Model Prediction -> Many consumers
         |
         v
    Persistence

Как средство извлечения, так и прогноз модели построены с использованием AWS Lambda. Кроме того, одновременно при отправке данных в средство извлечения необработанный ввод сохраняется в сегменте в s3.

Когда нам нужно разработать новую модель, мы строим следующий конвейер:

RAW Data -> Feature extractor -> Model Prediction -> Many consumers
         |
         v
    Persistence
         |
         v
   New Feature  -> Model Training and testing processes -> New Model
    Extractor

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

При использовании простой лямбда-функции непросто создать несколько необработанных скриптов на python, для извлечения которых требуется около одной секунды, но при попытке воспроизвести ее до 1 миллиона хранимых записей это невозможно. Для этого у нас в настоящее время есть несколько сценариев Pyspark для обработки всех старых и новых функций для создания новой модели, но в этом случае у нас всегда есть две копии кода, одна в сыром python и другая для pyspark.

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

Думаю, мне следует ожидать какой-то шаблон проектирования для этой проблемы.

1 Ответ

0 голосов
/ 22 марта 2019

Просто убедитесь, что я понимаю вашу проблему. Позвольте мне обобщить вашу проблему.

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

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

Чтобы избежать этого недостатка, нам лучше оставить только одну версию для средства извлечения функций (raw python или pyspark). Таким образом, нам не нужно рассматривать преобразование версии. Здесь я выбираю Python в качестве версии экстрактора возможностей.

Итак, следующая проблема заключается в том, как мы обрабатываем использование Python-лямбды для обработки 1 миллиона хранимых записей.

Это невозможно, если мы просто используем лямбда-функцию, потому что мы знаем, что ограничение максимального времени выполнения лямбда-функции составляет 15 минут. Чтобы снять ограничение, мы могли бы ввести функцию шага aws.

Функции шага AWS - это сервис, который позволяет координировать несколько сервисов AWS в безсерверных рабочих процессах. А рабочие процессы состоят из последовательности шагов, выход одного шага действует как вход для следующего. Эти небольшие шаги могут выполняться в AWS Lambda или Amazon ECS.

Итак, во втором конвейере я хотел бы заменить новый экстрактор функций на шаговую функцию aws. Эта функция метки может иметь 3 шага.

  • Шаг 1: вызов списка объектов s3. Запустите новую функцию извлечения объектов на объектах и ​​запустите процессы обучения модели и тестирования с новыми функциями. и этот шаг вывода является маркером из вызова списка объектов s3. Который будет передан на шаг 2.

  • Шаг 2: проверьте, есть ли еще необработанные объекты, проверив, является ли маркер пустым или нет. Перейдите к шагу 1, если маркер не равен нулю. В противном случае перейдите к шагу 3.

  • Шаг 3: готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...