Юрий Чернышов
Руководитель исследовательского центра
Цикл статей "Инженерия машинного обучения"
Этой статьей мы начинаем публикацию цикла материалов, посвященных созданию и управлению инфраструктурой для проектов машинного обучения (MLOps), который основан на лекциях совместного учебного курса УрФУ и компании СайберЛимфа "Инженерия машинного обучения" [1]. Мы планируем в ближайших статьях кратко рассмотреть отдельные темы этого курса: виртуализация, автоматизация работы с данными, инструменты для создания пайплайнов, CI/CD для ML, средства мониторинга и контроля. При изложении акцент будет сделан на практическом применении, в том числе на инструментах для решения задач MLOps, например: Jenkins, Ansible, dvc, Airflow, MLFlow и другие. Конечно же изложение вышеуказанных тем будет кратким, в "формате habr", достаточным для формирования у читателя понимания того, как и зачем пользоваться тем или иным инструментом, однако недостаточным для того, чтобы сразу после прочтения статьи приступить к выполнению производственных задач. Конечно же, для этого требуется практика и более системное изучение инструментария и имеющихся подходов. И если вам интересно продолжать совершенствование в этом направлении, то рекомендуем обратиться к курсу "Инженерия машинного обучения" УрФУ, в котором представленные в статьях темы рассматриваются более глубоко, а также многочисленным источникам по теме: книгам, тематическим каналам, видеолекциям. Также мы планируем учитывать обратную связь от читателей и рассказывать о том, что может быть востребовано в ваших проектах. Пожалуйста, пишите пожелания в комментариях или напрямую авторам.
Вступление
Большинство проектов машинного обучения не выходят в промышленную эксплуатацию ("продакшн"). Одним из способов исправить ситуацию является качественная организация всей инфраструктуры проекта машинного обучения, решающая задачи проекта: сбор и обработка данных, эксперименты с данными и моделями, обучение моделей, хранение артефактов разных этапов проекта, сборка, тестирование и вывод решения в производственную среду. В классической разработке программного обеспечения подобные задачи решает инженер DevOps. Концепция DevOps для проектов машинного обучения называется MLOps (Machine Learning Operations). Содержание работы, инструменты и необходимые навыки инженера MLOps очень похожи на DevOps. Однако, из-за специфики проектов машинного обучения, спектр задач и инструментов для их решения в MLOps гораздо шире.
Интерес к MLOps обусловлен тем, что эти навыки сейчас очень востребованы в большом количестве проектов, использующих машинное обучение. Благодаря различным курсам, соревнованиям и хакатонам, тематическим часам и open-source проектам, сейчас сформировано большое сообщество ML специалистов (инженеров, программистов, исследователей, ученых). Базовые вещи в машинном обучении можно освоить быстро: сбор и обработка данных, создание и обучение простых и не очень моделей. Однако столь же быстро приходит понимание, что кроме разработки самой модели необходимо уделять внимание выводу этой модели в продакшн. Поэтому сейчас спрос на MLOps специалистов гораздо выше, чем на ML программистов, а уж если ML программист обладает навыками MLOps, то он вообще является "золотым кадром" для HR и любого подразделения, занимающегося машинным обучением. Сложность в освоении MLOps заключается в том, что нет строгого перечня инструментов и методик, освоив которые можно гарантированно стать MLOps инженером. Для каждого проекта и для каждого предприятия набор таких требований может быть разным. Например, в крупной компании, где все процессы строго регламентированы, MLOps инженер может выполнять небольшой перечень задач с использованием типового инструментария, а в небольшом стартапе, где "все занимаются всем", MLOps инженер активно участвует на всех этапах создания продукта, начиная от архитектуры и заканчивая эксплуатацией. В зависимости от конкретного проекта от MLOps инженера могут потребоваться навыки написания скриптов автоматизации, программирования, работы с базами данных, проектирования API, тестирования, администрирования linux, понимания принципов создания и обучения моделей ML, и множество других. Не претендуя на то, чтобы научить слушателей курса "Инженерия машинного обучения" [1] всем существующим в ИТ технологиям, мы сосредоточились на наиболее популярных инструментах, а также на концепциях и типовых задачах MLOps, о которых коротко расскажем в цикле материалов, а более подробно можно узнать об этом на курсе.
Тема 1: Виртуализация
Одной из частых бед в проектах разработки программного обеспечения является несовместимость разных библиотек, используемых в проекте. Это же в полной мере относится и к проектам ML. Для машинного обучения разработано множество open-source инструментов (библиотек, фреймворков), что само по себе очень круто и конечно же положительно повлияло на взрывной рост разработок в области ML. Однако каждый из этих инструментов разрабатывается по собственной стратегии, разными командами разработчиков с разной квалификацией, по разным дорожным картам. Разные библиотеки развиваются и меняют версии с разной скоростью, что приводит к несовместимости. Такие проблемы сложно быстро диагностировать, а иногда и вообще невозможно. Почти всегда, встретив подобную проблему, разработчик отправляется на stackoverflow. Чтобы избежать несовместимости отдельных компонентов ПО в проектах ML в работе с моделями машинного обучения на всех этапах проекта много внимания уделяют строгому контролю версий всех компонентов используемого программного обеспечения и системных настроек среды, в которой выполняется программа. Основная цель состоит в том, чтобы можно было быстро повторить результат эксперимента. Это можно сделать с использованием выделенных сред выполнения программ, среди которых наиболее популярными являются виртуальные машины и контейнеры приложений.
Архитектура программного обеспечения подстраивается под эти подходы, отдавая предпочтение все более популярной идеологии микросервисной архитектуры программного обеспечения, соответствующей разделению общего монолитного решения на отдельные независимые компоненты. Подробно это рассматривается в курсе магистратуры УрФУ "Инженерия машинного обучения" (1 семестр) [2].
Из этой статьи вы узнаете:
зачем нужны изолированные среды выполнения программ и какие есть подходы для их создания;
что такое виртуальные машины, как их создавать и использовать.
Термин “виртуализация” стал очень популярным благодаря развивающимся технологиям облачных вычислений. Появились облачные сервисы, предоставляющие услуги доступа к виртуальным аппаратным и программным ресурсам таким образом, что для пользователя это выглядит как работа с локальным компьютером или сервером. Такой подход эффективен тем, что позволяет оптимально использовать имеющиеся аппаратные ресурсы:
вычислительные процессоры:
центральный процессор (CPU, Central Processing Unit);
графический процессор (GPU, Graphics Processing Unit);
тензорный процессор (TPU, Tensor Processing Unit);
оперативную память;
средства сетевого обмена информацией;
средства хранения информации, жесткие и оптические диски;
виртуальные программные комплексы, которые можно использовать "из коробки" в облаке.
При виртуализации имеющиеся аппаратные ресурсы разделяются на логические виртуальные сущности для того, чтобы создать несколько изолированных друг от друга процессов, пользующихся виртуальными ресурсами независимо друг от друга. Это позволяет оптимально распределить между изолированными процессами нагрузку на имеющиеся “физические” аппаратные мощности, избежать простоя и непроизводительного использования ресурсов, повышает рентабельность вложений в аппаратное обеспечение. Изолированный процесс, пользующийся виртуальными ресурсами, называется виртуальная машина.
Виртуальная машина имеет свою операционную систему и работает как независимый компьютер. Кроме того, виртуальная машина имеет свои уникальные характеристики мощности процессора и объема памяти, в одних системах нужен большой объем оперативной памяти, а в других предъявляются повышенные требования к скорости вычислений. При планировании ресурсов виртуальных мощностей надо учитывать их суммарный объем “виртуальных мощностей”, сопоставляя с возможностями “физического” аппаратного обеспечения. Понятно, что виртуальные машины, которые не загружены на всю мощность, могут по очереди пользоваться "физическими" ресурсами, при этом их совокупные характеристики в сумме будут больше "физических", в этом и заключается преимущество виртуализации для разделения ограниченного ресурса. Однако если по характеру решаемых задач виртуальные машины часто будут задействовать мощности, близкие к пиковым (например, для вычислений), то необходимо это учесть при планировании. В современных кластерах одновременно может работать много виртуальных машин, поэтому актуален вопрос управления и мониторинга. Система, управляющая виртуальными машинами, называется гипервизор. Оборудование, на котором работает виртуализация, называется хост, его операционная система - хостовой. В противоположность этому, гостевые операционные системы — это операционные системы, работающие в виртуальных машинах, пользующиеся ресурсами хоста. Гостевые операционные системы работают с эмуляцией аппаратных ресурсов.
Основная роль гипервизора состоит в координации работы виртуальных машин и физического оборудования хоста при предоставлении виртуальным машинам доступа к физическим ресурсам. Также гипервизор изолирует виртуальные машины друг от друга, чтобы они не конфликтовали за память или вычислительный ресурс.
По такой схеме работают все системы виртуализации, отличаясь между собой в технических деталях и реализации. Вот, например, схема работы гипервизора Hyper-V, который входит в состав Microsoft Windows.
Основные преимущества технологии виртуализации:
оптимальное использование аппаратных ресурсов:
Один аппаратный ресурс может быть задействован в нескольких виртуальных машинах, которые будут разделять его использование между собой, что снижает время непроизводительного простоя.
Пример для MLOps: вычислительный ресурс GPU в машинном обучении стоит очень дорого, однако применяется главным образом на этапе обучения моделей. В то время как одна модель уже обучена и проходит тестирование, ресурс GPU может быть использован для обучения другой модели.
дополнительные возможности обеспечения безопасности:
Виртуализация позволяет создать копию рабочей системы, чтобы быстро переключиться на вторую систему при выходе из строя первой. Кроме того, виртуальная машина выглядит идентично обыкновенной системе, однако злоумышленник, получивший доступ к виртуальной машине, не сможет вывести из строя основную, хостовую систему.
Пример для MLOps: в случае возникновения неполадок при работе можно переключиться на резервную систему, сократив время простоя.
быстрое развертывание:
Можно создать типовые шаблоны и политики для создания виртуальных машин и их настройки, единообразный подход позволяет упростить и ускорить процедуру развертывания решения. Для унифицированной конфигурации проще проанализировать технические риски и есть возможность создать единые политики безопасности и контролировать их выполнение.
Пример для MLOps: для рабочей конфигурации основных элементов можно создать правила развертывания и настройки, сведя к минимуму время на развертывание системы.
Как видите, технологии виртуализации поддерживают тренд в разработке и использовании программного обеспечения, обеспечивая скорость выполнения операций и надежность.
Примеры гипервизоров виртуальных машин:
VirtualBox компании Oracle, пока еще бесплатный инструмент для виртуализации серверов,
VMware, коммерческий инструмент, обеспечивает виртуализацию серверов, рабочих столов (desktops), хранилищ данных. К сожалению, компания прекратила свою деятельность в России [3],
Hyper-V, входит в состав ОС Microsoft Windows, предоставляет решения по виртуализации серверов и рабочих компьютеров,
отечественная платформа "Базис", см. например [4].
Конечно, список инструментов для виртуализации гораздо шире. В конечном счете специалисты DevOps/MLOps выбирают наиболее оптимальные инструменты, руководствуясь необходимыми функциями, производительностью, стоимостью решения.
Как и почти любая новая полезная технология, виртуализация порождает и новые проблемы с безопасностью. Например, если злоумышленник взломает гипервизор, то он может получить контроль над всеми виртуальными машинами и их операционными системами. Эту проблему будет сложно диагностировать с помощью традиционных средств защиты, так как гипервизоры "не видны" как со стороны самой виртуальной машины, так и со стороны сети, поскольку взаимодействие виртуальных машин друг с другом организуется без участия физической сети. Поэтому необходимо применять продукты для безопасности виртуализации, способные сканировать и исправлять виртуальные машины, зараженные вредоносным кодом, шифровать все виртуальные диски виртуальных машин и контролировать доступ к ним.
Кроме рассмотренной виртуализации серверов, рабочих компьютеров, процессоров и систем хранения данных еще существуют технологии виртуализации сетей, приложений, отдельных компонентов программной системы или даже больших комплексных решений, например ЦОДов. Основные преимущества подхода точно такие же, как мы рассмотрели, быстрая настройка и конфигурирование, простота в эксплуатации, гибкое управление и надежность.
А теперь давайте попробуем познакомиться с возможностями виртуализации на конкретном примере. Предупреждение: если вы матерый инженер, который виртуальные машины поднимает на завтрак, настраивает на обед и восстанавливает на ужин, то дальше вы не найдете для себя чего-либо нового. Начиная со следующего абзаца, текст под катом предназначен для тех, кто только начинает свое знакомство со средствами виртуализации.
Создание виртуальной машины в VirtualBox.
Давайте создадим виртуальную машину с использованием популярного бесплатного инструмента VirtualBox компании Oracle. Инструкции по установке и дистрибутивы для скачивания можно найти здесь.
Для работы вам понадобится образ операционной системы, которая будет работать в виртуальной машине. Мы будет использовать Ubuntu, образ которой можно скачать здесь. Необходимо учитывать, что это файл очень большого размера, поэтому для экспериментов с созданием виртуальных машин можно также воспользоваться образом более “легкой” операционной системы alpine, скачать которые можно здесь.
В качестве хостовой ОС мы будем использовать операционную систему Windows 64-бит, надо внимательно выбрать подходящую программу для установки VirtualBox на сайте, если у вас на хостовой машине другая операционная система, то вам понадобится другой установщик, который также легко найти. Кроме установщика самой программы понадобится еще установщик для пакета расширений VirtualBox, его можно скачать там же.
После запуска исполняемого файла “VirtualBox….-Win.exe” вы будете следовать обычному сценарию установки программного обеспечения в Windows.
В VirtualBox каждая виртуальная машина может иметь до четырех сетевых адаптеров, а каждый такой адаптер имеет определённый режим работы, вот описание некоторых из них:
NAT (Network Address Translation): позволяет виртуальным машинам получать доступ в интернет через хост, но не позволяет им взаимодействовать друг с другом, IP в этом случае назначается динамически, виртуальные машины доступны из внешней сети, но внешняя сеть видит только хост машину,
NAT Network: то же, что и NAT, но виртуальные машины могут взаимодействовать между собой через внутреннюю сеть,
Bridged: виртуальная машина имеет свой собственный статический IP адрес и доступна из внешней сети напрямую,
Host-only: создается одна общая сеть между хостом и всеми виртуальными машинами, каждой из которых можно назначить статический IP адрес, требует создания виртуального сетевого адаптера на хосте.
Эти режимы отвечают за способ взаимодействия виртуальных машин с хостом и между собой, а также будет ли у них доступ в интернет и смогут ли другие устройства в сети хоста взаимодействовать с этими виртуальными машинами.
Виртуальный адаптер сети хоста доступен в меню Файл → Менеджер сетей хоста.
Если требуется отключить динамическое назначение IP адресов для виртуальных машин, то необходимо отключить эту опцию в параметре “DHCP сервер”. Поле “IPv4 адрес” задает IP адрес хоста. Мы можем назначать IP адреса виртуальным машинам из одной подсети с хостом, подсеть задается маской в поле “IPv4 маска сети”. После изменения адреса сетевого адаптера необходимо обязательно перезагрузить компьютер, т.к. без этого виртуальные машины не будут запускаться.
Давайте создадим шаблонную виртуальную машину. Для этого в пункте меню “Машина” необходимо выбрать раздел “Создать”.
После этого можно задать имя виртуальной машины, указать ее тип и версию.
Также можно перейти в расширенные настройки параметров виртуальной машины и изменить такие параметры как объем памяти и способ организации виртуального жесткого диска.
После этого создаем для виртуальной машины новый виртуальный жёсткий диск в формате VDI (VirtualBox Disk Image) с форматом хранения “Динамический виртуальный жёсткий диск” и нужным вам размером, например, для наших целей нам понадобится 10Гб.
Наша виртуальная машина готова.
У созданной виртуальной машины можно теперь менять параметры, например, изменить количество процессоров.
Конечно же, виртуальная машина пока не может эксплуатироваться, хотя и обладает уже виртуальными ресурсами - процессором, оперативной памятью, жестким диском, сетевым адаптером. Для работы необходимо использовать установочный образ, с которого в виртуальную машину будет загружена гостевая операционная система. Один из способов указать виртуальной машине откуда брать загрузочные данные, это создать виртуальный оптический диск и прикрепить к нему образ операционной системы, скачанный с официального сайта (например, в формате ISO). Для этого в панели управления виртуальными машинами надо для рабочей виртуальной машины выбрать пункт “Настроить”
после чего появится следующее окно для настроек
Сначала в разделе “Носители” надо добавить оптический диск
Он должен появиться в перечне дисков
После этого в разделе “Система” меняем порядок загрузки, делаем оптический диск первым
После этого нажимаем кнопку “Запустить”
и в появившемся окне надо выбрать виртуальный загрузочный диск
После этого система начнет использовать диск с загрузчиком операционной системы, в частности, вы увидите диалог для установки Ubuntu.
Полезная информация: если вы нажмете курсором мыши на окно виртуальной машины, то произойдет перехват управления и передача всех управляющих сигналов от мыши и клавиатуры к виртуальной машине. То есть мышь и клавиатура не будут работать в домашней операционной системе. Поначалу это может удивлять и пугать. Вернуть управление можно нажатием специальной клавиши, в большинстве случаев это правая клавиша Ctrl.
Особенностей настройки и работы виртуальных машин очень много, большинство из них понимается и осваивается на практике, при решении конкретных задач. В поисках ответов на нестандартные ситуации даже самые опытные специалисты обращаются к информационным ресурсам: официальным сайтам разработчиков, технической документации, тематическим форумам и группам в Интернет и мессенджерах. И каждая система обладает своими особенностями, плюсами и минусами. Для описания этих особенностей понадобилась бы целая книга, или больше. Поэтому мы в заключении ограничимся описанием двух ситуаций при работе с virtualbox, которые часто вызывают вопросы у новичков: организация двустороннего копирования из хостовой в гостевую систему и обратно и настройка "прокидывания" сетевого порта для доступа к виртуальной машине извне.
Предположим, что вам необходимо скопировать текст из текстового редактора в хостовой машине в консоль в гостевой системе. Например, вы копируете значение ключа или длинную команду. Оказывается по умолчанию это нельзя сделать, для этого необходимо настроить "Общий буфер обмена" и параметры его работы. Для работы с "Общим буфером обмена" (например для его установки в режим "Двунаправленный") недостаточно просто выбрать этот пункт меню
Для осуществления указанных настроек необходимо подключить установочный диск.
И затем выполнить установку обновлений, только после этого появится такая полезная функция "copy" - “paste”.
Для удобства работы разработчика на виртуальной машине требуется настройка IDE, например, Visual Studio Code, который подключается удаленно к серверу через ssh и позволяет редактировать и выполнять скрипты на удаленном сервере. Для организации такой инфраструктуры требуется установить openssh-server на виртуальной машине командой
sudo apt install openssh-server
а затем "прокинуть" порт в virtualbox
после чего в конфигурационном файле ssh в VS Code прописать параметры подключения и открыть удаленное подключение нажав на кнопку
слева внизу в интерфейсе VS Code.
На этом мы завершаем рассказ про виртуальные машины. Теперь вы знаете как на одном компьютере организовать работу нескольких различных операционных систем, работающих независимо и изолированно друг от друга. Это удобный инструмент для изучения различных подходов и инструментов, использующихся в MLOps, так как теперь вы можете создать "макет" многосерверной инфраструктуры предприятия без необходимости задействовать серверные мощности. Для предварительного знакомства с технологиями часто этого оказывается достаточно. Умение настроить виртуальные машины понадобится вам для освоения инструментов в следующих статьях: Jenkins, airflow, mlflow, dvc, clearML.
До новых встреч!
Список литературы
Курс магистратуры УрФУ "Инженерия программного обеспечения".
Магистратура "Инженерия машинного обучения" (первый семестр, второй модуль, второй юнит).
Статья о прекращении деятельности VMWare в России.
"Ведущие российские производители систем виртуализации объединились под брендом Базис".