当前位置: 首页 > 编程日记 > 正文

免费GPU哪家强?谷歌Kaggle vs. Colab

640?wx_fmt=jpeg

作者 | Jeff Hale
译者 | Monanfei
责编 | 夕颜
出品 | AI科技大本营(id:rgznai100)

谷歌有两个平台提供免费的云端GPU:Colab和Kaggle, 如果你想深入学习人工智能和深度学习技术,那么这两款GPU将带给你很棒学习的体验。那么问题来了,我们该选择哪个平台进行学习和工作呢?接下来,本文将介绍如何比较硬件规格和探索优缺点的差异;本文还将基于一个计算机视觉任务,比较在不同平台下,使用迁移学习、混合精度训练、学习率模拟退火以及测试时间增广等操作时,所需的训练时间。基于上述内容,你将对这两个平台的GPU性能,有一个更加全面和清楚的了解。

640?wx_fmt=jpeg

Kaggle 和 Colab 是两个非常相似的产品,它们都具有如下特性:

  • 提供免费的GPU

  • 在浏览器中使用Jupyter进行交互——但是它们都有自己独特的风格

  • 旨在促进机器学习的协作

  • 都是谷歌的产品

  • 不是十全十美,但是在多数场景下都适用,尤其是在入门深度学习的时候

  • 官方文档对硬件规格的描述较为简略

最后一项是本文研究的重点,但不幸的是,Kaggle和Colab都不提供对使用环境的详细描述,而且官方文档(https://www.kaggle.com/docs/kernels#technical-specifications)往往很过时,跟不上平台硬件更新的速度。除此之外,平台IDE的小控件虽然提供了一些信息,但是这往往不是我们真正想要的。接下来,本文展示常用的profiler命令,该命令可以查看平台环境的信息。

在正式开始之前,我们得先了解一些GPU的背景知识。

什么是GPU?

GPU是图形处理单元的简称,最初GPU是为加速视频游戏的图形所开发的专用芯片,它们能够快速的完成大量的矩阵运算。该特性也使得GPU在深度学习领域崭露头角,有趣的是,出于相同的原因,GPU也是挖掘加密货币的首选工具。

640?wx_fmt=jpeg


Nvidia P100 GPU


为什么要使用GPU?

使用大显存的GPU来训练深度学习网络,比单纯用CPU来训练要快得多。想象一下,使用GPU能够在十几分钟或者几个小时内,获得所训练网络的反馈信息,而使用CPU则要花费数天或者数周的时间,GPU简直是棒呆了。

硬件规格

2019年三月初,kaggle将它的GPU芯片从Nvidia Tesla K80升级到了Nvida Tesla P100,然而Colab还在用K80。有关Nvidia 芯片类型的讨论,可以参见这篇文章(https://towardsdatascience.com/maximize-your-gpu-dollars-a9133f4e546a)。

有很多不同方法可以查看硬件的信息,两个比较常用的命令是!nvidia-smi和 !cat/proc/cpuinfo,分别用于查看GPU和CPU的信息。即使你想用GPU来训练模型,CPU也是不必可少的,因此了解CPU的信息是必不可少的。

下图所示为Kaggle和Colab的硬件配置信息,更多内容可以参考谷歌官方文档(https://docs.google.com/spreadsheets/d/1YBNlI9QxQTiPBOhsSyNg6EOO9LH2M3zF7ar88SeFQRk/edit?usp=sharing)

640?wx_fmt=png

两个平台上的内存大小和磁盘空间,可能会存在一些令人疑惑的地方。一旦在Kaggle或者Colab上安装软件并开始进程,它的内存和磁盘可用量就会发生变化了。我们可以用!cat/proc/meminfo 命令来测试这种容量变化,如下图所示。

640?wx_fmt=png

Total表示总内存容量,Available表示启动后,没有任何其他进程运行的情况下,实际观察到的内存容量。从上图可以看到,我们自己测量的值和Colab或Kaggle的IDE控件面板中显示的很相似,但是并不完全匹配,如下图所示。

640?wx_fmt=png


Mouseover in Colab


640?wx_fmt=png


Kaggle Sidebar

上图显示的是Kaggle的内核Colab Notebook中的硬件规格信息,请注意,在开始前一定要确保开启了GPU的功能。

还有一点值得注意,使用命令行查看GPU的硬件规格时,系统返回值的单位是Mebibytes,该单位和Megabytes(兆字节)相似但并不等同。通过谷歌搜索相应信息,可以将Mebibytes转化为Megabytes。

Kaggle 的widget(小部件)显示,实际使用的磁盘空间比前文调研的要小得多,这是因为,无论理论上的磁盘总量是多少,Kaggle都会限制实际能够使用的磁盘空间。

在官方文档中Kaggle声明,用户拥有9个小时的使用时间,然而,对于每个会话,内核环境最多只会在窗口上显示6个小时。值得注意的是,重新启动内核会重新启动时钟。此外,如果用户在60分钟内没有任何操作,Kaggle会将会话重启。

Colab为用户提供12小时的执行时间,但是如果闲置时间超过90分钟,Colab就会将你踢掉。

接下来就要进入本文的重点了:训练一个深度学习网络,到底会花费多少时间。

计算机视觉任务下的速度比较

本文用一个图像分类的任务来比较Kaggle和Colab的计算性能。该任务的目标是构建一个深度学习模型,对猫狗的图像进行分类。数据集包含25000张图像,猫和狗的样本数是均衡的。将数据集分为两部分,其中23000张图像用于训练,另外2000张用于验证。数据集链接此(https://www.kaggle.com/lingjin525/dogs-and-cats-fastai)

640?wx_fmt=png


Cat and dog images from the dataset

本文用FastAI库构建了一个卷积神经网络,并以ResNet30为基础运用迁移学习训练该模型。模型的训练使用了以下几个技巧,分别是数据增广和学习率退火。在模型的测试阶段,本文使用测试时间增广技术来构建测试集。本节的代码改编自FastAI的示例(https://github.com/fastai/fastai/blob/master/examples/dogs_cats.ipynb)。

代码分别在KaggleColab上的实施。Batch size 设为16,FastAI的版本是1.0.48。使用FastAI的内置分析器,统计训练和测试的总时间,两平台所用的时间如下。

640?wx_fmt=gif

在两个平台中,模型的验证精度都超过了99%,三次迭代的时间在Kaggle中是11:17分钟,而Colab中为19:54分钟。Kaggle的运行环境性能,从速度上看,比Colab要快40%。

Batch Size

在Kaggle中,我们需要将batch size从64降低到16,才能使模型成功进行训练。如果batch size过大,会导致运行错误,该错误似乎是由于Docker容器中的共享内存设置得太低才引起的。有趣的是,作者在2018年底向Colab提出了这个问题(https://github.com/googlecolab/colabtools/issues/329),Colab在一周内便修复了这个问题。然而,截止2019年3月中旬,Kaggle依然存在该问题

接下来,我们将Colab中的batch size改为256,对模型进行两次迭代训练。上述的改变导致平均运行时间变成了18:38分钟。将batch size改为64,同样进行两次迭代训练,此时得到的平均运行时间为18:14分钟。这表示,当batch size大于16的时候,Colab能够缩减运行的时间。

尽管如此,对于本节中的任务而言,较小的batch size并不是一个值得深究的大问题,有关参数设置的讨论,可以参见这篇文章(https://arxiv.org/abs/1804.07612)。

当我将Colab上的batch size设为256,然后开始训练模型时,Colab抛出了一个警告,其中写道:我正在使用的GPU具有11.17GB的显存。具体如下图所示。

640?wx_fmt=png

这个警告非常棒,但是基于前文的分析,我们已经了解了Gibibytes和Gigabytes(https://www.gbmb.org/gib-to-gb)之间的区别。前文中讲到,Colab有11.17 Gibibytes(12 GB)的显存,这显然和警告中说的11.17GB矛盾。尽管如此,如果Colab提示你超出内存了,那就是超出内存了。因此batch size设为256,可能就是该任务下Colab的极限了。

混合精度训练

接下来,我们使用了混合精度训练,该训练方式能够有效地降低训练时间。混合精度训练在某些可能的情况下,会使用16位精度的数值代替32位的数值,来进行计算。Nvidia声称使用16位精度,可以使P100的吞吐量翻倍。

有关混合精度FastAI模型的介绍可以参见这篇文章(https://docs.fast.ai/callbacks.fp16.html)。请注意,在使用测试时间增广进行预测之前,我们需要将FastAI学习器对象设置为32位模式,这是因为torch.stack暂时不支持半精度。

通过在Colab上使用混合精度进行训练,在batch size 为16的情况下,平均运行时间为16:37分钟。显然,我们成功的缩减了运行时间。

然而,在Kaggle上实施混合精度训练,总的运行时间却增加了一分半,达到了12:47分钟。我们并没有改变硬件规格,而且得到的验证精度都达到了99%以上,这就很有趣了。

640?wx_fmt=gif

通过调查发现,Kaggle的默认包中的torch和torchvision的版本都很老,将它们的版本更新到和Colab上的一样后,Kaggle的运行时间并没有改变。但是这一个发现表明,Colab上默认包的版本比Kaggle更新的要快。

前文提到的硬件差异,似乎并不是导致Kaggle混合精度性能不佳的原因。那么软件差异似乎是答案,我们观察到,两平台唯一的软件差异就是,Kaggle使用CUDA 9.2.148 和 cuDNN 7.4.1,而Colab 使用CUDA 10.0.130 和 cuDNN 7.5.0。

CUDA是Nvidia的API,可以直接访问GPU的虚拟指令集。cuDNN是Nvidia基于CUDA的深度学习原型库。根据Nvidia的这篇文章,Kaggle的软件应该可以提高P100的速度。但是,正如cuDNN更改说明(https://docs.nvidia.com/deeplearning/sdk/cudnn-release-notes/rel_750.html#rel_750)中所示,阻止加速的bug是定期排查和修复的,那么kaggle在混合精度训练上表现不佳,可能是因为bug修复不及时所导致的吧。

既然如此,我们只好等待Kaggle升级CUDA和cuDNN,看看混合精度训练是否会变得更快。如果使用Kaggle,还是推荐你采用混合精度训练(虽然速度并不会得到提升)。如果使用Colab,当然采用混合精度训练更佳,但是要注意batch size不要设置得太大。

优缺点对比

谷歌是一家希望您支付GPU费用的公司,天下没有免费的午餐。

640?wx_fmt=png

Colab和Kaggle当然会有一些令人沮丧的问题。例如,两个平台运行时断开连接的频率太高,这令我们非常沮丧,因为我们不得不重启会话。

在过去,这些平台并不能总保证你有GPU可以用,但是现在却可以了。接下来让我们一起看看,Colab和Kaggle的各自的优缺点吧。

640?wx_fmt=png

Colab

优点

  • 能够在Google Drive上保存notebook

  • 可以在notebook中添加注释

  • 和GIthub的集成较好——可以直接把notebook保存到Github仓库中

  • 具有免费的TPU。TPU和GPU类似,但是比GPU更快。TPU是谷歌自行开发的一款芯片,但不幸的是,尽管Colab意在整合PyTotch和TPU,但TPU对PyTorch的支持仍不太友好。如果使用TensorFlow进行编程,而不是使用FastAI/Pytorch编程,那么在Colab上使用TPU可要比在Kaggle上使用GPU快多了。

缺点

  • 部分用户在Colab中的共享内存较小。

  • 谷歌云盘的使用较为麻烦。每个会话都需要进行身份验证,而且在谷歌云盘中解压文件较为麻烦。

  • 键盘快捷键和Jupyter Notebook中不太一样。具体对比可以参见这里

640?wx_fmt=png

Kaggle

优点

  • Kaggle社区有利于学习和展示你的技能

  • 在Kaggle上发布你的工作,能够记录一段美好的历史

  • Kaggle和Jupyter notebook的键盘快捷键基本相同

  • Kaggle有很多免费数据集

缺点

  • Kaggle一般会自动保存你的工作,但是如果你没有提交工作,然后重新加载你的页面,你的工作很有可能丢失。

  • 就像前面提到的,在Kaggle中,Docker容器中的PyTorch共享内存较低。在本次图像分类任务中,如果设置batch size的大小超过16,那么系统就会报错: RuntimeError: DataLoader worker (pid 41) is killed by signal: Bus error。

  • Kaggle内核通常看起来有些迟钝。

结论

Colab和Kaggle都是开展云端深度学习的重要资源。我们可以同时使用两者,例如在Kaggle和Colab之间相互下载和上传notebook。

Colab和Kaggle会不断更新硬件资源,我们可以通过比较硬件资源的性能,以及对编程语言的支持,选择最优的平台部署代码。例如,如果我们要运行一个密集的PyTorch项目,并且期望提高精度,那么在Kaggle上开发可能更加适合。

如果我们希望更加灵活的调整batch size 的大小,Colab可能更加适用。使用Colab,我们可以将模型和数据都保存在谷歌云盘里。如果你用TensorFlow编程,那么Colab的TPU将会是一个很好的资源。

如果需要更多的时间来编写代码,或者代码需要更长的运行时间,那么谷歌的云平台的性价比可能更高。

原文地址:
https://towardsdatascience.com/kaggle-vs-colab-faceoff-which-free-gpu-provider-is-tops-d4f0cd625029

精彩推荐



6月29-30日,2019以太坊技术及应用大会 特邀以太坊创始人V神与以太坊基金会核心成员,以及海内外知名专家齐聚北京,聚焦前沿技术,把握时代机遇,深耕行业应用,共话以太坊2.0新生态。


扫码或点击阅读原文,既享优惠购票!


640?wx_fmt=jpeg


推荐阅读

  • Python从入门到精通,这篇文章为你列出了25个关键技术点(附代码)

  • 基础必备 | Python处理文件系统的10种方法

  • B站超全分享!2万人收藏的免费计算机科学速成课

  • 如何正确的获取数据?

  • 苹果 SwiftUI 踢馆谷歌 Flutter!

  • 惊!为拯救美国落伍的 STEM 教育,纷纷出手教老师编程?!

  • 超级黑幕:开发者千万别被算法迷惑了!

  • 程序员爬取 42 年高考数据,告诉你高考为什么这么难?

  • 把病毒写到区块链上可以永远不死? 我们做了一个大胆的实验…… | 技术头条

  • 新一代私有云来了!看透基于开源生态的产品化


640?wx_fmt=png


点击阅读原文,查看更多精彩内容。

相关文章:

【SVN】svn“E155017工作副本的参考文件损坏、E200014文件校验和不匹配”的解决方法

1、问题描述 在执行svn提交时报错 svn: E155017: 工作副本的参考文件损坏 svn: E200014: ‘test.cpp’ 的文件校验和不匹配: 期望:xxxx 实际:xxxx 2、解决方法 2.1 拷贝 最好将提交的项目拷贝一份; 2.2 删除 使用svn rm --k…

QT程序启动加载流程简介

1. QT应用程序启动加载流程简介1.1 QWS与QPA启动客户端程序区别1.1.1 QWS(Qt Window System)介绍QWS(Qt Windows System)是QT自行开发的窗口系统,体系结构类似X Windows的C/S结构。QWS Server在物理设备上显示,QWS Client实现界面,两者…

QQ2012 Under Ubuntu

下载地址: QQ2012 Under Ubuntu转载于:https://www.cnblogs.com/ismdeep/archive/2012/08/09/2630067.html

25亿布局大湾区,创新工场的AI下一站

2019年6月5日,创新工场大湾区总部正式开业启动,集“产业投资AI 研究院商业赋能落地”三个功能为一体。当天创新工场还首次分享人工智能工程院成立两年来的成绩单,创新奇智的大湾区布局,并发布大湾区人才战略。创新工场也正式宣布第…

【TX2】TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口

1、简述 TX2开发板系统默认串口有ttyS0(调试口)、ttyTHS1、ttyTHS2、ttyTHS3,通过修改设备树文件,可以新增三个串口。 2、设备树 设备树中关于串口部分的描述 2.1 基础配置 注意:在这里状态都配置成禁止&#xff…

unix的发展

转载http://blog.51cto.com/1193432/1671058转载于:https://www.cnblogs.com/vwei/p/9588823.html

让你的输入框使用Google云语音输入技术

2019独角兽企业重金招聘Python工程师标准>>> 只需一行代码,你的网站上面输入框(input),直接可以在谷歌浏览器(chrome)上面使用Google的云语音输入技术。 在你的输入框input的HTML属性里面&#…

速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条

作者 | Daniel Bolya Chong Zhou Fanyi Xiao Yong Jae Lee译者 | 刘畅责编 | Jane出品 | AI科技大本营(id:rgznai100)【导读】在论文《YOLACT:Real-time Instance Segmentation》中,作者提出了一种简洁的实时实例分割全…

JSP内置对象基础知识小结

JSP提供9大内置内象:一、request内象:封装了由客户端生成的HTTP请求的所有细节,主要包括了http头信息,系统信息,请求方式,请求参数等。1、获取访问请求参数:request.getParameter("arg&quo…

一个正执行的程序如何启动另一新程序并关闭现执行程序

最简单的方法有两个函数即可实现: //启动新程序WinExec("存放另一新程序的路径", SW_SHOW);//关闭现执行软件 ExitThread(0); 若在win ce 下,用WinExec这个函数就不对了,那时就应该用ShellExecuteEx了。 SHELLEXECUTEINFO ShExecIn…

【android】java.lang.NoClassDefFoundError或classnotfount等异常错误

在android上开发,当导入一个外部的包,可能会出现这类错误,我已经两次碰到了,一次是用科大讯飞的android开发包,另一次是用Jsoup包(html 解析)。 解决方案: 先去掉加入的外部包 不要把…

Java面试题(一)部分题目

博主马上要面对几家公司的面试,故自己准备了点面试题,仅供参考! 1,线程的创建的方式:答:1,继承Thread(注意,此类其实也是实现了Runnable接口的),2,实现Runnable接口2,1. …

在win ce中如何使正在运行的软件自动升级更新

创建两个独立的程序A和B:A是现正在运行的程序,B是用于辅助新版本的A覆盖旧版A 在客户端先运行A,使A提供从服务器端下载新版A放于一临时文件夹中,并运行B,关闭A; 运行的B用于执行:用新版A覆盖旧…

刘铁岩:AI打通关键环节,加快物流行业数字化转型

导语:近日,在微软亚洲研究院创新论坛上,微软亚洲研究院副院长刘铁岩分享了关于“AI物流”行业的实践经验。以下为其发言内容。 随着时代的发展,人工智能成为了决定性的技术,我们所谈的企业数字化转型也正在从“互联网”…

Unity的三种Interceptor

Unity默认提供了三种拦截器:TransparentProxyInterceptor、InterfaceInterceptor、VirtualMethodInterceptor。 TransparentProxyInterceptor:代理实现基于.NET Remoting技术,它可拦截对象的所有函数。缺点是被拦截类型必须派生于MarshalByRe…

Python编写循环的两个建议 | 鹅厂实战

作者 | piglei(腾讯高级工程师)转载自腾讯技术工程知乎专栏循环是一种常用的程序控制结构。我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行。而“循环”,则是实现让…

作为JavaScript开发人员,这些必备的VS Code插件你都用过吗

本文翻译自:https://www.sitepoint.com/vs-code-extensions-java-developers/转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。如今,Visual Studio Code无疑是最流行的轻量级…

matlab常遇小问题汇总

1、如何注释掉多行: 同时注释掉多行,有2种方法可行: (1)、选中所有要注释的行,按快捷键"Ctrl R" 或者 选择工具菜单"Text --> Comment"; 如果释放所有要注释的行,则按快捷键"Ctrl T&qu…

《几何与代数导引》习题1.35.4

求直线之间的距离$l_1:\frac{x1}{-1}\frac{y-1}{3}\frac{z5}{2}$.$l_2:\frac{x}{3}\frac{y-6}{-9}\frac{z5}{-6}$.解:点$q(-1,1,-5)$在直线$l_1$上,点$p(0,6,-5)$在直线$l_2$上.$\vec{pq}(-1,-5,0)$.直线$l_1$的方向向量为$(-1,3,2)$,直线$l_2$的方向向量…

深度学习难,这本书让你轻松学深度学习

深度学习在短短几年之内便让世界大吃一惊。它非常有力地推动了计算机视觉、自然语言处理、自动语音识别、强化学习和统计建模等多个领域的快速发展。随着这些领域的不断进步,人们现在可以制造自动驾驶的汽车,基于短信、邮件甚至电话的自动回复系统&#…

matlab中用于小数取整的函数的用法

matlab中小数取整的函数大约有四个:floor、ceil、round、fix 若 A [-2.0, -1.9, -1.55, -1.45, -1.1, 1.0, 1.1, 1.45, 1.55, 1.9, 2.0]; floor:朝负无穷方向靠近最近的整数; floor(A) ans -2 -2 -2 -2 -2 1 1 1 1 …

SQLServer之删除约束

使用SSMS数据库管理工具删除约束 1、连接数据库,选择数据表-》展开键或者约束-》选择要删除的约束-》右键点击-》选择删除。 2、在删除对象弹出框中-》点击确定。 3、刷新表-》展开键或者约束-》查看结果。 使用T-SQL脚本删除约束 语法: --声明数据库使用…

新建silverlight项目提示未将对象设置到实例解决方案

1.打开 visual studio 命令提示 输入一下命令 2.devenv /resetskippkgs 这条命令会启动visual stuio 关闭visual studio然后输入下面的命令3.devenv /setup

毕业十年后,我忍不住出了一份程序员的高考试卷

作者 | 程序员小吴转载自公众号五分钟学算法(ID: CXYxiaowu)一、选择题(共计 50 分)1、在下列四种排序算法,只有( )是一种不稳定排序A、冒泡排序B、选择排序C、插入排序D、归并排序2、一个数组&…

查看matlab中函数源代码的方法

有几种方法可以实现查看matlab里自带函数的源代码: 在命令窗口中输入: (1)、type 函数名(如 type rgb2gray 或者 type rgb2gray.m):即可在命令窗口中显示此函数的源代码; (2)、open 函数名(如 open rgb2gray 或者 open rgb2gray.m):即可打开…

Watir-webdriver处理table

最近大脸猫同学给了我一个popup的demo,让我试着定位弹出窗口中的按钮元素。在研究过程中,发现webdriver与watir代码有区别,一度让我很郁闷,在网上也找不到相应的解决方案,刚才code运行成功,在这记一笔&…

PyTorch Hub发布获Yann LeCun强推!一行代码调用经典模型

作者 | Team PyTorch译者 | Monanfei责编 | 夕颜出品 | AI科技大本营(ID: rgznai100)导读:6月11日,Facebook PyTorch 团队推出了全新 API PyTorch Hub,提供模型的基本构建模块,用于提高机器学习研究的模型复…

【会议纪要】非洲新经济-线下沙龙分享

沙龙 主题: 《解开非洲新经济神秘面纱》 时间: 2018年09月08日 14:00 ~ 15:00 地点: 杭州丰潭路 UXCoffee 背景: 随着中非合作峰会召开,非洲发展潜力越来越受到关注。。。许多人眼中的非洲是贫穷…

图像处理和图像识别中常用的matlab函数

下面仅给出函数的大概意思,详细用法见: help 函数名 或 matlab help 1、imread:read image from graphics file; 2、imshow:display image in Handle Graphics figure; 3、imwrite:write image…

Powershell管理Active Directory 复制和拓扑

Powershell管理Active Directory 复制和拓扑 Active Directory 的 Windows PowerShell (AD) 支持复制和拓扑管理。它包含了管理复制、站点、域和林、域控制器和分区的功能。过去的管理工具(如 AD 站点和服务管理单元与 repadmin.exe)的用户将发现如今也可…