Управление техническим долгом систем машинного обучения

Managing technical debt in machine learning systems

Изучайте практики устойчивого снижения стоимости быстрой доставки – с примерами кода

По мере развития сообщества машинного обучения (ML) в течение многих лет, ресурсы, доступные для разработки проектов ML, становятся все более обширными. Например, мы можем полагаться на общий пакет Python scikit-learn, который основан на NumPy, SciPy и matplotlib, для предварительной обработки данных и основных задач предсказания. Или мы можем использовать открытую коллекцию предварительно обученных моделей от Hugging Face для анализа различных типов наборов данных. Это позволяет современным специалистам по данным быстро и легко решать стандартные задачи ML, достигая приемлемых результатов.

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

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

Фото Андреа Де Сантис на Unsplash

В ML-системе существует несколько источников технического долга. Некоторые из них приведены ниже.

#1 Негибкий дизайн кода для удовлетворения непредвиденных требований

Для проверки возможности использования ML для решения предприятий текущих вызовов, многие проекты ML начинаются с концепции (PoC). Мы начинаем с создания блокнота Jupyter или среды Google Colab для исследования данных, затем разрабатываем несколько ад-хок функций и создаем иллюзию приближения к завершению проекта для заинтересованных лиц. Такие системы, созданные непосредственно на основе PoC, могут состоять в основном из кода соединения – поддерживающего кода, который соединяет конкретные несовместимые компоненты, но сам по себе не имеет функциональности анализа данных. Они могут быть похожи на спагетти, сложны для поддержки и подвержены ошибкам.