В конце октября состоялся релиз фреймворка машинного обучения (Machine Learning) PyTorch 1.7. Релиз оказался достаточно большой, в основном касается распределенных вычислений. Читайте в этой статье: новый модуль для быстрого преобразования Фурье, повышение производительности, а также множество нововведений в распределенных вычислениях.
Быстрое преобразование Фурье с torch.fft
Быстрое преобразование Фурье (Fast Fourier transform, FFT) часто используется для обработки сигналов. PyTorch поддерживал несколько функций FFT, но с выходом релиза 1.7 на стадии бета находится целый новый модуль torch.fft
с таким же API, каким обладает Python-библиотека NumPy. До этого torch.fft
был отдельной функцией.
Примеры использования в Python:
>>> import torch.fft >>> t = torch.arange(4) >>> t tensor([0, 1, 2, 3]) >>> torch.fft.fft(t) tensor([ 6.+0.j, -2.+2.j, -2.+0.j, -2.-2.j]) >>> t = tensor([0.+1.j, 2.+3.j, 4.+5.j, 6.+7.j]) >>> torch.fft.fft(t) tensor([12.+16.j, -8.+0.j, -4.-4.j, 0.-8.j])
Поддержка неравномерных датасетов в DDP (Distributed Data Parallel)
В PyTorch 1.7 появился контекстный менеджер, который можно использовать вместе с моделями, обученными с помощью DistributedDataParallel
, чтобы обеспечить обучение с неравномерным размером набора данных в разных процессах. Эта функция обеспечивает большую гибкость при использовании DDP и избавляет пользователя от необходимости вручную обеспечивать одинаковые размеры данных для разных процессов. С помощью контекстного менеджера DDP можно автоматически обрабатывать неравномерные размеры данных, что может предотвратить ошибки или зависания в конце обучения.
Использование оптимизатора в TorchScript во время распределенных вычислений
PyTorch предоставляет широкий набор оптимизаторов для алгоритмов обучения, и они неоднократно использовались как часть API Python. Однако пользователи часто хотят использовать многопоточное обучение вместо многопроцессного обучения, поскольку оно обеспечивает лучшее использование вычислительных ресурсов и эффективность в контексте крупномасштабного распределенного обучения на основе RPC (remote procedure call). Раньше пользователи не могли этого делать, поскольку для этого нужно избавиться от ограничения Global Interpreter Lock (GIL) в Python.
TorchScript — инструмент для сериализация моделей машинного обучения PyTorch, т.н. для перевода их в C++ программы. С выходом нового релиза в TorchScript можно использовать оптимизатор в режиме распределенных вычислений, не затрагивая GIL, который как раз таки не даёт возможности для распараллеливания. Новый распределенный оптимизатор имеет тот же интерфейс, что и раньше, но он автоматически преобразуется внутри каждого рабочего процесса в TorchScript так, чтобы каждый GIL пустовал. Это достигается за счёт использования концепции функционального оптимизатора (functional optimizer).
В настоящее время единственный оптимизатор, поддерживающий автоматическое преобразование в TorchScript, — это Adagrad. Разработчики PyTorch в дальнейшем планируют поддержку всех оптимизаторов. Вот пример использования в Python:
import torch.distributed.autograd as dist_autograd import torch.distributed.rpc as rpc from torch import optim from torch.distributed.optim import DistributedOptimizer with dist_autograd.context() as context_id: # Forward pass. rref1 = rpc.remote("worker1", torch.add, args=(torch.ones(2), 3)) rref2 = rpc.remote("worker1", torch.add, args=(torch.ones(2), 1)) loss = rref1.to_here() + rref2.to_here() # Backward pass. dist_autograd.backward(context_id, [loss.sum()]) # DistributedOptimizer автоматически конвертирует/компилирует # оптимизатор Adagrad в TorchScript (без GIL) dist_optim = DistributedOptimizer( optim.Adagrad, [rref1, rref2], lr=0.05, ) dist_optim.step(context_id)
Поддержка распределенного обучения в Windows
PyTorch 1.7 теперь обеспечивает поддержку прототипов DistributedDataParallel и коллективных коммуникаций (collective communications) на платформе MS Windows. В этом релизе поддержка распространяется только на ProcessGroup
и FileStore
на основе Gloo (библиотека коллективных коммуникаций). Пример на Python:
# initialize the process group dist.init_process_group( "gloo", # пример с несколькими машинами: # init_method = "file://////{machine}/{share_folder}/file" init_method="file:///{your local file path}", rank=rank, world_size=world_size ) model = DistributedDataParallel(local_model, device_ids=[rank])
PyTorch и мобильные устройства
PyTorch поддерживает мобильные платформы Android и iOS. На некоторых устройствах, таких как Pixel (смартфон от Google), могут быть проблемы с памятью. Это приводит к частым ошибкам на веб-страницах. Чтобы уменьшить потери производительности, в новой версии появился распределитель кэша для CPU. Распределитель кэширует выделения по размеру тензора и в настоящее время доступен только через PyTorch C ++ API. Сам распределитель кэша принадлежит клиенту, поэтому время жизни распределителя также поддерживается клиентским кодом.
Также нововведения коснулись:
- CUDA 11 теперь официально поддерживается в PyTorch
- Обновления и дополнения, а также улучшение в производительности в инструменте для профилирования autograd (автоматическое дифференцирование) и модуля RPC (Remote Procedure Call, Удалённый вызов процедур)
- Поддержка GPU поколения Nvidia A100 и собственного формата TF32
- Касаемо torchvision:
- Преобразователи изображений (Transforms) поддерживают тензоры Torch в качестве входа, пакетные вычисления (batch computation), GPU и TorchScript
- Встроенный ввод-вывод изображений для форматов JPEG и PNG
- Новый API для чтения видео
- Касаемо torchaudio:
- Добавлена поддержка алгоритмов записи речи (wav2letter), преобразования текста в речь (WaveRNN) и разделения речей (ConvTasNet)
Ещё больше подробностей о PyTorch и создании моделей машинного обучения на реальных примерах Data Science, вы узнаете на специализированном курсе «PYNN: Введение в Нейронные сети на Python» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.