Докеризация вашего кода

Машинное обучение продолжает развиваться. Хотя многие люди движутся к более современным подходам, все еще существуют опасения по поводу использования Docker и связанных с ним технологий в большей части науки о данных. Внесение изменений и использование контейнерного пространства решений, такого как Docker, не обязательно является легким шагом - во многом как перенос рабочих нагрузок в области обработки данных в облако (и, возможно, вы все еще не сделали этого).

Docker, часто называемый технологией контейнеризации, использует абстракцию виртуализации, которая повторно использует ядро ​​Linux хост-системы для упаковки и запуска приложения в независимой от платформы неизменяемой единице развертывания. Этот пакет создает неизменяемое развертываемое программное обеспечение, которое должно быть идентично исполняемым (и часто абстрактно повторно используемым) на любой платформе с запущенной установкой Docker или Kubernetes.

Почему!

Какое это имеет отношение к созданию конвейера машинного обучения? Это простой вопрос. Сложный - как докеризовать ваш код для науки о данных.

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

Постепенное улучшение вашей практики в области науки о данных / машинного обучения - это выработать привычку докеризовать (создавать исполняемые пакеты / образы Docker) различные компоненты вашего конвейера. Каждая часть или, если соответствующая коллекция исполняемых частей, должна быть записана в неизменяемый, версионный и помеченный образ докера. Это гораздо больше, чем контроль версий, гарантирует повторяемость обучения кода (независимо от того, где оно выполняется). Следует использовать концентратор / репозиторий Docker, публичный или частный, чтобы вы могли хранить копии всех своих артефактов выполнения. Все это (и многое другое) поможет убедиться, что вы используете этичные и соответствующие методы машинного обучения.

Сшить выполнение этих конвейеров вместе не всегда просто. Требуется время, чтобы научиться строить конвейеры и находить подход, который лучше всего подходит вам и вашей команде.

Докеризация вашего конвейера

Первый шаг в докеризации вашего кода - это знание основ Docker. И поскольку у меня нет намерения создавать учебник по Docker в настоящее время, я отсылаю вас к этому прекрасному руководству. Остальные шаги:

  1. Создайте файл Dockerfile для каждого раздела конвейера, который вы хотите отделить при выполнении от других. Это разделение может быть выполнено на языковых границах (R и Python), различиях версий библиотек, естественном / органическом разделении (выбор функций и обучение модели), локализации данных (локальная или облачная) и т. Д.
  2. Выберите базовый образ Docker, который удовлетворит большинство ваших требований - существует множество готовых образов Docker, предназначенных для удовлетворения различных потребностей машинного обучения. Но, как правило, большинство образов Docker не подходят для ваших конкретных нужд. Вы должны создавать изображения, соответствующие вашему общему стеку, чтобы минимизировать время сборки для повторяющихся действий (например, повторного запуска конвейеров с небольшими изменениями). Образ Docker, используемый в качестве основы, помещается в строку с помощью оператора FROM.

3. Добавьте требования к образу Docker. Эти требования могут быть любыми: от небольших наборов данных, информации о конфигурации (будьте осторожны при хранении секретов, когда ваше изображение может быть общедоступным - и даже когда оно является частным - для этого есть лучшие стратегии), зависимостей кода и многого другого. Это то, что нужно для того, чтобы ваш код заработал. Добавление содержимого выполняется с помощью оператора COPY или ADD.

4. Скопируйте код, который будет использоваться при выполнении. Если вы работаете с большим проектом, у вас может быть много образов Docker для одной и той же кодовой базы и т. Д., Тогда, скорее всего, лучший вариант - скопировать всю кодовую базу в ваш образ (часто они действительно маленькие в общей схеме. вещей). Это делается так же, как добавление требований с помощью оператора COPY или ADD - здесь у нас другое намерение.

5. Установите зависимости и код сборки, которые потребуются для выполнения вашего конвейера. Иногда, как в большинстве конвейеров Python и R, достаточно установить ваши библиотеки, но если вы используете код, который является Java / Scala, C / C ++ и т. Д., Вам нужно будет скомпилировать свой код в образе Docker. Зависимости устанавливаются с помощью RUN. Оператор RUN выполнит следующую команду bash. Чтобы убедиться, что ваш образ как можно меньше - это вещь Docker - вы должны связать свою установку и объединить шаги в одну команду bash, используя &&, когда это возможно.

6. Установите точку входа выполнения, чтобы при запуске образа Docker вы сами выбирали это - он знал, какой код запускать. Это делается с помощью оператора CMD. Эта команда немного странная, когда вы впервые сталкиваетесь с ней, но по сути представляет собой список строк, составляющих команду bash.

Собрав все это вместе, вы получите довольно простую схему того, что вам следует делать. Теперь образы Dockerfile в дикой природе часто содержат гораздо больше. Иногда необходимо обновить базовые зависимости ОС, выполнить более сложные установки, скопировать больше файлов разных типов, установить переменные среды и многое другое.

7. Создание образа - это выполнение инструкций, изложенных в файле Docker, и их выполнение в механизме сборки Docker для компиляции исполняемого модуля. Этот шаг мало чем отличается от процесса, который следует предпринять при компиляции исполняемого кода - и если вы читаете достаточно и имеете правильный опыт разработки программного обеспечения, вы начнете видеть много параллелей с объектно-ориентированным программированием и общей разработкой программного обеспечения. В любом случае этот образ создается с помощью команды bash из командной строки. Он создает двоичный образ на вашем устройстве, который теперь может быть переносимым и исполняемым на любой платформе, на которой работает Docker - волшебство!

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

Организация вашего кода

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

Мой разум любит разделять разные единицы работы. Вот как я действую. Поэтому, естественно, я стараюсь организовать свой код аналогичным образом (все, что связано с кодом). Каждая логическая часть конвейера / рабочего процесса обычно помещается в свой собственный каталог. Это позволяет мне смотреть на код и видеть, что я делаю. В приведенном ниже примере я сделаю рабочее предположение, что весь код для каждого этапа находится в одном файле (обычно это не так - это исключение - в хорошо организованном коде с высоким коэффициентом повторного использования).

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

Когда я работаю вручную, мне нравится создавать сценарий Bash, который инкапсулирует всю работу, которую я буду выполнять при развертывании моего кода. В данном случае - как точка - это означает наличие полной сборки всех образов (это очень быстро собранный bash, а не то, что кто-то будет делать в производственной среде).

Что бы вы ни делали, убедитесь, что у вас есть организация, которая поможет вам организовать процесс сборки - чем бы это ни было (мы можем помочь).

Использование вашего Dockerized Pipeline

Запуск ваших докеризованных конвейеров обработки данных может осуществляться разными способами. При традиционных подходах (технический возраст FAST) вы должны запускать его в локальной системе или на виртуальной машине с помощью docker-compose - надеюсь, не с использованием Docker run (если вы не тестируете). Docker-compose, Kubernetes (с Argo - см. Этот блог), Prefect, Apache Airflow и различные другие технологии могут быть использованы для построения конвейера машинного обучения. Все они используются для создания конвейера выполнения, известного как DAG (см. Мой блог, где объясняется, что такое DAG). После того, как вы развернули свой Docker и выбрали технологию оркестровки конвейера, вы можете использовать его для локального или удаленного запуска (предпочтительный подход).

Теперь ваше решение версировано в репозитории, и эксперименты с данными, которые вы проводите, полностью воспроизводимы (кашель, изменение данных, кашель).

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

О чем я не говорил

Честно говоря, множество тем - просто невозможно дать справедливость в одном сообщении в блоге. Я могу только попробовать, а куда идти дальше - решать только вам. Автоматизация процесса обучения, хранение и организация результатов моделирования, развертывание контейнерных моделей, обфускация или сокрытие создания ваших конвейеров с помощью сложных инструментов и т. Д. - есть много тем. И я буду рассматривать эти темы по очереди в этой серии статей Building ML Pipelines. Они не находятся в каком-либо определенном порядке: они будут ссылаться друг на друга (как вы наверняка видели некоторые ссылки выше), предназначены для того, чтобы дать вам некоторое представление о тонкостях выполнения машинного обучения в нашем развивающемся мире технологий и, надеюсь, помочь вам спуститься вниз. ваш путь к зрелости MLOps.

Как Hashmap может помочь

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

Если вам понадобится помощь в пути, свяжитесь с нами.

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

Чтобы послушать обычный разговор обо всех вещах, связанных с инженерией данных и облаком, посмотрите подкаст Hashmap Hashmap on Tap, а также в Spotify, Apple, Google и других популярных потоковых приложениях.



Другие инструменты и контент, которые могут вам понравиться









Джон Авен, доктор философии, технический директор Hashmap, предоставляющий решения в области данных, облачных вычислений, Интернета вещей и искусственного интеллекта / машинного обучения, а также консультационные услуги. в разных отраслях с группой инновационных технологов и экспертов в предметной области, ускоряющих получение ценных бизнес-результатов для наших клиентов. Обязательно свяжитесь с Джоном в LinkedIn и узнайте больше о перспективах и информации о том, как ускорить достижение бизнес-результатов, основанных на данных.