- PVSM.RU - https://www.pvsm.ru -

Недавно, команда AWSDeepLearning выпустила новый фреймворк — “sockeye”, цель которого является упрощение обучения seq2seq сетей. Забегая вперед — я даже не ожидал такой простоты. Так что решил написать простое, быстрое и самодостаточное руководство, которое не требует от читателя глубоких знаний в области нейронных сетей. Единственное, что все же требуется для успешного выполнения всех шагов, это иметь некоторый опыт работы с:
Если все эти три вещи не вызывают проблем — прошу под кат.
Перед тем как продолжить, хочу высказать особенную благодарность моим патронам [1], которые меня поддерживают.
Как уже упомянул, намедни команда AWS DeepLearning выпустила новый фреймворк — “sockeye”. Позвольте мне привести цитату с официального сайта:
… the Sockeye project, a sequence-to-sequence framework for Neural Machine Translation based on MXNet. It implements the well-known encoder-decoder architecture with attention.
Вольнвый перевод:
Sockeye это фреймворк для обучения нейронных сетей машинному переводу, который базируется на известной архитектуре encoder-decoder.
Несмотря на то, что официально это framework разработан для тренировки сетей, для машинного перевода, технически он же может быть использован для тренировки более общего класса задач преобразования одной последовательности в другую(seq2seq). Я уже затрагивал тему того, почему машинные перевод и создание чата ботов, как две задачи, имеют очень много схожего и могут решаться схожими методами, в одной из прошлых статей [2]. Так что не буду повторятся оставив возможность пытливым читателям пройти по ссылки, а тем временем я перейду к непосредственно созданию чат-бота.
В целом, процесс состоит из следующих шагов:
В данной статье мы будем использовать AWS DeepLearning AMI [3], далее по тексту: DLAMI (кстати, если вы не знаете что такое AMI, то рекомендую ознакомится с официальной документацией вот тут [4]). Основные причины использования именно этого AMI:
Для того что бы быстро создать нужную нам машину из AMI, идем на страницу DLAMI в AWS Marketplace [5]. Тут стоит обратить внимание на следующие вещи:

На момент написания — «Jun 2017» была самая свежая версия, так что если хотите, что бы ваш процесс был консистентет с остальной частью этой стать — рекомендую выбрать именно его.

Учитывайте что не все типы машин с GPU доступны во всех регионах. Собственно, даже если они формально доступны, то не всегда есть возможность их создать. Так, например, в 2016 во время NIPS конференции с ними было очень проблематично. Нам потребуется машина типа p2, плюс, и на момент написания статьи, DLAMI был доступен только в тех регионах, где этот самый тип был доступен:


p2.xlarge — является самой дешёвой машинкой которая удовлетворяет нашим требованиям к памяти GPU (можете конечно попробовать и g2.2xlarge, но не говорите потом что вас не предупредили). На момент написания цена за него составляла ~0.9$ в час. Но лучше проверьте цену на официальном сайте [6].

Если не в курсе что с этим делать — не трогайте.

Так же как и с VPC, не знаете — не трогайте. Однако, если хотите использовать существующую группу, то убедитесь что там открыт SSL.

Позволю себе предположить что у читателя есть опыт работы с SSH и есть понимание того что это.

Собственно теперь можем создать машину и подключится к ней.
Подключимся к ново созданной машине. Сразу после, самое время запустить screen. И не забудьте тот факт, что при подключении нужно использовать логин ec2-user:

Несколько замечаний по сему моменту:
Первое что нам нужно, это установить sockeye. С DLAMI процесс установки очень простой, всего одна команда:
sudo pip3 install sockeye --no-deps
Важная чать тут то, что нужно использовать именно pip3, а не просто pip, так как по умолчанию pip из DLAMI использует Python 2, который в свою очередь не поддерживается в sockeye. Так же нет необходимости устанавливать какие либо зависимости ибо они все уже установлены.
Для тренировки, мы будем использовать “Cornell Movie Dialogs Corpus”(https://www.cs.cornell.edu/~cristian/Cornell_Movie-Dialogs_Corpus.html). Это, по факту огромный корпус диалогов из фильмов. Для обучения его нужно «приготовить», собственно я уже реализовал скрипт который готовит корпус и рассказывал детальнее о не ранее.
Ну а теперь давайте эти самые данные, для обучения, и подготовим:
# cd ~/src
src# git clone https://github.com/b0noI/dialog_converter.git
Cloning into ‘dialog_converter’…
remote: Counting objects: 59, done.
remote: Compressing objects: 100% (49/49), done.
remote: Total 59 (delta 33), reused 20 (delta 9), pack-reused 0
Unpacking objects: 100% (59/59), done.
Checking connectivity… done.
src# cd dialog_converter
dialog_converter git:(master)# git checkout sockeye_chatbot
Branch sockeye_chatbot set up to track remote branch sockeye_chatbot from origin.
Switched to a new branch 'sockeye_chatbot'
dialog_converter git:(sockeye_chatbot)# python converter.py
dialog_converter git:(sockeye_chatbot)# ls
LICENSE README.md converter.py movie_lines.txt train.a train.b test.a test.b
Пару вещей на которые стоит обратить внимание:
Теперь давайте создадим папку где будем проводить обучение и скопируем туда все данные:
# cd ~
# mkdir training
# cd training
training# cp ~/src/dialog_converter/train.* .
training# cp ~/src/dialog_converter/test.* .
Ну все, мы готовы начать обучение…
С sockeye процесс обучения очень прост — нужно лишь запустить одну единственную команду:
python3 -m sockeye.train --source train.a --target train.b --validation-source train.a --validation-target train.b --output model
Знаю-знаю, НИКОГДА не используйте один и те же данные для обучения и валидации. Однако мой скрипт на данный момент не совсем корректно разбивает данные на две группы и посему более лучшие результаты (я о субъективном оценивании) получаются, как не странно, без разбивки.

Если читали прошлую статью [2] то могли заметить что sockeye пытается за вас найти подходящую конфигурацию для тренировки, а именно:
Это довольно неплохо, так как более близкая к оптимуму конфигурация может привести к более быстрой (читай дешёвой) тренировке. Хотя еще нужно посмотреть как именно sockeye производит поиск параметров и насколько много ресурсов тратится на этот процесс.
Также sockeye определит когда именно процесс обучения стоит завершить. Это произойдёт если качество модели не улучшилось на данных для валидации за последние 8 контрольных точек.
Пока ждете можно посмотреть как MXNet пожёвывает ресурсы GPU во время обучения. Для этого нужно запустить вот эту команду в новом окне:
watch -n 0.5 nvidia-smi
Увидите что-то вроде:

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

Теперь можно начать общение:
Этот процесс не требует остановки обучения, нужно лишь открыть новое окно (ну или новое SSH соединение) перейти в ту же папку где происходит обучение и выполнить команду:
python3 -m sockeye.translate --models model --use-cpu --checkpoints 0005
Несколько элементов на которых хочу с акцентировать внимание:
После запуска команды sockeye будет считывать ввод из STDIN и выводить ответ в STDOUT. вот несколько примеров:



Как можно увидеть с sockeye процесс обучения очень прост. Собственно, самое сложное, пожалуй, это поднять нужную машину и подключится к ней =)
Я все до сих пор жду что бы кто-то из читателей:
PS: не забудьте скачать вашу модель и прибить машину после окончания обучения.
Вот тут [9] можно скачать натренированную модель (тренировал всего 4 часа). Ее можно использовать на локальной машине, что бы поиграться с ботом, если не хочется тренировать своего.
Автор: Viacheslav Kovalevskyi
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/amazon-web-services/260022
Ссылки в тексте:
[1] патронам: https://www.patreon.com/b0noi
[2] прошлых статей: https://habrahabr.ru/post/317732/
[3] AWS DeepLearning AMI: https://aws.amazon.com/amazon-ai/amis/
[4] тут: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html
[5] страницу DLAMI в AWS Marketplace: https://aws.amazon.com/marketplace/pp/B01M0AXXQB
[6] на официальном сайте: https://aws.amazon.com/ec2/pricing/on-demand
[7] tmux: https://en.wikipedia.org/wiki/Tmux
[8] screen: https://en.wikipedia.org/wiki/GNU_Screen
[9] Вот тут: https://s3-us-west-1.amazonaws.com/blog.kovalevskyi.com/models/model_chatbot.zip
[10] Источник: https://habrahabr.ru/post/332654/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.