Введение

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

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

1. Архитектура крупномасштабной модели

Почему нам нужно поддерживать более крупные модели в SmartNews?

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

1.1 Распределенное обучение

1.1.1 Как быстро создать распределенную службу обучения?

Поскольку большинство моделей DNN могут хорошо работать на ЦП, мы выбрали стратегию параллелизма данных, основанную на архитектуре PS, чтобы разделить обучающие данные на разные рабочие машины для параллельного обучения (в нашей практике быстрее нарезать обучающие файлы, чем нарезать tf.dataset для обучения).

На основе кластера k8s мы используем TFJob для управления распределенными вычислительными ресурсами и интегрируем AWS EFS для хранения журналов и контрольных точек. Что касается обучения, мы использовали ParameterServerStrategy в качестве распределенной стратегии обучения. Поскольку Estimator имеет более полную поддержку архитектуры PS, чем Keras, мы в основном выбрали Estimator в качестве основы для разработки модели. Базовая архитектура показана на рисунке ниже. Как пользователь, вам нужно только отправить файл конфигурации модели, чтобы впоследствии получить полные результаты модели на панели инструментов.

1.1.2 Как оптимизировать производительность модели распределенного обучения?

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

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

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

1.2 Динамическое встраивание

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

1.2.1 Реализация динамического встраивания

Собственное статическое встраивание TensorFlow не может поддерживать добавление и удаление функций динамического встраивания, поэтому мы позаимствовали и использовали реализацию динамического встраивания TensorFlow Recommenders-Addons (TFRA) для полной поддержки всех типов встраивания. Динамическое встраивание поддерживается TensorFlow Recommenders-Addons (TFRA). Однако, поскольку бизнес-модель основана на Keras+Feature Column, ее поддержка TFRA в то время была неполной, поэтому мы разработали различные API-интерфейсы TensorFlow, связанные с динамическим встраиванием, чтобы пользователи могли повторно использовать исходные API-интерфейсы без изменения каких-либо привычек.

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

1.2.2 Динамическое встраивание на практике для рекламных сценариев

В рекламной модели CTR мы в основном использовали динамическое встраивание в пользовательское встраивание для достижения итеративного обучения и быстрого обновления функций встраивания пользователей. Однако во время первоначальных экспериментов с внедрением пользователей мы обнаружили, что модель может легко попасть в переобучение. Поэтому для обучения встраиванию пользователя мы используем ограниченное обновление условного градиента, где мы выполняем прямое распространение весов встраивания только в первые несколько эпох обучения и только обратное распространение + обновление градиента в последнюю эпоху, чтобы избежать явления переобучения, вызванного функцией. Мы также обнаружили, что значение инициализации пользовательского внедрения оказывает значительное влияние на сходимость модели. Наконец, мы ввели пользовательское встраивание внешней модели в качестве значения инициализации нового пользовательского встраивания и повторили итерацию на этой основе для достижения лучших результатов, чем случайная инициализация. В конечном итоге мы добились прироста офлайн-аукциона на уровне 0,001 по рекламной модели CTR и успешно запустили ее, чтобы добиться большей прибыли в онлайн-бизнесе.

2. Потоковое обучение практически в реальном времени

2.1 Зачем нужны обучающие потоки в реальном времени

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

2.2. Как реализовать обучающие потоки в реальном времени

Все автономные пакетные задачи на приведенном выше рисунке заменены задачами Flink в реальном времени. Хранилище KV также используется для кэширования данных объектов. Генерируя поток обучающих данных в режиме реального времени, мы успешно сократили задержку обновления модели с 2+ часов до менее 10 минут, что привело к значительному повышению производительности модели.

Поток данных функций напрямую сбрасывается в хранилище KV, а поток данных в реальном времени сначала дедуплицируется и агрегируется для создания метки, например. Поведение показов генерирует отрицательные образцы по умолчанию, а положительные образцы генерируются, если после этого происходит поведение кликов. Функция агрегирования обеспечивает создание только одной метки для одного и того же запроса + элемента в пределах временного окна и дедупликацию данных для действий, превышающих временное окно. Агрегированные данные этикетки затем объединяются непосредственно с функцией в KV для создания выборки. Чтобы гарантировать успешность соединения действия и функции и предотвратить отставание потока данных функции от потока данных действия, поток данных действия всегда отстает от потока данных функции, координируя водяной знак задания действия со временем события. тематического события.

Как мы можем проверить точность прямой трансляции? Сравните количество выборок, пропорцию положительных и отрицательных выборок и точность выборочных данных сравнения между потоком в реальном времени и пакетным потоком. В настоящее время мы не проверяем модель перед ее обновлением, а отслеживаем модель в режиме реального времени с помощью онлайн-журналов (рассчитывая AUC…), основываясь на нашем опыте и характеристиках модели: образцы могут отсутствовать, но не ошибаться. Если некоторые выборки потеряны, модель может быть восстановлена ​​автоматически, но в случае ошибок выборки модель может быть восстановлена ​​только путем восстановления исторической контрольной точки и пропуска данных об ошибках.

3. Более эффективные методы обучения

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

3.1 Выбор функций

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

3.1.1 Важность функции

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

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

3.1.2 Выбор функции

Основываясь на вышеуказанной важности функций, мы можем затем выбрать функции, которые необходимо удалить. При выборе функций, подлежащих удалению, в дополнение к оценке важности функций также необходимо учитывать стоимость функций. Так называемая стоимость функции — это в основном дополнительные затраты на хранение и вычисления из-за таких факторов, как ее размерность или длина последовательности функций. Поэтому мы объединили стоимость функции + важность функции (важность функции генерируется ежедневно, поэтому в качестве окончательного результата мы выбрали среднее значение за один месяц), чтобы получить рейтинг стоимости функции и производительности, который использовался в качестве основы для экспериментов с моделью выбора функций. .

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

3.2 Подготовка к началу работы

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

Возьмем в качестве примера типичную сеть DNN (показана ниже), когда нам нужно добавить новые функции в исходную модель, веса серого слоя будут считаны из онлайн-контрольной точки. Веса слоев в красной рамке будут добавлены или изменены. Для новых весов TensorFlow автоматически инициализирует их в соответствии с инициализатором, поэтому никаких дополнительных действий не требуется. Когда добавляется новая функция, веса этого слоя будут меняться по порядку и форме из-за новой функции, поэтому нам нужно динамически регулировать положение весов этого слоя в соответствии со структурой графика и инициализировать веса нового Рис5.

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

4. Планы на будущее

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