5 советов по обучению с использованием нескольких графических процессоров с помощью Keras PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

5 советов по тренировкам с несколькими GPU с помощью Keras

Глубокое обучение (любимое модное слово конца 2010-х вместе с блокчейном / биткойном и Data Science / Machine Learning) позволило нам сделать несколько действительно крутых вещей за последние несколько лет. Помимо достижений в алгоритмах (которые, по общему признанию, основаны на идеях, уже известных с 1990-х годов, называемых «эрой интеллектуального анализа данных»), основные причины его успеха можно объяснить наличием больших свободных наборов данных, введением библиотек с открытым исходным кодом и использование графических процессоров. В этой записи блога я остановлюсь на последних двух и поделюсь с вами некоторыми советами, которые я усвоил нелегко.

Почему TensorFlow и Keras?

TensorFlow очень популярная библиотека глубокого обучения, разработанная Google, которая позволяет быстро создавать прототипы сложных сетей. Он поставляется с множеством интересных функций, таких как автоматическое дифференцирование (которое избавляет вас от оценки / кодирования градиентов функций стоимости) и поддержка графического процессора (что позволяет легко получить увеличение скорости в 200 раз при использовании достойного оборудования). Более того, он предлагает интерфейс Python, что означает, что вы можете создавать прототипы быстро, не требуя написания кода на C или CUDA. По общему признанию есть много других структур, которые можно использовать вместо TensorFlow, таких как Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK и т. Д., Но все это сводится к вашему сценарию использования и вашим личным предпочтениям.

Но почему Keras? Для меня прямое использование TF - это все равно что заниматься машинным обучением с Numpy. Да, это выполнимо, и время от времени вам приходится это делать (особенно если вы пишете пользовательские слои / функции потерь), но действительно ли вы хотите написать код, который описывает сложные сети как серию векторных операций (да, я знаю Есть ли в TF методы более высокого уровня, но они не такие крутые, как у Keras)? И что делать, если вы хотите перейти в другую библиотеку? Ну, тогда вам, вероятно, придется переписать код, который отстой. Та та тааа, Керас на помощь! Keras позволяет вам описывать свои сети с использованием концепций высокого уровня и писать код, независимый от бэкенда, что означает, что вы можете управлять сетями в разных библиотеках глубокого обучения. Немного вещей, которые мне нравятся в Керасе, это то, что он хорошо написан, имеет объектно-ориентированную архитектуру, его легко внести вклад и дружелюбное сообщество. Если вам это нравится, скажите спасибо Франсуа Шоле для развития и открытого источника.

Советы и рекомендации по обучению на нескольких GPU

Без лишних слов давайте перейдем к нескольким советам о том, как максимально эффективно использовать GPU-обучение на Keras, и к нескольким уловкам, которые вы должны иметь в виду:

1. Multi-GPU обучение не является автоматическим

Обучение моделей на графическом процессоре с использованием Keras и Tensorflow проходит без проблем. Если у вас есть карта NVIDIA и вы установили CUDA, библиотеки автоматически обнаружат ее и используют для обучения. Так круто! Но что, если вы избалованный ребенок и у вас несколько графических процессоров? Что ж, к сожалению, вам придется немного поработать, чтобы добиться обучения с использованием нескольких GPU.
5 советов по обучению с использованием нескольких графических процессоров с помощью Keras PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.
Существует несколько способов распараллеливания сети в зависимости от того, чего вы хотите достичь, но два основных подхода - распараллеливание модели и данных. Первая может помочь вам, если ваша модель слишком сложна, чтобы поместиться в один графический процессор, а вторая помогает, когда вы хотите ускорить выполнение. Обычно, когда люди говорят о тренировках с несколькими GPU, они имеют в виду последнее. Раньше было труднее достичь, но, к счастью, недавно Керас включил служебный метод под названием mutli_gpu_model что облегчает параллельное обучение / предсказания (в настоящее время доступно только с бэкэндом TF). Основная идея заключается в том, что вы передаете свою модель через метод, и она копируется в разные графические процессоры. Исходный вход разбивается на порции, которые подаются на различные графические процессоры, а затем объединяются в один выход. Этот метод может использоваться для достижения параллельного обучения и прогнозирования, тем не менее имейте в виду, что для обучения он не масштабируется линейно с количеством графических процессоров из-за требуемой синхронизации.

2. Обратите внимание на размер партии

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

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

Конвергенция: Если вы используете Stochastic Gradient Decent (SGD) или некоторые его варианты для обучения вашей модели, вы должны иметь в виду, что размер пакета может влиять на способность вашей сети сходиться и обобщать. Типичные размеры партий во многих проблемах компьютерного зрения находятся между 32-512 примерами. Так как Кескар и др. Он сказал: «На практике было замечено, что при использовании более крупной партии (чем 512) качество модели ухудшается, если судить по ее способности обобщать». Обратите внимание, что другие разные оптимизаторы имеют разные свойства, и специализированные методы распределенной оптимизации могут помочь с этой проблемой. Если вы заинтересованы в математических деталях, я рекомендую прочитать тезис Джори Херманс «О масштабируемом глубоком обучении и распараллеливании градиентного спуска».
5 советов по обучению с использованием нескольких графических процессоров с помощью Keras PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.
Порча весов: Это неприятная техническая деталь, которая может иметь разрушительные результаты. Когда вы тренируетесь с несколькими графическими процессорами, важно снабжать все графические процессоры данными. Может случиться так, что в самой последней партии вашей эпохи будет меньше данных, чем определено (потому что размер вашего набора данных не может быть разделен точно на размер вашей партии). Это может привести к тому, что некоторые графические процессоры не получат никаких данных на последнем шаге. К сожалению, некоторые слои Keras, прежде всего слой нормализации партии, не могут справиться с тем, что приводит к появлению значений nan в весах (скользящее среднее и дисперсия в слое BN). Чтобы сделать вещи еще более неприятными, никто не будет наблюдать проблему во время обучения (в то время как фаза обучения равна 1), потому что определенный уровень использует среднее / дисперсию пакета в оценках. Тем не менее, во время предсказаний (фаза обучения установлена ​​на 0), используется текущее среднее / дисперсия, которая в нашем случае может стать нан, что приведет к плохим результатам. Поэтому сделайте себе одолжение и всегда следите за тем, чтобы размер пакета был фиксированным, когда вы проходите обучение с несколькими графическими процессорами. Два простых способа добиться этого - либо отклонить пакеты, которые не соответствуют предопределенному размеру, либо повторять записи в пакете до тех пор, пока вы не достигнете предопределенного размера. И последнее, но не менее важное: имейте в виду, что в конфигурации с несколькими графическими процессорами размер пакета должен быть кратным числу доступных графических процессоров в вашей системе.

3. голодание данных GPU, то есть процессоры не поспевают за GPU

Обычно самой дорогой частью при обучении / прогнозировании глубоких сетей является оценка, которая происходит на графических процессорах. Данные предварительно обрабатываются в процессорах в фоновом режиме и периодически передаются в графические процессоры. Тем не менее, нельзя недооценивать, насколько быстры графические процессоры; может случиться так, что если ваша сеть слишком мелкая или этап предварительной обработки слишком сложен, то ваши процессоры не успевают за вашими графическими процессорами, или, другими словами, они недостаточно быстро снабжают их данными. Это может привести к низкому использованию графического процессора, что приводит к потере денег / ресурсов.
5 советов по обучению с использованием нескольких графических процессоров с помощью Keras PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.
Keras обычно выполняет оценку пакетов параллельно, тем не менее, из-за GIL (Global Interpreter Lock) в Python вы не сможете добиться истинной многопоточности в Python. Для этого есть два решения: либо использовать несколько процессов (обратите внимание, что в этом множестве ошибок, которые я не буду здесь освещать), либо сделайте шаг предварительной обработки простым. В прошлом я отправлял Pull-запрос на Keras, чтобы облегчить некоторые ненужные нагрузки, которые мы накладывали на процессоры во время предварительной обработки изображений, поэтому на большинство пользователей это не должно повлиять, если они используют стандартные генераторы. Если у вас есть собственные генераторы, попробуйте использовать как можно больше логики для библиотек C, таких как Numpy, потому что некоторые из этих методов на самом деле выпустить GIL Это означает, что вы можете увеличить степень распараллеливания. Хороший способ определить, сталкиваетесь ли вы с голоданием данных на GPU, - это отслеживать использование GPU, тем не менее, имейте в виду, что это не единственная причина для наблюдения за этим (синхронизация, которая происходит во время обучения на нескольких GPU, также является причиной низкой загрузки). ). Как правило, голодание данных GPU можно обнаружить, наблюдая всплески GPU, сопровождаемые длинными паузами без использования. В прошлом я использовал расширение с открытым исходным кодом для Dstat, которое может помочь вам измерить использование вашего графического процессора, поэтому посмотрите на оригинальное сообщение в блоге.

4. Сохранение ваших параллельных моделей

Допустим, вы использовали метод mutli_gpu_model для распараллеливания вашей модели, обучение завершено, и теперь вы хотите сохранить свои веса. Плохая новость в том, что вы не можете просто вызвать save () для него. В настоящее время Keras имеет ограничение, которое не позволяет вам сохранить параллельную модель, Это можно обойти двумя способами: либо вызвать save () для ссылки на исходную модель (веса будут обновлены автоматически), либо вам нужно сериализовать модель, вырубив параллельную версию и очистив все ненужные соединения. Первый вариант намного проще, но в будущем я планирую открыть метод serialize () с открытым исходным кодом, который выполняет последний.

5. Подсчет доступных графических процессоров имеет неприятный побочный эффект

К сожалению, на данный момент существует неприятный побочный эффект метода tenorflow.python.client.device_lib.list_local_devices (), который вызывает создание нового сеанса TensorFlow и инициализацию всех доступных графических процессоров в системе. Это может привести к неожиданным результатам, таким как просмотр большего количества графических процессоров, чем указано, или преждевременная инициализация новых сеансов (вы можете прочитать все подробности на этом выдвижная запрос). Чтобы избежать подобных неожиданностей, советуем использовать вместо этого метод Keget K.get_session (). List_devices (), который вернет вам все зарегистрированные в данный момент графические процессоры в сеансе. И последнее, но не менее важное: имейте в виду, что вызов метода list_devices () несколько дорог, поэтому, если вас просто интересует количество доступных графических процессоров, вызовите метод один раз и сохраните их число в локальной переменной.

Это оно! Надеюсь, вы нашли этот список полезным. Если вы нашли другие полезные советы / советы по обучению GPU на Keras, поделитесь ими ниже в комментариях. 🙂

Отметка времени:

Больше от Датумбокс