职场小钢炮 职场小钢炮男主角( 二 )


数据生成/爬取(网络I/O, CPU速度, L3 Cache/内存)
数据清洗(CPU速度, 内存)
数据缓存/保存(内存大小,存储I/O)
数据加载进图(内存大小,存储I/O,PCI-E带宽,GPU显存)
根据图Backward一轮(GPU速度)
Forward一轮给出当前batch预测(GPU速度)
根据预测给出当前batch训练集精度(CPU速度,BLAS指令集优化)
Forward一轮给出当前epoch在测试集预测(GPU速度)
根据预测给出当前epoch在测试集的精度(CPU速度,BLAS指令集优化)
保存模型中间点(存储I/O)
for i in num_of_epoch:
for k in num_of_batch:
for j in num_of_batch_size:
数据生成/爬取(网络I/O, CPU速度, L3 Cache/内存)
数据清洗(CPU速度, 内存)
数据缓存/保存(内存大小,存储I/O)
数据加载进图(内存大小,存储I/O,PCI-E带宽,GPU显存)
根据图Backward一轮(GPU速度)
Forward一轮给出当前batch预测(GPU速度)
根据预测给出当前batch训练集精度(CPU速度,BLAS指令集优化)
Forward一轮给出当前epoch在测试集预测(GPU速度)
根据预测给出当前epoch在测试集的精度(CPU速度,BLAS指令集优化)
保存模型中间点(存储I/O)
除了更多的把走网络I/O的步骤移动到准备阶段是一个很明显的优化点以外,你会发现,一旦作为数据缓存的内存容量不够大,你的物理存储I/O马上就会成为下一个瓶颈 。尤其图片一般来说还都是小文件,而固态硬盘(SSD)对小文件的优化比机械硬盘8.9ms随机寻道一次的速度不知道超越了几个数量级(具体),如果你真的优化不了数据训练阶段的结构,那你为什么不花多一点的钱提高这个物理存储IOPS的随机寻道性能呢?
我的方案是Samsung 960 EVO M.2 250G 作为系统盘 。
Intel 750 PCI-E 1.2T作为副盘
可以看到,队列深度在32的时候,对SSD的随机存取都超过了300k IOPS,在SSD上,对小文件(如分辨率较低的照片)频繁进行存取将不会是瓶颈 。
WD紫色监控机械硬盘2T作为数据盘,主打监控(大数据流,大文件读写)功能 。(图就不找了)
因为M.2接口和PCI-E接口都占用PCI-E通道,稍后在主板阶段我会介绍一下这里面的坑 。
内存篇
内存应该是一个题外话,真要买的话,闭着眼睛买个8GB*2或者16GB*2的套装可以适应大部分主流的主板,(小主板只有2个内存槽,而大主板的话你可以把内存插到同色槽位,)所以我们就开一个小差聊聊内存的DDR标准 。
现在新装机的平台,以X99,Z170为例,用的普遍都是DDR4的内存,老一些的机器老树开新花用的有DDR3的内存 。假设你的数据较小,数据都能加载到内存种,那究竟什么是影响内存存取速度的关键因素呢?
一个就是DDR内存的工作频率,而另一个和工作频率此消彼长的是DDR内存的时序(DDR Timing),这是一个内存存取的延迟指标 。工作频率的倒数,就是一个内存工作时钟周期的时间长度 。
可以看到,图中这个Crucial内存上贴的标签『8-8-8-24』分别代表:
CL:CAS Latency,Column Access Strobe (CAS) latency,从系统发送命令到内存开始到读写特定列所消耗的时钟周期数 。时间 。也就是说,如果我们已经指定了我们要从某一行读内存,但我们要从这一行里取多个数值,每次读写数值的时候这个CL是无可避免要消耗掉的 。
tRCD:RAS to CAS Delay,激活内存中的一行后(激活动作)到读写动作(READ/WRITE)所需要消耗的时间 。如果我们是在同一行进行读写的话,不需要重新激活行的情况下,tRCD的时间只需要消耗一次 。
tRP:Row Precharge Time 。有的时候我们需要取消一行的激活,再去激活另一行以读取数据,这一部分需要对内存行进行充电,这个时间的损耗就是tRP 。