В 2019 году Google представил TensorFlow Extended (TFX) с открытым исходным кодом, набор библиотек для создания машинного обучения промышленного масштаба. 4 года назад, в 2015 году, когда Google открыл TensorFlow с открытым исходным кодом, у них уже был полный проект (TF и TFX), готовый для собственного использования, но на тот момент они решили опубликовать только ядро ​​технологии.

В Sarus мы всегда используем и оцениваем различные технологии машинного обучения (MLOps), и мы хотели бы поделиться некоторыми работами, которые мы проделали над TFX. Надеюсь это поможет!

TFX: общая картина

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

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

Основные комплекты компонентов:

  • Проверка данных: компоненты, связанные со статистикой, генерацией схемы и проверкой примеров.
  • Преобразование: инструменты для предварительной обработки данных
  • Обучение: модели Estimator и TensorFlow
  • Анализ модели: оценка моделей перед их развертыванием - критический шаг
  • Толкающие и обслуживающие модели

Акцент на проверке данных

Компоненты проверки данных доступны в пакете tensorflow_data_validation.

Почему важна проверка данных: анекдот из реальной жизни

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

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

Однако однажды мы стали замечать снижение производительности. Доходы от некоторых клиентов начали снижаться в некоторых областях без очевидной причины. После исследования мы обнаружили, что наши модели прогнозирования ведут себя странно, поэтому мы просмотрели обучающие наборы данных. МОЙ БОГ! Мы нашли несколько событий (из миллиардов), которые показали экстравагантные значения отпускных цен на некоторые предметы - в миллиард раз выше, чем в среднем! Откуда взялись эти ценности?

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

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

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

Давайте немного закодируем

Давайте погрузимся в код. Мы собираемся создать статистику и схемы проверки для знаменитого набора данных переписи, доступного на Kaggle. Он основан на данных переписи населения США, и обычное упражнение - попытаться предсказать годовой доход людей (есть только два класса: больше или меньше 50 тысяч долларов).

Статистика

Проверка данных начинается с вычисления статистики по набору данных. Это делается путем синтаксического анализа и анализа типов и распределения данных.

import tensorflow_data_validation as tfdv
csv_path = "./adult.csv"
train_stats = tfdv.generate_statistics_from_csv(
                   data_location=csv_path
                   )
tfdv.visualize_statistics(train_stats)

Получаем аккуратное интерактивное представление:

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

Вывод схемы

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

Давайте составим схему на основе только что вычисленной статистики.

schema = tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)

что дает нам следующий результат:

Несколько комментариев:

  • как только у вас есть статистика, вывести схему очень быстро
  • Схема - это экземпляр protobuf, определенный здесь
  • категории набираются как STRING в пределах определенного домена. Это указано в вышеупомянутом protobuf

Проверка примера или набора данных по схеме

TFX API дает вам множество способов запросить подтверждение, все они связаны с вычислительными аномалиями. Помните, что TFX ориентирован на производство, поэтому он предпочитает работу с пакетами (из PyArrow), файлами TFRecords или аналогичными.

Здесь мы используем фрейм данных Pandas

import pandas as pd
invalid_example = [{"age":"40", "income":"error"},{"age":"another_error", "income":">50K"}]
df = pd.DataFrame.from_records(invalid_example)
errors_stats = tfdv.generate_statistics_from_dataframe(df)
anomalies = tfdv.validate_statistics(statistics=errors_stats, schema=schema)
tfdv.display_anomalies(anomalies)

Это довольно богато:

  • проверка дает вам недостающие столбцы
  • несоответствие типов (INT / STRING)
  • Строка за пределами указанного домена
  • статистика по количеству ошибок

Основываясь на этих аномалиях, мы можем решить сбросить партию или, если она действительна, ввести ее в производственный конвейер. Мы также можем попытаться исправить аномалии, применив преобразование к пакету (преобразование типов, значений ограничения и т. Д.), А затем повторную проверку.

Заключение

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

Мы нанимаем!

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

Ресурсы