Если вы случайно наткнулись на эту статью, я настоятельно рекомендую вам начать с первой части этой серии по вполне очевидным причинам.

Вот и все, конец пути, как они (кто?) Говорят. План состоял в том, чтобы вести своего рода журнал действий, необходимых для перехода от идеи к продукту, хотя и простой и ограниченный по объему, что мы и сделали. И график соблюдал!

Не благодарите, настоящим героям это не нужно.

Другие статьи из этой серии

Напомним, на этом этапе мы завершили конвейер данных, который идет от изображения к решению головоломки судоку. Сегодня мы замыкаем круг, упаковывая наш продукт, создавая приятный веб-интерфейс.

Однако прежде чем мы начнем, небольшое предположение.

Единорогов не бывает

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

Я считаю себя достаточно опытным в программировании на Python и материалах, связанных с машинным обучением, но, например, мои знания о том, как лучше всего развернуть приложение, подобное тому, над которым я работал для этой серии, ограничены, если не сказать больше. . Это означает, что, конечно, я могу собрать что-то, что, вероятно, сработает и не подожжет всю серверную, но очень вероятно, что любой опытный ‹INSERT-JOB-TITLE-OF-PERSON-Who-DOES-THESE-THINGS ›В лучшем случае сочтет мою реализацию неоптимальной.

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

[Не очень] динамический дуэт: интерфейс + бэкэнд

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

Я решил использовать flask для бэкэнда, поскольку я уже был знаком с ним, и он хорошо сочетается с остальным кодом, написанным на Python, и Node.js для внешнего интерфейса. , так как у меня никогда не было повода поиграть с ним, и это показалось мне хорошим.

Я действительно не хочу вдаваться в подробности того, как я что-то делал, поскольку на самом деле здесь нет ничего особенно умного, просто обычное сочетание HTML / JS / CSS (bootstrap) и асинхронных запросов для внешнего интерфейса, а также супер стандартная функция вывода в бэкэнде, плюс немного магии PIL для рисования решения (т. е. недостающих чисел) по исходной сетке. Вот как это выглядит:

Как обычно, вы найдете код этого проекта в репо. Обратите внимание, что для того, чтобы система работала, вам придется либо обучить модель самостоятельно (следуя инструкциям в предыдущей статье этой серии), либо загрузить ту, которую я обучил (в репозитории есть сценарий с именем download_data.sh, который выполняет тот). Вам также понадобится файл шрифта .ttf, используемый для записи цифр на выходном изображении (об этом также позаботится сценарий).

Dockerize ВСЕ ВЕЩИ

Если бы я был ответственным, я бы сделал незаконным развертывание чего-либо любым способом, кроме контейнера докеров или чего-то подобного. И я не говорю о незаконном «вы получаете штраф», я говорю как минимум о пожизненном заключении.

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

Вот и все, готово! Но еще кое-что.

Ретро

Хорошая практика - после завершения проекта (или даже его части) проанализировать, что прошло хорошо, а что пошло не так, чтобы в следующий раз можно было улучшить и стать лучше. Это называется «иметь ретро» (сокращенно от «ретроспективы»).

Что прошло хорошо

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

Все прошло более-менее гладко, за небольшим исключением, о котором мы поговорим в следующем абзаце.

Что прошло неважно

Единственная часть, которая представляла некоторые неожиданные проблемы, - это реализация компонента распознавания цифр. Не вдаваясь в подробности (более подробное обсуждение можно найти в статье, посвященной этой части), подход, который я изначально планировал использовать, не сработал так, как ожидалось, и необходимо было найти альтернативный маршрут.

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

Последнее слово автора

Я написал эту серию, чтобы поставить перед собой задачу создать то, что, я надеюсь, вы найдете качественным, с приличным количеством юмора, чтобы сделать его терпимым. Я пытался (и, видимо, умудрялся, да ладно мне!) Придерживаться расписания, чтобы выпускать одну новую статью каждый понедельник, чтобы не дать угаснуть импульсу.

Не стесняйтесь связываться со мной через LinkedIn, я всегда готов обсудить темы, связанные с наукой о данных, и тому подобное со всеми, кто разделяет этот интерес.

Более того, если вы - детеныш и / или подражатель данных и не можете понять, что вам следует делать, чтобы получить работу в этой фантастической отрасли, напишите мне: я буду более чем счастлив дать вам совет по этому поводу 🙃

Спасибо за чтение!