Professional Documents
Culture Documents
Deep Learning
Numpy-alternative
Reinforcement Learning
ndarray library
• np.ndarray <-> torch.Tensor
• 200+ operations, similar to numpy
Numpy PyTorch
ndarray / Tensor library
ndarray / Tensor library
ndarray / Tensor library
ndarray / Tensor library
NumPy bridge
NumPy bridge
Zero memory-copy
very efficient
NumPy bridge
NumPy bridge
Seamless GPU Tensors
automatic differentiation engine
for deep learning and reinforcement learning
PyTorch Autograd
from torch.autograd import Variable
PyTorch Autograd
from torch.autograd import Variable
x = Variable(torch.randn(1, 10))
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20))
W_x = Variable(torch.randn(20, 10))
PyTorch Autograd
from torch.autograd import Variable
x = Variable(torch.randn(1, 10)) MM MM
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20))
W_x = Variable(torch.randn(20, 10))
x = Variable(torch.randn(1, 10)) MM MM
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20))
W_x = Variable(torch.randn(20, 10))
x = Variable(torch.randn(1, 10)) MM MM
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20))
W_x = Variable(torch.randn(20, 10))
Add
i2h = torch.mm(W_x, x.t())
h2h = torch.mm(W_h, prev_h.t())
next_h = i2h + h2h
PyTorch Autograd
from torch.autograd import Variable
x = Variable(torch.randn(1, 10)) MM MM
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20))
W_x = Variable(torch.randn(20, 10))
Add
i2h = torch.mm(W_x, x.t())
h2h = torch.mm(W_h, prev_h.t())
next_h = i2h + h2h
next_h = next_h.tanh() Tanh
PyTorch Autograd
from torch.autograd import Variable
x = Variable(torch.randn(1, 10)) MM MM
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20))
W_x = Variable(torch.randn(20, 10))
Add
i2h = torch.mm(W_x, x.t())
h2h = torch.mm(W_h, prev_h.t())
next_h = i2h + h2h
next_h = next_h.tanh() Tanh
next_h.backward(torch.ones(1, 20))
Neural Networks
Optimization package
SGD, Adagrad, RMSProp, LBFGS, etc.
Research Core Philosophy Upcoming
Pain Points
workflows (of PyTorch) features
pick datasets /
idea / theory design experiments
environments
pick datasets /
idea / theory design experiments
environments
pick datasets /
idea / theory design experiments
environments
Research Upcoming
Pain Points Core Philisophy
Workflows Features
Writing Data Loaders
PyTorch solution:
• Code in practice
Research Upcoming
Pain Points Core Philisophy
Workflows Features
Interfacing with environments
print(foo)
Identifying bottlenecks
• PyTorch is a Python extension
• Use your favorite Python profiler
Identifying bottlenecks
• PyTorch is a Python extension
• Use your favorite Python profiler: Line_Profiler
Compilation Time
• PyTorch is written for the impatient
Compilation Time
• PyTorch is written for the impatient
• Absolutely no compilation time when writing your scripts
whatsoever
Compilation Time
• PyTorch is written for the impatient
• Absolutely no compilation time when writing your scripts
whatsoever
• All core kernels are pre-compiled
Ecosystem
• Use the entire Python ecosystem at your will
Ecosystem
• Use the entire Python ecosystem at your will
• Including SciPy, Scikit-Learn, etc.
Ecosystem
• Use the entire Python ecosystem at your will
• Including SciPy, Scikit-Learn, etc.
Ecosystem
• Use the entire Python ecosystem at your will
• Including SciPy, Scikit-Learn, etc.
Ecosystem
• A shared model-zoo:
Ecosystem
• A shared model-zoo:
Linear style of programming
• PyTorch is an imperative / eager computational toolkit
Linear style of programming
• PyTorch is an imperative / eager computational toolkit
Linear style of programming
• PyTorch is an imperative / eager computational toolkit
- Not unique to PyTorch
Linear style of programming
• PyTorch is an imperative / eager computational toolkit
- Not unique to PyTorch
- Chainer, Dynet, MXNet-Imperative, TensorFlow-imperative, TensorFlow-eager, etc.
Linear style of programming
• PyTorch is an imperative / eager computational toolkit
- Not unique to PyTorch
- Chainer, Dynet, MXNet-Imperative, TensorFlow-imperative, TensorFlow-eager, etc.
- Least overhead, designed with this in mind
- 20 to 30 microseconds overhead per node creation
- vs several milliseconds / seconds in other options
Go Through an example
The Philosophy of PyTorch
The Philosophy of PyTorch
• Stay out of the way
• Cater to the impatient
-y=x+2
-z=y*y
- # nothing is executed yet, but the graph is being constructed
- print(z) # now the entire graph is executed: z = (x+2) * (x+2)
• We can do just in time compilation on the graph before execution
x = Variable(torch.randn(1, 10))
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20)) MM MM
W_x = Variable(torch.randn(20, 10))
x = Variable(torch.randn(1, 10))
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20)) MM MM
W_x = Variable(torch.randn(20, 10))
x = Variable(torch.randn(1, 10))
prev_h = Variable(torch.randn(1, 20))
W_h = Variable(torch.randn(20, 20)) MM MM
W_x = Variable(torch.randn(20, 10))
print(next_h)
Tanh
MM MM
Add
Tanh
Tanh
Tanh
1 2 3 3 1 2 Node 1
Node 0 GPU 1
BatchNorm GPU 0
Node 1
Node 0 GPU 0
Conv2d GPU 1
Node 0
GPU 0
With ❤ from
http://pytorch.org
Released Jan 18th
100,000+ downloads
950+ community repos
8200+ user posts
245 contributors