How Prototyping Can Help You to Get Buy-In
Юджин Ян объясняет, почему демонстрация простого прототипа часто убеждает руководство там, где не справляются продуманные предложения с исследованиями и данными. Прототипы делают идею конкретнее, служат доказательством технологии и упрощают сбор обратной связи, но не отвечают на вопрос «зачем это строить», поэтому проект всё равно стоит начинать с one-pager'а. В прошлой роли автору отказали в развитии компьютерного зрения, но он в свободное время собрал на Theano реализацию ResNet с transfer learning для классификации изображений и поиск по эмбеддингам с косинусной близостью; демо зажгло стейкхолдеров, и в 2018 году поиск по картинкам вышел в приложении (Lazada). Он советует строить прототипы на Python (Flask, FastAPI, Streamlit, Docker, EC2 spot) и делится уроком: первый классификатор, доступный лишь через curl, никто не использовал, пока он не добавил простой GUI. Главный вывод: каким бы хорошим ни был ваш код, нетехнические пользователи не попробуют его без удобного графического интерфейса, поэтому имеет смысл потратить неделю-две на прототип в начале проекта.
Как прототипирование помогает заручиться поддержкой
[ productivity ] · 7 мин чтения
Иногда хорошо продуманные предложения, подкреплённые обширными исследованиями и данными, не убеждают тех, кто принимает решения. А демонстрация простого прототипа вызывает у них энтузиазм и готовность взяться за дело. Меня удивляет, как часто это происходит.
Хотя нам всё же стоит начинать проекты с one-pager'а, чтобы прояснить идеи, поделиться ими и получить отзывы, — если дело не движется, один из вариантов — собрать и показать прототип.
Почему прототипы работают: они конкретнее
Прототипы делают наше видение доступнее. Для нетехнических людей идеи и проектные замыслы могут быть слишком абстрактными. Трудно представить опыт конечного пользователя по документу. В отличие от этого, прототипы — особенно с графическим интерфейсом (GUI) — позволяют легче понять, как выглядит и ощущается итоговый продукт. Помогая другим лучше понять наши идеи, мы повышаем шансы заручиться поддержкой.
Прототипы также служат доказательством технологии. То, что мы обещаем сделать с помощью данных и машинного обучения, может звучать как преувеличение. (Впрочем, бывает и обратное, когда от нас ждут чуда из Excel-таблицы на 500 строк.) Пытаясь заручиться поддержкой, я порой сталкиваюсь со скепсисом: «А это правда выполнимо?» Построив прототип, мы делаем предложение реальным и достижимым, и убедить тех, кто принимает решения, становится проще.
«Всё кажется невозможным, пока не будет сделано». — Нельсон Мандела
Наконец, прототипы упрощают получение обратной связи. Вместо того чтобы присутствовать на презентации или читать предложение, люди могут взаимодействовать с нашим приложением. Они могут протестировать его на своих данных (например, изображениях товаров, действиях пользователей) и увидеть результаты. Давая им повзаимодействовать с прототипом предлагаемой идеи, мы повышаем шансы получить отзывы.
Но прототипы не объясняют «зачем»
Хотя прототипы могут показать «Как это выглядит?» и «Как это будет работать?», они не объясняют «Зачем нам это строить?» Поэтому, если «зачем» для проекта всё ещё неясно, нам лучше написать one-pager, чтобы прояснить проблему, замысел и критерии успеха. Иначе неважно, насколько хорошо работает наш прототип, если он не решает правильную проблему.
Кроме того, в зависимости от масштаба проекта быстрый прототип может быть невозможен. Крупные проекты (например, доставка дронами, беспилотные автомобили, собственная ML-платформа) потребуют значительных ресурсов, и их нельзя спрототипировать за неделю-другую. Чтобы поднять первый прототип, могут понадобиться месяцы, если не годы.
Как прототип сработал там, где не сработала дорожная карта
На одной из прошлых работ я пытался убедить стейкхолдеров, что нашей команде стоит заняться компьютерным зрением. У нас был огромный каталог изображений товаров, и мы могли использовать его, чтобы лучше обслуживать клиентов. Мы бы начали с классификаторов изображений, чтобы улучшить категоризацию товаров, а затем адаптировали бы их для поиска и рекомендаций по картинкам.
Однако заручиться поддержкой мне не удалось. Некоторые считали, что нашей команде не хватает экспертизы (читай: «У вас не получится»), и что это нежизнеспособная бизнес-возможность.
Я был разочарован, но не отступил. Если я не мог построить это на работе, мне пришлось бы строить это в свободное время. Используя данные изображений, собранные с Amazon, я наспех собрал реализацию ResNet на Theano (это было давненько) и применил transfer learning для классификации изображений. Чтобы построить поиск по картинкам, я взял эмбеддинги из предпоследнего слоя и рассчитал косинусную близость. На то, чтобы освоить и собрать это, ушли месяцы, но работало оно прилично.
Демо классификатора изображений и поиска по картинкам на товарах моды
Усилия определённо окупились. Стейкхолдеры были явно воодушевлены, когда я показал прототипы. В частности, они сочли поиск и рекомендации на основе изображений убедительным сценарием использования, особенно для визуального шопинга (например, мода, мебель, игрушки). (Значительная доля транзакций приходилась на моду.) Это положило начало нашим инвестициям в GPU-кластеры и работе над приложениями компьютерного зрения.
Поиск по картинкам для игрушек и мебели
В 2018 году функция поиска по картинкам вышла в приложении.
Теперь клиенты могут визуально искать товары по фотографиям (источник)
Как собрать прототип сейчас?
Множество библиотек упрощают создание и развёртывание прототипов машинного обучения на Python. Среди веб-фреймворков широко используются Flask и Bottle, а FastAPI набирает популярность. Я недавно перешёл на FastAPI и он мне очень нравится. Вот отличное сравнение для пользователей Flask от Amit Chaudhary.
Чтобы собрать базовый фронтенд, можно использовать сочетание шаблонов Jinja и CSS, а возможно, и фреймворк вроде Bootstrap. Streamlit — тоже популярный вариант. (Правда, я не пробовал Streamlit и был бы рад услышать о вашем опыте с ним.)
Чтобы развернуть наш прототип, можно использовать Docker — обернуть его и развернуть в контейнере. В качестве облачных серверов я обычно использую spot-инстансы Amazon Elastic Compute Cloud (EC2) spot instances, потому что они дешёвые. Есть также такие варианты, как Heroku и Digital Ocean.
Не знаете, с чего начать? Вот пара дополнительных ресурсов:
Развёртывание машинного обучения с FastAPI и Heroku Настройка FastAPI с Jinja, формами и шаблонами Добавление чекбокса и кнопки скачивания в веб-приложение на FastAPI
Учитесь на моей ошибке с ранним прототипом: curl
Одним из моих первых проектов по машинному обучению был классификатор товаров по названию. Мне удалось построить систему, достигшую 95% точности, и я хотел получить отзывы пользователей. Поэтому я обернул её в приложение на Flask и развернул на наших внутренних серверах.
Чтобы воспользоваться классификатором товаров, нужно было всего лишь подставить название товара в команду curl ниже. Проще не придумаешь (по крайней мере, я так думал). Поделившись командой curl и спецификацией API с бизнес- и операционными стейкхолдерами, я нетерпеливо следил за логами в ожидании первых пользователей.
curl -d '{"title":"title of product"}' -H "Content-Type: application/json" -X POST http://internal-url/categorize
Никто им не воспользовался 😞. Я узнал, что большинство моих стейкхолдеров работали на машинах с Windows и не имели простого доступа к curl. Они также не были знакомы с работой в терминале или с инструментами вроде Postman — мне пришлось упростить ещё сильнее.
Чтобы обойти это, я потратил время на создание простого фронтенда (предшественника интерфейса для классификатора и поиска по картинкам) и снова поделился прототипом. На этот раз вместо команды curl стейкхолдеры получили веб-ссылку.
Простой GUI для классификации товаров
Результат? Мой крошечный двухпоточный сервер на Flask рухнул от слишком большого числа одновременных запросов.
Из этого опыта я вынес ценный урок: каким бы хорошим ни был ваш код, нетехнические пользователи вряд ли попробуют его, если у него нет GUI и он не прост в использовании. С тех пор я всегда нахожу время, чтобы добавить к своим прототипам простой GUI.
Попробуйте собрать прототип в начале следующего проекта
Испытываете трудности с тем, чтобы донести своё видение и заручиться поддержкой? Почему бы не потратить неделю-другую на создание прототипа? Вы удивитесь, насколько эффективными они могут быть.
Есть ли у вас истории и опыт того, как прототипы помогали продвинуть проект вперёд? Буду рад услышать о них в комментариях ниже.
Почему прототипы получают поддержку там, где хорошо написанные предложения, подкреплённые данными, терпят неудачу? Потому что они:• Конкретнее абстрактных идей• Доказательство технологии• Интерактивны, и по ним проще дать обратную связьНо когда они не срабатывают? Как стоит собирать прототип?👇https://t.co/OTERqwkj4L— Eugene Yan (@eugeneyan) 14 октября 2020
Спасибо Yang Xinyi за прочтение черновиков.
Если этот материал оказался полезным, ссылайтесь на него так:
Yan, Ziyou. (Oct 2020). How Prototyping Can Help You to Get Buy-In. eugeneyan.com. https://eugeneyan.com/writing/prototyping-to-get-buy-in/.
или
@article{yan2020prototype, title = {How Prototyping Can Help You to Get Buy-In}, author = {Yan, Ziyou}, journal = {eugeneyan.com}, year = {2020}, month = {Oct}, url = {https://eugeneyan.com/writing/prototyping-to-get-buy-in/} }
Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.