Полезная, актуальная и при этом полная документация - миф или реальность? В первой части статьи обсудим зачем вообще нужна документация (а когда она и не нужна вовсе), поговорим о распространённых проблемах и ошибках, а во второй - посмотрим на примеры специфичной документации, связанной с ML-моделями и данными. Статья представляет собой текстовую версию доклада Lean DS.
При обсуждении какого-то явления, полезно сначала посмотреть на его определение. Тут нам поможет старая добрая Википедия:
“Письменный текст или иллюстрация, которая сопровождает программное обеспечение или интегрирована прямо в исходный код. Документация объясняет, как работает ПО или как его использовать. Может иметь разное значение для людей с разными ролями в команде”
Определение действительно неплохое, в нём содержится несколько важных свойств документации:
может существовать отдельно или “зашита” в код (documentation-as-code)
может иметь разные формы - текст, картинка, видео
один и тот же документ может по-разному использоваться разными людьми
Кому нужна документация?
Давайте посмотрим на документацию с точки зрения ML-команды. Кто ей может пользоваться?
Сама команда DS-разработчиков
Тимлид этой команды
Внешние пользователи (менеджмент компании, заказчики, конечные пользователи DS-продукта)
Мы разрабатываем ИИ-решение для радиологов и вопрос документации для нас всегда был очень острым. Без качественной документации невозможно “выкатывать” новые релизы и четко планировать развитие продукта, очень сложно “онбордить” новых сотрудников, да и вообще плохое качество документации чревато разными проблемами, особенно это начинает чувствоваться при масштабировании продуктов и команды.
Самим ML-командам документация служит для:
Снижения сложности вникания в новые проекты.
Возможности получения актуального референса (например, при актуализации старой гипотезы, отложенной в “долгий ящик”)
Создания культуры открытости и обмена знаний внутри команды
Повышения количества новых идей и структуризации знаний о проектах
Лидам документация помогает всегда оставаться в курсе актуального состояния проекта, позволяет быстро делиться информацией со стейкхолдерами проекта, формировать и обновлять вектор развития, а также облегчать процесс онбординга новых сотрудников.
Документация помогает и внешним пользователям (здесь под внешними пользователями я понимаю и другие команды на проекте): с ее помощью они могут всегда получить актуальную информацию по продукту и не дергать лишний раз членов команды. Например, прочитать readme и самостоятельно подключиться к API. Также документация ускоряет процесс принятия управленческих решений, делая их более точными и основанными на актуальной информации.
Прежде чем создавать любой документ или внедрять какую-то практику, связанную с документацией, рекомендую обязательно пройтись по такому чек-листу:
Сколько будет стоить (в деньгах, времени, раздражении) написание и поддержка документа или практики?
Кто будет читать документ, как часто и в каких ситуациях?
Кто, как и когда будет актуализировать документ? Будут ли члены команды это делать добровольно?
Можно ли полностью или частично автоматизировать процесс актуализации документа?
![](https://habrastorage.org/getpro/habr/upload_files/c06/87f/f15/c0687ff159aa9baa8f24a18db97f2823.png)
Частые проблемы, связанные с документацией
В документации содержится слишком мало информации. Приходится часто дергать членов команды для получения нужных данных
Информации слишком много, и она разбросана по разным источникам - wiki, Slack, гугл-документы и презентации, бумажные носители
Информация неактуальна
Информация дублируется в разных источниках
Итак, мы разобрались с основными целями создания и ведения документации и знаем, с какими проблемами нам предстоит столкнуться. Теперь поговорим о “правилах хорошего тона”, использование которых сильно уменьшит вероятность появления этих самых проблем.
Правила структуры и оформления:
Единая точка входа ко всей документации проекта. Это может быть страница в Notion, фрейм в Miro или Markdown-документ, форма не так важна. Главное, чтобы с этой страницы любой человек мог получить доступ к нужной ему информации.
Единые правила оформления и стиля, наличие шаблонов. Немаловажным фактором для восприятия пользователем документации является наличие и консистентность общего стиля оформления документации.
Стиль описания и подачи информации в документации соответствует культуре команды. Нет смысла придерживаться ненужного формализма во внутренних документах команды.
В документах есть ссылки на другие релевантные документы.
Важные места выделены
Используются оптимальные методы передачи информации. В зависимости от задачи документа может использоваться не только текст, но и картинки, графики, диаграммы, видео
Правила использования и актуализации:
Определена целевая аудитория каждого документа - кто, как и зачем будет его использовать
Если документация не используется самой командой, то её актуализацию стоит встраивать в процессы в формате “definition of done”. Например, нельзя зарелизить новую модель, не обновив документацию
Использование методологии (“docs as code”) там, где это актуально. В данном случае документация является частью кодовой базы, лежит в репозитории и пишется в IDE. Данный подход “из коробки” даёт возможность версионирования, тестирования, ревью изменений документации.
Производится регулярная ревизия документации. Включает себя в том числе отказ от устаревших или лишних документов.
Встречи команды должны порождать новые “артефакты” (документы по итогам встречи). Например, дорожная карта реализации или лист договоренностей.
Инвентаризация технического долга по документации. Да-да, техдолг по документации тоже является техдолгом.
Можно ли как-то измерить качество документации?
Если у нас уже есть какая-то документация и процедуры её актуализации, можно ли попробовать померить её качество? Такие показатели действительно есть:
Покрытие - какая часть кода проекта или DS-пайплайна покрыта документацией
Доступность - сколько времени или кликов в среднем занимает поиск нужного документа
Читаемость - насколько легко читать этот документ
Количество посещений/обновлений документа за период
Мы пока не дошли до того, чтобы регулярно замерять динамику этих показателей, пока это кажется лишним. Но в качестве точки среза - почему нет?
Документация ML-проекта
В первой части статьи я рассказал про документацию процесса разработки. Однако ML-разработка довольно сильно отличается от классической разработки. Есть ли различия в документации?
Если максимально упростить пайплайн ML-разработки, то он будет выглядеть следующим образом:
Оценивается осуществимость и значимость проекта
Производится сбор, очистка и разметка данных
Генерируем гипотезы, тренируем модели
Оцениваем качество и устойчивость лучшей модели
Деплоим модель
Осуществляем мониторинг
Понятно, что этот пайплайн весьма условен, каких-то этапов может не быть, какие-то могут добавиться. Да и носит он, конечно, циклический характер, например на этапе оценки качества мы можем вернуться на этап генерации новых гипотез и построения моделей. Тем не менее, такое разделение позволит нам посмотреть на разные виды документации, характерные для разных этапов.
Что же может быть входной точкой в документацию?
В нашем случае это карточка проекта, оформленная в Notion.
![](https://habrastorage.org/getpro/habr/upload_files/4f3/f77/fa0/4f3f77fa0cb212155c207fc6731bc6b9.png)
В таком случае в рамках проекта по маммографии документы распределены по группам: описание работы системы, код и model cards, эксперименты и идеи, данные и так далее.
Если мы углубимся в какую либо подгруппу, например, описание работы системы, то мы увидим внутри список документов и ссылок, связанных с данной предметной областью. Как мы видим внутри могут содержаться абсолютно разные документы, такие как Miro, Google-таблицы, PDF-файлы.
![](https://habrastorage.org/getpro/habr/upload_files/6cc/d5d/e65/6ccd5de653dc834546e94e839e07332e.png)
Начинаем с оценки проекта
На этапе оценки осуществимости и значимости проекта мы хотим собрать и агрегировать информацию, которой владеют разные группы пользователей - бизнес, аналитики, ML-специалисты, доменные эксперты, заказчики. Это позволяет нам создать общее понимание нюансов проекта, структурировать нужную информацию, которая позволит принять решение о старте проекта.
Примеров, как может выглядеть такой документ, очень много - AI Canvas, Mission Canvas, карточка проекта (design doc, чек-лист требований). В эту же группу можно включить технические задания от заказчиков.
Такие документы могут включать:
Описание проблемы и предположения о достижимой ценности продукта
Варианты решения с ML и без него
Требования к качеству (метрики)
Описание источников возможных данных
Другие требования (например, к железу и программному обеспечению)
Последствия ошибок системы и так далее
Этапы проекта
Технические риски и заключение по проекту
Конкуретная среда
Литература, научные статьи, видео по теме
Исходя из всей собранной информации мы готовим заключение о целесообразности или же её отсутствии для реализации проекта.
Принято положительное решение для реализации ML-проекта
После сбора и анализа такой информации, проведения встречи с бизнес-подразделением принимается решение о реализации или же отмене проекта. Допустим было принято положительное решение и теперь мы переходим к шагу №2 - “сбор, очистка и разметка данных”.
Поскольку в нашем случае мы работаем с медицинскими данными, то разметка данных - это отдельный важный процесс. В нашем случаи, разметчики - доменные эксперты, врачи, что ведёт к отдельным трудностям. Сам процесс разметки, разумеется, также описан в документации - процесс отбора разметчиков, инструкции врачам, принципы разрешения конфликтов в разметке.
![](https://habrastorage.org/getpro/habr/upload_files/6f8/1cf/404/6f81cf404dd26ba9f2a68652158b692e.png)
Любой источник данных также требуется документировать. Это позволяет быстро получать информацию об источнике и объёме данных, их ограничений и свойств, генерировать новые гипотезы, связанные с данными - например, какие данные нужно доразметить или наоборот выбросить из датасета.
Datasets Cards
Документацию датасетов мы называем dataset cards. В зависимости от специфики данных, частоты их пополнения, типа разметки это может быть как просто статический документ, так и интерактивный дашборд. В идеале датасет-карды обладать следующими свойствами:
версионирование - мы хотим понимать, какая документ соответствует той или иной версии датасета
автообновление - если датасет-карт или дашборд подключен к БД с разметкой, то он всегда будет содержать актуальную информацию о датасетах
интерактивность - должна быть возможность подробно глазами изучить тот или иной слайс данных или конкретный кейс
В зависимости от задачи датасет-кард может содержать различную информацию - примеры данных и разметки, описательные статистики, источник данных и описание процесса сбора данных, информация о разметчиках, известные проблемы и ограничения.
![](https://habrastorage.org/getpro/habr/upload_files/a78/ae1/a1d/a78ae1a1d606b0a8c982a9f3fb4eaabd.png)
![](https://habrastorage.org/getpro/habr/upload_files/bb7/cbc/1bc/bb7cbc1bc98989907dcfa90e464608ff.png)
Собрали данные… Начинаем тренировать какие-то модели
Итак, мы определились с источниками данных, собрали их и разметили, создали документацию. Теперь пора начинать выдвигать гипотезы и тренировать модели для решения нашей бизнес-задачи.
Среди целей, которые мы ставим перед собой на данном этапе:
Быстрая генерация, приоритезация и проверка гипотез
Удобный анализ результатов экспериментов
Возможность возврата к результатам предыдущих экспериментов
Удобство разработки
Безусловно, ни одна из этих целей не решается только документацией, но документация должна поддерживать наше стремление к реализации каждой цели. Примеры документации на этом этапе - база гипотез, карточки экспериментов, документация кода, презентации по итогам серии экспериментов.
База гипотез - список приоритизированных идей на отработку. Он может содержать различную информацию и описание самой идеи, теги для удобной фильтрации контента внутри базы идей, оценки реализуемости и трудоемкости идеи (например, по ICE), дизайн-ревью и отчет по эксперименту, ссылка на эксперимент в трекере экспериментов.
![](https://habrastorage.org/getpro/habr/upload_files/078/011/fd7/078011fd7602598e7e7691486afc9f9e.png)
В данном случае база идей реализована в Notion. Благодаря этому ее можно упорядочивать в необходимом нам формате. Например, по статусам, оценке “легкости реализации” и так далее. Отсюда мы можем попасть в саму карточку нужного нам эксперимента и посмотреть его детали.
![](https://habrastorage.org/getpro/habr/upload_files/033/52d/8ee/03352d8eea7ca7d59b5e0674f79cc013.png)
Когда гипотеза попадает в базу она как правило описана очень верхнеуровнево, без деталей. Этой информации обычно недостаточно, чтобы точно оценить трудоёмкость гипотезы, конкретные шаги, нужные для её проверки, зависимости. Большая часть этой информации приходит уже в процессе анализа задачи. Когда конкретный человек из команды берет ее на себя, собирает инфорацию, гуглит статьи, смотрит репозитории, наличие и доступность данных, он описывает детали эксперимента (experiment design), чтобы обозначить план итоговой реализации. Этот план затем оценивают другие члены команды в рамках процедуры design review. Это помогает избавиться от проблем неправильного понимания задачи, расходования времени на переписывание после код-ревью, нерационального расходования времени во время проверки гипотезы.
![](https://habrastorage.org/getpro/habr/upload_files/55d/828/693/55d828693a07f385b859c2508c272460.png)
Результаты реализации гипотез могут быть описаны в различном формате в зависимости от “ожиданий” и их важности. В некоторых случаях достаточно односложного комментария, а в некоторых необходимо готовить презентацию и обсуждать результаты и дальнейшие идеи с коллегами.
Использование трекера (в нашем случае это ClearML) позволяет обеспечить репродуцируемость эксперимента и в любой момент получить информацию о его метриках, версии кода, гиперпараметрах.
![](https://habrastorage.org/getpro/habr/upload_files/181/02e/5cc/18102e5cc56f496390cd5c5cc463236a.png)
В трекере можно сравнить результаты разных экспериментов, изучить метрики, сформулировать выводы. Всё это по сути тоже является частью документации ML-проекта.
Натренировали. Выбрали лучшую модель. Теперь пора оценить её качество и устойчивость
На этом этапе мы хотим оценить качество модели, сравнить её с предыдущей версией, понять ограничения и особенности модели. Например, новая модель может работать с конкретным типом данных (снимки с определённого типа оборудования) хуже. И это также важно знать и учиывать.
В качестве артефактов документации на этом этапе у нас появляются model card, дашборды с таблицами и метриками, отчёты по анализу ошибок.
Model Card - описание ML-системы, которая включает в себя следующую информацию:
Изменения в последней версии
Описание обучающих и тестовых данных
Описание архитектуры сети, препроцессинга и других компонентов
Описание требований к входным данным
Описание аутпутов системы
Метрики
Описание известных ограничений и проблем
Модел-кард для разных групп пользователей может иметь разный итоговый вид. Например, для бизнес или конечных пользователей можно включить рекомендуемые сценарии использования системы, но убрать лишнюю информацию об архитектуре сети.
Мы храним такую документацию в формате docs-as-code - в нашем случае, это Markdown-док, который версионируется и прилинкован к конкретным коммитам. По важным же релизам могут быть экспортированы и PDF.
![](https://habrastorage.org/getpro/habr/upload_files/334/e39/6ee/334e396ee8f9a7ffb8066e9eb7f9e2c5.png)
Круто. Теперь мы можем задеплоить модель и подготовить ее в продакшну!
Деплой как и любой другой ML-процесс порождает свой класс специфичных документов. Среди которых :
Отчеты по тестам (test reports)
Автоматизированные тесты
Результаты a/b тестов
Отчеты по опросы пользователей
Дашборды и регулярные автоматические отчёты
Post-mortem по итогам инцидентов на проде (документация события, несущего негативные последствия с целью анализа и устранения его причин)
Документация API
Change Notes
Прочая документация, связанная с релизами
Ну и куда без общей документации
Конечно, на ML-проекте появляется и всякая общая и процессная документация. Примеры из нашей практики:
Team Canvas
Очень полезный элемент для онбординга новых сотрудников. Документ описывает состав команды, ценности команды, зоны ответственности внутри команды и между сотрудниками, процессы, встречи и их формат, командные ритуалы и правила
Доски и скоринговые карты собеседований сотрудников
Таблица с описанием встреч
![](https://habrastorage.org/getpro/habr/upload_files/abc/348/1d6/abc3481d6c4b3724e6851bbb57b487ba.png)
Таблица встреч - очень полезная вещь, которая обеспечивает понимание цели, участников и артефактов встреч для всех сотрудников. Для планирования стреч и напоминаний мы также используем гугл-календари.
Гайдлайны по написанию кода
База знаний - по коду, инфраструктуре, ML, заметки со встреч с доменными экспертами (врачами)
Доска онбординга
Общее Миро со всей информацией
Стратегия и цели компании/проекта
Роадмапы
В зависимости от вида документа и его целевой аудитории варьируется и лицо, поддерживающее документ. Кроме того, важно в целом создавать культуру ведения документации в компании, формировать понимание каждого члена компании, что документация и её актуализация приносит конкретную ценность, экономит время и устраняет дублирование работы.
Отдельно хочу остановиться на таком моменте как автоматизация документации. Во-первых, чем меньше мы в целом делаем руками - тем меньше нужды в ручном написании документации. Например, если мы ставим эксперименты в джупитере или меняем данные руками в эксель-табличках, то и документацию нужно будет написать руками. А работа с эксперимент-трекером или БД с разметкой автоматически создаёт нужные артефакты.
Помимо этого, есть разные инструменты, которые позволяют автоматизировать процесс создания и актуализация документации - Swagger, плагины для IDE, интерактивные датасет-карды (о них можно прочесть выше), DVC-пайплайны, методология docs-as-code.
Заключение и рекомендации
Качественная документация - залог возможности успешного масштабирования как разработки, так и бизнеса в целом.
Что бы я предложил вам сделать уже сейчас?
Провести аудит документации и по каждому документу ответить на вопросы из списка (можно найти в первой части статьи), сформировать бэклог техдолга по документации
Создать единую точку входа в документации (если её еще нет)
Оценить, для каких документов подходит методология docs-as-code, актуализацию каких документов можно автоматизировать
Собрать обратную связь от разных групп (ML-инженеры, пользователи, разметчики, бизнес и другие команды)
Тренироваться писать хорошие технические (и не только) тексты
Если вы хотите узнать ещё больше об организации процессов ML-разработки, подписывайтесь на наш Телеграм-канал Варим ML.