Skip to content

Latest commit

 

History

History
111 lines (70 loc) · 17 KB

HOW_TO_START.md

File metadata and controls

111 lines (70 loc) · 17 KB

Starter kit

Задача этого раздела - рассказать вам как как начать работать над своим игроком, редактировать код вашего сервиса, а также улучшать вашу модель для загадывания и отгадывания слов.

Если вы уже задеплоили вашего первого игрока по кнопке "Deploy to heroku" - отлично! Вы сможете использовать то же приложение на heroku на шаге 3.

  1. Для начала, форкните этот репозиторий и скачайте себе репозиторий: выполните в консоли git clone $YOUR_OWN_FORK на свою локальную машину.
  2. Вам потребуется собрать локальное окружение - если вы пользуетесь Pipenv, то это можно сделать с помощью pipenv install. В прочих случаях зависимости можно установить из requirements.txt
  3. Запустите dummy бота для шляпы локально.
    • Можно просто выполнить cd flask_app && python app.py
    • Вы можете сделать это с помощью docker: cd flask_app && docker build . -t hat-player:latest. Когда сборка закончится, выполните docker run hat-player:latest. Теперь откройте localhost:8888 и вы увидете ваше приложение.
    • Наконец, можно запустить локально с помощью heroku: heroku local web
  4. Зарегистрируйтесь на heroku.com, задеплойте туда приложение, следуя инструкциям https://devcenter.heroku.com/articles/git
  5. Если вы задеплоили новую модель на новый URL, вы можете вернуться к гугл-форме и отредактировать URL в ней. Лидерборд остается на том же месте :)

Глубже в детали

Теперь, когда вы задеплоили своего первого dummy-игрока игрока в Шляпу, пришло время обучить более интелектуальную модель. В ноутбуке GameRun_Demo.ipynb есть пример обучения простой fasttext модели. Обратите внимание, что в качестве датасета можно использовать только 20newsgroups.

Теперь давайте разберемся, как устроена игра и сам сервис в flask_app.

Проведение игр со своими локальными моделями

Начнем с примера проведения игры. Для этого откроем ноутбук GameRun_Demo.ipynb и выполним его целиком. Мы будем использовать 20 news groups - их можно загрузить с помощью модуля sklearn.datasets. Они также доступны на kaggle.

Данный пример позволяет проводить локальные игры между несколькими игроками в рамках юпитер ноутбука (нужно инициализировать объекты соответствующих классов в ноутбуке), а также тестировать развернутые удаленно сервисы (с помощью класса RemotePlayer).

Также проводить локальные игры можно с помощью скрипта run_game.py.

Сервис с удаленным игроком

Обратим внимание на класс RemotePlayer. Этот класс используется для коммуникации с сервисом, поднимаемым вами на удаленной (или локальной) машине. Смотря на него, видно, какие методы (эндпоинты) дергаются у сервиса. Сам запускаемый сервис описан в папке flask_app.

В скрипте app.py создается простое Flask-приложение, отображающее на главной странице гифки с котами и умеющее обрабатывать два типа запросов: /explain и /guess. Запросы к приложению могут выглядеть следующим образом: 127.0.0.1:5000/explain?word=riddle&n_words=10

В скрипте player.py находится класс, описывающий игрока (в примере класс LocalFasttextPlayer).

В requirements.txt перечислен список библиотек, необходимых для работы app.py и player.py

Dockerfile представляет собой файл, задающий параметры сборки докер-образа.

Для модификации сервиса должно быть достаточно переместить код класса своего игрока в player.py, скопировать необходимые для работы файлы в папку flask_app, затем проинициализировать объект класса с использованием нужных файлов в скрипте app.py.

Обратите внимание на то, что есть две стратегии заворачивания модели в докер-образ: запаковать файл с моделью в докер-образ (докер-образ будет весить много мегабайт) или скачивать модель при каждом старте сервиса (сервис будет долго запускаться и перезапускаться - это актуально для heroku, где бесплатные сервисы "засыпают"). Для временного хранения файлов можно использовать transfer.sh. Смотрите примеры использования по ссылке.

Как реализовать локального игрока

Удобно сначала создать локального игрока, реализовать желаемую логику по загадыванию и отгадыванию слов, а также отладить его работу локально, а затем перенести код и обученную модель в приложение на flask, которое можно запускать как полноценного удаленный сервис с реализованным игроком.

Обратим внимание на класс LocalFasttextPlayer. Для описания локального игрока необходимо создать подобный класс с обязательным присутствием методов explain и guess, которые принимают на вход те же аргументы и возвращают объект того же типа. Предлагается инициализировать класс обученной моделью и другими необходимыми параметрами, описывающими логику загадывания и отгадывания. Для начала предлагается воспользоваться следующим подходом:

  1. Имеющийся корпус текстов предобрабатывается - например, удаляются специальные символы, слова приводятся к начальной форме, и так далее;
  2. На текстах обучаются эмбеддинги или реализуется другой способ находить слова для объяснения или отгадывания слов;
  3. Обученные эмбеддинги используются, чтобы находить ближайшие по косинусному расстоянию слова к загадываемому слову (/explain) и к предлагаемой для отгадывания последовательности слов (/guess);
  4. Поверх найденных ближайших слов реализуется определенная логика - например, убрать из списка однокоренные слова или убрать слишком короткие/бессмысленные слова.

Важным моментом является наличие timeout запросов к сервису с удаленным игроком. Обратите внимание на реализацию этого в коде.

Запуск созданного сервиса

Ниже рассматриваются две возможности запуска данного приложения:

  1. Без использования docker-образа;
  2. С помощью использования докер-образа.

Запускать сервис можно локально, на удаленном сервере и с помощью специализированных платформ для этого - например, heroku или GKE (Google Kubernetes Engine).

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

Без использования docker

При запуске непосредственно flask-приложения локально достаточно выполнить команду python app.py. Проверить работу приложения можно, зайдя в браузере на 127.0.0.1:5000. Если приложение успешно запустилось, вы увидите гифки с котиками.

С использованием docker

Запуск с помощью docker можно произвести следующим образом. Внутри папки docker-flask-app выполните две команды:

  1. Собрать докер-образ, руководствуясь инструкцией в Dockerfile: docker build -t hat_player .
  2. Запустить собранный образ, связав порт 5000 внутри докер-контейнера с портом 5000 на используемом сервере: docker run --rm -it -p 5000:5000 hat_player

При запуске контейнера с docker-образом выполняются команды, описанные в Dockerfile. В частности, внутри нашего докер-образа будет выполнена команда python app.py.

Запуск на heroku

Для запуска сервиса в рамках участия в соревновании предлагается воспользоваться сервисом heroku. Запуск с бесплатным аккаунтом обладает следующими особенностями:

  • (+) Запущенный сервис будет существовать на heroku неограниченное время, в отличие от поднятых временно серверов на облачных провайдерах;
  • (+) Поднятый сервис не требует вашего дальнейшего вмешательства а также не зависит от перезагрузок сервера, переустановок пакетов и так далее;
  • (-) Сервис "засыпает" после получаса неиспользования;
  • (-) В месяц доступно около 500 часов для работы запущенных сервисов;
  • (-) На один сервис доступно 512мб RAM.

Приложение на heroku можно запустить с помощью git и с помощью docker-образа.

Запуск на GKE

Чтобы развернуть более требовательное к памяти или вычислениям приложение, можно воспользоваться Google Kubernetes Engine. Для этого достаточно завести аккаунт в Google Cloud (за регистрацию дают 300$, но придется привязать банковскую карту. Не забудьте отвязать вовремя :)

  1. Создать аккаунт в Google Cloud;
  2. Задеплоить докер-образ. Удобно воспользоваться вариантом А и использовать Cloud Shell. Вместо Step 4: Create a container cluster нужно создать кластер с двумя n2-highmem-4 (4vCPUs, 32GB RAM);
  3. Проверить его доступность и мониторить состояние.

Запуск на удаленном сервере

Если вы запускаете приложение на удаленном сервере, необходимо, чтобы порт 5000 был открыт для входящий соединений извне. При использовании aws, google cloud, azure или других облачных провайдеров эти параметры есть в панели управления созданным сервером.

Аналогично использованию Google Kubernetes Engine, можно арендовать машинку на Google Cloud. На этой машинке можно запустить приложение на Flask или установить докер и запустить докер-образ. Чтобы сервер был доступен снаружи, потребуется также открыть порты.

Полезные ссылки