在公司,mentor教了我一些关于CPU,GPU的知识,将学过的计组知识拿起来一起帮助理解。趁着记忆还在,记下一些大概的想法
首先对CPU,GPU有一个初显的理解,以前我就用速度取理解两者,不管里面的内容。CPU,是中央处理器,代表内存,串行处理;
GPU,图形处理器,代表外存(独立显卡,也许集成显卡也有?)并行处理,要用到GPU显存时,需要一个工具将数据从硬盘放到内存,然后从内存放到GPU上,为什么GPU可以放,CPU不行呢?因为GPU有专门的框架帮忙处理,比如pytorch,tensolfow这些,那numpy为啥不行呢,因为没有这个调用源码呢,举个torch的命令比如torch.to(GPU.device)(提一下Nvidia的cuda,cudann给GPU的加速训练)使用GPU训练。
PS:(PyTorch不是代码行“GPU -> on”,而是“CUDA”张量。CUDA是一个用于在GPU上执行操作的库。基本上,PyTorch要求你声明要在GPU上放置的内容,然后你可以像往常一样执行操作。)
从数据量来理解一下为什么batch_size参数太大会导致输出结果爆掉或者说是报错RAM不够,首先明白数据的处理过程:从硬盘读到内存(RAM),再送到显存(GPU),举个例子假如batch_size是4,每张图片是400×400×3,那么一次从硬盘读到内存的数据量是 400×400×3个像素点×4(假如每个像素点是int 4位存储的话)*batch_size=480000*4*batch_size(bit),240000×batch_size(B),而RAM可用空间不大,会被爆掉。
这些是一些个人理解吸收吧,很感谢mentor肯手把手教我这些基础知识,emmmm,换而言之,我这不就是在学习一些先验知识吗,哈哈哈哈,元数据来了,后面就容易学进去了!
另外去网上查了些资料,网上有一个比喻用来比较 GPU 和 CPU ,我觉得非常贴切,100 个小学生和一个大学教授组成两队进行数学比赛,第一回合是两队分别完成 100 道四则运算题,比赛开始,第一回合教授还在写的时候,小学生们已经完成了答题,然后进行了第二回合,第二回合是两队分别完成 1 道高等数学题目,教授已经完成了答题,100个小学生还在冥思苦想。
这就是GPU和CPU的最大不同,他们设计的目标不一样,针对不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,还要逻辑判断引入大量分支跳转和中断处理,使得CPU内部结构复杂,被大量cache占据空间,它的计算性能只是CPU的很小一部分呢。
GPU面对的是类型高度统一的,相互无依赖的大规模数据和不需要被打断的纯净计算环境,采用数量众多的计算单元和超长的流水线,简单的控制逻辑省去cache,这张Nvidia CUDA文档很好说明了,其中绿色是计算单元,橙红色的是存储单元,橙黄色是控制单元。
结合那个比喻来看就是,一些简单的操作,GPU可以用大量的并行操作取同时进行,完全是人海战术,而对复杂的操作不能,但是深度学习而言,处理数据这种简单操作足矣,CPU是串行操作,可以应对复杂的操作指令,但是它的复杂结构,以及内存大小的限制导致它无法那么快处理那么多的数据单元。
搞定,回家!