Как притвориться художником с помощью Docker, AWS и Deep Learning

В соавторстве с Альваро Барберо, докерским ниндзя и главным специалистом по данным в Instituto de Ingeniería del Conocimiento (IIC)

«Хорошие художники копируют, великие художники воруют» - Пабло Пикассо

В сериале документальных фильмов британского канала Channel 4 «Подделка» Полу О'Хара, художнику и декоратору из Ливерпуля, было дано всего четыре недели на то, чтобы превратиться в прекрасного художника и попытаться обмануть критиков в лондонской картинной галерее. Мы собираемся показать, как это сделать менее чем за полчаса и с небольшой помощью Docker, AWS и Deep Learning, включая время, необходимое для чтения этой записи. И менее чем за 10 долларов.

Гениальный ход

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

Но гораздо легче увидеть, что он делает, посмотрев на полученные изображения. Эти картинки стоят тысячи часов исследования или строк кода;)

Загадочная работа этого алгоритма начинается с повторного использования предварительно созданной глубокой нейронной сети, известной как VGG19, разработанной оксфордскими исследователями и победителем конкурса ImageNet Challenge 2014 по обработке изображений. Эта сеть использует несколько уровней сверточных нейронных сетей (CNN) для улучшения изображения от необработанных пикселей до более высокоуровневых, более концептуальных представлений изображения. Настолько высока, что стиль может быть точно представлен корреляциями, возникающими на самых глубоких уровнях сети. Именно благодаря этой декомпозиции необработанных пикселей по сравнению со стилями сеть может использоваться для создания новых изображений, перерисовывая пиксели фотографии в стиле другого изображения.

До сих пор внедрение и развертывание этого алгоритма было непростой задачей по ряду причин. В оставшейся части этого сообщения мы объясним, как это сделать, используя не более трех команд. Но прежде чем мы это сделаем, давайте объясним еще несколько деталей. Теперь, когда мы разобрались, как выполнять штрихи (VGG19), нам понадобятся:

  • Наша палитра рисования: библиотеки torch DL, позволяющие реализовать наш нейронный художник (на основе работ Джастина Джонсона)
  • и способ ускорить производство наших произведений искусства, поскольку мы не хотим тратить часы, дни, недели или месяцы в ожидании результатов. Мы будем использовать графические процессоры -GPU- вместе с традиционным ЦП, чтобы ускорить наш алгоритм глубокого обучения (наши штрихи) и сократить время ожидания до нескольких минут.

Проблемы современной живописи

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

  • Драйверы графического процессора Nvidia для использования графических процессоров
  • Комплект разработчика CUDA для управления графическими процессорами
  • библиотеки cudnn для глубоких сетевых вычислений на GPU
  • torch7, фреймворк для разработки глубоких сетей, и его зависимости (protobuf)
  • lua-модуль loadcaffe для загрузки готовых сетей, вот как мы будем применять VGG19.

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

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

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

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

Малярные инструменты и принадлежности

Теперь нам нужно только место для запуска нашей системы. Мы будем полагаться на публичное облако, в частности на AWS и их виртуальные машины, оптимизированные для GPU. AWS предлагает два семейства инстансов GPU, но мы собираемся использовать совершенно новые инстансы P2 AWS EC2. Эти экземпляры предназначены для преодоления сложных рабочих нагрузок глубокого обучения, подобных той, что у нас в руках. Предоставим это:

$ docker-machine create — driver amazonec2 \
-- amazonec2-instance-type p2.xlarge \
-- amazonec2-access-key *** \
-- amazonec2-secret-key *** nvidia-docker

Перед запуском этой команды вам необходимо:

  1. Установите Docker на Mac, Docker на Windows или докер-машину на свой ноутбук / настольный компьютер, если вы еще этого не сделали.
  2. Создайте учетную запись в AWS. К сожалению, экземпляры P2 или G2 не имеют права на план уровня бесплатного пользования AWS… но мы могли бы сделать много искусства менее чем за 10 долларов. Если на вашем ноутбуке или настольном компьютере есть чип NVIDA, вы можете запускать наши скрипты локально!
  3. Создайте пару ключей доступа / секрета и
  4. Поскольку вам не разрешено использовать экземпляры P2 или G2 по умолчанию на AWS, откройте заявку в службу поддержки AWS, чтобы увеличить лимит экземпляров P2 или G2, которые вы могли бы использовать. На его получение уходит не более нескольких часов.

Установка драйверов NVIDIA и nvidia-docker - это наш второй шаг на нашем пути к становлению (фальшивым) художником. Мы составили простой скрипт, который делает всю работу за нас:

$ docker-machine ssh nvidia-docker
$ git clone https://github.com/albarji/neural-style-docker
$ cd neural-style-docker
$ ./scripts/install-nvidia.sh

Если все пойдет по плану, вы получите следующий результат:

С помощью этой последней команды мы просто устанавливаем программный пакет nvidia и запрашиваем карту GPU, чтобы убедиться, что все в порядке.

Чтобы рисовать, нужно закрыть глаза и спеть ...

Сказал однажды Пикассо. Но прежде чем вы закроете глаза, вот наш последний шаг: развертывание алгоритма машинного обучения, который творит чудеса:

$ ./scripts/fake-it.sh goldengate.jpg vangogh.jpg

Теперь вам нужно только загрузить полученные изображения и опубликовать их на художественном форуме, таком как Devianart, или показать в местной художественной галерее;). На своем ноутбуке / настольном компьютере запустите это:

$ docker-machine scp -r docker-nvidia:/home/ubuntu/neural-style-docker/output .

И соберите свои результаты в текущем каталоге (в нашем примере goldengate_by_vangogh.jpg).

Вот еще несколько примеров того, что вы могли бы сделать:

Дайте мне музей…

… И я его наполню, - снова сказал Пабло Пикассо. Теперь мы тоже могли! И не тратя на это всю жизнь. Мы подготовили несколько стилей и некоторый контент, чтобы вы начали, так что вам нужно только сесть, расслабиться, закрыть глаза и петь. Просто применив эти разные стили к одному и тому же изображению контента, мы могли бы понять, как разные художники изобразили бы одну и ту же сцену или взялись бы за портрет.

Как дань уважения Докеру и часам, дням, неделям нашей жизни, которые спасли нас ... мы решили открыть собственный музей Докера:

Теперь твоя очередь. Выберите своего любимого художника или произведение искусства и несколько своих фотографий и превратите их в произведение искусства. Поделитесь с нами своей работой! И подписывайтесь на нас в Twitter (@albarjip и @lherrerabenitez).

PS: не забудьте остановить и удалить экземпляры P2, когда закончите.

$ docker-machine rm nvidia-docker

Наши галереи

Смотрите «наши» работы по адресу:

Ссылки на ML, DL и Docker

Новичок в ML, DL или Docker и хотите узнать больше Попробуйте эти ссылки…

Сборка и оптимизация образа докера

Мы хотели бы улучшить и уменьшить размер нашего образа докера. Не могли бы вы нам помочь?

  • Клонировать проект
$ git clone https://github.com/albarji/neural-style-docker
  • Измените любой из файлов проекта
  • Создайте новый образ:
$ sudo nvidia-docker build -t neural-style:2.0 .
  • Проверьте, работает ли он, запустив пример в документации:
$ sudo nvidia-docker run — rm -v $(pwd):/images — entrypoint python neural-style /neural-style/variants.py — contents img/docker.png — styles img/starryNight.jpg — outfolder