量产工具sk6211bb教程-()

192.168.0.1 次浏览手机阅读
量产工具sk6211bb教程 ()

翻译 | 林椿眄

出品 | AI 科技大本营(微信官方账号ID:rgznai100)

本版主要更新一些性能优化,包括权衡内存计算和提供 Windows 支持,24个基本分布,变量和数据类型,零维张量,张量变量合并,支持 CuDNN 7.1.加快分布式计算,修复重要部件 bug等。

目录

主要变化

张量/变量合并

零维张量

数据类型

版本迁移指南

新特性

张量

高级索引功能

傅里叶快速变换

神经网络

权衡内存计算

瓶颈-识别代码热点的工具

torch中的分布

24个基础的概率分布

添加 cdf,variance,entropy,perplexity 等方法

分布式计算

便捷使用的Launcher utility

NCCL2 后端

C 拓展

Window 支持

改善 ONNX 性能

RNN 支持

性能改善

Bug 修复

主要变化

我们将在下面这样做Pytorch最重要的核心功能是用户总结的。

主要变化和潜在突破性变化

Tensors/Variables 合并

零维 Tensors 的一些操作

弃用Volatile 标志

性能改善

添加了 dtypes、devices及numpy风格的 tensor 创建函数

支持编写一些不依赖设备的代码

我们写了一个版本的迁移指南,帮助您将代码转换为新版本 APIs和风格。如果你想迁移以前的版本 PyTorch请阅读迁移指南,代码。如果你想迁移以前的版本 PyTorch代码,请阅读迁移指南。此外,迁移指南中还包括本部分(包括主要核心变化)。

Tensor 和Variable 类合并

新版本中,torch.autograd.Variable和torch.Tensor同属一类。更准确地说,torch.Tensor 能跟踪历史,像旧版本一样跟踪历史 Variable 那样运行; Variable 包装仍然可以像以前一样工作,但返回的对象类型是 torch.Tensor。 这意味着您不再需要代码中的所有变量包装器。

Tensor 的type () 变化

这里需要注意的是张量 type()不再反映数据类型,而是改用 isinstance()或 x.type()表示数据类型,代码如下:

>>> x = torch.DoubleTensor([1, 1, 1])>>> print(type(x)) # was torch.DoubleTensor<class 'torch.autograd.variable.Variable'>>>> print(x.type()) # OK: 'torch.DoubleTensor''torch.DoubleTensor'>>> print(isinstance(x, torch.DoubleTensor)) # OK: TrueTrue

autograd 跟踪历史记录

作为 autograd方法的核心标志,requires_grad现在是 Tensors 类的属性。 让我们看看这个变化是如何反映在代码中的。 让我们看看这个变化是如何反映在代码中的。Autograd以前用过的使用方法和方法 Variable 同样的规则。任意输入操作 Tensor的require_grad = True它开始跟踪历史记录。代码如下所示,

>>> x = torch.ones(1) # create a tensor with requires_grad=False (default)>>> x.requires_gradFalse>>> y = torch.ones(1) # another tensor with requires_grad=False>>> z = x y>>> # both inputs have requires_grad=False. so does the output>>> z.requires_gradFalse>>> # then autograd won't track this computation. let's verify!>>> z.backward()RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn>>>>>> # now create a tensor with requires_grad=True>>> w = torch.ones(1, requires_grad=True)>>> w.requires_gradTrue>>> # add to the previous result that has require_grad=False>>> total = w z>>> # the total sum now requires grad!>>> total.requires_gradTrue>>> # autograd can compute the gradients as well>>> total.backward()>>> w.gradtensor([ 1.])>>> # and no computation is wasted to compute gradients for x, y and z, which don't require grad>>> z.grad == x.grad == y.grad == NoneTrue

requires_grad 操作

除直接设置属性外,你也可以用 my_tensor.requires_grad_(requires_grad = True)在原地更改此标志,或者如上所示,在创建时将其作为参数传递(默认为 False)来实现,代码如下:

>>> 电脑 existing_tensor.requires_grad_()>>> existing_tensor.requires_gradTrue>>> my_tensor = torch.zeros(3, 4, requires_grad=True)>>> my_tensor.requires_gradTrue

关于 .data

.data 是从 Variable中获取底层 Tensor 主要方法。 合并后,调用 y = x.data语义仍然相似。 合并后,调用 y = x.data它仍然有相似的语义。 y将是一个与 x共享相同的数据 Tensor,并且 requires_grad = False,它与 x计算历史无关。

但是,在某些情况下 .data 可能不安全。 对 x.data 不会有任何变化 autograd 在反向过程中需要跟踪 x,计算出的梯度将不正确。另一种更安全的方法是使用它 x.detach(),它将返回一个和 requires_grad = False 共享数据 Tensor,但如果需要在反向过程中 x,那么 autograd 将当场更改。

零维张量的一些操作

在之前的版本中,Tensor矢量(1维张量)索引将返回一个索引Python但是一个数字Variable矢量索引将返回一个大小为(1,)的矢量。同样地, reduce函数具有类似的操作,即函数具有类似的操作,即函数具有类似的操作tensor.sum()会回一个Python数字,但是variable.sum()调用大小为(1,)的向量。

幸运的是,新版本PyTorch引入适当的标量(0维张量)支持! 可使用新版本torch.tensor函数创建标量(这将在后面更详细地解释,现在只需要认为是PyTorch中numpy.array等效项)。现在你可以做这样的事,代码如下:

>>> torch.tensor(3.1416) 电脑 # create a scalar directlytensor(3.1416)>>> torch.tensor(3.1416).size() # scalar is 0-dimensionaltorch.Size([])>>> torch.tensor([3]).size() # compare to a vector of size 1torch.Size([1])>>>>>> vector = torch.arange(2, 6) # this is a vector>>> vectortensor([ 2., 3., 4., 5.])>>> vector.size()torch.Size([4])>>> vector[3]# indexing into a vector gives a scalartensor(5.)>>> vector[3].item() # .item() gives the value as a Python number5.0>>> sum = torch.tensor([2, 3]).sum()>>> sumtensor(5)>>> sum.size()torch.Size([])

累计损失函数

考虑在 PyTorch0.4.0 以前广泛使用的版本 total_loss = loss.data[0]模式。Loss 它包含张量(1,)Variable,但是新发布的0.4.0版本中,loss 是0维标量。Loss 它包含张量(1,)Variable,但是新发布的0.4.0版本中,loss 是0维标量。 标量索引毫无意义(当前版本会给出警告,但在0.5.0中会报错一个硬错误:使用) loss.item()从标量中获取 Python 数字。

值得注意的是,如果你不能在累积损失时将其转换为电脑 Python 数字可能会增加程序中的内存使用量。这是因为上面表达式的右侧是以前版本中的一个Python 浮点数,现在是零维张量。 因此,总损失将积累张量及其历史梯度,自动解决梯度值可能需要更多的时间。

弃用volatile标志

新版本中,volatile 标志将被废弃,不再工作。在之前的版本中,任何涉及的版本 volatile = True 的 Variable 没有理由计算 autograd 追踪到。它已被一组更灵活的上下文管理器所取代,包括 torch.no_grad(),torch.set_grad_enabled(grad_mode)等等。代码如下:

{ x}


电脑
喜欢 ()