Авторы Уильям Кокс, Гаян Сеневиратна и Хьюг Демерс

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

Первым шагом является планирование заблаговременно, чтобы мы могли убедиться, что у нас достаточно курьеров, чтобы забрать и доставить заказы. Если в дороге слишком мало курьеров, посетители остаются ждать своей еды, что по понятным причинам делает их несчастными. С другой стороны, если в дороге слишком много курьеров, то некоторые курьеры останутся без дела, и нам придется платить этим курьерам по более низкой ставке, чем та, которую они зарабатывают при активной доставке — то, что делает оба Grubhub и наши курьеры недовольны. Итак, чтобы нанизать эту трехстороннюю иглу счастья, мы делаем прогнозы того, сколько заказов мы будем получать каждые полчаса для каждого региона, который мы обслуживаем. Это составляет миллионы прогнозируемых временных интервалов, и мы делаем это ежедневно!

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

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

От исследований до производственного цикла

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

Платформа данных Grubhub

Система прогнозирования объема заказов находится внутри более широкой инфраструктуры платформы данных Grubhub. Это включает в себя AWS EMR для распределенных вычислений, Azkaban в качестве планировщика рабочих процессов, PrestoDB для запросов и объединения источников данных и S3 в качестве базового озера данных. Мы также широко используем Sqlite для локального кэширования данных на наших рабочих узлах. Мы развертываем наш продукт в виде пакета Python, запуск которого запланирован через Азкабан для ежедневного запуска. Ежедневные задания Азкабана загружают кластер EMR, устанавливают пакет прогнозирования и запускают задание прогнозирования.

Прогнозирование инфраструктуры

При разработке нашей системы прогнозирования мы поставили перед собой несколько целей:

  • Предпочитаю реализацию python(ic)
  • Предпочитайте простоту
  • Предпочитаю локальное тестирование/распределенное развертывание
  • Сделайте исследования и развертывание как можно более плавными

Поскольку это, по сути, стандартный язык машинного обучения, все исследования и разработки проводились на Python. Мы пришли к выводу, что сложность повторной реализации исследовательских моделей на другом языке, таком как Java, или импорт готовых моделей в отдельную производственную среду будет слишком высокой и снизит скорость, с которой мы можем выполнять итерации этих моделей. Кроме того, мы решили использовать Dask вместо Spark в качестве среды распределенных вычислений в основном потому, что это был собственный Python и допускала реализацию Pythonic.

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

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

Подготовка данных

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

Dask для распределенных вычислений

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

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

Обеспечение качества прогнозирования

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

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

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

Заключение

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

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

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