該腳本簡化了 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
閱讀更多 AI科技大本營 的文章