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 #include // 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(); // let's use a function from the std library to implement // the unique function std::unordered_set set(input_data, input_data + input.numel()); // create the output tensor, with size set.size() at::Tensor output = input.type().tensor({static_cast 
(set.size())}); scalar_t* output_data = output.data(); // 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");}

在 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


分享到:


相關文章: