Краткий обзор PyTorch

PyTorch, разработанный командой Facebook в 2017 году фреймворк Deep Learning, создан в первую очередь для Python. В этой статье мы расскажем об интерфейсе PyTorch: на практических примерах рассмотрим тензоры на GPU, основные модули, способы создания моделей и развертывания в production, инструменты для визуализации.

Тензоры на GPU и автоматическое дифференцирование

В отличие от TensorFlow, фреймворк PyTorch не навязывает разработчику свой интерфейс. Вы можете сами создавать свои слои, функции активации и прочие нужные объекты в виде обычных классов и функций Python,. Операции над тензорами могут выполняться на GPU. Для выбора этого режима вычислений достаточно одной строчки:

device = torch.device("cuda:0")

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

torch.randn(10, 10, device=device)

PyTorch использует автоматическое дифференцирование для вычислений градиентов, которые используются в алгоритме обратного распространения ошибки (backpropogation). Достоинством такого подхода является скорость вычисления. Чтобы активировать автоматическое дифференцирование, следует в аргументе тензора указать requires_grad=True либо вызвать метод requires_grad_(True):

a = torch.randn(2, 2, requires_grad=True)
b = torch.randn(3, 3)
# нижнее подчеркивание в конце, чтобы не переприсваивать
b.requires_grad_(True)

Компоненты PyTorch для построения моделей

В отличие от популярной Python-библиотеки NumPy, PyTorch не только позволяет работать с тензорами, но и предоставляет ряд возможностей для глубокого обучения (Deep Learning). В PyTorch есть четыре основных компонента, необходимые для построения моделей:

  • nn используется для создания вычислительных графов, которые формируют слои нейронных сетей (neural net). Аналогичную функцию в TensorFlow выполняет модуль Keras.
  • optim содержит различные алгоритмы оптимизации (SGD, Adam и т.д.). Аналог в TensorFlow – модуль optimizers.
  • Dataset — интерфейс для представления входных и выходных данных в разных форматах, например, в виде тензоров (TensorDataset), iterable (IterableDataset) и т.д. В TensorFlow тоже есть класс Dataset.
  • DataLoader преобразует Dataset в манипулируемый формат, с помощью которого можно контролировать размера пакета (batch size), перемешивать данные, распределять процессы и т.д. В TensorFlow за это отвечает модуль data.

Для создания слоев, например, сверточных (convolutional), полносвязных (fully-conected), рекуррентных (recurrent), можно воспользоваться модулем torch.nn, а для алгоритмов оптимизации — torch.optim. Однако интерфейс построения и обучения модели не такой высокоуровневый по сравнению с TensorFlow, поэтому придется писать дополнительный код на Python, что мы увидим ниже на примерах. Снизить трудоемкость работы с данными позволяют классы Dataset и DataLoader.

Построение модели

Для создания модели Machine Learning можно воспользоваться модулем torch.nn. Ниже рассмотрен пример на Python, который иллюстрирует сеть, состоящую из одного полносвязного слоя. Класс, должен наследоваться от nn.Module и реализовывать алгоритм прямого прохода сети:

from torch import nn

class Logistic_Net(nn.Module):
    def __init__(self, in_shape, out_shape):
        super().__init__()
        self.lin = nn.Linear(in_shape, out_shape)

    def forward(self, xb):
        return self.lin(xb)

Помимо прямого прохода, требуется также написать алгоритм обратного прохода сети и определить функцию потерь, что уже требует некоторых знаний Deep Learning. Рассмотренные далее примеры кода на Python показывают, как это может выглядеть.

import numpy as np

def loss_batch(model, loss_func, xb, yb, opt=None):
    loss = loss_func(model(xb), yb)
    if opt is not None:
        loss.backward()
        opt.step()
        opt.zero_grad()
    return loss.item(), len(xb)


def fit(epochs, model, loss_func, opt, train_dl, valid_dl):
    for epoch in range(epochs):
        model.train()
        for xb, yb in train_dl:
            loss_batch(model, loss_func, xb, yb, opt)

        model.eval()
        with torch.no_grad():
            losses, nums = zip(
                *[loss_batch(model, loss_func, xb, yb) for xb, yb in valid_dl]
            )
        val_loss = np.sum(np.multiply(losses, nums)) / np.sum(nums)

Кроме того, PyTorch имеет специальный контейнер Sequential для последовательного наслоения, чтобы избежать субклассирования. Тем не менее, обратный проход сети и функцию потерь, придется также реализовывать вручную. Пример ниже иллюстрирует сверточную сеть, упакованную в Sequential.

model = nn.Sequential(
    nn.Conv2d(1,20,5),
    nn.ReLU(),
    nn.Conv2d(20,64,5),
    nn.ReLU()
)

Готовим ML-модель в production с TorchScript

PyTorch предназначен, в первую очередь, для разработки кода на Python. Однако, этот язык программирования не везде он применяется, например, он редко используется в мобильных платформах или на серверах c C++. Поэтому при переводе PyTorch-модели в рабочую эксплуатацию (production) часто возникают некоторые трудности. Для решения этих проблем предусмотрен специальный инструмент — TorchScript, который сериализует и оптимизирует модель, написанную на чистом Python, чтобы ее легко интегрировать в системы, где используется C++.
TorchScript представляет модель, унаследованную от torch.nn, в специальный формат, которая есть ни что иное как вычислительный граф. Пример ниже показывает рекуррентную сеть на TorchScript.

RecursiveScriptModule(
  original_name=WrapRNN
  (loop): RecursiveScriptModule(
    original_name=MyRNNLoop
    (cell): RecursiveScriptModule(
      original_name=MyCell
      (dg): RecursiveScriptModule(original_name=MyDecisionGate)
      (linear): RecursiveScriptModule(original_name=Linear)
    )
  )
)
def forward(self,
    argument_1: Tensor) -> Tensor:
  _0, h, = (self.loop).forward(argument_1, )
  return torch.relu(h)

На данный момент на экспериментальной стадии находятся инструменты для интеграции моделей PyTorch в мобильные платформы и для взаимодействия с REST API [1].

Визуализация в PyTorch

PyTorch не имеет собственных инструментов визуализации. Поэтому до некоторого времени использовался такой Python-инструмент как Visdom от Facebook. Рисунок ниже иллюстрирует, как выглядят графики в браузере на localhost.

Примеры графиков в Visdom: визуализация Data Science на Python
Интерфейс Visdom

На данный момент можно воспользоваться TensorBoard, который является частью TensorFlow. Интерфейс доступен в модуле torch.utils.tensorboard [2].

 

Больше подробностей о создании PyTorch-моделей машинного обучения для реальных проектов Data Sceince вы узнаете узнать на специализированных курсах по Python в Big Data в нашем лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.

Источники
  1. https://pytorch.org/features/
  2. https://pytorch.org/docs/stable/tensorboard.html

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

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