點選上方“AI公園”,關注公衆号,選擇加“星标“或“置頂”
作者:Facebook
編譯:ronghuaiyang
導讀
Facebook剛剛釋出了PyTorch的最新版本,PyTorch1.1.0,這是自從釋出PyTorch1.0以來的又一個重大的更新。
Facebook剛剛釋出了PyTorch的最新版本,PyTorch1.1.0,這是自從釋出PyTorch1.0以來的又一個重大的更新,在這個版本中,最最顯眼的一個更新就是官方支援TensorBoard了,之前大家都是用的TensorBoardX,這次,終于可以光明正大的使用TensorBoard了,順便吐槽一下visdom,确實不如TensorBoard好用。
除了TensorBoard之外,其實還有不少重要的更新,下面給大家提供一些摘要,給大家先過目一遍,我列出了一些要點,更多的内容大家可以去看看原文。
注意:不再支援CUDA 8.0
重點
TensorBoard (試驗)
使用TensorBoard對可視化和模型調試提供一流的本地支援,這是一個用于檢查和了解訓練運作、張量和圖的web應用程式套件。PyTorch現在支援TensorBoard通過一個簡單的 fromtorch.utils.tensorboardimportSummaryWriter指令來寫入日志。直方圖、嵌入、标量、圖像、文本、圖形,以及更多東西都可以在訓練過程中進行可視化。目前,TensorBoard支援還處于試驗階段。

[JIT] ScriptModules中的屬性
可以在 ScriptModule上配置設定屬性,方法是用torch.jit.Attribute指定類型。屬性類似于參數或緩沖區,但可以是任何類型。當你調用torch.jit.save時,它們将與任何參數/緩沖區一起被序列化,是以它們是在模型中存儲任意狀态的好方法。
例子:
class Foo(torch.jit.ScriptModule): def __init__(self, a_dict): super(Foo, self).__init__(False) self.words = torch.jit.Attribute([], List[str]) self.some_dict = torch.jit.Attribute(a_dict, Dict[str, int]) @torch.jit.script_method def forward(self, input: str) -> int: self.words.append(input) return self.some_dict[input]
[JIT] 在TorchScript中支援字典和清單
TorchScript現在對清單和字典類型提供了健壯的支援。它們的行為很像Python清單和字典,支援大多數内置方法,包括簡單的包含操作和 for…in的構造方式。
[JIT] 在TorchScript中使用者自己定義類 (試驗)
對于更複雜的有狀态操作,TorchScript現在支援用 @torch.jit.script标注類。使用這種方法的類可以像其他TorchScript子產品一樣在c++中jit編譯和加載。
@torch.jit.scriptclass Pair: def __init__(self, first, second) self.first = first self.second = second def sum(self): return self.first + self.second
DistributedDataParallel新功能和指南
nn.parallel.DistributedDataParallel:現在可以封裝multi-GPU子產品,可以在一台伺服器上使用模型并行,以及多台伺服器上使用資料并行。
突破性的改進
- Tensor.set_: Tensor中的device不再可以通過Tensor.set_來改變了. 這通常發生在使用預設CUDA裝置設定Tensor,然後在另一個CUDA裝置的Storage中交換Tensor時。相反,需要從一開始就在正确的裝置上建立Tensor。
- 注意 lr_scheduler.step的順序更改了。
- torch.unique: 把sorted的預設值改成了True.
- [JIT]重命名isTensor接口為isCompleteTensor.
- [JIT]去掉了GraphExecutor的python綁定.
- [C++]: many methods on 在Type上的許多方面現在不再退出了,可以使用函數或者Tensor的方法來起到同樣的效果.
- [C++]:TensorOptions的Backend構造器不存在了. (18137).
- [C++, Distributed]: 去掉了c10dProcessGroup::getGroupRank也去掉了.
Tensors / dtypes
- torch.bool: 增加了對torch.bool類型以及該類型張量 (存儲為1-byte)的支援. 支援NumPy的轉化,但是操作現在是有限制的.
優化器
- optim.lr_scheduler.CyclicLR: 支援循環學習率和動量.
- optim.lr_scheduler.CosineAnnealingWarmRestarts: 新的學習率政策:帶熱身重新開機的随機梯度下降.
- 支援多個同步的學習率政策.
分布式
- torch.distributions: 現在支援多重繼承.
采樣
- quasirandom.SobolEngine: 新采樣器.
DistributedDataParallel
- nn.parallel.DistributedDataParallel: 現在支援帶無用參數的模型(例如控制流,比如adaptive softmax等等).
提升
- torch.min,torch.max,torch.median,torch.mode,torch.kthvalue,torch.symeig,torch.eig,torch.pstrf,torch.qr,torch.geqrf,torch.solve,torch.slogdet,torch.sort,torch.topk,torch.gels,torch.triangular_solve現在傳回一個名稱元組來描述輸出.
- torch.empty(還有其他的構造函數): 現在可以接受pin_memory參數; 現在不用torch.Storage也可以就那些pin了.. .
- torch.histc: 現在支援CUDA了.
- torch.unique: 增加了return_counts.
- torch.logspace: 增加了指定對數底的功能.
- torch.set_printoptions: 增加對科學計數的支援 .
- torch.btrifact現在可以操作超過3維的tensor.
- torch.kthvalue: 支援CUDA.
- torch.abs: 支援uint8和int8類型.
- torch.stack,torch.cat: 支援CPU半精度tensors.
- torch.cross: 支援負次元.
- torch.lerp: 增加像支援Tensor一樣支援weight.
- torch.transpose: 和NumPy變得一樣了: 1-d和0-d數組都可以接受,傳回原來一樣的數組.
- torch.linspace,torch.logspace現在可以使用steps=1和start!=end
- torch.cholesky: 把導數從三角形矩陣變成對稱矩陣.
- torch.lerp: 提升了數值穩定性.
- torch.logdet,torch.slogdet: 提升了數值精度.
- Tensor.__contains__現在支援了.
- Tensor.fill_和torch.zeros在CPU上支援半精度.
- Tensor.resize_as_,Tensor.view: 在CPU上支援半精度.
- Tensorindexing: 允許通過NumPy布爾值來進行索引.
- nn.EmbeddingBag: 支援半精度密集後端.
- nn.Embedding: 修改了密集嵌入來和雙後端一起使用.
- nn.MaxPool1d: 允許清單和元組作為output_size輸入.
- nn.CTCLoss: 通過zero_infinity參數可以支援對無限的損失置零.
- nn.Dropout: 支援在eval時使能.
- nn.MSELoss: 對不合法的廣播進行告警.
- nn.Module.load_state_dict: 增加兩個傳回值missing_keys和unexpected_keys.
- nn.parallel.data_parallel: 強制裝置比對device_ids.
- torch.device: 過去隻接受裝置好的地方,現在都可以用這個了.
- dtype.int8這個類型的tensors現在可以轉換為NumPy數組了.
- nn.functional.gumbel_softmax: 使用dim參數運作多個次元的輸入.
- nn.functional.cosine_similarity: 提高了精度.
- torch.autograd: 不再儲存不需要的輸入,提高了記憶體效率.
- torch.autograd.profiler: 增加了自身的CPU時間,總的CPU時間.
- DataLoader: 支援接受一個使用者自定義的記憶體pinning函數.
- DataLoader: 在EINTR重試libshm .
- DataLoader: 修改了使用pin_memory和PackedSequence的一個問題.
- data.utils.collate,data.utils.pin_memory: 現在可以儲存名字元組.
- 在許多的索引錯誤情況下,使用 IndexError代替RuntimeError.
- 在CPU上支援索引 torch.float16tensor.
- 在inplace操作上增加(有限的)錯誤檢測.
- utils.checkpoint.checkpoint: 支援None作為參數 .
- torch.autograd:為one of the variables neededforgradient computation has been modifiedbyan inplace operation異常增加更多的資訊.
- cuda.synchronize: 增加一個裝置參數.
- cuda.reset_max_memory_*: 現在支援了.
- distributions.Independent: 現在可以計算KL散度了.
- torch.distributed.new_group: 現在支援覆寫預設的backend.
性能
重點
- nn.BatchNormCPU推理速度提升了最高19倍.
- nn.AdaptiveAvgPool: size=1時通常可以加速30倍.
- nn.EmbeddingBagCPU性能提升了4倍.
- Tensor.copy_: 對于大的tensor拷貝加速了2~3倍.
- torch.nonzero: 在CPU上現在比numpy塊2倍.
- 改進用于為Pascal架構和更新的GPU提升了緩存配置設定器的性能,Mask-RCNN的記憶體使用率提高了10-20%。
- reduction functions: 對于某些大Tensor的情況下,加速了50-80%.
- [JIT]Graph fuser: 在廣播的存在下,更好地融合向後圖.
- [JIT]Graph fuser:batch_norm推理時的融合.
- [JIT]Graph fuser:layer_norm推理時的融合.
英文原文:https://github.com/pytorch/pytorch/releases
更多文章,請關注微信公衆号:AI公園