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.

На данный момент можно воспользоваться TensorBoard, который является частью TensorFlow. Интерфейс доступен в модуле torch.utils.tensorboard [2].
Больше подробностей о создании PyTorch-моделей машинного обучения для реальных проектов Data Sceince вы узнаете узнать на специализированных курсах по Python в Big Data в нашем лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.



