Некоторые хитрости питорха
изменение
- 29 ноября 2019 года: обновили некоторые методы разработки моделей и контент ускорения рассуждений и добавили вводную ссылку на вершину,
Кроме того, я удалил TFRECORD, можно ли использовать Pytorch? Я помню, что не могу, поэтому я удалил это (Указывает удаление: <) - 30 ноября 2019 года: Значение дополнительного MAC, Дополнительная бумажная ссылка ShufflenETV2
- 2 декабря 2019 года: Pytorch, который я упоминал ранее, не может использовать tfrecord. Сегодня я увидел ответ от https://www.zhihu.com/question/358632497, и я нахожусь в восходящей позе.
- 23 декабря 2019 года: добавлено несколько популярных научных статей о количественной оценке сжатия модели
- 7 февраля 2020 года. Несколько вещей, на которые следует отметить, были выдержаны из статьи и добавлены в раздел уровня кода
- 30 апреля 2020 года:
- Добавлен документ резервной копией GitHub
- Дополненные ссылки на введение сверточного слоя и слияния слоя BN
- Вот еще одно объяснение. Для статей и ответов многих друзей, на которые я упоминал ранее, ссылки и соответствующее резюме контента не связаны вместе. По оценкам, некоторые друзья будут задавать вопросы при чтении соответствующего контента, и они не могут спросить первоначального автора. Мне здесь очень жаль.
- Настроить немного контента и попытаться соответствовать ссылке
- 18 мая 2020 года. Добавьте несколько советов о Pytorch, чтобы сохранить видео память. В то же время просто отрегулируйте формат. Я также нашел предыдущую ошибку:
non_blocking=False 's Предложение должно быть non_blocking=True . - 6 января 2021 года. Отрегулируйте некоторые представления о чтении данных изображения.
- 13 января 2021 года. Добавлена стратегия для ускоренных рассуждений. Я думаю, что я должен сначала обновить документ GitHub. Обновление ответов Zhihu немного неприятно, и невозможно сравнить изменение информации, так что это очень сложно.
- 26 июня 2022 года. Следующий формат и соглашение о контенте были повторно приняты, в то время как дополнительные ссылки и некоторые из последних открытий были добавлены.
- 20 июня 2024 года. Простая корректировка формата дополняется идеей ускорения чтения данных на основе формата
tar и IterableDataset .
Pytorch ускоряется
Примечание
Оригинальный документ: https://www.yuque.com/lart/ugkv9f/ugysgn
Заявление: Большая часть контента поступает из обмена на Zhihu и других блогах, и здесь указана только в качестве коллекции. Приветствуются больше предложений.
Zhihu ответ (добро пожаловать в нравится):
- Нагрузка данных DataLoader Pytorch занимает большую часть времени. Как вы решаете это? - Ответ художника людей - Чжиху
- При использовании Pytorch слишком много данных обучающих наборов, чтобы достичь десятков миллионов, и что мне делать, если DataLoader загружается очень медленно? - Ответ художника людей - Чжиху
Предварительная обработка ускоряется
- Чтобы минимизировать операции предварительной обработки каждый раз, когда вы читаете данные, вы можете рассмотреть возможность использования некоторых фиксированных операций, таких как
resize , и сохранить их заранее, и использовать их напрямую во время обучения. - Переместите предварительную обработку в GPU для ускорения.
- Linux может использовать
NVIDIA/DALI . - Используйте операции обработки изображений на основе тензора.
IO ускоряется
- MMCV обеспечивает относительно эффективную и всестороннюю поддержку для чтения данных: OpenMMLAB: анализ компонентов ядра MMCV (iii): Fileclient
Используйте более быструю обработку изображений
-
opencv , как правило, быстрее, чем PIL .- Обратите внимание, что ленивая стратегия загрузки
PIL заставляет ее выглядеть open чем imread of opencv , но на самом деле она не полностью загружает данные. Вы можете вызвать метод load() на объекте, возвращаемого open для загрузки данных вручную. Скорость разумна в это время.
- Для чтения
jpeg вы можете попробовать jpeg4py . - Сохраните график
bmp (уменьшите время декодирования). - Обсуждение о скорости различных библиотек обработки изображений: в чем разница между методом реализации и скоростью чтения различных функций IMREAD Python? - Чжиху
Интегрируйте данные в один непрерывный файл (уменьшить количество чтений)
Для крупномасштабных показаний небольших файлов его можно сохранить как непрерывный формат файла, который можно прочитать непрерывно. Вы можете рассмотреть TFRecord (Tensorflow) , recordIO , hdf5 , pth , n5 , lmdb и т. Д.
-
TFRecord : https://github.com/vahidk/tfrecord - База данных
lmdb :- https://github.com/fangyh09/image2lmdb
- https://blog.csdn.net/p_lart/article/details/103208405
- https://github.com/lartpang/pysodtoolbox/blob/master/forbigdataset/imagefolder2lmdb.py
- Реализация на основе файла
Tar и IterableDataset
Предварительные данные
Предварительно прочитать данные, необходимые для следующей итерации. Примеры использования:
- Как дать вам DataLoader в Pytorch - Mkfmiku статьи - Zhihu
- Ускорить данные чтения в Pytorch - статьи о HI - Zhihu
С памятью
- Загрузите прямо в память.
- Прочитайте изображение и сохраните его в фиксированный объект контейнера.
- Карта памяти на диск.
С твердым состоянием
Механический жесткий диск заменяется твердым состоянием NVME. Обратитесь к тому, как дать вам куриную кровь в DataLoader в Pytorch - статья Mkfmiku - Zhihu
Стратегии обучения
Обучение с низким уровнем разрешения
При обучении используются низкооперативные ( FP16 или даже INT8 , бинарная сеть и FP32 сеть).
Он может сохранить определенное количество видео памяти и ускорить, но будьте осторожны с небезопасными операциями, такими как среднее значение и сумма.
- Введение в смешанную точную тренировку:
- Учебное пособие по смешанному прецизионному обучению от мелкого до глубокого
- Поддержка смешанной точности, предоставленная
NVIDIA/Apex .- Pytorch должен иметь артефакт | Fast Free: гибридная точность на основе вершины
- Установка Pytorch Apex Сложные и разные растворы заболеваний - статьи Чэнь Ханке - Жиху
- Pytorch1.6 начинает предоставлять
torch.cuda.amp для поддержки смешанной точности.
Большая партия
Большие партии, как правило, приводят к более короткому времени обучения в случае фиксированной эпохи. Тем не менее, крупные партии сталкиваются с многими соображениями, такими как настройка гиперпараметра и использование памяти, которая является еще одной областью, которая привлекла большое внимание.
- Настройки гиперпараметра
- Точный, большой Minibatch SGD: Training ImageNet за 1 час, бумага
- Оптимизировать использование видео памяти
- Градиент накопление
- Градиент контрольно -пропускной пункт
- Обучение глубоких сетей с сублинейными стоимостью памяти, бумагой
- На месте работы
- Активированный на месте BatchNorm для оптимизированной памяти обучение DNNS, документы, код
Код уровня
Настройки библиотеки
- Установка
torch.backends.cudnn.benchmark = True прежде чем тренировочный цикл сможет ускорить расчет. Поскольку производительность алгоритмов CUDNN, которые расчеты, расчетливы различных размеров ядра, AutoTuner может запустить эталон, чтобы найти лучший алгоритм. Рекомендуется включить этот настройка, когда размер вашего входа не часто меняется. Если размер входа часто изменяется, автотунунер должен быть сравнивать слишком часто, что может повредить производительности. Он может увеличить скорость распространения вперед и обратно в 1,27 раза до 1,70x. - Используйте страницу, чтобы заблокировать память, то есть SET
pin_memory=True в DataLoader. - Для соответствующего
num_worker можно найти подробные дискуссии в Руководстве по ускорению Pytorch - статьи Юнменга - Чжиху. - Optimizer.zero_Grad (set_to_none = false ЗДЕСЬ. Здесь вы можете уменьшить след за памятью, установив
set_to_none=True None может умеренно улучшить memset . Но это optimizer.zero_grad() изменит некоторое поведение, которое видно для документации. memset выполняется по всем параметрам через model.zero_grad() . Градиент будет обновлен с помощью операции «только None ». - Во время обратного распространения используйте режим
eval и используйте torch.no_grad для отключения расчетов градиента. - Рассмотрите возможность использования формата памяти Cannels_last.
- Замените
DataParallel на DistributedDataParallel . Для мульти-GPus, даже если DataParallel только один узел, DistributedDataParallel всегда предпочтительнее, потому что DistributedDataParallel применяется к нескольким процессам и создает один для каждого графического процессора, обходящее глобальное интерпретатор Python (GIL) и увеличивающую скорость.
Модель
- Не инициализируйте какие -либо неиспользованные переменные, потому что инициализация и
forward Pytorch отделены, и она не будет инициализироваться, потому что вы их не используете. -
@torch.jit.script , используйте Pytroch JIT, чтобы объединить операции с точки зрения на одно ядро CUDA. Pytorch оптимизирует работу тензоров с большими размерами. Это очень неэффективно делать слишком много операций на небольших тензорах в Pytorch. Поэтому, если возможно, переписывание всех операций расчета в партии может снизить потребление и повысить производительность. Если вы не можете вручную реализовать пакетные операции, то TorchScript может использоваться для повышения производительности вашего кода. TorchScript - это подмножество функций Python, но после проверки Pytorch Pytorch Pytorch может автоматически оптимизировать код TorchScript, чтобы повысить производительность через его компилятор DOME (JTT). Но лучшим подходом является вручную реализовать пакетные операции. - При использовании FP16 со смешанной точностью установите кратный размер 8 для всех различных архитектурных конструкций.
- Своиз -слой до того, как BN может удалить смещение. Потому что математически смещение может быть смещен с помощью вычитания BN. Мы можем сохранить параметры модели и память времени выполнения.
данные
- Установите размер партии на кратные 8, чтобы максимизировать использование памяти графического процессора.
- Выполните как можно больше операций в стиле Numpy, на графическом процессоре.
- Используйте
del , чтобы освободить площадь памяти. - Избегайте ненужной передачи данных между различными устройствами.
- При создании тензора укажите устройство напрямую, вместо того, чтобы создавать его, а затем передавать его на целевое устройство.
- Используйте
torch.from_numpy(ndarray) или torch.as_tensor(data, dtype=None, device=None) , что может избежать повторного применения пространства путем обмена памятью. Для получения подробной информации и мер предосторожности, пожалуйста, обратитесь к соответствующему документу. Если исходными и целевыми устройствами являются процессорами, torch.from_numpy и torch.as_tensor не будут копировать данные. Если исходные данные представляют собой массив Numpy, используйте torch.from_numpy быстрее. Если исходные данные являются тензором с тем же типом данных и типом устройства, torch.as_tensor может избежать копирования данных, которые могут быть списком, кортежом или тензором Python. - Используйте не блокирующую передачу, то есть установите
non_blocking=True . Это пытается асинхронное преобразование, где, например, преобразование тензора ЦП в блокировке страницы в тензор CUDA.
Оптимизация оптимизатора
- Храните параметры модели в непрерывной части памяти, тем самым сокращая время
optimizer.step() .-
contiguous_pytorch_params
- Использование слитых строительных блоков в вершине
Модель дизайна
CNN
- Shufflenetv2, бумага.
- Входные и выходные каналы слоя свертки являются согласованными: когда количество каналов функций ввода и вывода слоя свертки равным, Mac (время потребления памяти,
memory access cost составляет MAC ) является наименьшей, а скорость модели является самой быстрой в настоящее время. - Уменьшить сверточную группировку: слишком много групповых операций увеличит MAC, что замедлит модель
- Уменьшите отрасли модели: чем меньше ветвей в модели, тем быстрее модель модель
- Уменьшая операции
element-wise : потребление времени, вызванное element-wise намного больше, чем значения, отраженные в флопах, поэтому element-wise операции должны быть минимизированы как можно больше. depthwise convolution также имеет характеристики низких провалов и высокого Mac.
Vision Transformer
- TRT-VIT: Tensorrt-ориентированный трансформатор зрения, бумага, интерпретация.
- Уровень стадии: блок трансформатора подходит для более поздних стадий модели, что максимизирует компромисс между эффективностью и производительностью.
- Назначение на сцене: схема проектирования сцены сначала с мелкой, а затем Deep может улучшить производительность.
- Уровень блока: гибридный блок трансформатора и узкого места более эффективен, чем отдельный трансформатор.
- Уровень блока: глобальный, а затем локальный шаблон проектирования блоков помогает компенсировать проблемы с производительностью.
Общие идеи
- Уменьшите сложность: например, резание и обрезка модели, уменьшить уровень моделей и шкала параметров
- Изменить структуру модели: например, дистилляция модели и получить небольшие модели с помощью метода дистилляции знаний
Ускорить рассуждения
Половина точности и взвешивания
Используйте представление о низкой режиме ( FP16 или даже INT8 , бинарной сети и трехзначной сети) в выводе, чтобы заменить исходное представление о точности ( FP32 ).
-
TensorRT -это механизм вывода нейронной сети, предложенный NVIDIA, который поддерживает квантование 8-бит после тренировки. Он использует алгоритм квантования модели на основе поперечной энтропии, чтобы минимизировать степень разницы между двумя распределениями. - Pytorch1.3 уже поддерживает функцию квантования, основанную на реализации QNNPACK, и поддерживает квантование после обучения, динамическое квантование и обучение восприятию квантования и другие технологии.
- Кроме того,
Distiller является инструментом оптимизации модели с открытым исходным кодом, основанным на Pytorch, и естественным образом поддерживает количественную технологию в Pytorch. -
NNI Microsoft интегрирует различные алгоритмы обучения количественному восприятию и поддерживает несколько фреймворков с открытым исходным кодом, таких как PyTorch/TensorFlow/MXNet/Caffe2
Для получения более подробной информации, пожалуйста, обратитесь к трем AIS: [Разное разговор] Какие инструменты с открытым исходным кодом доступны для текущей количественной оценки модели?
Оперативное слияние
- Навыки ускорения модели: слияние BN и убедительные слои - статьи Xiaoxiaojiang - Zhihu
- Конвергенция уровня Conving и уровня BN на стадии вывода сети - статья Autocyz - Zhihu
- Сам Pytorch обеспечивает аналогичную функциональность
Повторная параметризация
- Repvgg
- Repvgg | Пусть ваш конверт до конца, простая сеть впервые превышает 80% TOP1
Время анализа
- Python поставляется с несколькими
profile анализа производительности, cProfile и hotshot . Методы использования в основном одинаковы. Это не что иное, как модуль чистый питон или написан в C. - Pytorch Profiler - это инструмент, который собирает метрики производительности во время обучения и вывода. API Context Manager Profiler может использоваться для лучшего понимания, какой оператор модели является наиболее дорогим, проверяйте его форму ввода и записи стеков, активность ядра для учебного устройства и визуализацию записей выполнения.
Рекомендация проекта
- Реализовать сжатие модели на основе Pytorch:
- Количественная оценка: 8/4/2 битов (dorefa), трехзначное/двоичное значение (TWN/BNN/XNOR-NET).
- Обрезка: нормальная, обычная обрезка канала для сгруппированных сверточных структур.
- Сгруппированная сверточная структура.
- BN Fusion для бинарного квантования.
Расширенное чтение
- Нагрузка данных DataLoader Pytorch занимает большую часть времени. Как вы решаете это? - Чжиху
- При использовании Pytorch слишком много данных обучающих наборов, чтобы достичь десятков миллионов, и что мне делать, если DataLoader загружается очень медленно? - Чжиху
- Каковы подводные камни/ошибки в Pytorch? - Чжиху
- Оптимизация кода обучения Pytorch
- 26 секунд ОДНА ОДНА ГПУ CIFAR10, Джефф Дин также любит навыки глубокого обучения оптимизации - статьи о сердце машин - Чжиху
- После обучения несколько новых функций на онлайн -модели, почему время прогнозирования Tensorflow служит более чем в 20 раз медленнее, чем оригинал? - Ответ Цезинга - Чжиху
- Сжатие модели глубокого обучения
- Сегодня ваша модель ускорилась? Вот 5 методов для вашей ссылки (с анализом кода)
- Резюме общих ловушек в Pytorch - статьи Yu Zhenbo - Zhihu
- Руководство по ускорению Pytorch - статьи Юнменга - Чжиху
- Оптимизировать скорость и эффективность памяти Pytorch (2022)
Pytorch сохраняет видео память
Оригинальный документ: https://www.yuque.com/lart/ugkv9f/nvffyf
Собран: Каковы советы для сохранения памяти (видео памяти) в Pytorch? - Zhihu https://www.zhihu.com/question/274635237
Используйте на месте
- Попробуйте включить операции, которые поддерживают
inplace по умолчанию. Например, relu может использовать inplace=True . -
batchnorm и некоторые конкретные функции активации могут быть упакованы в inplace_abn .
Функция потерь
Удаление потерь в конце каждого цикла может сохранить очень небольшую видео память, но она лучше, чем ничего. Тенсор до переменной и лучшие практики без памяти
Точность смешивания
Он может сохранить определенное количество видео памяти и ускорить, но будьте осторожны с небезопасными операциями, такими как среднее значение и сумма.
- Введение в смешанную точную тренировку:
- Учебное пособие по смешанному прецизионному обучению от мелкого до глубокого
- Поддержка смешанной точности, предоставленная
NVIDIA/Apex .- Pytorch должен иметь артефакт | Fast Free: гибридная точность на основе вершины
- Установка Pytorch Apex Сложные и разные растворы заболеваний - статьи Чэнь Ханке - Жиху
- Pytorch1.6 начинает предоставлять
torch.cuda.amp для поддержки смешанной точности.
Управление операциями, которые не требуют обратного процесса
- Для этапов вперед, которые не требуют обратного процесса, таких как периоды проверки и вывода, используйте
torch.no_grad для завершения кода.- Обратите внимание, что
model.eval() не равна torch.no_grad() , см. Следующее обсуждение: 'model.eval ()' vs 'с torch.no_grad ()'
- Установите
requires_grad переменных, которые не должны рассчитывать градиент на False , чтобы переменная не участвовала в обратном распространении градиента, чтобы уменьшить использование памяти ненужных градиентов. - Удалите путь градиента, который не нужно рассчитывать:
- Стохастическое обратное распространение: эффективная стратегия памяти для обучающих видео моделей, интерпретация можно увидеть:
- https://www.yuque.com/lart/papers/xu5t00
- https://blog.csdn.net/p_lart/article/details/124978961
Очистка видео памяти
-
torch.cuda.empty_cache() - это расширенная версия del . Использование nvidia-smi обнаружит, что видео память имеет очевидные изменения. Тем не менее, максимальное использование видео памяти во время обучения, похоже, не меняется. Вы можете попробовать: как мы можем выпустить кеш памяти графических процессоров? - Вы можете использовать
del для удаления ненужных промежуточных переменных или использовать форму replacing variables для снижения занятости.
Градиент накопление
Разделите batchsize=64 на две партии 32 и после двух переадресации, назад один раз. Но это повлияет batchnorm и другие слои, связанные с batchsize .
В документации Pytorch упоминается пример использования накопления градиента и точности смешивания.
Используйте технологию накопления градиента для ускорения распределенного обучения, которое можно использовать для обозначения: [оригинал] [Deep] [Pytorch] DDP Серия 3: Практические и навыки - 996 Статьи из золотого поколения - Zhihu
Градиент контрольно -пропускной пункт
torch.utils.checkpoint представлен в Pytorch. Это достигается путем повторного представления прямого распространения в каждом месте контрольной точки во время обратного процесса.
Глубокие сети бумаги с затратами на сублинейную стоимость памяти основаны на технологии контрольно -пропускной пункты градиента, чтобы уменьшить видео память от O (n) до O (SQRT (N)). Для более глубоких моделей, чем больше памяти этот метод сохраняет и значительно не замедляется.
- Анализ механизма контрольно -пропускного пункта Pytorch
- TORCH.Uutils.CheckPoint Введение и простые в использовании
- Реализация Pytorch о стоимости подсознания памяти, на которую ссылаются: каковы советы для сохранения памяти (видео памяти) в Pytorch? - Ответ Ликена - Чжиху
Связанные инструменты
- Эти коды могут помочь вам обнаружить память GPU во время обучения с помощью Pytorch. https://github.com/oldpan/pytorch-memory-utils
- Просто меньше, чем Nvidia-SMI? https://github.com/wookayin/gpustat
Ссылки
- Каковы советы для сохранения памяти (видео памяти) в Pytorch? - Ответ Чжэн Чжедонга - Чжиху
- Краткое обсуждение глубокого обучения: как рассчитать след моделей и промежуточных переменных.
- Как мелко использовать видео память в Pytorch
- Каковы советы для сохранения видео памяти в Pytorch? - Ответ Чена Ханке - Чжиху
- Анализ механизма видео памяти Pytorch - статья Коннолли - Zhihu
Другие советы
Воспроизводить
Вы можете следовать соответствующим главам в документе.
Обязательная детерминированная операция
Избегайте использования нетерминированных алгоритмов.
В pytorch, torch.use_deterministic_algorithms() может принуждать использование детерминированных алгоритмов вместо недерминированных алгоритмов, и ошибка выдвигается, если операция, как известно, является непертерминированной (и не детерминированная альтернатива).
Установить семена случайных чисел
def seed_torch ( seed = 1029 ):
random . seed ( seed )
os . environ [ 'PYTHONHASHSEED' ] = str ( seed )
np . random . seed ( seed )
torch . manual_seed ( seed )
torch . cuda . manual_seed ( seed )
torch . cuda . manual_seed_all ( seed ) # if you are using multi-GPU.
torch . backends . cudnn . benchmark = False
torch . backends . cudnn . deterministic = True
seed_torch () Ссылка на https://www.zdaiot.com/mlframeworks/pytorch/pytorch%E9%9A%8F%E6%9C%BA%E7%A7%8D%E5%AD%90/
Скрытая ошибка в DataLoader перед Pytorch версии 1.9
Конкретные детали показывают, что 95% людей все еще допускают ошибки Pytorch - Статьи о починках - Чжиху
Для решения, пожалуйста, обратитесь к документации:
def seed_worker ( worker_id ):
worker_seed = torch . initial_seed () % 2 ** 32
numpy . random . seed ( worker_seed )
random . seed ( worker_seed )
DataLoader (..., worker_init_fn = seed_worker )