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-специалистов в Москве.