Обучение модели с 92 миллионами записей за 34 секунды
От исследования космоса до робототехники, от игровых движков до медицинских исследований, от обучения одной модели до питания всего центра обработки данных - графические процессоры являются неотъемлемой частью процесса работы с данными.
Если что-то, что нам нужно сегодня, больше, чем когда-либо, - это скорость обработки огромных данных, которые мы генерируем. В последнем программном докладе GTC 2020, который прозвучал с кухни генерального директора, NVIDIA дала понять, что они хотят использовать графические процессоры во всех возможных областях.
В этой статье мы узнаем, как ускорить непрерывный рабочий процесс машинного обучения с помощью NVIDIA RAPIDS. Если вы еще не знаете, как работает непрерывный рабочий процесс или что такое RAPIDS, оставайтесь со мной, вас ждет удовольствие. В этой статье мы будем обсуждать следующее, не стесняйтесь двигаться вперед, если вы знаете одну или две темы.
- Что такое RAPIDS?
- Как работают сквозные рабочие процессы
- Прогнозирование тарифов на такси Нью-Йорка и сравнение времени, затрачиваемого на CPU и GPU
Кроме того, прежде чем мы начнем, обратите внимание, что машина, которую я использую, имеет следующие характеристики:
Что такое RAPIDS?
Хорошо, давай сразу перейдем к делу. RAPIDS - это рыночная / отраслевая библиотека, которая работает поверх CUDA, платформы параллельных вычислений и API, созданной, как вы уже догадались, NVIDIA.
Хотя несколько библиотек нацелены на разные домены, RAPIDS был специально разработан для анализа данных с ускорением на GPU, а позже был принят сообществом Data Science для более быстрого обучения их моделей машинного обучения. Я имею в виду, кому не нравится тренировать своих моделей в мгновение ока? Верно? Чтобы узнать больше о RAPIDS и последних разработках, посетите их веб-сайт и вводный блог.
Как работает непрерывный рабочий процесс
Если вы здесь читаете, как ускорить непрерывный рабочий процесс машинного обучения, скорее всего, вы знакомы с рабочим процессом, который я собираюсь объяснить. Если это так, вы можете перейти к следующей части, где мы прогнозируем тарифы на такси Нью-Йорка с использованием CPU и GPU. Но если вы новичок и хотите узнать больше, оставайтесь со мной.
Внимательно посмотрите на схему. Делал? Идеально. Теперь давайте разберемся в этом шаг за шагом:
- ETL - извлечение, преобразование и загрузка
Именно здесь большинство специалистов по данным тратят свое время на очистку данных. На этом этапе мы делаем все необходимое для формирования хорошего набора данных перед тем, как передать его нашему алгоритму машинного обучения - от создания фреймов данных до разработки функций - все это относится к ETL. Если вы хотите начать медленно и хотите узнать, как реализовать базовый ETL, перейдите к этой статье, где мы выполняем ETL и предсказываем, кто выжил после Титаника. - Обучение
Чтобы получить наилучшие результаты, мы сначала должны обучить нашу модель на данных, чтобы в следующий раз, когда она увидит нечто подобное, она знала, на что смотрит. Это этап обучения и настройки вашей модели. - Вывод
Затем мы запускаем нашу модель, чтобы иметь возможность отвечать на запросы пользователей после прохождения нескольких процессов. Например, рейтинг. На основе запросов пользователей мы ранжируем результаты и доставляем их пользователю. Подумайте, как Google представляет вам новый набор результатов для каждого нового запроса. Аккуратно, да?
Чтобы избежать неправильного понимания, знайте, что это всего лишь общее представление о том, как работает сквозной рабочий процесс. За кулисами много работы. Также как фильм, спектакль или опера.
Потребность в высокопроизводительных вычислениях
Вам может быть интересно, зачем нам ускорять этот процесс? Позвольте мне вкратце рассказать почему.
Что происходит, так это то, что все три этапа, которые мы обсуждали выше, имеют свой собственный набор проблем, когда дело доходит до вычислений. С огромным объемом данных, генерируемых каждый день, и высокими требованиями к обработке данных (терабайты набора данных), давайте просто скажем, что процессоров просто недостаточно.
Специалисты по обработке данных тратят большую часть своего времени на очистку и обработку данных (также известную как ETL), и никто не хочет, чтобы этот процесс занимал полдня или целый день. Я знаю, что не стал бы.
А поскольку компании быстро переходят к сбору и обработке петабайт данных, скорость сейчас нужна нам больше, чем когда-либо. Давайте лучше поймем это на примере.
Прогнозирование тарифов на такси Нью-Йорка
Понимание данных
Прежде всего, вы должны знать свои данные лучше, чем вы знаете сами. Набор данных о такси Нью-Йорка популярен и широко доступен, вы можете скачать его здесь. Он содержит 9 файлов за 9 разных месяцев, начиная с января 2014 года, и каждый файл имеет размер примерно 2–2,2 ГБ, да, каждый файл. Вы, наверное, поняли. Мы будем обрабатывать все файлы вместе.
Во-первых, давайте посмотрим, что находится в этих файлах. В наборе данных 17 столбцов или объектов. Я перечислил каждый из них, и они не требуют пояснений.
vendor id pickup_datetime dropoff_datetime passenger_count trip_distance pickup_latitude pickup_longitude rate_code dropoff_latitude dropoff_longitude payment_type fare_amount surcharge mta_tax tip_ammount tolls_ammount total_amount
Все просто, правда? Хороший. А что насчет записей, возможно, вам интересно. У нас есть 124 миллиона строк или записей во всех этих 9 файлах вместе взятых. Да, верно, 124 миллиона. 124 649 497, если быть точным. Есть предположения, сколько времени потребуется для завершения процесса ETL? Останься со мной, чтобы узнать.
Мы будем использовать cuDF с Dask и XGBoost для масштабирования операций в стиле ETL GPU DataFrame и для обучения модели. Чтобы узнать больше о cuDF, прочитайте сообщение друга-коммуникатора Джорджа Как использовать CuPy, чтобы сделать Numpy более чем в 10 раз быстрее ». Для простоты я оставлю код в посте минимальным, но вы можете найти всю записную книжку ipynb и многие другие примеры записных книжек E2E в репозитории RAPIDS на GitHub здесь.
Очистка данных
Как мы уже знаем, нам нужно очистить данные, поэтому мы приведем в порядок наш набор данных.
У нас одни и те же имена столбцов по-разному представлены в разных файлах CSV. Например, у одного файла есть rate_code, а у другого - RateCodeID, хотя оба являются общепринятыми способами представления имен столбцов, мы должны использовать любой из них. Я всегда выбираю первый, так как слова разделяются подчеркиванием, и я легко могу их прочитать. Вечно команда ленивая.
Обработка выбросов
Есть выбросы. Всегда. Чтобы что-то сломать, чтобы что-то не работало эффективно, и мы должны с этим справиться. Например, если тариф меньше 0 долларов или больше 500 долларов, кто даст 500 долларов? То же самое с количеством пассажиров, отменить записи с ‹0 и› 6 записями.
После очистки набора данных мы отбросили почти 7 миллионов записей, и теперь у нас есть 117 миллионов, из которых мы действительно можем получить информацию.
Выбор тренировочного набора
Давайте представим, что вы собираетесь совершить поездку в Нью-Йорк, не идите, просто представьте, 25-го числа, и вы хотите построить модель, чтобы предсказать, какими будут цены на проезд в последние несколько дней, учитывая данные первой части. месяца.
Мы измеряем время, чтобы узнать, сколько времени потребуется вашему кластеру для загрузки данных из сегмента хранилища и части рабочего процесса ETL. На данный момент у нас есть 92 млн данных для обучения и оставшиеся 25% для тестирования.
Время стены представляет собой общее время работы ЦП, которое составляет 2 мин 3 с или 123 секунды. Впечатляет, да? Но что, если я скажу вам, что мы можем достичь еще более быстрых результатов?
В том же процессе, сразу после включения 1 графического процессора (NVIDIA TITAN RTX 24 ГБ DDR6) мы можем завершить ту же работу за 63 секунды. Повышение почти в 2 раза. Если вы думаете, что это здорово, подождите, пока я покажу вам увеличение времени тренировки. Кроме того, при этом я следил за использованием процессора. Все ядра работают, глаза успокаивали, врать не собирался.
Обучение
Мы собираемся обучить модель регрессии XGBoost на наших обучающих данных и выяснить, сколько времени потребуется для завершения всего обучения.
Время составляет 6 минут 36 секунд, то есть 396 секунд. Неплохо. Давайте проверим то же самое после включения графического процессора TITAN RTX.
КАКИЕ! Мы только что обучили нашу модель 92 миллионам записей за 33,9 секунды? Черт возьми, мы сделали. Честно говоря, я сначала не поверила. Но да, это реальность. Более чем 12-кратное ускорение всего за счет включения одного графического процессора, что, если мы будем использовать несколько?
Прогноз
Поскольку у нас есть обученная модель, теперь нам нужно протестировать ее с 25% имеющихся записей.
Показатель производительности
Измерение производительности нашей модели является важной частью. Мы сделаем это, вычислив среднеквадратичную ошибку. Если вы хотите узнать больше о функциях затрат, перейдите к этой статье о функциях затрат, написанной другим коммуникатором Камилом.
Совсем неплохо. Мы можем сделать и другие улучшения, но это выходит за рамки данной статьи. Возможно, в другой раз.
Заключение
Сейчас, когда нам доступно больше, чем когда-либо, данных в различных формах, нам нужны инструменты, которые могут быстрее обрабатывать данные, чтобы получать информацию и использовать ее для принятия более эффективных решений - от медицинских исследований до освоения космоса. С помощью NVIDIA RAPIDS (программный стек) и NVIDIA GPU (аппаратные) мы можем достичь почти 6-кратного ускорения в конвейере сквозного машинного обучения. Также вот фото зверя.
Разве это не красиво? Вы можете найти записные книжки здесь и здесь, а данные - здесь.
Удачного обучения.