pytorch windows可以在arm上跑吗

使用PyTorch,OpenAI Gym和Gazebo机器人模拟器为NVIDIA Jetson深度强化学习GPU库
机器人深化强化学习在本教程中,我们将创建人工智能代理,从与环境交互中学习,收集经验,并通过深度强化学习(深度RL)获得奖励系统。使用将原始像素转换为动作的端到端神经网络,RL训练的代理能够展示直观的行为并执行复杂的任务。最终,我们的目标是通过3D虚拟机器人仿真训练强化学习代理,并将代理转移到真实世界的机器人。强化学习者根据环境状态(如摄像机输入)和奖励向代理提供关于其性能的反馈,为代理选择最佳行为。强化学习可以学习在给定策略或任务的环境中表现最佳,例如获得奖励。在许多情况下,状态空间非常复杂且多维度,因此越来越多地使用神经网络来预测最佳动作,这是深度强化学习和GPU加速技术发挥作用的地方。通过深入的强化学习,代理人通常使用卷积神经网络(CNN)处理2D图像,处理比低维RL更复杂一个数量级的输入,并且能够通过最终结果学习“从视觉” (被称为“像素到动作”)。该存储库包括PyTorch中的离散Deep Q-Learning(DQN)和连续A3G算法,C ++中的示例和互操作性库API,用于将Linux应用程序集成到机器人,仿真和现场部署中。目录从源代码构建从终端运行以下命令以从源代码构建:$ sudo apt-get install cmake
$ git clone http://github.com/dusty-nv/jetson-reinforcement
$ cd jetson-reinforcement
$ git submodule update --init
$ mkdir build
$ cd build
$ cmake ../
$ make在此cmake步骤中,PyTorch将被编译和安装,因此可能需要一段时间(约30分钟到1小时在Jetson上)。我们目前使用的PyTorch的稳定版本是0.3.0。构建脚本将下载pacekages并sudo在安装期间询问您的密码。验证PyTorch在继续之前,为确保PyTorch安装正确,并且如果您不熟悉PyTorch,请提供一个名为Jupyter IPython的笔记本,其中包含一些简单的PyTorch示例,用于验证安装并测试CUDA / cuDNN支持PyTorch。要在系统本地启动,请运行以下命令:$ cd jetson-reinforcement / build / aarch64 / bin
#或cd在PC上的x86_64 / bin
$ jupyter notebook intro-pytorch.ipynb或者,如果您希望跳过笔记本并直接运行PyTorch验证命令,可以通过使用python命令启动交互式Python shell 并运行以下命令来完成此操作:&&& import pytorch
&&& print(torch.__version__)
&&& print('CUDA available: ' + str(torch.cuda.is_available()))
&&& a = torch.cuda.FloatTensor(2).zero_()
&&& print('Tensor a = ' + str(a))
&&& b = torch.randn(2).cuda()
&&& print('Tensor b = ' + str(b))
&&& c = a + b
&&& print('Tensor c = ' + str(c))如果PyTorch在您的系统上正确安装,则输出应如下所示:Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 ] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&&& import pytorch
&&& print(torch.__version__)
0.3.0b0+af3964a
&&& print('CUDA available: ' + str(torch.cuda.is_available()))
CUDA available: True
&&& a = torch.cuda.FloatTensor(2).zero_()
&&& print('Tensor a = ' + str(a))
Tensor a =
[torch.cuda.FloatTensor of size 2 (GPU 0)]
&&& b = torch.randn(2).cuda()
&&& print('Tensor b = ' + str(b))
Tensor b =
[torch.cuda.FloatTensor of size 2 (GPU 0)]
&&& c = a + b
&&& print('Tensor c = ' + str(c))
Tensor c =
[torch.cuda.FloatTensor of size 2 (GPU 0)]现在我们已经证实PyTorch正在加载,能够检测GPU加速,能够在GPU上分配张量,并且能够使用CUDA执行基本张量操作。DQN + OpenAI健身房为了首先测试和验证深层强化学习算法的确在学习,我们将在OpenAI Gym环境(2D)中运行它们。作为DQN算法的介绍,第二个支持CUDA的IPython笔记本包含在回购中。这款笔记本将DQN应用于从Gym的环境中捕捉的视频,因此它在GPU上从“视觉”学习,而不是像传统RL那样从游戏获取低维参数。虽然CartPole是一个玩具的例子,但是从一个简单的例子开始,至关重要的一点是,在毕业后将更容易地调试到更复杂的3D场景,并且由于DQN从原始的2D像素数组中学习,它仍然被考虑深入强化学习。建议您按照下面的,以熟悉DQN算法,以便在后面的更复杂环境中从C ++转换到更复杂的环境时使用它。Cartpole要从您的机器本地启动,请运行以下命令:$ cd jetson-reinforcement / build / aarch64 / bin
#或者cd x86_64 / bin
$ jupyter notebook intro-DQN.ipynb在笔记本内部,DQN设置为仅运行50集。在目睹DQN开始收敛并且CartPole开始长时间保持正常之后,退出笔记本并从终端运行独立脚本以提高性能:$ python gym-DQN.py(假设你的终端的当前目录仍然jetson-reinforcement/build/&arch&/bin在上面)应该出现三个窗口,显示小推车游戏,一个性能图表,DQN代理应该开始学习。DQN特工能够平衡移动手推车上的杆子的时间越长,奖励得分越多。在健身房,200分表示场景已被掌握。经过一段时间的培训后,代理人应该实现它,程序将退出。Lunar Lander使用类似的脚本,您可以在不同的健身房环境中使用--env参数进行实验:$ python gym-RL.py --env = LunarLander-v2 --render该环境是有趣的探索,因为它是一个类似的任务,无人机自动着陆,因此对机器人技术相关。起初,着陆器将会疯狂地坠毁,但从第50集开始,你可能会注意到它开始试图留在旗帜之间,并且在几百集之后,它应该开始以受控制的下降着陆。在终端,你应该看到奖励变得积极,随着时间的推移会增加到200:Episode 010
Reward: -508.10
Last length: 079
Average length: 18.20
Episode 020
Reward: -301.04
Last length: 088
Average length: 25.02
Episode 030
Reward: -208.76
Last length: 102
Average length: 31.96
Episode 040
Last length: 071
Average length: 48.18
Episode 050
Reward: -155.66
Last length: 107
Average length: 53.96
Episode 060
Reward: -103.31
Last length: 091
Average length: 58.13
Episode 070
Last length: 095
Average length: 64.51
Episode 080
Last length: 147
Average length: 76.15
Episode 090
Reward: -150.40
Last length: 120
Average length: 86.76
Episode 100
Reward: -218.14
Last length: 100
Average length: 98.21
Episode 110
Last length: 101
Average length: 100.55
Episode 120
Last length: 120
Average length: 105.52
Episode 130
Reward: -112.93
Last length: 183
Average length: 120.30
Episode 140
Reward: -188.25
Last length: 110
Average length: 149.31
Episode 150
Last length: 176
Average length: 148.66
Episode 160
Last length: 174
Average length: 153.23
Episode 170
Reward: +131.50
Last length: 252
Average length: 155.50
Episode 180
Reward: +110.42
Last length: 128
Average length: 154.47
Episode 190
Last length: 161
Average length: 156.21
Episode 200
Reward: +111.07
Last length: 505
Average length: 162.06
接下来,我们将看看通过我们的C ++包装库将这些独立的Python示例集成到机器人代码中。深入研究C ++ API为了将这些深入的强化学习者从庞大的Python示例转化为可与机器人和模拟器集成的libray形式,我们为Python代码提供了一个C ++包装库和API。在下面,该库使用Python的低级别C FFI在应用程序和PyTorch之间传递张量内存,而无需额外的副本(ZeroCopy)。该库的架构可扩展到新型学习算法。下面是伪代码,说明RL实现继承的接口的签名:/**
* Base class for deep reinforcement learning agent
class rlAgent
* Create a new instance of a module for training an agent.
static rlAgent* Create( uint32_t width, uint32_t height,
uint32_t channels, uint32_t numActions );
* Destructor
virtual ~rlAgent();
* From the input state, predict the next action
virtual bool NextAction( Tensor* state, int* action );
* Issue the next reward and training iteration
virtual bool NextReward( float reward, bool end_episode );
};回购中包含代理的不同实现,包括我们将在模拟场景中使用的实现。用户将其传感器数据或环境状态提供给NextAction()调用Python脚本并返回预测动作的函数,然后用户将其应用于其机器人或模拟。接下来,在NextReward()函数中发布奖励,该函数从环境中向学习者提供反馈,并开始下一次训练迭代,使代理随着时间学习。测试C ++ API为了确保强化学习者在C ++中仍能正常工作,使用调用和调用的API的一些简单示例。在概念上与乒乓球类似,球在球到达屏幕底部之前必须捕捉的环境顶部的球落下,通过向左或向右移动桨。抓住与以前的单片Python脚本示例不同,该示例是一个简单的C / C ++程序,它链接到上述强化学习库。要测试文本示例,请从终端运行以下可执行文件。在大约100集左右之后,代理人应该几乎100%的时间开始赢得剧集:$ ./catch
input_width:
input_height:
input_channels: 1
num_actions:
optimizer:
learning rate:
replay_memory:
batch_size:
epsilon_start:
epsilon_end:
epsilon_decay:
allow_random:
debug_mode:
creating DQN model instance
DQN model instance created
DQN script done init
cudaAllocMapped 16384 bytes, CPU 0x GPU 0x
pyTorch THCState
nn.Conv2d() output size = 800
WON! episode 1
001 for 001
WON! episode 5
004 for 005
WON! episode 10
007 for 010
WON! episode 15
010 for 015
WON! episode 20
013 for 020
13 of last 20
(max=0.65)
WON! episode 25
015 for 025
11 of last 20
(max=0.65)
LOST episode 30
018 for 030
11 of last 20
(max=0.65)
LOST episode 35
019 for 035
09 of last 20
(max=0.65)
WON! episode 40
022 for 040
09 of last 20
(max=0.65)
LOST episode 45
024 for 045
09 of last 20
(max=0.65)
WON! episode 50
027 for 050
09 of last 20
(max=0.65)
WON! episode 55
031 for 055
12 of last 20
(max=0.65)
LOST episode 60
034 for 060
12 of last 20
(max=0.65)
WON! episode 65
038 for 065
14 of last 20
(max=0.70)
WON! episode 70
042 for 070
15 of last 20
(max=0.75)
LOST episode 75
045 for 075
14 of last 20
(max=0.75)
WON! episode 80
050 for 080
16 of last 20
(max=0.80)
WON! episode 85
055 for 085
17 of last 20
(max=0.85)
WON! episode 90
059 for 090
17 of last 20
(max=0.85)
WON! episode 95
063 for 095
18 of last 20
(max=0.90)
WON! episode 100
068 for 100
18 of last 20
(max=0.90)
WON! episode 105
073 for 105
18 of last 20
(max=0.90)
WON! episode 110
078 for 110
19 of last 20
(max=0.95)
WON! episode 111
079 for 111
19 of last 20
(max=0.95)
WON! episode 112
080 for 112
20 of last 20
(max=1.00)在内部,我们正在使用C ++库中的API来实现学习。备用参数有一些可供选择的命令行参数可用于改变环境的大小和像素数组输入大小,增加复杂性以查看它如何影响收敛和训练时间:$ ./catch --width = 96 --height = 96
$ ./catch --render
#启用环境的文本输出在96x96环境规模的情况下,捕鱼剂在150-200集之后达到75%以上的精度。在128x128环境规模的情况下,大约325集之后,捕鱼剂的准确度达到75%以上。水果接下来,我们提供了一个名为C ++的二维图形样本,其中代理出现在随机位置,并且必须找到“水果”对象才能获得奖励并在超出限制或超时期限到期之前赢取剧集。该代理有4个可能的动作可供选择:移动上,下,左,右屏幕上,以导航到该对象。请注意,此C ++示例主要在GPU上运行,其中CUDA中的环境的基本2D栅格化以及DQN和OpenGL中的显示可视化。和以前一样,它正在学习“从视觉上”,利用深度强化学习将原始像素阵列转换为动作。与更复杂的导航和运动计划任务类似,这个简单的示例旨在证明能够从任何起始位置以可视方式识别和导航感兴趣的对象。稍后在回购协议中,我们将在3D机器人仿真中建立这种路径规划功能。运行示例首先,从终端启动以下可执行文件:$ ./fruit在默认48x48环境下约100集后,它应该达到85%的准确度:action = DOWN
reward = +0.0628
wins = 052 of 094 (0.55)
16 of last 20
(max=0.80)
action = LEFT
reward = +0.0453
wins = 052 of 094 (0.55)
16 of last 20
(max=0.80)
action = LEFT
reward = +0.0271
wins = 052 of 094 (0.55)
16 of last 20
(max=0.80)
action = LEFT
reward = +0.0084
wins = 052 of 094 (0.55)
16 of last 20
(max=0.80)
action = UP
reward = +0.1208
wins = 052 of 094 (0.55)
16 of last 20
(max=0.80)
action = LEFT
reward = +0.1154
wins = 052 of 094 (0.55)
16 of last 20
(max=0.80)
action = UP
reward = +1.0000 EOE wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
action = DOWN
reward = +0.1441
wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
action = DOWN
reward = +0.1424
wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
action = DOWN
reward = +0.1406
wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
action = DOWN
reward = +0.1386
wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
action = DOWN
reward = +0.1365
wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
action = DOWN
reward = +0.1342
wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
action = RIGHT
reward = +0.0134
wins = 053 of 095 (0.56)
17 of last 20
(max=0.85)
备用参数与样本类似,您可以使用一些可选的命令行参数:$ ./fruit --width = 64 --height = 64 --episode_max_frames = 100当增加环境和像素阵列输入的尺寸时,episode_max_frames应该相应地增加,因为在情节暂停之前,代理将需要更多时间在更大的环境中穿过屏幕。3D模拟直到回购的这一点,环境都是二维的,即确认深度RL算法正在按照预期学习。为了将代理迁移到3D世界中,我们将使用机器人模拟器来模拟不同的自动机器,包括机器人手臂和漫游器,然后可以将其转移到真实世界的机器人。机器人手臂我们的第一个Gazebo环境训练机器人手臂触摸物体,而不需要明确的IK()。手臂的运动计划由网络内部学习。要开始,请从终端运行以下脚本:$ ./gazebo-arm.sh将学习与模拟挂钩的插件位于回购目录中。请参阅链接Gazebo与代码,并控制手臂关节。一旦您注意到手臂物剂会聚在物体上,您可以通过按T键盘上的按键启动TranslationGazebo中的模式,然后通过单击并拖动视口周围的物体,开始在场景周围移动物体。请注意,您需要移动物体,以便手臂仍能够到达它,因为手臂的旋转底座最初被限制在任一方向的行程约45度。流动站导航我们在Gazebo还有一个滑行转向火车,学习跟踪物体,同时避开其环境的墙壁,类似于场景。要启动流动站模拟,请运行以下脚本:$ ./gazebo-rover.sh按下Ctrl+T并订阅~/camera/link/camera/image主题以从相机中可视化场景。与手臂类似,一旦您注意到流动站一直在寻找物体(在这种情况下为绿色框),您可以通过T先按下,在场景周围移动物体。请注意,有一个情节超时类似于,所以如果不先在代码中增加流动站并重新编译,您不会希望将对象移动太远。连续控制我们一直使用的DQN代理是离散的,这意味着网络每个时间步选择一个输出神经元,然后用户明确地映射或定义对应于一个动作(通常按增量增加/减少位置或速度) 。这意味着对于机器人中的每个自由度,需要2个输出 - 一个是通过增量增加变量,另一个是减小它。在更复杂的现实世界中,同时控制所有自由度并使网络输出这些变量的精确值通常是有利的。例如,如果你想教一个人形行走(可以有20-40或更多的自由度),同时控制所有关节对于它的稳定性很重要。对于连续控制,存在一类更先进的深度强化学习者,称为Actor / Critic - 这是一个活跃的研究领域,最近得到了最新的最先进的解决方案,如,和。双足步行者为了在最具挑战性和困难的OpenAI健身房环境之一中演示持续学习者,在回购中包含了一个A3G演示,它启动了许多Gym实例,以便使用GPU并行快速学习。要启动A3G解算器,请从终端运行以下命令:$ cd jetson-reinforcement / python / A3G
$ python main.py --env BipedalWalkerHardcore-v2 --workers 8 --gpu-ids 0 --amsgrad True
- moduleCONV --stack-frames 4根据设置和系统资源的不同,通常需要90-120分钟的时间通过清除障碍和陷阱来掌握环境。如果您的PC或服务器中有多个GPU,则可以禁用渲染并增加工作线程的数量并指定其他设置gpu-ids以加速培训。附录:使用LUA默认情况下,回购利用PyTorch和Python构建。但是,Torch7和LUA脚本中也包含对编译标志的支持。该过程被编写为自动安装Torch7等依赖项,并从源代码构建项目。您可能需要在某个时间输入sudo密码。1.GitHub clone首先,确保构建工具$ sudo apt-get install git cmake
$ git clone http://github.com/dusty-nv/jetson-reinforcement2.配置构建$ cd jetson-reinforcement
$ mkdir构建
$ cd build
$ cmake ../ -DUSE_LUA = yes -DUSE_PYTHON = no这将启动构建诸如Torch之类的依赖关系,并且这对CUDA / cuDNN是有约束力的,这可能需要一些时间。3.编译$ cd jetson-inference / build
# omit如果pwd已经是来自步骤#2
$ make 根据体系结构,该软件包将被构建为armhf或aarch64,具有以下目录结构:|-build
where the application binaries are built to
where the headers reside
where the libraries are build to
where the application binaries are built to
where the headers reside
where the libraries are build to
验证Lua + Torch安装在或[下载程序包](#downloaded-the-package)之后,使用以下命令验证LuaJIT-5.1 / Torch7脚本环境:$ cd aarch64/bin
$ ./deepRL-console hello.lua
# verify Lua interpreter (consult if unfamiliar with Lua)
created new lua_State
opened LUA libraries
loading 'hello.lua'
HELLO from LUA!
my variable equals 16
multiply = 200
closing lua_State该命令将测试加载Torch7包和CUDA / cuDNN的绑定:$ ./deepRL-console test-packages.lua
# load Torch packages and bindings
created new lua_State
opened LUA libraries
loading 'test-packages.lua'
hello from within Torch/Lua environment (time=0.032163)
loading Lua packages...
loading torch...
loading cutorch...
cutorch.hasHalf == false
loading nn...
loading cudnn...
loading math...
loading nnx...
loading optim...
done loading packages. (time=5.234669)
closing lua_State这些脚本应该正常运行并验证Lua / Torch环境是否健全。deepRL控制台程序可以从命令行(CLI)启动用户的脚本。扮演LUA Q-Learner接下来,为了验证强化Q-learner学习它应该如何学习,让我们玩一个简单的游戏:半球或捕捉。$ ./deepRL-console catchDQN.lua启动上面的脚本应该开始你的Jetson玩捕捉游戏并实时绘制学习过程:每个时代都是一场比赛,球从球幕的顶部落到底部。在几百个时代之后,Q-learner应该在大多数时候开始接球。
没有更多推荐了,ArXiv最受欢迎开源深度学习框架榜单:TensorFlow第一,PyTorch第四
新智元报道
来源:Twitter等
作者:文强
【新智元导读】Kears作者Fran?ois Chollet刚刚在Twitter贴出最近三个月在arXiv提到的深度学习框架,TensorFlow不出意外排名第一,Keras排名第二。随后是Caffe、PyTorch和Theano,再次是MXNet、Chainer和CNTK。
Keras作者Fran?ois Chollet刚刚在Twitter贴出一张图片,是近三个月来arXiv上提到的深度学习开源框架排行:
TensorFlow排名第一,这个或许并不出意外,Keras排名第二,随后是Caffe、PyTorch和Theano,再次是MXNet、Chainer和CNTK。
Chollet在推文中补充,Kears的使用在产业界和整个数据科学圈中最占主流,产业既包括大公司也包括创业公司。不过,在研究社区,Keras的份额要小很多。
这个统计结果是使用Google Search Index得到的。
这个排名让人想起来之前Fran?ois Chollet晒的另外一次排名(时间范围是2017年4月到7月,综合Github上issue、fork、contributors等数据得到的活跃度),也是TensorFlow和Keras排名第一和第二。
不过,在Github的那次排名,MXNet、PyTorch的名次明显上升。
针对近三个月来arXiv的深度学习框架排名结果,有人评论,他很遗憾Theano排名如此靠后,Theano是他的第一个框架。
深度学习的图景总是在不断变化,Theano是第一个被广泛采用的深度学习框架,由Yoshua Bengio领导的MILA创建和维护。但2017年9月,MILA宣布将在2018年终止Theano的开发和维护。Theano的离开不禁让人感慨,这也是第一个退出舞台的流行框架。
TensorFlow性能并非最优,为何如此受欢迎?粉丝团!
在过去的几年里,出现了不同的开源Python深度学习框架,TensorFlow就属于其中典型,由谷歌开发和支持,自然引发了很大的关注。
但需要指出,根据香港香港浸会大学褚晓文教授团队在2017年推出深度学习工具评测的研究报告
《 基准评测 TensorFlow、Caffe、CNTK、MXNet、Torch 在三类流行深度神经网络上的表现(论文)》
,TensorFlow的性能在有些时候表现并非最佳:
仅用一块GPU,FCN上Caffe、CNTK和Torch比MXNet和TensorFlow表现更好;CNN上MXNet表现出色,尤其是在大型网络时;而Caffe和CNTK在小型CNN上同样表现不俗;对于带LSTM的RNN,CNTK速度最快,比其他工具好上5到10倍。
通过将训练数据并行化,这些支持多GPU卡的深度学习工具,都有可观的吞吐量提升,同时收敛速度也提高了。多GPU卡环境下,CNTK平台在FCN和AlexNet上的可扩展性更好,而MXNet和Torch在CNN上相当出色。
这一结果,反而凸显出TensorFlow和谷歌强大的号召力,以及已经形成的生态圈的积极拉动影响。
在2017年初的这份报告中,褚晓文教授指出,硬件和软件同样重要,仅仅有硬件是不够的,没有好的软件,硬件的效能发挥不出来,这也是为什么今天有这么多深度学习软件,它们的性能有如此大的差异。
“Torch是很流行的软件,2002年就有了,那时候还没有深度学习。后来把深度学习做进去了。2014年就是Caffe,微软2015年开源了CNTK,接下来谷歌也开源了他们相应的开发平台。第三行是它的粉丝数量,目前(2017年9月)TensorFlow的粉丝团是最庞大的,有6万多个关注,相对来讲,CNTK、Caffe加起来还没有TensorFlow有影响力。最底下是开发平台的维护情况,随着硬件的提升,新的算法的提出,每个软件都是要不断的更新换代的,TensorFlow的更新是非常频繁的,基本上每一两个月就会有一个新的更新,代表着他们对软件平台的投入。”
而Keras,则是谷歌在2017年宣布,将Keras作为TensorFlow的高级API。这意味着Keras被包含在TensorFlow版本中及时更新。除了TensorFlow,Keras也可以使用Theano或者CNTK作为后端。
其他框架和公司合纵连横——中国框架何时才能上榜?
ONNX最初由微软和Facebook联合发布,后来亚马逊也加入进来,并在12月发布了V1版本。ONNX是一个表示深度学习模型的开放格式。它使用户可以更轻松地在不同框架之间转移模型。例如,它允许用户构建一个PyTorch模型,然后使用MXNet运行该模型来进行推理。
ONNX由微软、亚马逊和Facebook等公司共同发起,宣布支持ONNX的公司还有AMD、ARM、华为、 IBM、英特尔、Qualcomm等。谷歌不在这个阵营中并不令人惊讶。ONNX从一开始就支持Caffe2,Microsoft Cognitive Toolkit,MXNet和PyTorch,但与其他开源项目一样,社区也已经为TensorFlow添加了一个转换器。
在你争我抢,合纵连横之下,深度学习框架的流行趋势似乎很难预测。不过,中国的开源框架,什么时候才能在这样的排名上显露自己的名字呢?
点击展开全文人工智能培训:
后使用快捷导航没有帐号?
人工智能教程:常见深度学习框架简介,告诉你为什么选择PyTorch
主题帖子积分
新手上路, 积分 19, 距离下一级还需 31 积分
新手上路, 积分 19, 距离下一级还需 31 积分
小编说:目前研究人员正在使用的深度学习框架不尽相同,本文介绍了6种常见的深度学习框架,PyTorch与他们相比又有哪些优势呢?
PyTorch的诞生
2017年1月,Facebook人工智能研究院(FAIR)团队在GitHub上开源了PyTorch,并迅速占领GitHub热度榜榜首。
作为一个2017年才发布,具有先进设计理念的框架,PyTorch的历史可追溯到2002年就诞生于纽约大学的Torch。Torch使用了一种不是很大众的语言Lua作为接口。Lua简洁高效,但由于其过于小众,用的人不是很多,以至于很多人听说要掌握Torch必须新学一门语言就望而却步(其实Lua是一门比Python还简单的语言)。
OK2xQF22lZNZQcXc.jpg (13.21 KB, 下载次数: 0)
13:02 上传
考虑到Python在计算科学领域的领先地位,以及其生态完整性和接口易用性,几乎任何框架都不可避免地要提供Python接口。终于,在2017年,Torch的幕后团队推出了PyTorch。PyTorch不是简单地封装Lua Torch提供Python接口,而是对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。
PyTorch一经推出就立刻引起了广泛关注,并迅速在研究领域流行起来。图1所示为Google指数,PyTorch自发布起关注度就在不断上升,截至日,PyTorch的热度已然超越了其他三个框架(Caffe、MXNet和Theano),并且其热度还在持续上升中。
XZ2ia2144ijayp4m.jpg (21.79 KB, 下载次数: 0)
13:02 上传
PyTorch 和 Caffe、Theano、MXNet 的 Google 指数对比(类别为科学)
常见的深度学习框架简介
随着深度学习的发展,深度学习框架如雨后春笋般诞生于高校和公司中。尤其是近两年,Google、Facebook、Microsoft等巨头都围绕深度学习重点投资了一系列新兴项目,他们也一直在支持一些开源的深度学习框架。
目前研究人员正在使用的深度学习框架不尽相同,有 TensorFlow 、Caffe、Theano、Keras等,常见的深度学习框架如图2所示。这些深度学习框架被应用于计算机视觉、语音识别、自然语言处理与生物信息学等领域,并获取了极好的效果。本部分主要介绍当前深度学习领域影响力比较大的几个框架,限于笔者个人使用经验和了解程度,对各个框架的评价可能有不准确的地方。
Z22yT2UriJE22URi.jpg (28.11 KB, 下载次数: 0)
13:02 上传
图 2 常见的深度学习框架
1 . Theano
Theano最初诞生于蒙特利尔大学 LISA 实验室,于2008年开始开发,是第一个有较大影响力的Python深度学习框架。
Theano 是一个 Python 库,可用于定义、优化和计算数学表达式,特别是多维数组(numpy.ndarray)。在解决包含大量数据的问题时,使用 Theano 编程可实现比手写 C 语言更快的速度,而通过 GPU 加速,Theano 甚至可以比基于 CPU 计算的 C 语言快上好几个数量级。Theano 结合了计算机代数系统(Computer Algebra System,CAS)和优化编译器,还可以为多种数学运算生成定制的 C 语言代码。对于包含重复计算的复杂数学表达式的任务而言,计算速度很重要,因此这种 CAS 和优化编译器的组合是很有用的。对需要将每一种不同的数学表达式都计算一遍的情况,Theano 可以最小化编译/解析的计算量,但仍然会给出如自动微分那样的符号特征。
Theano诞生于研究机构,服务于研究人员,其设计具有较浓厚的学术气息,但在工程设计上有较大的缺陷。一直以来,Theano因难调试、构建图慢等缺点为人所诟病。为了加速深度学习研究,人们在它的基础之上,开发了Lasagne、Blocks、PyLearn2和Keras等第三方框架,这些框架以Theano为基础,提供了更好的封装接口以方便用户使用。
日,在Theano 1.0正式版即将发布前夕,LISA实验室负责人,深度学习三巨头之一的Yoshua Bengio 宣布Theano即将停止开发:“Theano is Dead”。尽管Theano即将退出历史舞台,但作为第一个Python深度学习框架,它很好地完成了自己的使命,为深度学习研究人员的早期拓荒提供了极大的帮助,同时也为之后深度学习框架的开发奠定了基本设计方向: 以计算图为框架的核心,采用GPU加速计算。
2017年11月,LISA实验室在 GitHub 上开启了一个初学者入门项目,旨在帮助实验室新生快速掌握机器学习相关的实践基础,而该项目正是使用PyTorch作为教学框架。
点评:由于Theano已经停止开发,不建议作为研究工具继续学习。
2 TensorFlow
日,Google宣布推出全新的机器学习开源工具TensorFlow。 TensorFlow 最初是由 Google 机器智能研究部门的 Google Brain 团队开发,基于Google 2011年开发的深度学习基础架构DistBelief构建起来的。TensorFlow主要用于进行机器学习和深度神经网络研究, 但它是一个非常基础的系统,因此也可以应用于众多领域。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。
TensorFlow在很大程度上可以看作Theano的后继者,不仅因为它们有很大一批共同的开发者,而且它们还拥有相近的设计理念,都是基于计算图实现自动微分系统。TensorFlow 使用数据流图进行数值计算,图中的节点代表数学运算, 而图中的边则代表在这些节点之间传递的多维数组(张量)。
TensorFlow编程接口支持Python和C++。随着1.0版本的公布,Java、Go、R和Haskell API的alpha版本也被支持。此外,TensorFlow还可在Google Cloud和AWS中运行。TensorFlow还支持 Windows 7、Windows 10和Windows Server 2016。由于TensorFlow使用C++ Eigen库,所以库可在ARM架构上编译和优化。这也就意味着用户可以在各种服务器和移动设备上部署自己的训练模型,无须执行单独的模型解码器或者加载Python解释器。
作为当前最流行的深度学习框架,TensorFlow获得了极大的成功,对它的批评也不绝于耳,总结起来主要有以下四点。
过于复杂的系统设计,TensorFlow 在GitHub代码仓库的总代码量超过100万行。这么大的代码仓库,对于项目维护者来说维护成为了一个难以完成的任务,而对读者来说,学习TensorFlow底层运行机制更是一个极其痛苦的过程,并且大多数时候这种尝试以放弃告终。
频繁变动的接口。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,同时也间接导致了许多基于TensorFlow的第三方框架出现BUG。
接口设计过于晦涩难懂。在设计TensorFlow时,创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对普通用户来说难以理解。同一个功能,TensorFlow提供了多种实现,这些实现良莠不齐,使用中还有细微的区别,很容易将用户带入坑中。
文档混乱脱节。TensorFlow作为一个复杂的系统,文档和教程众多,但缺乏明显的条理和层次,虽然查找很方便,但用户却很难找到一个真正循序渐进的入门教程。
由于直接使用TensorFlow的生产力过于低下,包括Google官方等众多开发者尝试基于TensorFlow构建一个更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等数不胜数的第三方框架每隔几个月就会在新闻中出现一次,但是又大多归于沉寂,至今TensorFlow仍没有一个统一易用的接口。
凭借Google着强大的推广能力,TensorFlow已经成为当今最炙手可热的深度学习框架,但是由于自身的缺陷,TensorFlow离最初的设计目标还很遥远。另外,由于Google对TensorFlow略显严格的把控,目前各大公司都在开发自己的深度学习框架。
点评:不完美但最流行的深度学习框架,社区强大,适合生产环境。
Keras是一个高层神经网络API,由纯Python编写而成并使用TensorFlow、Theano及CNTK作为后端。Keras为支持快速实验而生,能够把想法迅速转换为结果。Keras应该是深度学习框架之中最容易上手的一个,它提供了一致而简洁的API, 能够极大地减少一般应用下用户的工作量,避免用户重复造轮子。
严格意义上讲,Keras并不能称为一个深度学习框架,它更像一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失灵活性。Keras最初作为Theano的高级API而诞生,后来增加了TensorFlow和CNTK作为后端。为了屏蔽后端的差异性,提供一致的用户接口,Keras做了层层封装,导致用户在新增操作或是获取底层的数据信息时过于困难。同时,过度封装也使得Keras的程序过于缓慢,许多BUG都隐藏于封装之中,在绝大多数场景下,Keras是本文介绍的所有框架中最慢的一个。
学习Keras十分容易,但是很快就会遇到瓶颈,因为它缺少灵活性。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。
点评:入门最简单,但是不够灵活,使用受限。
4 . Caffe/Caffe2
Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,核心语言是C++,它支持命令行、Python和MATLAB接口,既可以在CPU上运行,也可以在GPU上运行。
Caffe的优点是简洁快速,缺点是缺少灵活性。不同于Keras因为太多的封装导致灵活性丧失,Caffe灵活性的缺失主要是因为它的设计。在Caffe中最主要的抽象对象是层,每实现一个新的层,必须要利用C++实现它的前向传播和反向传播代码,而如果想要新层运行在GPU上,还需要同时利用CUDA实现这一层的前向传播和反向传播。这种限制使得不熟悉C++和CUDA的用户扩展Caffe十分困难。
Caffe凭借其易用性、简洁明了的源码、出众的性能和快速的原型设计获取了众多用户,曾经占据深度学习领域的半壁江山。但是在深度学习新时代到来之时,Caffe已经表现出明显的力不从心,诸多问题逐渐显现(包括灵活性缺失、扩展难、依赖众多环境难以配置、应用局限等)。尽管现在在GitHub上还能找到许多基于Caffe的项目,但是新的项目已经越来越少。
Caffe的作者从加州大学伯克利分校毕业后加入了Google,参与过TensorFlow的开发,后来离开Google加入FAIR,担任工程主管,并开发了Caffe2。Caffe2是一个兼具表现力、速度和模块性的开源深度学习框架。它沿袭了大量的 Caffe 设计,可解决多年来在 Caffe 的使用和部署中发现的瓶颈问题。Caffe2的设计追求轻量级,在保有扩展性和高性能的同时,Caffe2 也强调了便携性。Caffe2 从一开始就以性能、扩展、移动端部署作为主要设计目标。Caffe2 的核心 C++ 库能提供速度和便携性,而其 Python 和 C++ API 使用户可以轻松地在 Linux、Windows、iOS、Android ,甚至 Raspberry Pi 和 NVIDIA Tegra 上进行原型设计、训练和部署。
Caffe2继承了Caffe的优点,在速度上令人印象深刻。Facebook 人工智能实验室与应用机器学习团队合作,利用Caffe2大幅加速机器视觉任务的模型训练过程,仅需 1 小时就训练完ImageNet 这样超大规模的数据集。然而尽管已经发布半年多,开发一年多,Caffe2仍然是一个不太成熟的框架,官网至今没提供完整的文档,安装也比较麻烦,编译过程时常出现异常,在GitHub上也很少找到相应的代码。
极盛的时候,Caffe占据了计算机视觉研究领域的半壁江山,虽然如今Caffe已经很少用于学术界,但是仍有不少计算机视觉相关的论文使用Caffe。由于其稳定、出众的性能,不少公司还在使用Caffe部署模型。Caffe2尽管做了许多改进,但是还远没有达到替代Caffe的地步。
点评:文档不够完善,但性能优异,几乎全平台支持(Caffe2),适合生产环境。
MXNet是一个深度学习库,支持C++、Python、R、Scala、Julia、MATLAB及JavaScript等语言;支持命令和符号编程;可以运行在CPU、GPU、集群、服务器、台式机或者移动设备上。MXNet是CXXNet的下一代,CXXNet借鉴了Caffe的思想,但是在实现上更干净。在2014 年的NIPS 上,同为上海交大校友的陈天奇与李沐碰头,讨论到各自在做深度学习 Toolkits 的项目组,发现大家普遍在做很多重复性的工作,例如文件 loading 等。于是他们决定组建 DMLC【Distributied (Deep) Machine Learning Community】,号召大家一起合作开发 MXNet,发挥各自的特长,避免重复造轮子。
MXNet以其超强的分布式支持,明显的内存、显存优化为人所称道。同样的模型,MXNet往往占用更小的内存和显存,并且在分布式环境下,MXNet展现出了明显优于其他框架的扩展性能。
由于MXNet最初由一群学生开发,缺乏商业应用,极大地限制了MXNet的使用。2016年11月,MXNet被AWS正式选择为其云计算的官方深度学习平台。2017年1月,MXNet项目进入Apache基金会,成为Apache的孵化器项目。
尽管MXNet拥有最多的接口,也获得了不少人的支持,但其始终处于一种不温不火的状态。个人认为这在很大程度上归结于推广不给力及接口文档不够完善。MXNet长期处于快速迭代的过程,其文档却长时间未更新,导致新手用户难以掌握MXNet,老用户常常需要查阅源码才能真正理解MXNet接口的用法。
为了完善MXNet的生态圈,推广MXNet,MXNet先后推出了包括MinPy、Keras和Gluon等诸多接口,但前两个接口目前基本停止了开发,Gluon模仿PyTorch的接口设计,MXNet的作者李沐更是亲自上阵,在线讲授如何从零开始利用Gluon学习深度学习,诚意满满,吸引了许多新用户。
点评:文档略混乱,但分布式性能强大,语言支持最多,适合AWS云平台使用。
2015年8月,微软公司在CodePlex上宣布由微软研究院开发的计算网络工具集CNTK将开源。5个月后,日,微软公司在他们的GitHub仓库上正式开源了CNTK。早在2014年,在微软公司内部,黄学东博士和他的团队正在对计算机能够理解语音的能力进行改进,但当时使用的工具显然拖慢了他们的进度。于是,一组由志愿者组成的开发团队构想设计了他们自己的解决方案,最终诞生了CNTK。
根据微软开发者的描述,CNTK的性能比Caffe、Theano、TensoFlow等主流工具都要强。CNTK支持CPU和GPU模式,和TensorFlow/Theano一样,它把神经网络描述成一个计算图的结构,叶子节点代表输入或者网络参数,其他节点代表计算步骤。CNTK 是一个非常强大的命令行系统,可以创建神经网络预测系统。CNTK 最初是出于在 Microsoft 内部使用的目的而开发的,一开始甚至没有Python接口,而是使用了一种几乎没什么人用的语言开发的,而且文档有些晦涩难懂,推广不是很给力,导致现在用户比较少。但就框架本身的质量而言,CNTK表现得比较均衡,没有明显的短板,并且在语音领域效果比较突出。
点评:社区不够活跃,但是性能突出,擅长语音方面的相关研究。
7 . 其他框架
除了上述的几个框架,还有不少的框架,都有一定的影响力和用户。比如百度开源的PaddlePaddle,CMU开发的DyNet,简洁无依赖符合C++11标准的tiny-dnn,使用Java开发并且文档极其优秀的Deeplearning4J,还有英特尔开源的Nervana,Amazon开源的DSSTNE。这些框架各有优缺点,但是大多流行度和关注度不够,或者局限于一定的领域。此外,还有许多专门针对移动设备开发的框架,如CoreML、MDL,这些框架纯粹为部署而诞生,不具有通用性,也不适合作为研究工具。
为什么选择PyTorch
这么多深度学习框架,为什么选择PyTorch呢?
因为PyTorch是当前难得的简洁优雅且高效快速的框架。在笔者眼里,PyTorch达到目前深度学习框架的最高水平。当前开源的框架中,没有哪一个框架能够在灵活性、易用性、速度这三个方面有两个能同时超过PyTorch。下面是许多研究人员选择PyTorch的原因。
① 简洁:PyTorch的设计追求最少的封装,尽量避免重复造轮子。不像TensorFlow中充斥着session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的设计遵循tensor→variable(autograd)→nn.Module 三个由低到高的抽象层次,分别代表高维数组(张量)、自动求导(变量)和神经网络(层/模块),而且这三个抽象之间联系紧密,可以同时进行修改和操作。
简洁的设计带来的另外一个好处就是代码易于理解。PyTorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得PyTorch的源码十分易于阅读。在笔者眼里,PyTorch的源码甚至比许多框架的文档更容易理解。
② 速度:PyTorch的灵活性不以速度为代价,在许多评测中,PyTorch的速度表现胜过TensorFlow和Keras等框架 。框架的运行速度和程序员的编码水平有极大关系,但同样的算法,使用PyTorch实现的那个更有可能快过用其他框架实现的。
③易用:PyTorch是所有的框架中面向对象设计的最优雅的一个。PyTorch的面向对象的接口设计来源于Torch,而Torch的接口设计以灵活易用而著称,Keras作者最初就是受Torch的启发才开发了Keras。PyTorch继承了Torch的衣钵,尤其是API的设计和模块的接口都与Torch高度一致。PyTorch的设计最符合人们的思维,它让用户尽可能地专注于实现自己的想法,即所思即所得,不需要考虑太多关于框架本身的束缚。
④活跃的社区:PyTorch提供了完整的文档,循序渐进的指南,作者亲自维护的论坛 供用户交流和求教问题。Facebook 人工智能研究院对PyTorch提供了强力支持,作为当今排名前三的深度学习研究机构,FAIR的支持足以确保PyTorch获得持续的开发更新,不至于像许多由个人开发的框架那样昙花一现。
在PyTorch推出不到一年的时间内,各类深度学习问题都有利用PyTorch实现的解决方案在GitHub上开源。同时也有许多新发表的论文采用PyTorch作为论文实现的工具,PyTorch正在受到越来越多人的追捧 。
如果说 TensorFlow的设计是“Make It Complicated”,Keras的设计是“Make It Complicated And Hide It”,那么PyTorch的设计真正做到了“Keep it Simple,Stupid”。简洁即是美。
使用TensorFlow能找到很多别人的代码,使用PyTorch能轻松实现自己的想法。
《深度学习框架PyTorch:入门与实践》
EFMnGo46nM773b46.jpg (45.96 KB, 下载次数: 0)
13:02 上传
媲美TensorFlow的深度学习框架!实战Kaggle竞赛中经典项目、GAN生成动漫头像、AI滤镜、RNN写诗、图像描述任务,附赠源代码文件!
作者 :陈云
图书链接:http://item.jd.com/.html
查看:402&|&回复:0
人工智能培训:软证据的数学记录,以及杰弗里的破坏性' (A Mathematical Accoun
机器学习培训:用于无监督学习视觉特征的深度聚类(Deep Clustering for Unsupervised L
人工智能培训:为什么不让模块占主导地位 - 研究一个众所周知的模块化诱导问题领域的结
人工智能论文:扫描:用于视频人员重新识别的自我协作注意网络(SCAN: Self-and-Collabo
人工智能培训:评估波多黎各的电力和基础设施恢复情况(Assessment of electrical and i
深度学习培训:用机器学习促进组合问题建模(Boosting Combinatorial Problem Modeling
机器学习培训:利用高分辨率遥感影像学习可转移的土地利用分类深度模型(Learning Trans
深度学习培训:生物识别系统中光谱成像的广泛回顾:挑战与进步(An Extensive Review on
深度学习培训INENET:用于城市环境中众包高清地图建模的可缩放CNN(LineNet: a Zooma
深度学习培训:基于稀疏性的无监督医学图像分析卷积核心网络(Sparsity-based Convoluti
官方qq群:}

我要回帖

更多关于 pytorch 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信