Pytorch 1.8,带有AMD Rocm支持

2021-03-07 11:18:12

我们很高兴宣布Pytorch 1.8的可用性。此版本由1.7自1.7以来的3,000多个提交组成。它包括编译的主要更新和新功能,代码优化,科学计算的前端API,以及通过Pytorch.org可用的二进制文件的AMD Rocm支持。它还为管道和模型并行性的大规模培训提供了改进的功能,以及梯度压缩。少数亮点包括:

添加或稳定的API以支持FFT(TORCH.FFT),线性代数功能(TORCH.LINALG),为复杂的张力和更新增加了支持自动化,以提高计算Hessians和Jacobians的性能;和

对分布式培训的重大更新和改进,包括:提高NCCL可靠性;管道并行支持; RPC分析;并支持沟通挂钩添加渐变压缩。请参阅此处的完整发行说明。

以及1.8,我们还释放了Pytorch库的主要更新,包括Torchcsprng,Torchvision,Torchtext和Torchaudio。有关库的更多信息,请参阅此处的帖子。如前所述,Pytorch版本中的功能被分类为稳定,测试版和原型。您可以在这里了解帖子中的定义。

您可以在Pytorch 1.8发行博客中找到更多有关所有突出显示功能的详细信息。

在Python%=中的模数=被错误地完成了张量的地方。此更改修复了行为。依赖于此操作的先前代码应更新,以便使用退出的位置版本T = T%而不是T%=其他。

>> > A =火炬。 Arange(0,10)>> > b = a>> > B%= 3>> >打印(a)张量([0,1,2,3,4,5,6,7,8,9])>> >打印(B)张量([0,1,2,0,1,2,0,1,2,0]))

>> > A =火炬。 Arange(0,10)>> > b = a>> > B%= 3>> >打印(a)张量([0,1,2,0,1,2,0,1,2,0])>> >打印(B)张量([0,1,2,0,1,2,0,1,2,0]))

为了便于阐述,让A_MIN是" min&#34的价值;钳位的论点,A_max是" max&#34的价值;夹具的论点。

此PR将Torch.Clamp的行为更改为始终计算MIN(MAX(A,A,A_MIN),A_MAX)。 Torch.Clamp当前在其矢量化CPU实现中计算了这一点,但使用其他后端使用不同的方法。当A_min<时,这些实现是相同的。 a_max,但是当a_min&gt时发散; a_max。这种分歧很容易触发:

该PR使得行为与Numpy' s剪辑一致。 C ++' s std :: clamp' s行为在a_min&gt时是未定义的。 a_max。 Python没有标准钳位实现。

DeepCopy协议现在将在存在时正确复制.GRAD张于张于的张量。在执行DeepCopy后,可以通过将.grad字段设置为NONE来恢复旧行为。

1.7.1为整体张量和浮点张量引发RuntimeError。输出的DTYPE由第一个输入确定。

>> > x =火炬。 Arange(start = 1,end = 6,dtype =火炬。Int32)#张量([1,2,3,4,5])>> > y =火炬。 Arange(start = 1.1,end = 2.1,步骤= 0.2,dtype =火炬。Float32)#张量([1.1,1.3,1.5,1.7,1.9])>> >火炬。 fmod(x,y)runtimeerror:结果类型float can' t被施放到所需的输出类型Int>> > z =火炬。 Arange(START = 0.2,END = 1.1,步骤= 0.2,DTYPE =火炬。FLOAT64)#张量([0.2,0.4,0.6,0.8,1],DTYPE = TORCH.FLOAT64)>> >火炬。 fmod(y,z)。 dtype火炬。 float32>> >火炬。 fmod(z,y)。 dtype火炬。 float64> >火炬。 FMOD(x,1.2)张量([0,0,0,0,0],dtype =火炬。int32)

1.8.0:支持整体张量和浮点张量作为输入。输出的DTYPE由两个输入确定。

>> > x =火炬。 Arange(start = 1,end = 6,dtype =火炬。Int32)#张量([1,2,3,4,5])>> > y =火炬。 Arange(start = 1.1,end = 2.1,步骤= 0.2,dtype =火炬。Float32)#张量([1.1,1.3,1.5,1.7,1.9])>> >火炬。 FMOD(X,Y)张量([1.0000,0.7000,0.0000,0.6000,12000])>> > z =火炬。 Arange(START = 0.2,END = 1.1,步骤= 0.2,DTYPE =火炬。FLOAT64)#张量([0.2,0.4,0.6,0.8,1],DTYPE = TORCH.FLOAT64)>> >火炬。 fmod(y,z)。 dtype火炬。 float64> >火炬。 fmod(z,y)。 dtype火炬。 float64> >火炬。 FMOD(X,1.2)张量([1.0000,0.8000,0.6000,0.4000,0.2000])

所有* _like工厂函数现在将生成相同的行驶,因为不合适的操作。这尤其意味着非连续的张量会产生非连续输出。如果您需要连续输出,则可以将Memory_Format = Torch.Conture关键字参数传递给出厂函数。此类工厂功能包括克隆,浮动,CUDA,* _like,Zeros,Rand {n}等。

以前,当给定复杂的输入时,TORCH.LINALG.NORM和TORCH.NORM将返回一个复杂的输出。 Torch.linalg.cond有时会返回一个复杂的输出,并且在给定复杂的输入时有时会返回真正的输出,具体取决于其P参数。此PR更改此行为以匹配numpy.linalg.norm和numpy.linalg.cond,以便复杂的输入将导致实数类型,与numpy一致。

torch.svd增加了对Pytorch 1.7中的复杂输入的支持,但未记录为此。返回的复杂v张量实际上是预期的复杂共轭。该PR修复了差异。已经使用以前版本的Torch.svd具有复杂输入的用户可以通过返回返回的复杂共轭来恢复以前的行为。

此PR更新Pytorch'萝卜操作员与Numpy' s一致。以前的火炬.Angle将为所有真实输入(包括NaN)返回零。现在的角度返回PI对于负真实输入,为非负真实输入为零,并传播NAN。

这可能会略微减慢一些模型。有关用户可以通过使用Torch.distribumess.distribution.set_default_validate_args(false)或通过MyDistribution禁用单个分发验证(...,validate_args = false)来禁用验证。

这可能导致依赖于不受支持行为的模型中的新值错误,例如,应用于连续值的张量的分类。(仅支持{0,1} valued tensors)。这些模型应该是固定的,但可以通过使用上述方法禁用参数验证来恢复以前的行为。

分配给稀疏的张量没有正常工作并导致无操作。以下代码现在正确提出了错误:

C ++ API:通过ArrayRef< tensor&gt不能调用拿起可选张于棘索列表的运算符;再过(#49138)

该PR更改来自ArrayRef< Tensor&Gt的可选张于的C ++ API表示(例如,在Tensor ::``索引方法中)。列出<选项>>这种变化破坏了向后兼容性,因为没有来自Arrayref< tensor&gt的隐含转换。列出<选项>>

常用调用模式是Tensor.Index({indices_tensor}),其中indices_tensor是一个张量。这将继续工作,因为列表{} initializer_list构造函数< rent; tensor>>可以采用隐式转换为可选的张力元素。

但是,另一个常见的呼叫模式是tensor.index(indices_tensor),其中张量被隐式地转换为arrayref< tensor&gt ;.隐含转换张力 - >可选<张量> - >列表<可选>>将链接两个隐式转换,C ++没有允许。所以应该重写这些呼叫站点以使用Tensor.Index({indices_tensor})模式。

在此修复之后,当在视图上执行就地操作时,将正确抛出错误以避免错误梯度,当在第一视图上不允许就地操作时,当不允许发生就地操作时。这意味着用于在1.7.1中返回错误渐变的代码(例如t.unbind()[0] .select(0,0).add_(1))现在将正确提出错误。

该PR删除了不推荐的火炬。{FFT,RFFT,IFFT,IRFFT}及其在TORCH.TENTOR上的相应方法。使用这些函数的Pytorch程序现在必须更新以使用Torch.fft命名空间。

此PR更新Pytorch'浪费函数与scipy' stuity.digamma函数一致。这将更改在非呈整数上的rorch.digamma函数的结果,其中未定义伽马函数。由于伽马功能在这些点处未定义,因此伽马函数对数的(典型的)导数也在这些点处未定义,并且对于负整数,该PR更新Torch.Digamma返回NaN。但是,对于零,它返回-Inf与scipy一致。

有趣的是,Scipy做了类似的变化,至少有一个用户注意到:Scipy / Scipy#9663

1.7.1:在第二个参数是Python编号的情况下,将结果投射到第一个参数的DTYPE。

1.8.0在第二个参数是Python编号的情况下,结果的DTYPE是由两个输入的类型促销决定的。

args输入torch.nonx.export函数的参数被更新以更好地支持可选参数。可以除了args元组中的最后一个参数,指定具有相应命名参数的输入,可选字典。请注意,这是对最后输入也是字典类型的情况后退。在新API中,对于这种情况,必须具有一个空字典作为args元组中的最后一个参数。有更多细节可以找到:https://pytorch.org/docs/1.8.0/onnx.html?highlight=onnx#using-dictionaries-to-handle-named-arguments-as-model-inputs。

run_args参数现在必须包含包含位置参数的列表或元组,即使只有单个参数也是如此。特别是:qmodel =量化(float_model,default_eval_fn,img_data)现在将引发错误:typeerror:default_eval_fn()需要2个位置参数,但给出了3个位置。您应该更新此代码以在列表中提供图像:qmodel =量化(float_model,default_eval_fn,[img_data])

改变我们量化relu,泄漏refu和sigmoid(#47415,#45702,#45883,#45882,#47660)

从版本1.8.0开始,在渴望模式量化流中,不再需要观察到Relu,因为不需要。在以前的版本中,量化泄漏_RELU和SIGMOID不需要观察,并且刚从其输入中继承了量化参数,但在渴望模式量化中不起作用。从版本1.8.0开始,他们被观察到运营商,使它们在渴望模式量化中更好地工作。

此更新是BC-Breaking,因为发动机绘制的值与1.7.1中的引擎不同的值也与同一种子不同。

老式NN.MODULE向后钩已被打破了很长时间(它们不像文档中的广告一样行事)。我们现在有新的nn.module.register_full_backward_hook,它提供了这些钩子的完全工作实现。不应使用旧功能并将其迁移到新的完整版本。

下面的示例中示出了该差异的示例,其中线性层作为输入的单个尺寸5的输入,并且返回大小5的单个张量,但旧样式钩将仅返回两个梯度,仅针对输入输入输入两个梯度。

从火炬导入nn mod = nn的进口火炬。线性(5,5)def hook(mod,grad_inp,grad_out):打印(f"毕业输入大小:" +"""加入(str(g。size())对于g ingr_inp中的g))打印(F"毕业输出大小:" +""" grad_out的g中g的g(g。size()))mod。 register_backward_hook(钩)mod(火炬。rand(5,farcer_grad = true))。和()。倒退()>> > `毕业输入尺寸:火炬。尺寸([5])火炬。尺寸([5])#一个太多>> >毕业输出尺寸:火炬。尺寸([5])`

从火炬导入nn mod = nn的进口火炬。线性(5,5)def hook(mod,grad_inp,grad_out):打印(f"毕业输入大小:" +"""加入(str(g。size())对于g ingr_inp中的g))打印(F"毕业输出大小:" +""" grad_out的g中g的g(g。size()))mod。 register_backward_hook(钩)mod(火炬。rand(5,farcer_grad = true))。和()。倒退()>> >毕业输入尺寸:火炬。尺寸([5])火炬。尺寸([5])#一个太多>> >毕业输出尺寸:火炬。尺寸([5])>> > `UserWarning:当前进包含多个Autograd节点时,使用非完全后向钩子被弃用,将在将来的版本中删除。这个钩子将遗漏一些grad_Input.`

完全钩子应该用来一直得到适当的结果,避免警告

以前的火炬。拍摄了一个可选的return_complex参数,指示输出是真正的张量还是复杂的张量。 return_complex具有false的默认值。弃用此默认值(意味着此可选参数正在变为强制性),并将在将来的版本中删除。您可以明确传递此参数以避免此弃用。

该测试功能正在重命名,以提高清晰度。用户应该迁移以使用新名称。

弃用火炬。*线性代数函数支持Torch.linalg。* Cholesky(#51460),逆(#51672),PINVESS(#51671)的变种

所有线性代数函数都被移动到Torch.linalg子模块,该子模块提供兼容Numpy的兼容API。这些新功能具有与火炬相同的特征。那些应该使用。

新函数(大多数是以改善Numpy兼容性):torch.nan_to_num(#44592),torch.tensor_split(#45168),torch.nanmedian(#45847),torch.ravel(#46098),火炬。agamma(#46183 ),torch.igammac(#48171),火炬。{column_stack,row_stack}(#46313),torch.kron(#45358),torch.copysign(#46396),tensor.new_empty_string(#47225),火炬。{swapdims ,Swapaxes}(#46041),武器(#47974),火炬.Float_Power(#44937),Torch.inner(#48581),Torch.inner(#46716),火炬。(#48440),火炬。 sinc(#48740),torch.broadcast_to(#48997),torch.xlogy(#48777),torch.f {max,min}(#49312),火炬.diff(#50569),torch.ldexp(#45370) ,torch.broadcast_shapes(#43935),

Torch.fft新功能:2D FFT功能(#45164),在Stft(#47601),帮助函数(#44877),模糊基准(#47872)中使用新的FFT运算符

Torch.linalg新功能:Linalg.Tensorsolve(#46142),Linalg.Cholesky(#46083),Linalg.Tensorinv(#45969),Linalg。{Eigh,Eigvalsh}(#45526),Linalg.matrix_Rank(#48206), linalg.solve(#48456),linalg.qr(#47764,#50046),linalg.svd(#45562),linalg.inv(#48261),linalg.pinv(#48399),linalg.slogdet(#49194) ,linalg.cond(#45832)

基于自定义重要性分数通过Importance_Scores关键字参数添加支持(#48378)

CPU和CUDA for Torch.Symeig(#45121),火炬,火炬。(#45980),火炬,武器。{addcmul,addcdiv}(#46639 ),torch.lu_solve(#48028),torch.matrix_exp(#48363),火炬。火炬。炮弹。{Acosh,Asinh,Atanh}(#50387),火炬_mast _散列(#51281),火炬。 BMM和Torch.baddbmm(#42553),torch.orgqr(#50502),torch.index_fill_(#50578),torch.coleske_inverse(#50269)

CUDA对Torch.QR(#45032),火炬,火炬。(#45898),火炬,武器(#46916),火炬。(#47045),torch.coleske_solve(#45916),torch.colesky_solve( #47047),火炬。(#47048),火炬。(#45795),torch.inverse(#47595),torch.tensor.index_put_(#51148)

复杂的Autograd对火炬的支持。{atan,日志,log10,log1p,log2,互惠,tan,pow,rsqrt,tanh,asinh,acosh}(#46275),火炬。{cholesky,triangular_solve,mm,mv,ger}( #45737),torch.take(),torch.tensor.fill_()(#46860),torch.matrix_exp(#48363),火炬。{baddbmm,addbmm,addmm,addmv}(#50632),torch.qr( #48489),火炬,火炬.Pinverse(#47761),火炬。(#49461),火炬.Torch.trace(#51537),火炬。均值(#47566),火炬,火炬。{堆栈,收集,index_select},torch.tensor.index_add_(#49552),火炬。{masked_catter,masked_select}(#51281),火炬。{addcmul ,addcdiv}(#46639),火炬。{acosh,asinh,atanh}(#50387),torch.solve(#47045),torch.colesky_solve(#47047),火炬。原来(#47595)

CUDA BFLOAT16辍学(#45005),Batchnorm(非CUDNN)(#44994),倒退(#48809),索引(#48801),嵌入(#44848),信号窗口(#45155),规范(#48806),ISINF和Isfinite(#49356),ARM上的Ampere(#50442),夹具,余数,Lshift,rshift(#45247)

添加支持脚本和运行模块级别挂钩在JIT(#49544,#49975,#49546,#49547)

添加分布式功能adam优化器(#50624),SGD优化器(#50618),Adadelta优化器(#50623),RMSProp优化器(#50619),L Adamw Optimizer(#50620)

FX图形模式量化为RNN和RNNCell(#49126)的动态量级添加支持(#49126),量化功能线性+ {functional Relu / module Relu}(#50975),功能规范2D + Relu(# 51079),函数conv1d和conv3d(#51155)(#51254),标量作为添加/ mul(#46751),漏洞的refu(#45712),嵌入(#46677),embeddingbag(#46678)

修复错误的错误未在配置无QConfig(#47316)的模块后未插入DefaultQuantizer

添加整数支持(通过将整数浮动到浮动)到火炬。{cos,sin,tan}(#45733,#46706),torch.log {2,10}(#46810),火炬。{a} tanh(#47064 ),火炬。{cos,tan}(#47005),torch.a {cash,sinh}(#47152),火炬。(#47293),火炬.log1p(#48002)。 torch.erf {c}(#48472),火炬.Arigmoid(#48461),火炬。(#47551),火炬。(#48644),火炬.cosh(#48923),火炬。{2,m1 }(#48926),火炬.Reciprocal(#49102),Torch.erfinv(#49155),Torch.RSQRT(#47909),火炬。雷克.Lgamma(#50140)

将Boolean类型支持添加到Torch.hows(#47454),火炬_Mul和Tensor .__ mul__(#48637),火炬。{全,任何}(#44790),tensor.to_dense(# 50019)

制作火炬模块接受批次大小为0:nn.replicationpad(#39137),nn.unfold(#40689),nn.pixelshuffle(#49187),nn.avgpool {1,2,3} d(#50008) ,nn.multilabelmarginloss和nn.multimarginloss(#50007)

将类型注释添加到子模块:torch.nn.cpp(#46490),torch.nn.parallel.comm(#46736),torch.nn.modules。*(#46828,#45772,#49957,#49479 ,#49045,#49035,#49494,#48969),来自C ++(#46622),火炬。来自C ++的函数(#46623),火炬.Storage(#46876),火炬._Tensor_str(#48463,# 48584),火炬..modules.pooling(#48412),common_nn(#48190),torch.lobpcg(#47680),火炬。一uncurseal(#50106),火炬。(#50824),火炬.generate_torch_version (#51637),火炬。(#45689),torch.quantizization.quantized_jit(#45548),torch.utils.tensorboard(#49834),火炬.cuda(#47756),火炬。火炬(#47756),火炬._c._distributed_rpc(#46624),torch.distreibuted。*(#47531,#47532,#47533,#47534),torch.nn.parelial._functions(#49687)

添加浮动 ......