В предыдущем посте мы говорили об использовании классификатора с несколькими ярлыками для классификации угроз, чтобы решать проблемы, когда угроза на изображении не является заметным объектом. В этом посте мы собираемся обсудить использование исследовательского анализа данных (EDA) для нашего набора данных с несколькими метками и его результаты. Поскольку наша модель должна анализировать миллионы изображений, сохранение низкого времени вывода нашей модели является высшим приоритетом для лучшей масштабируемости. В этой связи мы также представляем результаты использования обучения со смешанной точностью для нашего классификатора угроз на основе EfficientNet. Поскольку это проприетарный набор данных, особенности набора данных не будут раскрыты - например, точные метки - но они будут адресованы простой нумерацией от L0 до L9. L0 - это класс, который представляет безопасный контент на изображении, в то время как классы из L1-L9 представляют наличие опасного контента.

Исследовательский анализ данных

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

Поскольку это вариант использования с несколькими ярлыками, порядок совпадения также является параметром. Порядок здесь определяется как количество классов в каждом наборе этикеток. Библиотека Scikit-multilearn вместе с библиотеками графов networkX позволяют строить и анализировать отношения меток с помощью графов. Это может дать некоторые важные сведения о наборе данных и его распределении.

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

На момент написания этого блога набор данных золотого стандарта для последовательного запуска всех наших моделей на одном наборе данных еще не был завершен. Для целей этой публикации, поскольку Multiclass и Multilabel требуют по-разному балансировать классы, тестовые наборы данных не идентичны. Однако в рамках этого блога тестовые наборы данных имеют достаточно достоинств, чтобы показать, что этот метод более перспективен, чем мультиклассовый классификатор. Показатели производительности для 10 основных классов (например, L0-L9) показаны на рисунке 1.

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

Таким образом, эта итерация классификатора угроз намного лучше предыдущей по двум причинам:

  1. Производительность показывает улучшение по ключевым классам и ключевым показателям, а именно Отзыв.
  2. Классификатор Multilabel может предоставить конечному пользователю дополнительную информацию о классах, представленных на изображении.

С точки зрения производительности все выглядит хорошо, но развертывание в производственной среде требует учета масштабируемости. Один из способов улучшить вертикальное масштабирование в моделях глубокого обучения с миллионами параметров и тысячами слоев - использовать вычисления с плавающей запятой 16 (FP16).
Как бы просто это ни звучало, с этим связаны проблемы -

  1. Не все графические процессоры способны выполнять вычисления FP16. Подробнее об этом чуть позже.
  2. Обучение с использованием полных вычислений FP16 приводит к нестабильному обучению, поэтому важно использовать процедуры Смешанная точность обучения.
  3. Не на каждом уровне доступна соответствующая реализация FP16.

Все графические процессоры от Nvidia с архитектурой Volta или Turing поддерживают вычисления FP16 с использованием ядер Tensor, которые ускоряют умножение матриц. Это доступно на AWS с инстансами G4, на которых работают графические процессоры Tesla T4. Подробнее об этом можно прочитать здесь T4.

Для краткости на рис. 2 красиво представлены смешанные прецизионные тренировки:

  1. Модель конвертируется в FP16, так что все ее веса находятся в FP16. Но сохраняется копия весов FP32 (основных), которые синхронизируются с этими весами FP16 модели.
  2. После прямого прохода мы получаем потерю FP16, которая преобразуется в потерю FP32, потому что мы будем масштабировать потерю с большим числом.
  3. Масштабирование потерь применяется для предотвращения переполнения градиента; всякий раз, когда происходит переполнение, масштаб потерь уменьшается вдвое, и это обновление градиента пропускается.
  4. Используя эти масштабированные потери, мы выполняем обратное распространение и получаем масштабированный градиент FP16, который затем преобразуется в FP32.
  5. При необходимости выполняем удаление накипи и градиентную обрезку. Эти градиенты FP32 используются для обновления наших основных весов FP32. Обновленные основные веса затем конвертируются в FP16, чтобы получить наши обновленные веса модели в FP16.

Причина использования основных весов FP32 состоит в том, чтобы приспособить небольшие обновления весов, поскольку градиенты малы по сравнению с параметрами, и FP16 не может обрабатывать вычисления с такой точностью (например, значения менее 2⁻¹¹).

Подобно весам, EfficientNet использует и другие уровни, требующие обновления параметров FP32, например, уровень batchnorm. Слишком сложно?
К счастью, Nvidia упаковала это в простую библиотеку под названием APEX, которую мы можем использовать. Эта библиотека реализует автоматическое обучение смешанной точности на моделях PyTorch с ~ 4 строками кода.

Это подводит нас к последней, но самой важной части - насколько эффективно обучение смешанной точности для EfficientNet?

В наших экспериментах мы использовали модель EfficientNet B4. Ускорение резюмируется следующим образом -

Мы наблюдали ускорение на нашей модели примерно на 50% и значительное уменьшение размера модели. Две версии FP16 - это два режима, в которых работает Apex, O1 - предпочтительный и рекомендуемый режим для работы со смешанной точностью обучения. Одно предостережение заключается в том, что мы работаем с одним изображением на пакет, что не идеально. Работа с большим количеством изображений в пакете может привести к лучшему ускорению. Уменьшение размера модели позволяет нам загружать больше изображений за пакет или больше моделей на один и тот же компьютер, что является еще одним преимуществом использования вывода FP16.

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

  1. Обязательно проверьте свою версию cuDNN.
    - Версия cuDNN ‹7.2 требует, чтобы количество входных и выходных каналов было кратным 8 для срабатывания тензорного ядра.
    - Для версии cuDNN› 7.2 , это ограничение снимается с операций свертки.
  2. Nvidia заявляет о 8-кратном ускорении с использованием вывода FP16 в идеальной настройке. EfficientNet далек от таких впечатляющих цифр. В ходе наших очень исчерпывающих экспериментов мы поняли несколько вещей. Наблюдается ускорение всего на 50%, потому что реализация EfficientNet активно использует глубинные свертки 5x5. И, к сожалению, cuDNN не имеет реализации для ускорения глубинной свертки 5x5. Подробно вопрос обсуждается здесь.
  3. Очень удобный способ проверить, действительно ли ваша модель ускоряется с использованием тензорных ядер (с использованием FP16), - это использовать профилировщик и проверить, где работает каждое ядро. Это пример выходных данных профилировщика для EfficientNet B4 на Tesla T4:

Запуск 1 столбца TC означает, что тензорное ядро ​​используется для выполнения этой конкретной операции ядра. Чтобы получить такой специфичный для ядра анализ, мы использовали pyprof, который поставляется с библиотекой apex.

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

Увеличение производительности, хотя и незначительное, является дополнительным преимуществом без дополнительных затрат!

Мы всегда ищем новые таланты! Просмотр вакансий.

Следуйте за нами: Facebook | Твиттер | | Linkedin | Инстаграм