
Несмотря на кажущуюся простоту изложения и повторяемость (едва ли не дословную) одних и тех же утверждение, подходов и объяснений по несколько раз в разных частях книги, произведение представляет интерес, давая подробное, полное и доступное руководство по проектированию распределённых систем машинного обучения.
Большая часть приведённых здесь паттернов, как замечает и автор, его комментаторы, взято из проектирования распределённых систем и может быть использовано для построения таких конвейеров. Целью настоящей книги было рассмотреть применимость рассмотренных паттернов в разрезе задач машинного обучения. В связи с чем произведение рассматривает полный цикл разработки и эксплуатации нейросетевых моделей, затрагивая все классические шаги конвейера MLOps.
Книга разбита на три смысловые части. Первая сосредоточена на разработке моделей машинного обучения и включает в себя все её [разработки] основные этапы, начиная от извлечения данных и их предобработки, анализа, очистки, балансировки и импутации (при необходимости), проходя этап обучения нейросетевой модели, затем её улучшения, подбора гиперпараметров и выбора лучшего (одного или нескольких) из кандитатов для дальнейшего использования в финальном продукте.
Вторая часть посвящена эксплуатации полученного на первом этапе решения. Здесь рассмотрены как классические DevOps-задачи, такие как возможность динамически управлять количеством развёрнутых реплик сервиса в зависимости от текущей нагрузки, синхронная и асинхронная работа в рамках единого направленного графа вычислений (а также альтернативы классическим DAG-ам), так и ML-специфичные. К последним можно отнести задачу о том, как динамически распределять вычислительные ресурсы между пользователями и командами, приоритезируя задачи и выделяя для каждого участника строго определённое количество от всех доступных вычислительных мощностей. В рамках этого подхода рассмотрена приоритезация задач и возможность вытеснения менее приоритетных в пользу наиболее значимых (так, чтобы вычислительные ресурсы в первую очередь утилизировались на выполнение наиболее важных), а также минимизация простоя дорогостоящего оборудования.
Для каждого из атомарных шагов описанного конвейера машинного обучения предлагается один или несколько паттернов, упрощающих проектирование единой системы и делающих как эксплуатацию, так и разработку легко масштабируемой, устойчивой к сбоям, автоматизированной и гибкой.
Третья часть, повторяя почти дословно всех пройдённых ранее этапов (вместе с описаниями и графиками), показывает на конкретном примере, как можно было бы спроектировать и реализовать полноценную работающую систему. В отличие от предыдущих частей, максимально подробно и даже просто описывающих паттерны проектирования, эта завершающая часть даёт некий беглый обзор используемых технологий, а также листинг python-скриптов и kube-манифестов, необходимых для реализации предложенного решения. Эта часть книги также вызывает ряд вопросом относительно реализации, но позвольте оставить их без внимания. Ограничусь лишь тем, что скажу, что новичкам, не знакомым с Argo CD, Kubernetes и Kubeflow, полагаю, будет достаточно сложно разобраться даже при довольно подробном руководстве к действию. Некоторые из рассмотренных паттернов в финальную реализацию, к сожалению, не попали, иные можно было бы реализовать поопрятнее, и несмотря на все эти замечания и огрехи, книга заслуживает высокой оценки за последовательное и подробное рассмотрение подходов к проектирования распределённых систем машинного обучения.
Можно смело рекомендовать книгу как data science специалистам, так и инженерам автоматизации (MLOps и DevOps специалистам она будет интересна в первую очередь), архитекторам и software-разработчикам как для расширения кругозора, так и для систематизации уже известных знаний.





















