PyTorch简介
在2017年1月18日,facebook
下的Torch7
团队宣布PyTorch
开源后就引来了剧烈的反响。PyTorch
是 Torch
在 Python
上的衍生版本。Torch
是一个使用 Lua
语言的神经网络库, Torch
很好用, 但是 Lua
流行度不够, 所以facebook
开发团队将 Lua
的 Torch
移植到了更流行的语言 Python
上,推出了PyTorch
。
2017年12月5日,深度学习框架PyTorch
更新到0.3.0。
PyTorch
是一个Python
优先的深度学习框架,是一个和tensorflow,Caffe,MXnet
一样,非常底层的框架。先说下PyTorch
相比于Tensorflow
的三大优势:
一、Python优先支持
PyTorch主推的特性之一,就是支持Python(官方的提法:puts Python first
)。因为直接构建自 Python C API,PyTorch
从细粒度上直接支持python的访问。相比于原生Python
实现,引入的新概念很少,这不仅降低了 Python
用户理解的门槛,也能保证代码基本跟原生的 Python
实现一致。事实上,开发者可以直接用原生 Python
代码扩展 PyTorch
的 operation
。
而Tensorflow
总有一种用 Python
调用 C++
写的第三方动态链接库的感觉;写模型需要更多代码,无法贯彻 Python
的简约风格;而且写新的 operation
必须用 C++
开发。
二、动态图的良好支持
Tensorflow
运行必须提前建好静态计算图,然后通过feed
和run
重复执行建好的图。但是Pytorch
却不需要这么麻烦:PyTorch
的程序可以在执行时动态构建/调整计算图。相对来说,pytorch具有更好的灵活性。这得益于PyTorch
直接基于 Python C API
构建的 Python
接口。
TensorFlow
饱受诟病的痛点就是只支持静态图模型。也就是说,在处理数据前必须预先定义好一个完整的模型。如果数据非常规整,那还好。但实际工程和研究项目中的数据,难免有一些边角的情况。很多项目,其实需要大量实验才能选择正确的图模型。这就很痛苦了。因此,很多项目转而采用了PyTorch
等支持动态图模型的框架,以便在运行程序的时候动态修正模型。
不过在2017年10月31日万圣节这天,Google
发布了TensorFlow Eager Execution
(贪婪执行),为TensorFlow
添加了命令式编程的接口。启用贪婪执行后,TensorFlow
操作会立刻执行,不用通过Session.run()
执行一个预先定义的图。相信在TensorFlow1.5
左右,谷歌会正式为TensorFlow
加入动态图的支持!
三、易于Debug
Pytorch在运行时可以生成动态图,开发者就可以在堆栈跟踪中看到哪一行代码导致了错误。你甚至可以在调试器中停掉解释器并看看某个层会产生什么。
PyTorch的Windows支持
PyTorch
官方暂时没有提供Windows
下的pip
或者conda
安装包。不过关于PyTorch
的Windows
官方CI
和官方版本,Soumith
大神已经发话了:准备在Pytorch 0.4.0
添加Windows
正式版支持,CI
版本正在搭建中。
PyTorch在Windows下的安装
据网友反应,这次的包需要CUDA 9
才能使用。
在conda-build
没有提供MSVC 2017
的支持之前,我们没有办法来制作相应的Conda
包,因此只能通过whl
包来进行安装。具体怎么安装呢?目前将编译好的包上传到了Github
的Release页面上(旧的包没有启用BLAS,已删除,新的正在上传中),国内的在百度云,需要的用户可以自己下载安装。安装的命令如下:
# 对于 Conda 的用户 conda install numpy mkl pyyaml cffi # For Python 3.5 pip install torch-0.3.0b0.591e73e-cp35-cp35m-win_amd64.whl # For Python 3.6 pip install torch-0.3.0b0.591e73e-cp36-cp36m-win_amd64.whl
测试
在Python
交互模式下输入:
import torch
如果不报错,就是安装成功!
版本日志
错误修复
-
backward
中的错误会导致死锁 -
DataLoader
多线程时的内存泄漏 -
torch.cuda
中的缩进bug
新功能
- 添加对
CUDA
和cuDNN
新版本的支持 - 添加对
Ninja
和clcache
编译器的支持
存在问题
-
Conda
下的bz2b
包不支持Python3.5
及以下的版本 - 不能支持
torch.distributed
(分布式)、NCCL
(多卡)和Magma
- 不能把
num_worker
设置为1以上的值。有问题可以尝试调成0。另外代码入口得用以下的if语句包裹。即代码里面必须要有:
if __name__ == '__main__':
注意:本文归作者所有,未经作者允许,不得转载