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

Честно говоря, большинство проектов машинного обучения, как правило, начинаются с ручного рабочего процесса. Это нормально, волноваться не о чем.

Но в какой-то момент вы захотите сосредоточиться на новых моделях, а не на поддержании существующих. Вот в чем преимущество TensorFlow Extended (TFX).

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

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

Что такое TensorFlow Extended (TFX)?

Если вы новичок в TensorFlow Extended, я рекомендую статью одного из моих коллег, Даррена, который написал отличное введение в TFX.

Tensorflow Extended (TFX) предназначен для создания конвейеров сквозного машинного обучения.

Впервые я прочитал о TFX в 2019 году (год, когда он был официально выпущен для широкой публики). По общему признанию, это было ошеломляюще.

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

Я уверен, что вы придете к тому моменту, когда почувствуете, что TFX не завершен. В этом случае считайте, что номер версии TFX по-прежнему начинается с нуля (0,27.0). Если вы когда-либо хотели стать частью чего-то с самого начала, TFX - ваш способ принять участие.

TensorFlow Extended (TFX) - это не то, через что можно пройти между двумя чашками кофе. Получать вознаграждение от TFX похоже на выращивание помидоров, это просто, но требует времени 🍅.

Обещаю, к концу этого поста вы спросите себя: «Почему я раньше не использовал TFX?»

Недостатки базового развертывания машинного обучения

Эта статья - вторая из серии статей о решениях сквозного машинного обучения. В первой статье, которая была о выполнении анализа настроений в Google Cloud, мы рассмотрели базовую архитектуру, которой будет достаточно, если вы начинаете развертывать начальное решение машинного обучения.

Подведем итоги некоторых неоптимальных аспектов нашего предыдущего решения:

  • Это ручной процесс.
  • Никакой проверки или отслеживания (производительность модели с течением времени)
  • Предварительная обработка в двух отдельных частях нашего приложения
  • Ручное обучение и развертывание
  • Нет автоматического обучения
  • Нет отслеживания артефактов
  • При обслуживании используется ненужная оболочка Python API из-за предварительной обработки.

Давайте улучшим это, построив конвейер с помощью TensorFlow Extended.

Перейти прямо к записной книжке и коду

Полный код конвейера TensorFlow Extended описан в записной книжке Colab. Мы рассмотрим каждый из разделов этого блокнота вместе с этой статьей. В конце каждого компонента вы можете перейти непосредственно к соответствующему коду.

Мы используем TensorFlow Extended 0.28.0. Если вы используете более раннюю версию, могут потребоваться адаптации. В будущем, если вы будете использовать более новую версию TFX и что-то в этом ноутбуке окажется неисправным или устаревшим, дайте мне знать.



Где запускать расширенные конвейеры TensorFlow

Перед созданием нашего расширенного конвейера TensorFlow я хочу продемонстрировать различные варианты запуска конвейера.

Начальная разработка и POCs

Ноутбуки - отличный способ для начальной разработки и POC. TFX предоставляет именно этот вариант использования InteractiveContext. Включение этого необходимо для запуска конвейера без необходимости выполнять более сложную настройку.

from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
context = InteractiveContext()

Запуск наших компонентов с InteractiveContext также позволяет нам отображать вывод каждого компонента.

context.run(example_gen)

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

Производство

Когда мы говорим о том, где запустить расширенный конвейер TensorFlow в производственной среде, мы говорим об оркестровке. Какой метод оркестрации вы используете, зависит от вашего опыта и текущей инфраструктуры.

Вот некоторые примеры:

  • Apache Beam
  • Apache Airflow
  • Конвейеры платформы AI (легко начать)
  • Kubeflow (полноценное решение)

Использование TFX как части Orchestrator (Kubeflow) рассматривается в нашей следующей статье. Как всегда пошагово.

Начало работы с TensorFlow Extended

Обзор компонентов TFX

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

Обзор библиотек TFX

Кроме того, эти компоненты используют различные библиотеки. Чтобы получить максимальную отдачу от TensorFlow Extended, вы должны иметь представление о каждой из этих библиотек. Не волнуйтесь, у вас все получится, если вы последуете за мной.

Эти библиотеки интегрированы в компоненты TFX, но вы также можете использовать их как отдельные библиотеки. Давайте посмотрим на них:

Метаданные ML

Библиотека для хранения и получения метаданных, создаваемых нашим конвейером. Метаданные - это результат каждого из наших компонентов. Это может быть такая информация, как гиперпараметр, расположение данных, показатели модели. По сути, все хранится в базе данных. Вы когда-нибудь задумывались, насколько хорошо работает ваша последняя модель по сравнению с развернутой в настоящее время? Что ж, с метаданными ML этот тип информации сохраняется.

Проверка данных TensorFlow (TFDV)

Библиотека для анализа и проверки данных. Мы рассматриваем это как часть компонента ExampleValidator.

Преобразование TensorFlow (TFT)

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

Анализ модели TensorFlow (TFMA)

Когда вы оцениваете свою обученную модель или сравниваете ее с ранее обученными моделями. Мы рассматриваем это как часть компонента Evaluator.

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

Я знаю, что это может показаться слишком большим, но я обещаю вам, что это намного проще, чем кажется.

Как использовать каждый компонент TFX

Проходя через каждый из компонентов, мы следуем четкой структуре.

  • Введение в высшую задачу, которую выполняет каждый компонент.
  • Понимание входов и выходов компонента.
  • Понимание того, как связаны компоненты.
  • Наконец, мы опишем дополнительные параметры и функции, которые предлагает каждый компонент.
  • В конце каждого компонента серое поле приведет вас к коду записной книжки и документации для этого конкретного компонента. Я советую проверить документацию по каждому компоненту, а затем вернуться к этой статье.

Нравится:

Jump to ExampleGen documentation and notebook.

Получение данных с помощью ExampleGen

Как всегда, машинное обучение начинается со сбора данных. Наш первый компонент используется для передачи данных в наш конвейер TensorFlow Extended.

Компонент ExampleGen, как следует из названия, генерирует TFRecords, содержащие данные в виде примеров TensorFlow. TFRecords увеличивает производительность вашего конвейера и, следовательно, время обучения вашей модели.

ExampleGen также можно использовать для разделения данных на наборы данных для обучения и оценки.

Данные можно читать из различных источников и типов данных (локально, удаленно и из баз данных):

  • CsvExampleGen
  • FileBasedExampleGen
  • ImportExampleGen (TFRecords)
  • PrestoExampleGen
  • BigQueryExampleGen

Если вам нужны дополнительные источники, вы можете реализовать свои собственные или преобразовать данные в TFRecords и продолжить с ImportExampleGen.

Из нашего примера анализа настроений данные хранятся в формате CSV в Google Cloud Storage Bucket. Вот почему мы используем CsvExampleGen.

from tfx.components.example_gen.csv_example_gen.component import CsvExampleGen
example_gen = CsvExampleGen(input_base='/content/data')

По умолчанию ExampleGen разделит данные в соотношении 3: 2 для обучающего и оценочного наборов. Если вам нужен еще один сплит, например, обучение / оценка / тест, вы можете это сделать.

output = example_gen_pb2.Output(
split_config=example_gen_pb2.SplitConfig(splits=[
   example_gen_pb2.SplitConfig.Split(name='train', hash_buckets=8),
   example_gen_pb2.SplitConfig.Split(name='eval', hash_buckets=1),
   example_gen_pb2.SplitConfig.Split(name='test', hash_buckets=1)
]))

Для чтения из Google Cloud Storage или AWS S3 мы определяем внешний вход и используем его таким же образом.

from tfx.utils.dsl_utils import external_input
examples = external_input("gs://machine-learning-samples/datasets/sentiment/imdb/tfx")
example_gen = CsvExampleGen(input=examples)

Как видите, даже наш первый компонент достаточно гибкий и охватывает большой набор возможностей. Это относится ко всем компонентам. Вам не обязательно знать все варианты вначале. Со временем вы попадете в это.

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

Jump to ExampleGen documentation and notebook

Знайте свои данные с помощью StatisticsGen

Компоненты StatisticsGen предоставляют обзор ваших данных. Это очень полезно для обозначения несбалансированных наборов данных. Например, поиск недостающих данных с помощью гистограмм; или определение минимальных, максимальных значений и распределения данных. Используйте StatisticsGen, чтобы сравнить набор данных для обучения и проверки и посмотреть, хорошо ли они оба представляют ваш набор данных.

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

statistics_gen = components.StatisticsGen(
examples=example_gen.outputs['examples'])

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

Jump to StatisticsGen documentation and notebook

Не предполагайте; Знайте, чего ожидать от SchemaGen

Компонент SchemaGen генерирует схему ваших данных, используя статистику, которую вы получаете после использования StatisticsGen. Схема описывает, что такое правильные данные. Это полезно для обнаружения ошибок и изменений в вашем наборе данных.

Наш набор данных о настроениях состоит из двух функций: обзор (фактический текст отзыва) и ярлык. Ярлыки представлены целыми числами, где 0 отрицательно, а 1 положительно. Этот факт хранится в схеме. Если по какой-то причине наши базовые наборы данных изменяют метку на positive и negative как строковые значения вместо int, мы можем немедленно это обнаружить (мы доберемся до этого со следующим компонентом).

Этот компонент иногда упускают из виду, но вы не можете просто сделать предположение о правильности данных. Вы должны это доказать.

from tfx.components import SchemaGen
schema_gen = SchemaGen(
   statistics=statistics_gen.outputs['statistics'],
   infer_feature_shape=True
)

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

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

label_int_domain = schema_pb2.IntDomain(min=0, max=1)
tfdv.set_domain(schema, "label", label_int_domain)

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

Jump to SchemaGen documentation and notebook

Выявление аномалий с помощью ExampleValidator

Компонент ExampleValidator просматривает наши данные и ищет аномалии. ExampleValidator в настоящее время проверяет ~ 80 типов аномалий, в том числе:

  • Неожиданные типы
  • Нет значений
  • Неожиданные значения (например, определенный домен для наших ярлыков)
  • Новые столбцы, не известные в схеме
  • Мало примеров
  • Средняя длина строки (отлично подходит для текста нашего обзора)
  • Дрейф / перекос

Есть разные виды смещения и перекоса. Некоторые из них требуют настройки на основе ваших знаний в предметной области. Мы расскажем об этом в следующей статье о том, как эффективно использовать TFX в производственной среде. Вкратце, нам нужно обновить нашу схему и определить skew_comparator или drift_comparator

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

В случае аномалии конвейер остановится и получит сообщение о сбое статуса. Имейте в виду, что не учитываются все возможные аномалии.

from tfx.components import ExampleValidator
example_validator = ExampleValidator(
    statistics=statistics_gen.outputs['statistics'],
    schema=schema_gen.outputs['schema']
)

Мы рекомендуем реализовать свой собственный компонент для интеграции аномалий, которые не покрывает ExampleValidator.

Jump to ExampleValidator documentation and notebook

Преобразуйте свои данные с помощью «Преобразования»

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

В основе Transform лежит функция preprocessing_fn как часть нашего кода преобразования.

Важно понять: Transform использует библиотеку TensorFlow Transform, которая генерирует график TensorFlow. При работе с графиками TensorFlow разрешены только TFOperations. Это означает, что при реализации кода преобразования вам разрешено использовать только операции TensorFlow. На мой взгляд, это, вероятно, самая сложная часть нашего полного конвейера TensorFlow Extended.

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

Возьмите свои текущие преобразования и реализуйте их шаг за шагом как TF Operations. В какой-то момент вам кажется естественным использовать TF Operations.

Вы можете спросить себя: «Почему так сложно?» Есть веская причина, по которой вы захотите интегрировать преобразование как часть своей модели. Вы уменьшаете количество ошибок, используя ту же логику предварительной обработки как часть обучения и обслуживания. И вы повысите производительность, используя оптимизированные операции TensorFlow.

Jump to Transform documentation and notebook

Обучите модель с помощью Trainer

Наконец, мы обучаем нашу модель TensorFlow с помощью компонента Trainer. Тренер использует преобразованные данные, график преобразований, упомянутый в предыдущей статье, и код трейнера.

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

Он содержит весь необходимый код для обучения вашей модели и подготовки ее к прогнозам. Trainer вызывает обучающий модуль, модуль Python, отдельный файл (или файлы), содержащий наш обучающий код. Тренер найдет функцию с именемrun_fn и выполнит ее. Эта функция обычно выполняет следующие задачи:

  • Загрузите предварительно обученную модель
  • Построить модель
  • Подходит для модели
  • Определите подпись модели
  • Сохраните модель
trainer = Trainer(
    module_file=os.path.abspath("trainer.py"),
    custom_executor_spec=executor_spec.ExecutorClassSpec   (GenericExecutor),
    examples=transform.outputs['transformed_examples'],
    transform_graph=transform.outputs['transform_graph'],
    schema=schema_gen.outputs['schema'],
    train_args=trainer_pb2.TrainArgs(num_steps=TRAINING_STEPS),
   eval_args=trainer_pb2.EvalArgs(num_steps=EVALUATION_STEPS)
)

Компонент Transformer используется дважды в нашем компоненте Trainer. Мы используем уже предварительно обработанные данные во время обучения, и это помогает нам сократить время обучения. Нам не нужно предварительно обрабатывать данные во время обучения.

tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)

Кроме того, мы берем граф Transformer нашей логики предварительной обработки преобразования и интегрируем его в нашу модель обслуживания.

model.tft_layer = tf_transform_output.transform_features_layer()

Тренер не ограничен местной средой. Мы можем настроить наш Тренерский компонент для использования Google Cloud AI Platform Training. Проведение обучения на платформе AI - это замечательно, если вы используете такой продукт, как AI Platform Pipelines, таким образом, вы можете использовать графические процессоры без необходимости изменять базовый кластер Kubernetes.

Jump to Transform documentation and notebook

Доступ к вашей модели и данным с помощью Resolver

Resolver - это компонент, который обрабатывает разрешение артефактов. Другими словами, способ доступа к нашей модели, данным или другим артефактам.

Наиболее распространенные варианты использования:

  • Загрузка предыдущей модели для сравнения с текущей моделью. Мы будем использовать это для нашего следующего компонента, Evaluator.
  • Загрузка модели для горячего старта тренировки (в этой статье не рассматривается).

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

Экскурс: Сообщество TensorFlow играет огромную роль в его развитии. Существует множество RFC (документов, описывающих новые функции, которые может предложить сообщество).

Компонент Resolver - один из них.

Эти документы - отличный способ лучше понять назначение компонентов и функций TensorFlow.

В нашем следующем компоненте компонент Evaluator использует предварительно обученную модель, чтобы сравнить ее с обученной в настоящее время моделью. Для этого мы используем компонент Resolver, чтобы получить последнюю одобренную (одобренную) модель.

model_resolver =  Resolver(
    instance_name= "latest_blessed_model_resolver",
    strategy_class=   latest_blessed_model_resolver.LatestBlessedModelResolver,
    model=Channel(type=Model),
    model_blessing=Channel(type=ModelBlessing)
)

Имейте в виду, что в большинстве статей по-прежнему используется устаревший ResolverNode, который был объявлен устаревшим в версии 0.27.0.

Обязательно используйте новый компонент Резолвер. Документация по TFX все еще отстает от документации по этому поводу, но замечательное сообщество TFX уже знает об этом и работает над его улучшением.

Jump to Evaluator documentation and notebook

Оцените свою модель с помощью Evaluator

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

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

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

evaluator = Evaluator(
    examples=example_gen.outputs['examples'],
    model=trainer.outputs['model'],
    baseline_model=model_resolver.outputs['model'],
    eval_config=eval_config
)

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

eval_config = tfma.EvalConfig(
    model_specs   = [tfma.ModelSpec(...)],
    slicing_specs = [tfma.SlicingSpec(...)]
    metrics_specs = [tfma.MetricsSpec(...)]
)

Характеристики модели

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

model_specs=[
    tfma.ModelSpec(label_key='label')
]

Характеристики нарезки

Нарезка - это не что иное, как взять наши данные и поместить их в несколько сегментов в зависимости от функции или значения. Затем метрику можно рассчитать по этим различным срезам данных. Представьте себе набор данных, в котором у вас есть часы дня как часть ваших данных. Возможно, вас заинтересует, насколько хорошо наша модель работает в разное время дня. Таким образом, вы можете определить часы, в которые ваша модель не работает.

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

slicing_specs=[
    tfma.SlicingSpec()
]

Характеристики показателей

Если мы не предоставим никаких дополнительных показателей, оценщик (TFMA) будет использовать показатели обучения. Вы можете использовать множество метрик, и они зависят от решаемой вами проблемы машинного обучения. На более высоком уровне вы можете разделить метрики Keras и метрики анализа модели TensorFlow.

metrics_specs=[
    tfma.MetricsSpec(metrics=[        
       tfma.MetricConfig(class_name='ExampleCount'),
       tfma.MetricConfig(class_name='CategoricalAccuracy',
       ...
    ]
]

Также вы можете определить пороговые значения для своих метрик.

Есть два типа порогов:

  • GenericValueThreshold: используется для оценки того, превышает ли текущий показатель модели определенное значение (нижняя граница для таких показателей, как AUC) или меньше определенного значения (верхняя граница для таких показателей, как потери).
threshold=tfma.MetricThreshold(
   value_threshold=tfma.GenericValueThreshold( 
      lower_bound={'value': 0.7}
   )
)
  • GenericChangeThreshold: используется для сравнения различных моделей-кандидатов, таких как текущая модель, с предыдущей моделью. При этом мы проверяем, больше или меньше метрика текущей модели, чем у предыдущей модели.
threshold=tfma.MetricThreshold(
    change_threshold=tfma.GenericChangeThreshold(
        direction=tfma.MetricDirection.HIGHER_IS_BETTER, 
        absolute={'value': 0.0001}
    )
)

Запустив только что настроенный компонент Evaluator, мы получаем автоматический процесс принятия решения о запуске модели в производство.

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

Jump to Evaluator documentation and notebook

Опубликуйте модель с помощью Pusher

Pusher - самый последний компонент нашего конвейера TFX. Требуются Model и Validator, чтобы проверить, прошла ли модель валидацию, и переместит модель в указанное место.

Поддерживаются различные локации:

  • Файловая система
  • Облачное хранилище (GCP Bucket и AWS S3)
    Отлично, если вы используете TensorFlow Serving.
  • Обслуживание платформы Google Cloud AI
  • BigQueryML
pusher = Pusher(
    model=trainer.outputs['model'],
    model_blessing=evaluator.outputs['blessing'],
    push_destination=pusher_pb2.PushDestination(
    filesystem=pusher_pb2.PushDestination.Filesystem(
    base_directory=location))
)

Не стесняйтесь добавлять больше локаций в рамках этого удивительного проекта с открытым исходным кодом. Если вам интересно, как реализованы толкатели, посмотрите на один из уже существующих толкателей, например AI Platform TFX Pusher.

Jump to Pusher documentation and notebook

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

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

Что дальше?

Мы готовим пару статей, которые скоро будут опубликованы:

  • В первой статье в качестве инструмента оркестрации для запуска расширенного конвейера TensorFlow используются Конвейеры платформы AI и Kubeflow.
  • Второй касается обслуживания модели с использованием TensorFlow Serving и AI Platform Prediction.
  • третий - это глубокое погружение во внутреннюю работу компонентов и пользовательские компоненты для TensorFlow Extended.

Рекомендация книги

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



Спасибо за внимание! Чтобы оставаться на связи, подписывайтесь на нас в Инженерном блоге DoiT, Канале DoiT Linkedin и Канале DoiT Twitter. Чтобы изучить возможности карьерного роста, посетите https://careers.doit-intl.com.