Хотя мои последние несколько статей в блоге были больше сосредоточены на машинном обучении и глубоком обучении, я подумал, что было бы неплохо написать о DevOps в связи с машинным обучением и проектированием данных. В конце концов, без инженерии данных возможности машинного обучения ограничены. А без DevOps создание воспроизводимой и рентабельной инфраструктуры намного сложнее и требует больше времени. Инженеры DevOps создают инфраструктуру в виде кода, который можно легко, быстро и по запросу развертывать или модифицировать. Инженеры данных создают надежные воспроизводимые конвейеры для перемещения данных из разрозненных исходных систем в централизованное место, где специалисты по данным превращают их в ценность. Таким образом, инженеры по данным — незамеченные герои аналитического ландшафта (полное раскрытие: я много лет был инженером по данным).
Недавно начал экспериментировать с H2O, и надо сказать, интересный вариант. Сказав это, у него есть свои сильные и слабые стороны. Например, я не считаю это хорошим вариантом для подтасовки данных. Однако, как только у вас есть набор данных, готовый для машинного обучения, стоит потратить время на изучение.
Зачем рассматривать H2O?
H2O — это распределенная, быстродействующая и масштабируемая платформа машинного обучения с открытым исходным кодом, работающая в оперативной памяти. Вы можете использовать его как с Python, так и с R, и у него даже есть вариант под названием Sparkling Water, который вы можете использовать с Apache Spark. Возможно, его самая интригующая функция — AutoML — функция, которая позволяет H2O выполнять анализ ваших данных с использованием нескольких контролируемых алгоритмов, возвращая таблицу лидеров с подробным описанием наиболее эффективных из них.
Масштабирование
Одной из замечательных особенностей H2O является то, что вы можете масштабировать, создавая кластер из нескольких узлов. Хотя официальные инструкции по настройке кластера довольно просты, я могу добавить несколько советов:
- Использование Terraform для автоматической установки (и уничтожения) кластера практически любого размера с помощью одной команды
- Настройка кластера менее дорогих инстансов на спот-рынке Amazon EC2
- Запуск H2O как службы, чтобы ее можно было остановить и запустить с помощью
systemctl
в вариантах systemd Linux (Amazon Linux 2, Ubuntu и т. д.)
Конечно, вы можете запустить H2O на своем локальном компьютере, но когда вы запускаете его на кластере дешевых облачных виртуальных машин, с этим приходится считаться. В этом блоге я покажу вам, как создать кластер H2O из трех узлов менее чем за 0,10 доллара США в час, который будет работать более чем в два раза быстрее, чем его запуск на прилично оснащенном MacBook Pro (НЕОБХОДИМО ПРОВЕРИТЬ).
Предостережения
Несколько оговорок, прежде чем мы начнем:
- Это не следует использовать в качестве руководства для создания производственного кластера.
- Я предполагаю, что вы используете какую-то разновидность Linux (включая OS X) на своей локальной машине.*
- Вы установили Интерфейс командной строки AWS (AWS CLI) и Terraform.
- У вас правильно настроен файл учетных данных AWS в подкаталоге
.aws
домашнего каталога вашего пользователя. - Мы запустим экземпляры в вашем облаке VPC по умолчанию и назначим каждому публичный IP-адрес. Amazon создает для вас VPC по умолчанию в каждом регионе при создании учетной записи AWS.
- Для этой демонстрации мы будем использовать Amazon Linux 2.
- Скрипты используют экземпляры t2.large EC2 по спотовой цене 0,03 доллара США в час. Вам нужно будет убедиться, что спотовая цена для узлов t2.large в выбранной вами зоне доступности ниже, чем для выполнения ваших спотовых запросов, или отредактировать файлы Terraform, чтобы изменить спотовую цену на более высокую.
* Примечание для пользователей Windows: если вы используете Windows ≤ 8, проще всего установить Virtualbox и Ubuntu. Если вы используете Windows 10, рассмотрите возможность настройки Подсистемы Windows для Linux. Если вы используете Windows 10 Enterprise, Pro или Education, вы можете настроить Hyper-V и создать виртуальную машину Ubuntu через Hyper-V.
Вы можете использовать образ машины для настройки сервера H2O со всеми прибамбасами коммерческого продукта, включая ИИ без драйверов. Однако один узел рекомендованного поставщиком типа инстанса (p3.2xlarge) обойдется вам более чем в 3,00 доллара в час. Да, эти инстансы намного мощнее, чем инстансы t2.large, которые мы будем использовать, но вы получаете то, за что платите.
Предположения и сводка шагов
В этой статье предполагается, что у вас есть достаточные знания об AWS, в том числе о настройке конфигурационного файла SSH на локальном компьютере, создании инстансов и групп безопасности EC2 и работе с ними, а также об использовании интерфейса командной строки AWS. К счастью, Terraform делает большую часть тяжелой работы за нас.
Вот обзор того, что вам нужно сделать:
- Скопируйте репозиторий GitHub с сопутствующим кодом этой статьи.
- Создайте и настройте несколько переменных в файле a
terraform.tfvars
в корневом каталоге репозитория, который вы клонировали. - Запустите скрипт bash, чтобы запустить код Terraform, позволив ему завершиться.
- Подключиться к веб-интерфейсу через браузер.
- Уничтожьте ресурсы после того, как закончите экспериментировать.
Вкратце код Terraform:
а. Создает группу безопасности, позволяющую подключаться к виртуальным машинам через SSH (для устранения неполадок и туннелирования SSH) и разрешает связь между узлами (открывает порты 54321 и 54322 TCP и UDP для связи между узлами).
б. Создает три экземпляра EC2 и создает файл в домашнем каталоге каждого узла (здесь /home/ec2-user
) с именем flatfile.txt
, который включает частные IP-адреса всех трех узлов и запускает H2O на всех узлах в качестве службы.
в. Связывает группу безопасности с этими экземплярами.
Переменные настройки
Во-первых, взгляните на файл variables.tf
. Есть несколько переменных со значениями по умолчанию и некоторые без значений. Затем вы присвоите значения значениям без значений по умолчанию (если вам нужно переопределить какие-либо другие переменные, вы также можете сделать это, используя следующий процесс).
Перейдите в корневую папку репозитория и создайте или отредактируйте файл terraform.tfvars
. Вам нужно будет ввести значения по крайней мере для четырех переменных:
iam_instance_profile
— имя роли IAM для назначения экземплярам EC2.key_name
— имя вашего SSH-ключа (без суффикса.pem
)vpc_id
— идентификатор VPC, который вы будете использоватьsubnet_id
— идентификатор подсети в этом VPC
Вот пример того, как присвоить значение переменной:
iam_instance_profile = "My-IAM-Role-For-EC2-Instances"
Вероятно, вам не придется редактировать какие-либо другие значения переменных, но имейте в виду, что если вы запускаете не в регионе AWS us-east-1, вам также потребуется изменить зону доступности, а также AMI ID, потому что они зависят от региона.
После того, как вы отредактировали файл terraform.tfvars
, перейдите в корневую папку репозитория в окне терминала и введите следующее, чтобы запустить код в шаблоне Terraform:
sh launch_ondemand.sh /path/to/ssh/key/mykey.pem
Ключ, который вы используете здесь, должен быть тем же, что вы установили в файле terraform.tfvars
. Код пользовательских данных в bootstrap_h2o_python3.sh
(см. первый скрипт ниже) запускается на каждом экземпляре для установки Java, Python3, некоторых модулей Python и H2O, копирования некоторых файлов из репозитория GitHub и настройки H2O для запуска в качестве службы в systemd Linux. варианты, такие как Amazon Linux 2.
Второй скрипт ниже определяет, как служба запускается, останавливается и перезагружается, а третий скрипт (взятый из отличного поста о переполнении стека) — это фактический код, который запускается, когда вы вводите sudo service h2o start
(или stop
или restart
) в командной строке. .
Ниже приведен скриншот правил безопасности для входящего трафика для группы безопасности для H2O, созданных скриптом Terraform. Он обеспечивает связь между узлами и позволяет вам использовать SSH и SCP с вашими узлами.
Настройте динамическую переадресацию в локальном файле конфигурации SSH для переадресации всех локальных подключений через порт 8157 на удаленный хост.
Ниже приведен пример файла конфигурации SSH, который вы можете использовать для подключения к своим экземплярам H2O. Обратите внимание на локальную переадресацию на первом сервере. Пока вы подключены к этому серверу h2o1
через SSH и работает H2O, вы сможете подключиться к графическому веб-интерфейсу, введя https://127.0.0.1:8157
в веб-браузере вашего локального компьютера. Отредактируйте этот файл, чтобы заменить IP-адрес общедоступным IP-адресом сервера h2o1
. Вы можете сделать то же самое для других узлов, но вам это не нужно, если только вы не планируете подключаться к ним через SSH для устранения неполадок.
Когда код Terraform завершается, он записывает частные и общедоступные IP-адреса в flatfile.txt
и public_ips.txt
соответственно и использует список общедоступных IP-адресов для копирования flatfile.txt
в домашний каталог каждого узла H2O. H2O использует этот файл, чтобы быть в курсе доступных узлов в кластере.
После завершения сценария запуска и настройки конфигурационного файла SSH для переадресации портов подключите SSH к узлу кластера H2O, который вы обозначили какh2o1
, и введите следующую команду:
sudo systemctl status h2o
Вы должны увидеть что-то вроде следующего:
Это хороший знак — H2O успешно настроен как минимум на одном узле. Все еще подключенный к h2o1
через SSH, откройте окно веб-браузера и введите следующее, чтобы подключиться к H2O Flow:
https://127.0.0.1:8157
Вы должны увидеть графический интерфейс H2O Flow. Это происходит из-за того, что вы добавили инструкцию LocalForward
к узлу h2o1
в файле конфигурации ssh, а также из-за того, что у вас есть открытое соединение SSH с этим узлом.
Вы можете убедиться, что правильно настроили свой кластер, щелкнув меню «Администратор» и выбрав «Статус кластера».
Значения могут различаться, но вы должны увидеть эти четыре строки, по одной для каждого узла кластера и одну для совокупных значений всех узлов.
Вот и все! Вы только что установили недорогой мощный кластер H2O за 0,09 доллара в час. Не стесняйтесь поэкспериментировать с интерфейсом H2O Flow в своем браузере, чтобы понять, на что он способен.
Наконец, вернитесь в каталог с кодом Terraform и введите terraform destroy
, чтобы удалить узлы кластера и группу безопасности. Вам нужно будет ввести yes
в командной строке и подождать, пока не появится сообщение, подтверждающее, что все ресурсы были успешно уничтожены.
Важное предостережение: важно знать, что H2O не настроен на высокую доступность на момент написания этой статьи, поэтому, если один из узлов выйдет из строя, вам потребуется перезапустить весь кластер. а не просто перезапустить службу или виртуальную машину отказавшего узла.
В следующем сообщении в блоге я покажу вам, как использовать мощную функцию H2O AutoML для автоматизированного машинного обучения.