开发 | 为个人深度学习机器选择合适的配置
AI科技评论按:对于那些一直想进行深度学习研究的同学来说,如何选择合适的配置一直是个比较纠结的问题,既要考虑到使用的场景,又要考虑到价格等各方面因素。
日前,medium上的一篇文章为我们详细描述了该如何为个人的深度学习机器选择配置,主要该进行哪些方面的考虑。
AI科技评论编译整理如下:
作为一名业余爱好者,在探索和解决深度学习问题时,亚马逊 EC2 实例的运行成本太高了。
在一开始,我采用的是 Reserved 实例收费模式,因为我对云生态系统不是很懂。
后来,在运行结构良好的实验时,Spot 实例也成了我的选择之一。但用这种方法去启动和执行实验往往会碰到问题,我主要会在为备份和恢复数据/进程设置环境时碰到问题。
很感谢 Alex Ramos 和 Slav Ivanov 提供的 Classic 和 24X7 版本的 EC2 Spotter 工具,这在使用 spot 实例时很有用。(如果你仍然使用 Spot 实例的话可以试试他们的提供的工具)
在使用亚马逊 EC2 实例大约6个月后,我意识到,长远来看,还是买一个属于自己的机器会更加便宜。买机器之后,我可以更好地控制实验,并且可能会取得比在云端更好的效果。
在互联网上进行详尽的调查之后,我下定决心买属于自己的机器,然后我开始研究如何为本地深度学习来选择组件。
如何选择深度学习的组件?这真的很困扰那些刚开始实验的新手。这要求用户拥有一些关于构建系统的基本知识,以保证较高的性价比。
这篇文章试图帮助刚开始进行深度学习的读者选择机器配置,在选择产品之前帮助他们了解更多参数。
开 始
首先,你必须定下你最大需要多少块GPU,如果你经常进行机器学习研究,那你可能需要更多 GPU,这可以帮助你并行运行多个任务,你可以同时尝试不同的模型结构、数据规范化、超参数等等。
我的建议:如果你是一个普通研究员/学生/业余爱好者,可以考虑双 GPU。如果你打算运行大型的模型,并参加像 ImageNet 那样需要大量计算的竞赛,你可能需要考虑多 GPU 结构。
一旦你想清楚自己想要进行哪种研究,接下来就可以考虑需要的 PCIe 通道数了。
双 GPU(最多两块GPU):24条 PCIe 通道(当使用共享 PCle 通道的 SSD 或同时使用两块 GPU 时,可能会出现延迟)
多 GPU (最多4 块 GPU): 40到44条 PCIe 通道
为什么首先考虑 PCIe 通道?
实际情况下,在对磁盘进行访问操作或数据增加时,数据流到GPU上会出现瓶颈。一块 GPU 需要16条 PCIe 通道才能满负荷运转。
这篇文章将着重为大家介绍双 GPU 系统,下次我也将带来多 GPU 系统的介绍。
双 GPU
1)主板
一旦确定了 PCIe 通道的需求,接下来就可以挑选主板芯片组了:
下表给出了在不同芯片组下可用 PCIe 通道的个数:
注:理想情况下,单个 GPU 发挥最优性能需要16个 PCIe 通道。
因此,即使 B150、B250、H110、H170、H270 这样的芯片组支持英特尔处理器,它们也很少用于深度学习,因为对于深度学习应用来说,需要更多的 PCIe 通道数。因此,首选芯片组如下:
Z170 — 支持第6/7代英特尔处理器。使用第7代可能需要BIOS更新。
Z270 — 支持第6/7代英特尔处理器。
(最新的) Z370 — 支持第8代英特尔处理器。
一旦你决定了芯片组,可以利用 PC Partpicker 来选择主板,下面是链接:
https://pcpartpicker.com/products/motherboard/
你需要注意的有:
- 外形规格(例如ATX,微型ATX,EATX等)
- PCIe slot 数(最小2个 slot)
- 最大支持内存(首选 64GB)
- 内存 slot 数(最小4个 slot)
- SSD 和 SATA slot 数(你可以考虑一下)
2)处理器
选择主板之后,因为有 socket 类型等的限制,处理器的选择范围就缩小了,CPU 的选择可能会进一步依赖于 GPU。正如前面提到的,对于深度学习应用来说,CPU 主要负责数据处理和与 GPU 的通信。因此,如果我们想在数据预处理中进行并行计算,那每个核的核数和线程数将至关重要。建议大家选择多核系统(最好是4核)来处理这些任务。
需要注意的有:
- Socket 类型
- 核数量
- 费用
PS:一些处理器中可能不带散热风扇。
下面是用 PC Partpicker 选择处理器的地址:
https://pcpartpicker.com/products/cpu/#m=21
内 存
当处理大数据集时,它们可能需要存储于内存中。RAM 的大小决定了内存中可以容纳的数据集的量。
对于深度学习应用来说,至少选择 16G 的内存(Jeremy Howard 建议选择 32G 的内存)。Clock 越高越好,建议大家最小选择 2400 MHZ的。
要记住,让单个 stick 的内存更大!
因为这可以使得剩余 slot 的扩展空间更大。我看到很多人用4*8GB的内存取代2*16GB的内存,仅仅只是因为这样价格比较便宜,但最后会导致没有升级空间。
存储器
SSD变得越来越便宜,速度也更快了,所以HDD的价格也在持续下降。
最好有一个小容量的SSD和一个大容量的HHD。SSD倾向于存储和检索被经常使用的数据。HDD则主要用来存储将来会使用的数据。
SSD ——存储使用中的数据,价格昂贵,推荐最小买 128GB 的
HDD ——存储各种用户数据,价格相对来说会便宜一点,推荐最小买 2TB,7200RPM 的
GPU
GPU 是配置用于深度学习的机器的核心,它们决定了在训练神经网络过程中获得的性能增益。
深度学习中涉及的大部分计算都是矩阵运算,所以在相同的并行模式下,GPU 的表现胜过传统 CPU。
GPU 内部有很多叫核的小型计算单元,单元中的线程能保证矩阵运算更加快速。GPU 的内存带宽也可以使得它支持对大量数据进行操作。
Tim Dettmers之前写过一篇关于如何选择用于深度学习的 GPU 的文章,这篇文章很有代表性,一旦有了新卡他也会更新,在选择 GPU 之前大家可以看下他的这篇文章。链接如下:
http://timdettmers.com/2017/04/09/which-gpu-for-deep-learning/
下面是他关于 GPU 选择的建议:
- 最佳 GPU 选择:Titan Xp
- 高效但昂贵:GTX 1080 Ti, GTX 1070, GTX 1080
- 高效且便宜:GTX 1060 (6GB)
- 要是处理的数据集在 250 GB 以上,那么你的选择最好是 GTX Titan X (Maxwell)、 NVIDIA Titan X Pascal 或 NVIDIA Titan Xp
- 要是资金不足,那就选择 GTX 1060 (6GB)
- 完全没钱:GTX 1050 Ti (4GB)
- 参加kaggle比赛:常规比赛选择 GTX 1060 (6GB),深度学习类型的比赛,选择GTX 1080 Ti
- 经常参加比赛的计算机视觉研究人员:NVIDIA Titan Xp,不需要升级现有的 Titan X (Pascal 或 Maxwell)
- 研究人员:GTX 1080 Ti。在进行类似于自然语言处理的任务时,也可以选择 GTX 1070 或 GTX 1080,大家可以检查下当前模型的内存需求如何。
- 想要构造 GPU 集群:这有点复杂,你可以点击如下链接参考 http://timdettmers.com/2014/09/21/how-to-build-and-use-a-multi-gpu-system-for-deep-learning/
- 刚刚开始想要认真进行深度学习的研究:GTX 1060 (6GB)。根据你接下来选择的领域(初创公司,Kaggle,研究,深度学习应用),卖掉之前的 GTX 1060,然后购买更合适的。
- 抱着试一试的心态来进行深度学习研究:GTX 1050 Ti (4或2GB)
如果预算有限,强烈推荐初学者买 1060 6GB 的 GPU,新旧都可以。
如果预算可以增加一点,那么建议买最近发布的 1070ti (大约430美元),它与 1080 的性能几乎一样,但价格较低(几乎与 1070 相同)。
不要去买 1070,除非你有站得住脚的理由。如果你有足够的钱,那就买 1080ti。
再啰嗦一遍,如果你真的很热衷于进行研究,那么最好买2块 1070ti,而不是1块 1080ti,这将会给你带来极大的灵活性。
via:medium
- 使用 React 和 Django REST Framework 构建你的网站
- 小程序中带图片modal的实现
- 号称「永远不会输钱」的马丁格尔策略
- 小程序中图片高度等比缩放
- 三分钟使用 Python 处理 Nginx 日志
- Python,Shell 和 三个标准文件
- 【微信官方】获取用户信息方案介绍
- 【实战】如何使用 Python 从 Redis 中删除 4000万 KEY
- [多图] DevOps 也要懂点 Excel
- [实战篇] Python 运维中使用并发
- PHP数据结构(十) ——有向无环图与拓扑算法
- PHP数据结构(十一) ——图的连通性问题与最小生成树算法(1)
- 优化 MySQL: 3 个简单的小调整
- PHP数据结构(十一) ——图的连通性问题与最小生成树算法(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- airtest本地连接和远程连接
- Flutter基础widgets教程-TextField篇
- poco对象生成的几种方式根据你使用不同的ui决定
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
- SpringMVC系列之SpringMVC快速入门 MVC设计模式介绍+什么是SpringMVC+ SpringMVC的作用及其基本使用+组件解析+注解解析
- [Go] GoAdminGroup/go-admin的安装和运行
- 算法篇:滑动窗口(一)
- PHP代码审计02之filter_var()函数缺陷
- Flutter基础widgets教程-Tooltip篇
- 08 . Jenkins之SpringCloud微服务+Vue+Docker持续集成
- Spark 模型选择和调参
- Spark Parquet详解
- Spark 频繁模式挖掘
- Flutter基础widgets教程-WidgetsApp篇
- Js中Number对象