Что нового в PyTorch 1.7

В конце октября состоялся релиз фреймворка машинного обучения (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-специалистов в Москве.

Источники
  1. Релиз PyTorch

Добавить комментарий

Поиск по сайту