Ускорено инженерство на функции и обучение за системи за препоръчване

От Бенедикт Шиферер и Евен Олдридж

Нашето решение за 1-во място на RecSys Challenge 2020 се фокусира върху прогнозиране на взаимодействие с туитове въз основа на тазгодишния набор от данни, предоставен от домакина на състезанието, Twitter. Интердисциплинарният екип на NVIDIA включваше колеги от KGMON на NVIDIA (Kaggle Grandmasters), RAPIDS на NVIDIA (Data Science) и Merlin на NVIDIA (Recommender Systems), които си сътрудничиха по печелившото решение.

В публикацията „The Great AI Bake-Off: Recommendation Systems on Rise“ разказваме нашата история зад сцената. Фокусът на тази публикация в блога е да споделим нашите поуки от тазгодишните състезания от техническа гледна точка, включително ускоряване на обработката на данни от край 2 до 25 пъти с GPU-ускорение и оказване на влияние върху следващата версия на NVTabular, която опростява обработката на данни.

Нашият подход постигна най-висок резултат в седем от осемте показателя, използвани за изчисляване на крайната позиция в класацията. Ускоряването на нашия тръбопровод беше от решаващо значение за способността ни бързо да извършваме проучвателен анализ на данни (EDA) и доведе до откриването на набор от ефективни функции, използвани в крайното решение, което се предоставя като софтуер с „отворен код“.

Въведение

Системите за препоръчване (RecSys) играят критична роля за стимулиране на ангажираността на потребителите и приходите на онлайн платформите. Структурата на данните често е таблична и изисква обширно инженерство на функции, за да се намерят функции, които осигуряват най-добра производителност при моделиране. Въпреки че архитектурите за дълбоко обучение могат автоматично да извличат добри представяния на данни в други домейни, като изображения и текст, те все още зависят от експертни знания и инженеринг на функции в таблични данни. Най-добрите решения в предишни и настоящи предизвикателства на RecSys зависеха от персонализирани функции, въведени в подсилени дървета на решения или невронни мрежи.

За RecSys 2020 Challenge Twitter предостави набор от данни, съдържащ 200 милиона потребителски туит комбинации, изискващи от участниците да предскажат поведението на потребителя при дадена потребителска туит комбинация: харесва ли потребителят „отговор“, „ретуитване“ и/или „ ретуитване с коментар” туитът? Описание на схемата за данни можете да намерите тук. Наборът от данни от 200 милиона туитове изискваше значителни изчисления, за да се направи инженеринг на функции и да се подготви наборът от данни за моделиране, а нашето печелившо решение използва няколко ключови инструмента, за да ускори нашия процес.

Ускоряване на ETL и обучение

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

Нашата окончателна реализация работи изцяло на GPU и включва инженеринг на функции, предварителна обработка и обучение на моделите за 200 милиона взаимодействия, всичко това за две минути и 18 секунди, ускоряване с повече от два порядъка спрямо CPU оптимизирано код. Това беше постигнато чрез комбинация от RAPIDS cuDF, Dask, UCX и XGBoost на една машина с четири графични процесора NVIDIA V100. Нека анализираме различните етапи от нашия тръбопровод за данни.

Приготвяне

Трябва да обработим предварително оригиналния набор от данни, за да го преведем в оптимален формат. Това се извършва само веднъж и след това се използва от всички бъдещи експерименти. В тази стъпка заредихме предоставените TSV файлове, вменени NaN, факторизирахме категорични променливи, оптимизирахме променливи типове данни, обработихме списъци в колони, декодирахме BERT токени в текст, извлякохме текстови функции (напр. брой думи) и изчислихме дузина броя функции, свързани с ангажирането и ангажираните потребители. Тъй като това беше еднократна стъпка на предварителна обработка, ние не я включихме в нашето сравнение на Фигура 1.

Инженеринг на характеристиките

Основните техники за инженеринг на характеристиките са Кодиране на целта, Кодиране на броя и Разлика в забавянето (променливи разлики във времето). След като обсъдим идея, ще изчислим функцията(ите) и след това ще обучим, направим изводи и ще изчислим резултатите за валидиране. Важно беше този цикъл да се ускори колкото е възможно повече. Използването на RAPIDS cuDF, DASK и UCX ни позволи да използваме четири графични процесора NVIDIA V100 за тази задача. С тези библиотеки отнема по-малко от една минута, за да се проектират всички функции, докато използването на Pandas на CPU отнема осем часа 56 минути, коефициент на ускоряване от над 500 пъти. Дори в сравнение с оптимизиран CPU код (Pandas+Dask) на 20 ядра, нашето решение осигури ускорение от 42x. Фигура 1 визуализира ускорението, с изключение на Pandas, тъй като е извън диапазона.

обучение

Използването на Dask-XGBoost позволи на нашите модели да бъдат обучени на четири графични процесора NVIDIA V100, което значително ускори обучението на модела и изводите в сравнение с LightGBM на процесора. Използвайки това мулти-GPU решение, ние ускорихме обучението с фактор 120x. Показателите за конкуренция PRAUC и RCE изискват изчисляване на AUC и загуба на журнал. Ускорихме тези изчисления с GPU и Numba JIT, намалявайки изчисленията от минути до секунди.

End-2-end нашето решение беше 280 пъти по-бързо от нашето първоначално CPUбазирано внедряване и 25x по-бързо от оптимизирания CPU код. Техниките, използвани в решението, също се интегрират в NVTabular, нашата препоръчителна система ETL библиотека.

Опростяване на работните потоци за препоръки с NVTabular

Merlin на NVIDIA е приложна рамка и екосистема, която позволява разработка от край до 2 на препоръчителни системи, ускорени на NVIDIA GPU. NVTabular е ETL компонентът на NVIDIA Merlin. В изданието NVTabular v0.2 внедрихме наученото от предизвикателството RecSys2020, за да предоставим операторите Target Encoding, Count Encoding и Difference Lag, както и нова поддръжка на няколко GPU. NVTabular създава тръбопровода за инженеринг на функции само в 64 реда код.

Нека да разгледаме тръбопровода оператор по оператор:

  1. Преобразуваме етикетите (целите), отговаряме, ретуитваме, ретуитваме с коментар и харесваме в двоична колона. В необработените данни положителните взаимодействия са кодирани с клеймото за време.
  2. Прилагаме целево кодиране с 5 k-кратна стратегия и коефициент на изглаждане 20 върху всички етикети за категориалните характеристики, дефинирани от cat_groups.
  3. Ние използваме Count Encoding, дефинирано за категоричните характеристики в колоните.
  4. Създаваме нова функция, като вземаме съотношението на a_following_count и a_follower_count.
  5. Създаваме нова функция, като вземаме съотношението на b_following_count и b_follower_count.
  6. Преобразуваме клеймото за време във формат за дата и час.
  7. Извличаме часа от клеймото за време.
  8. Преобразуваме типа данни за колоните b_follower_count, b_following_count и език.
  9. Прилагаме кодиране на разлика в колоните b_follower_count, b_following_count и език.
  10. Попълваме липсващите стойности с 0.

Пълната имплементация край 2 края ще бъде пусната тук.

Заключение

В тази публикация в блога обяснихме нашето първо място решение на предизвикателството RecSys2020 на техническа аудитория. Споделихме техниките, които ни позволиха да спечелим състезанието. Успяхме да ускорим нашия конвейер 25x (оптимизирано внедряване на CPU) до 280x (първоначално внедряване на CPU), изпълнявайки end-2-end за две минути и 18 секунди. Показахме подробен анализ на различните етапи от нашия тръбопровод. Първо, стъпката за подготовка на данни се изпълнява само веднъж. Второ, етапът на инженеринг на характеристиките беше ускорен с 42x и накрая, етапът на обучение постигна 120x ускорение. Нашият оптимизиран за GPU конвейер ни позволи бързо да повторим нови идеи и да проведем много експерименти за кратко време, което ни даде конкурентно предимство да спечелим тазгодишното състезание.

Освен това споделяме тръбопровода за данни като работен поток NVTabular, изискващ само 64 реда код. Ние внедрихме нашето обучение по време на този процес в NVTabular, осигурявайки лесен достъп до същите техники за общността.

автори

Сътрудничество на участващия екип в предизвикателството RecSys2020: Бенедикт Шиферер, Жилберто Титериц Джуниър, Крис Деот, Кристоф Хенкел, Казуки Онодера, Живей Лиу, Боян Тунгуз, Евен Олдридж, Габриел Де Соуза Перейра Морейра и Ахмет Ердем.