PyTorch 重磅更新,不只是支持 Windows

该脚本简化了 distributed 软件包的日常可用性。

你还可以通过以下链接阅读它的详细用法:

http://pytorch.org/docs/stable/distributed.html#launch-utility

基于 NCCL 2.0 的新分布式后端

新版本的 PyTorch中添加了一个新的分布式后端,它可以利用 NCCL 2.0 获得最高运行速度。它还为多个GPU上的集群操作提供了新的API。

你可以通过如下代码启用新的后端:

torch.distributed.init_process_group("nccl")

其他的分布式更新

合并很多小广播以提高性能#4978

为分布式训练添加混合精度的功能支持#4891

发布 NCCL 分布式后端。在先前的版本中它只是作为实验品#4921

为 Gloo 数据通道启用 Infiniband 支持,并自动检测 IB 设备#4795

C++拓展

先前的版本中,使用 C 或 CUDA 为用户编写自定义的扩展模块的一种官方方式是通过 cffi 扩展模块。这种方法的缺点是它需要一个单独的步骤来编译CUDA 内核,这可能有点麻烦。

在新版本中,PyTorch 提供了一个更好的系统来编写自己的 C++/CUDA 扩展。使用这种新扩展支持的示例实现可以在 pytorch/cpp_extensions 仓库中找到。

在此,我们提供两种编译模式:

提前编译:使用新的 CppExtension 或 CUDAExtension 模块编写 setup.py 脚本,这是 setuptools.Extension 模块的扩展;

实时编译:将需要编译的 C++/CUDA 文件列表传递给 torch.utils.cpp_extension.load,它将进行实时编译并为你缓存这些库。以下示例讲说明了实现这种扩展的容易程度:

在 C++中

// my_implementation.cpp#include <torch>#include <unordered>// can use templates as well. But let's keep it// simpleusing scalar_t = float;at::Tensor unique_float(at::Tensor input_) { // only works for floats AT_ASSERT(input_.type().scalarType() == at::ScalarType::Float, "input must be a float tensor"); // and CPU tensors AT_ASSERT(!input_.type().is_cuda(), "input must be a CPU tensor"); // make the input contiguous, to simplify the implementation at::Tensor input = input_.contiguous(); // get the pointer that holds the data scalar_t* input_data = input.data<scalar>(); // let's use a function from the std library to implement // the unique function std::unordered_set<scalar> set(input_data, input_data + input.numel()); // create the output tensor, with size set.size() at::Tensor output = input.type().tensor({static_cast<int64>(set.size())}); scalar_t* output_data = output.data<scalar>(); // copy the content of the set to the output tensor std::copy(set.begin(), set.end(), output_data); return output;}// this defines the functions exposed to PythonPYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { m.def("unique_float", &unique_float, "Unique for float tensors");}/<scalar>/<int64>/<scalar>/<scalar>/<unordered>/<torch>

在 Python 中

import torchfrom torch.utils.cpp_extension import load as load_ext# pass the source files, they will be compiled on the fly# and will return a python module_C = load_ext('my_unique_lib', sources=['my_implementation.cpp'])# now can use the functions implemented in C++unique = _C.unique_floata = torch.tensor([1.0, 2.0, 1.0])print(unique(a))# tensor([ 2., 1.])

Window 支持

新版本中,PyTorch 将正式支持 Windows。我们为 Python3.5和 3.6 提供预编译的 Conda 二进制文件和 pip 文件。

但是,Windows 上的 PyTorch 不支持分布式训练,这可能会比 Linux/OSX系统上运行得慢一点,因为 Visual Studio 支持较早版本的 OpenMP。

与往常一样,你可以在 Pytorch 官网上(http://pytorch.org)找到在Windows 系统安装 PyTorch的命令。此外,你还可以通过访问http://pytorch.org/docs/stable/notes/windows.html,这里能够为你解答Window 系统中 Pytorch 版本可能遇到的所有问题。

ONNX 改进

新的 ONNX 操作

支持输出 torch.max(input,dim)和 torch.min(input,dim)#6220

为 ReLU 函数添加符号以支持导出到 ONNX#5759

添加 sum,prod,sqrt 并改进 log_softmax 方法#4579

为 InstanceNorm 方法添加 ONNX 支持#4626

为 Elu 函数添加 ONNX 符号#3453

为 UpsamplingNearest2d 模块添加 ONNX 符号#3450

改进之处

当 ONNX 导出失败时打印目标的源位置#5652

将 onnx protobuf 绑定导出到 python中#6651

在 ConvTranspose 模块中支持 output_padding 方法#4583

更好的 RNN 支持

新版本的 PyTorch 可以将一部分 RNN 导出到 ONNX 中#4409

将 Elman RNN 的输出添加到 ONNX#4613

在 ONNX 导出的填充序列中支持批次优先原则#5360

将双向 Elman RNN 的输出添加到 ONNX 中#5120

将 RNN 导出到 ONNX 中以便正确处理序列长度#4695

支持 GRU 导出到 ONNX 中#4390

Bug修复

修复 ONNX 中的 3D 平均池化bug#6101

修复复制/反射板上的 onnx 导出#4263

其他改进

将 numpy()和 from_numpy()方法添加到 HalfTensor中

启用 TensorDataset,以便输入任意数量的张量。

将 padding_value 方法添加到 torch.nn.utils.rnn.pad_sequence模块中

将 total_length 选项添加到 pack_padded_sequence 模块中,这在使用DataParallel 模块时将变得非常有用,因为我们可以确保我们使用相同长度的序列。

提高 torch.arange 的数值精度,使其与 numpy.arange 一致

改进 torch.load()和torch.save()方法以支持任意类似文件的对象

改进 torch.nn.functional.grid_sample 模块以支持 2D(空间)和 3D(体积)的输入

在 DataLoader 中设置 python 的随机种子,以提高实验的可重复性

将 __delitem__ 方法添加到 nn.Sequential 模块中。在新版本中可以删除 nn.Sequential模块的任意元素。例如:

model = nn.Sequential(nn.Linear(2, 2), nn.ReLU(), nn.Linear(2, 2))del model[1] # deletes nn.ReLU

新版本中的 ReduceLROnPlateau 可以进行序列化#5300

添加选项以清除 CPU上的非正常数字#5294

新版本中 PyTorch 将公开 conv1d,conv2d 和 conv3d 所对应的输入和权重的变化情况#5408

添加对列表或者张量使用时 pack_padded_sequence 的调用支持#5133

支持 nn.Embedding 方法中的 padding_idx 的负索引值#4496

添加对 pack_padded_sequence 反向传播过程的支持#4512

将nn.utils.rnn.pad_sequence和nn.utils.rnn.pack_sequence添加到可变长度张量的填充列表中,并打包一个可变长度张量列表。

添加 torch.cuda.memory_cached,torch.cuda.max_memory_cached,torch.cuda.memory_allocated和 torch.cuda.max_memory_allocated方法,用于检查 CUDA 内存使用情况#4511

如果新的视图尺寸与张量的原始尺寸和步幅兼容,则允许查看非连续张量。#4062

新版本中 NLLLoss 和 CrossEntropyLoss 能够支持2个以上的维度。#4654

添加一个选项以不显示 model_zoo 的下载进度条#4135

新版本中你可以将模块分配给 nn.Sequential 的索引。#4931

新版本中你可以用一个 numpy array 方法 np.longlong 来创建张量#4367

更改autograd执行顺序以便更好的使用,这也将大大改善大模型的内存使用量。#4746

将 AMSgrad 模式添加到 Adam 和 SparseAdam优化器中。#4034

添加更好的 torch.autograd.profiler 以支持使用 cudaEventAPI 进行 CUDA 分析。#3734

新版本中 torch.set_num_threads 能够设置相应的 MKL 选项,因此你不再需要使用环境变量来控制它。#4949

性能的提高

加速 CPU 中 nn.EmbeddingBag 模块,使得训练得总体速度提高30%#5433

将 Python 中的 nn.MarginRankingLoss,nn.CosineEmbeddingLoss,nn.HingeEmbeddingLoss 和 nn.TripletMarginLoss移到 Aten 后端,在某些情况下这将使性能提升3倍。#5346,#5646,#5080,#5680

将 pin_memory()作为 NativeFunction 实现#4094

保存用于反向计算 self.numel()函数而不是用于节省内存的 self 参数#5747

在特定情况下,逐点重排列操作可以使性能提高10倍。#4174

在小案例中将 normal_ 向量化可以带来5-6倍性能加速#4312

允许在新版 PyTorch 中使用 GPU Direct 进行广播操作#4183

为3D 输入案例加速 nn.Linear 模块#5279

通过并行化 vol2col 和 col2vol加速 CPU 上的 Conv3D 操作#4824

为 sigmoid 函数添加 AVX2 实现,实验表明这将带来大约10倍的性能加速#5010

使用快速整数除法算法来避免内核中的除法运算的内存占用。#5054

提高 CUDA 中随机数生成的内存占用率#5710

为常规规范的优化添加标准优化形式#5722

添加快速融合的 GLU 反向传播过程#5782

通过使用 std :: vector + sort 而不是 std ::set 来优化独特排序,这可以带来高达5倍的性能加速。#5913

加快维数的求和过程#6026

在前向和反向过程启用 MKLDNN 卷积操作。#6062

使用 OpenMP 并行化非连续的逐点操作#2764

将 Cudnn Tensor Core 操作添加到 Volta 的 RNN 中#3409

向量化 exp,log,sin,cos#6078

在多个反向过程中通过 grad_inputs 来重复使用中间结果#3526

分布式

DistributedDataParallel:使用混合精度支持的 NCCL 后端,这将带来10%的性能提升#5064

略微提高 DistributedDataParallel 模块在多进程分布式训练方面的性能(单 GPU 绑定)#4870

bug 修复

torch 操作

改进 torch.digamma 操作以提高极点附近的精度#6517

修复 Tensor.random 操作的负输入 bug#6463

修复 tensor.permute(dims)操作在反向过程中对负值 dims 未定义行为 bug#5945

修复 torch.remainder 运算符中的整数溢出bug(它将在以2**48为除数时中断)#5906

修复 torch.bmm 操作中的内存泄漏 bug#5744

使 scatter_add_ 的维度检查器与 scatter_ 的一致#5659

修复 CPU torch.multinomial 操作中非连续概率的张量输入 bug(先前的版本,它会覆盖输入的数据)#5093

修复 CUDA torch.multinomial 使用不正确的步幅并能够选择零概率事件的 bug#5774,#5238

支持 index_select 的空索引张量#3429

支持 CUDA Tensor.put_ 中的空索引张量#4486

利用空张量提高 torch.cat 的稳定性#3602,#5971,#5819

在任何输入尺寸未对齐的情况下修复 torch.fft #6118

改进 CUDA btrifact 的错误消息#5644

未请求 torch.symeig 时,为特征向量张量返回零#3411

修复张量上的 torch.btrifact 操作#4318

修复张量上的 torch.pstrf 操作#4883

修复 torch.median 中的内存泄漏#6889

当some = False 6870时,修复 SVD 操作中反向过程的非方形矩阵 bug

core

检测 _C 共享库的重新初始化,这通常会导致一些错误 bug#6232

修复所有零字节张量的索引 bug#3926

只允许使用稠密浮点类型作为默认张量类型#5674

在将 CUDA 张量类型设置前初始化 CUDA 以防止其崩溃#4788

如果 CUDA 未初始化,修复 from_dlpack 中的失败错误。#4182

使用 numpy 数组,修复创建 CUDA 张量时的崩溃#5850

在某些操作系统上,修复多处理进程中的空张量共享问题#6229

autograd

还原 allow_unused 功能:当可微分输入未被使用或无法访问时抛出错误#6553

修复 output_nr 未被正确递增的问题。这导致在某些输入不需要 _grad 的操作在反向传播过程中发生崩溃#4812

修复 torch.autograd.profiler 中的 nvprof 解析问题#5840

nn 层

仅支持在特定维度中为自适应池指定大小#3127

修复反射填充边界检查,以避免无效的内存访问#6438

修复 NLLLoss 的错误消息#5299,#6072

在 CUDA 上修复 kl_div 的反向过程。先前版本中它在计算 gradInput时不会考虑 gradOutput#5814

修复线性的错误偏差大小#5992

修复nn.functional.convNd 和 nn.functional.conv_transposeNd 模块的错误消息#5701

检查输入的维度与目标是否匹配,而不是与一些损失函数的元素数量匹配#5085

修复 torch.diag 操作在反向传播过程所返回方形渐变与非方形输入#4538

修复卷积类型不匹配的错误消息#5815

添加 align_corners 选项以便进行线性插值上采样操作,并使默认上采样行为与其他框架相一致#5927

当 log_input = False 时,防止 poisson_nll_loss 出现数值问题#3336

CUDA

确保卷积权重是连续的,以修复 CUDA ConvTranspose 中的双反向操作#4543

二次修复 CUDA 中的反向传播过程#4460

稀疏性

修复当 sparse = True 时的嵌入使用问题#4686

当输入仅包含 padding_idx 时,修复反向传播过程的稀疏嵌入问题#6211

处理从 CPU,GPU 空稀疏张量的复制问题。#5361

DataLoader

将参数检查添加到 torch.utils.data.Sampler 类中,修复 DataLoader尝试将整个数据集加载到非整数批处理大小的问题。#6249

设置 dataloader.batch_size = None 时给出 batch_sampler,修复 DataLoader将 batch_size 报告为1的错误。#6108

改善 DataLoader 中的信号处理问题#4643

关闭时忽略 FileNotFoundError 问题#5380

修复预处理的确定性问题#4640

Optim

在加载优化程序状态字典时以提高张量生成的可用性#3658

以确定性顺序列出模型参数以提高 load_state_dict()的稳定性#6031

为所有优化器添加参数范围检查#6000

修复 SparseAdam 的 AMSGrad 模式问题#4314

分布式和多 GPU

修复由于分离错误而导致的一些分布式训练错误#5829

在 no_grad 模块中运行 DataParallel 时,不要修改 requires_grad#5880

为分布式数据并行稳定性添加 broadcast_coalesce 的 GPU 保护#5655

原文链接:

https://github.com/pytorch/pytorch/releases/tag/v0.4.0