Перевод статьи подготовлен в преддверии старта базового и продвинутого курсов по машинному обучению.
Наша основная задача как специалистов по Data Science – это обработка данных, а также разработка и совершенствование моделей машинного обучения. Бытует мнение, что обработка данных – самый трудоемкий этап во всем проекте, а точность модели определяет успех информационного продукта. Однако отрасль сейчас находится на переходном этапе «от эпохи открытий к эпохе внедрения» (Сверхдержавы в области искусственного интеллекта: Китая, Силиконовая Долина, а новый мировой порядок в этой сфере диктует Ли Кайфу). Сейчас картина становится шире, и фокус смещается с построения модели на предоставление модели пользователям в качестве сервиса и с производительности модели к ее бизнес-ценности. Самый известный пример здесь Netflix, который никогда не использовал модели победителей их соревнования на 1$ млн, несмотря на обещанное значительное повышение производительности, обеспечиваемое этими движками (Netflix Never Used Its $1 Million Algorithm Due To Engineering Costs — WIRED).
От понимания к реальности (слайды с конференции Strata Data — Kubeflow explained: Portable machine learning on Kubernetes)
Имплементация модели крайне важна, и информационные продукты теперь можно рассматривать как программные продукты, ведь у них есть аналогичная структура проекта, менеджмент и жизненный цикл. Поэтому мы вправе использовать все известные методики из области разработки ПО для развертывания моделей машинного обучения на продакшене.
Контейнеризация – метод, который широко используется для развертывания программных продуктов как на облачной платформе, так и на локальном сервере. По сути, речь идет об упаковке кода и зависимостей в коробку, которая называется контейнером. Ниже приводится определение контейнера в контексте разработки программного обеспечения:
С сайта Docker
Контейнер – это стандартная единица программного обеспечения, которая упаковывает код и все его зависимости, чтобы приложение могло быстро и надежно запускаться в разных вычислительных средах.
Docker – это платформа, которая может помочь вам ускорить процесс разработки, контейнеризации, а также развертывания нашей модели машинного обучения в других средах. В этой серии статей я расскажу вам как хранить модель, использовать ее в качестве конечной точки API, контейнеризировать ваше ML-приложение и запускать его на движке Docker.
Прежде чем мы начнем, вам нужно будет зарегистрироваться в Docker ID, если у вас его нет, а затем использовать этот ID для загрузки и установки Docker на свой компьютер.
Когда я только начинал свою работу в банке, мне поручили проект, который был связан с обработкой данных, и первый MVP (минимальный жизнеспособный продукт) нужно было доставить за месяц. Звучит напряжно, но мы в команде используем методологию Agile в процессе разработки всех основных продуктов, и основной целью этого MVP было проверить гипотезу о практичности и эффективности продукта (более подробную информацию про методологию Agile вы найдете в книге Эрика Риса «Lean Startup»). Мой менеджер хотел, чтобы я развернул свою модель на его ноутбуке, то есть запустил ее и использовал для прогнозирования.
Если вы представили себе все шаги, которые мне нужно было сделать, чтобы подготовить ноутбук менеджера к запуску моего проекта, то у вас могло возникнуть много вопросов, таких как:
Помня про все эти вопросы, вот что я должен был сделать с его компьютером, чтобы на нем запустилась моя модель.
Для выполнения всех этих шагов понадобится много усилий, а при запуске кода в различных средах есть риск несовместимости.
Итак, если у вас уже установлен и запущен Docker, вы можете открыть терминал и выполнить следующую команду:
Через пару минут вы должны увидеть нечто похожее в своем терминале:
Теперь откройте свой любимый браузер и перейдите по этому адресу:
Нажмите на строчку predict из API, а затем на кнопку try-out справа, интерфейс будет выглядеть следующим образом:
Страница Swagger для API на бэкенде
Помните стандартный набор данных Цветы Ириса, с которым вы игрались? Это небольшое приложение поможет вам спрогнозировать вид цветка на основе информации о некоторых измерениях на основе классификационной модели. На самом деле вы уже используете мою модель машинного обучения как сервис, и все, что вы установили – это лишь Docker, и мне не понадобилось ставить Python или какие-то пакеты на вашу машину.
Вот в чем сила Docker. Он помогает мне решать проблемы с зависимостями, чтобы я мог быстро разворачивать свой код в разных средах или, в данном случае, на вашей машине.
Теперь, надеюсь, я вас достаточно замотивировал, чтобы продолжать чтение, и если вы просто захотите пропустить эти части и перейти сразу к коду, то все в порядке, поскольку это значит, что вы хотите контейнеризировать свою модель машинного обучения с Docker и предоставлять ее как сервис. Однако сейчас нам придется немного остановиться и отложить все материалы про машинное обучение и Docker в сторону, чтобы подумать о DevOps в Data Science и о том, зачем он там вообще нужен.
По этой причине компании ищут специалистов по анализу данных с навыками DevOps, которые умеют разворачивать и внедрять свои модели машинного обучения на продакшене и приносить компании бизнес-ценность, вместо того чтобы просто доказывать концепции и фокусироваться на повышении точности модели. Таких людей называют единорогами.
Есть множество способов развернуть модель машинного обучения, но Docker – это мощный инструмент, который даст вам необходимую гибкость, сохранив при этом надежность и инкапсуляцию вашего кода. Конечно, мы не будем просить наших клиентов устанавливать Docker и открывать терминал для его запуска. Но этот этап контейнеризации в конечном итоге станет основой, когда вы начнете работать с реальными проектами, где вам придется разворачивать свои модели на облачных платформах или локальных серверах.
Еще в университете мы узнали, что проект Data Science состоит из шести этапов, как показано на картинке ниже. Если автоматизация и развертывание модели на продакшене является нашей конечной целью, то как же «отправить» модель на стадию развертывания?
Шесть этапов Data Science-проекта
Самый простой способ, который только можно придумать – это скопировать все из нашего notebook, вставить в файл с расширение .py и запустить его. Однако каждый раз, когда нам нужно будет сделать прогноз, мы будем запускать этот файл и заново на тех же данных обучать модель. Если такой подход хоть как-то применим для простых моделей с небольшим обучающим набором данных, он не будет эффективен для сложных моделей с большим количеством обучающих данных (подумайте о том, сколько времени вам понадобится для обучения модели ANN или CNN). Здесь имеется в виду, что, когда пользователь отправляет запрос модели на прогнозирование, ему придется ждать от нескольких минут до нескольких часов, чтобы получить результат, поскольку много времени уйдет на выполнения этапа обучения модели.
В большинстве случаев модель машинного обучения в Python будет храниться в памяти как объект Python во время выполнения кода, а затем будет удалена после окончания работы программы. Если бы мы могли сохранить этот объект на жестком диске сразу после того, как модель обучится, то в следующий раз, когда нам понадобится сделать прогноз, мы сможем просто загрузить готовую модель в память и не проходить этапы инициализации и обучения. В информатике процесс преобразования объекта в поток байтов для хранения называется сериализацией. В Python это может быть легко реализовано с помощью пакета под названием pickle, который изначально имеет нативную поддержку Python. Python-разработчики еще называют «pickling» процесс сериализации объекта с помощью pickle.
В Jupyter notebook вы можете с легкостью сохранить объект модели (в моем случае «knn») в файл pkl, который располагается в том же каталоге, что и код:
Сохранение модели в текущую директорию
Мой notebook я рекомендую взять отсюда, чтобы дальше у нас были аналогичные результаты. Или же вы можете использовать свою модель, но убедитесь, что у вас есть все необходимые пакеты, а также нужные входные данные для модели.
Первый шаг пройден, вы сохранили обученную модель. Дальше мы будем переиспользовать модель для прогнозирования, но об этом уже во второй части статьи.
Расширяем возможности для наших студентов. Теперь в OTUS есть целых два курса по Machine Learning: базовый и продвинутый. Оба курса стартуют в августе, в связи с чем мы приглашаем всех желающих на день открытых дверей в онлайн-формате, в рамках которого наш эксперт — Дмитрий Сергеев (Senior Data Scientist в Oura) подробно расскажет о курсах, а также ответит на интересующие вопросы.
Наша основная задача как специалистов по Data Science – это обработка данных, а также разработка и совершенствование моделей машинного обучения. Бытует мнение, что обработка данных – самый трудоемкий этап во всем проекте, а точность модели определяет успех информационного продукта. Однако отрасль сейчас находится на переходном этапе «от эпохи открытий к эпохе внедрения» (Сверхдержавы в области искусственного интеллекта: Китая, Силиконовая Долина, а новый мировой порядок в этой сфере диктует Ли Кайфу). Сейчас картина становится шире, и фокус смещается с построения модели на предоставление модели пользователям в качестве сервиса и с производительности модели к ее бизнес-ценности. Самый известный пример здесь Netflix, который никогда не использовал модели победителей их соревнования на 1$ млн, несмотря на обещанное значительное повышение производительности, обеспечиваемое этими движками (Netflix Never Used Its $1 Million Algorithm Due To Engineering Costs — WIRED).
От понимания к реальности (слайды с конференции Strata Data — Kubeflow explained: Portable machine learning on Kubernetes)
Имплементация модели крайне важна, и информационные продукты теперь можно рассматривать как программные продукты, ведь у них есть аналогичная структура проекта, менеджмент и жизненный цикл. Поэтому мы вправе использовать все известные методики из области разработки ПО для развертывания моделей машинного обучения на продакшене.
Контейнеризация – метод, который широко используется для развертывания программных продуктов как на облачной платформе, так и на локальном сервере. По сути, речь идет об упаковке кода и зависимостей в коробку, которая называется контейнером. Ниже приводится определение контейнера в контексте разработки программного обеспечения:
С сайта Docker
Контейнер – это стандартная единица программного обеспечения, которая упаковывает код и все его зависимости, чтобы приложение могло быстро и надежно запускаться в разных вычислительных средах.
Docker – это платформа, которая может помочь вам ускорить процесс разработки, контейнеризации, а также развертывания нашей модели машинного обучения в других средах. В этой серии статей я расскажу вам как хранить модель, использовать ее в качестве конечной точки API, контейнеризировать ваше ML-приложение и запускать его на движке Docker.
Вопрос первый «Почему Docker?»
Прежде чем мы начнем, вам нужно будет зарегистрироваться в Docker ID, если у вас его нет, а затем использовать этот ID для загрузки и установки Docker на свой компьютер.
Когда я только начинал свою работу в банке, мне поручили проект, который был связан с обработкой данных, и первый MVP (минимальный жизнеспособный продукт) нужно было доставить за месяц. Звучит напряжно, но мы в команде используем методологию Agile в процессе разработки всех основных продуктов, и основной целью этого MVP было проверить гипотезу о практичности и эффективности продукта (более подробную информацию про методологию Agile вы найдете в книге Эрика Риса «Lean Startup»). Мой менеджер хотел, чтобы я развернул свою модель на его ноутбуке, то есть запустил ее и использовал для прогнозирования.
Если вы представили себе все шаги, которые мне нужно было сделать, чтобы подготовить ноутбук менеджера к запуску моего проекта, то у вас могло возникнуть много вопросов, таких как:
- На какой операционной системе нужно будет запускать модель, ведь он пользуется Macbook и ThinkPad? Я мог бы, конечно, спросить его об этом, но предположим, что в тот момент жизни мой босс был очень противным, и не хотел, чтобы я знал эту информацию. (Эта мысль здесь для того, чтобы вы осознали проблему зависимости от операционной системы, а так мой босс правда хороший человек.)
- Второй вопрос: «Установлен ли у него Python?». Если да, то какая версия, 2 или 3? Какая именно: 2.6, 2.7 или 3.7?
- А как насчет необходимых пакетов, таких как scikit-learn, pandas и numpy? Установлены ли у него те же версии, что и у меня на машине?
Помня про все эти вопросы, вот что я должен был сделать с его компьютером, чтобы на нем запустилась моя модель.
- Установить Python.
- Установить все пакеты.
- Настроить переменные среды.
- Перенести код на машину.
- Запустить код с необходимыми параметрами.
Для выполнения всех этих шагов понадобится много усилий, а при запуске кода в различных средах есть риск несовместимости.
Итак, если у вас уже установлен и запущен Docker, вы можете открыть терминал и выполнить следующую команду:
docker run --rm -p 5000:5000 datascienceexplorer/classifier
Через пару минут вы должны увидеть нечто похожее в своем терминале:
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Теперь откройте свой любимый браузер и перейдите по этому адресу:
http://localhost:5000/apidocs/
Нажмите на строчку predict из API, а затем на кнопку try-out справа, интерфейс будет выглядеть следующим образом:
Страница Swagger для API на бэкенде
Помните стандартный набор данных Цветы Ириса, с которым вы игрались? Это небольшое приложение поможет вам спрогнозировать вид цветка на основе информации о некоторых измерениях на основе классификационной модели. На самом деле вы уже используете мою модель машинного обучения как сервис, и все, что вы установили – это лишь Docker, и мне не понадобилось ставить Python или какие-то пакеты на вашу машину.
Вот в чем сила Docker. Он помогает мне решать проблемы с зависимостями, чтобы я мог быстро разворачивать свой код в разных средах или, в данном случае, на вашей машине.
DevOps Data Science
Теперь, надеюсь, я вас достаточно замотивировал, чтобы продолжать чтение, и если вы просто захотите пропустить эти части и перейти сразу к коду, то все в порядке, поскольку это значит, что вы хотите контейнеризировать свою модель машинного обучения с Docker и предоставлять ее как сервис. Однако сейчас нам придется немного остановиться и отложить все материалы про машинное обучение и Docker в сторону, чтобы подумать о DevOps в Data Science и о том, зачем он там вообще нужен.
Что же такое DevOps?
Из ВикипедииЦелью разработчиков программного обеспечения является своевременная доставка кода со всем необходимым функционалом, в то время как удобство использования, надежность, масштабируемость, сетевая часть, брандмауэр, инфраструктура и т.д. часто остаются операционными проблемами. Из-за разнящихся конечных целей и, вероятно, ключевых показателях эффективности, эти команды обычно не уживаются под одной крышей. Поэтому DevOps-специалист мог бы сыграть роль связующего звена и помочь этим командам работать сообща, или даже взять на себя ответственность обеих сторон, чтобы в итоге получилась одна команда, ведущая разработку от начала до конца. В конце концов, вы ведь не можете просто отдать свой компьютер клиенту, поскольку на нем-то код работает как надо.
DevOps – это совокупность практик, сочетающих в себе разработку программного обеспечения и информационно-технологическое обслуживание, целью которых является сокращение жизненного цикла разработки систем и обеспечение непрерывной поставки высококачественного программного обеспечения.
Но с Jupyter notebook я счастлив!!!У специалистов по Data Science история аналогичная, поскольку опять же вы не можете просто взять и отдать свой ноутбук с запущенным Jupyter Notebook, чтобы клиент просто пользовался им. Нам нужен способ использовать модель так, чтобы она могла обслуживать большое количество пользователей в любое время в любом месте и подниматься с минимальным временем простоя (удобство использования, надежность, масштабируемость).
По этой причине компании ищут специалистов по анализу данных с навыками DevOps, которые умеют разворачивать и внедрять свои модели машинного обучения на продакшене и приносить компании бизнес-ценность, вместо того чтобы просто доказывать концепции и фокусироваться на повышении точности модели. Таких людей называют единорогами.
Есть множество способов развернуть модель машинного обучения, но Docker – это мощный инструмент, который даст вам необходимую гибкость, сохранив при этом надежность и инкапсуляцию вашего кода. Конечно, мы не будем просить наших клиентов устанавливать Docker и открывать терминал для его запуска. Но этот этап контейнеризации в конечном итоге станет основой, когда вы начнете работать с реальными проектами, где вам придется разворачивать свои модели на облачных платформах или локальных серверах.
Хранение обученной модели
Еще в университете мы узнали, что проект Data Science состоит из шести этапов, как показано на картинке ниже. Если автоматизация и развертывание модели на продакшене является нашей конечной целью, то как же «отправить» модель на стадию развертывания?
Шесть этапов Data Science-проекта
Самый простой способ, который только можно придумать – это скопировать все из нашего notebook, вставить в файл с расширение .py и запустить его. Однако каждый раз, когда нам нужно будет сделать прогноз, мы будем запускать этот файл и заново на тех же данных обучать модель. Если такой подход хоть как-то применим для простых моделей с небольшим обучающим набором данных, он не будет эффективен для сложных моделей с большим количеством обучающих данных (подумайте о том, сколько времени вам понадобится для обучения модели ANN или CNN). Здесь имеется в виду, что, когда пользователь отправляет запрос модели на прогнозирование, ему придется ждать от нескольких минут до нескольких часов, чтобы получить результат, поскольку много времени уйдет на выполнения этапа обучения модели.
Как хранить модель сразу после того, как она обучится?
В большинстве случаев модель машинного обучения в Python будет храниться в памяти как объект Python во время выполнения кода, а затем будет удалена после окончания работы программы. Если бы мы могли сохранить этот объект на жестком диске сразу после того, как модель обучится, то в следующий раз, когда нам понадобится сделать прогноз, мы сможем просто загрузить готовую модель в память и не проходить этапы инициализации и обучения. В информатике процесс преобразования объекта в поток байтов для хранения называется сериализацией. В Python это может быть легко реализовано с помощью пакета под названием pickle, который изначально имеет нативную поддержку Python. Python-разработчики еще называют «pickling» процесс сериализации объекта с помощью pickle.
В Jupyter notebook вы можете с легкостью сохранить объект модели (в моем случае «knn») в файл pkl, который располагается в том же каталоге, что и код:
import pickle
with open('./model.pkl', 'wb') as model_pkl:
pickle.dump(knn, model_pkl)
Сохранение модели в текущую директорию
Мой notebook я рекомендую взять отсюда, чтобы дальше у нас были аналогичные результаты. Или же вы можете использовать свою модель, но убедитесь, что у вас есть все необходимые пакеты, а также нужные входные данные для модели.
Первый шаг пройден, вы сохранили обученную модель. Дальше мы будем переиспользовать модель для прогнозирования, но об этом уже во второй части статьи.