热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GPU与CPU的性能比较及影响因素

CPU的主要指标是主频和线程。Intel:后缀F表示无核显,后缀K代表可以超频,H代表移动端;AMD:后缀G

CPU的主要指标是主频和线程。


  • Intel:后缀F表示无核显,后缀K代表可以超频,H代表移动端;
  • AMD:后缀G代表有核显,后缀X代表加强版,后缀XT代表超级加强版。

CPU 常见计算操作

数据加载、数据预处理、模型保存、loss 计算、评估指标计算、日志打印、指标上报、进度上报。

GPU任务处理流程

GPU 任务交替使用 CPU 和 GPU 进行计算,当 CPU 计算成为瓶颈时,GPU 会等待,GPU 利用率降低了。

GPU 性能主要依靠制程技术(nm)、GPU架构、线路设计、数字表示方式;

通常制程技术的进步只能让GPU的性能提高到原来的1.5或2倍,

GPU性能的提升主要是靠GPU架构和线路设计、数字表示方式的完善。

GPU的架构适合集群,GPU架构的更新同时更新集群方案。


  • 计算量:即一个深度学习模型需要多少次计算才能完成一次前馈。
  • 内存带宽:带宽影响计算速度,即GPU内存带宽是深度学习性能提升的主要瓶颈。

一般的算力评价指标:TFLOPS(具体分单精度、双精度、Tensor);

在硬件架构相同的条件下,核越来以及带宽越高,性能就越好。

影响GPU性能

英特尔的 CPU 有AVX,一条指令可以做 512bit 的浮点操作,换算成32位浮点就是16个OPs,CPU 每个时钟周期可以做一次浮点乘加,相当于两个浮点运算,一个时间周期有 32 个FLOP,乘以 CPU 频率及核数,12 核,3GHz 的英特尔 CPU 运算性能 12 * 32 * 3G = 1152GFLOPS,论文显示 GPU 可达到 200GFLOPS,性能瓶颈并不在计算单元上,而是访存;CPU 的访存比GPU 大,只要 CPU 的访存能放得下,CPU 完全可能比GPU快。当访存放不下时,就要比较内存带宽,GPU 比 CPU快,对小规模数据,CPU 处理快,大规模数据,GPU 处理快。

数据加载问题

1. 数据存储与计算资源间物理距离过远;

2. 数据存储介质导致读写能力不同,不同存储介质读写性能:SSD > ceph > cfs-1.5 > hdfs > mdfs

优化:将数据先同步到本机 SSD,读本机 SSD 训练。本机 SSD 盘为“/dockerdata”,可先将其他介质下的数据同步到此盘下进行测试,排除存储介质的影响。

3. 小文件太多,文件 io 耗时太长;多个小文件是不连续存储,读取会浪费很多时间在寻道上,

优化:将数据打包成大文件,如将许多图片文件转成一个 hdf5/pth/lmdb/TFRecord 等大文件。

4. 未启用多进程并行读取数据;未设置 num_workers 等参数或设置不合理,导致 cpu 性能为发挥,卡住 GPU;优化:设置 torch.utils.data.DataLoader 方法的 num_workers 参数、tf.data.TFRecordDataset 方法的 num_parallel_reads 参数或者 tf.data.Dataset.map 的 num_parallel_calls 参数。

5. 未启用提前加载机制来实现 CPU 和 GPU 的并行;未设置 prefetch_factor 等参数或设置不合理,使 CPU 与 GPU 串行,CPU 运行时 GPU 利用率直接掉 0;优化:设置 torch.utils.data.DataLoader 方法的 prefetch_factor 参数 或者 tf.data.Dataset.prefetch()方法。prefetch_factor 表示每个 worker 提前加载的 sample 数量,Dataset.prefetch() 方法的参数 buffer_size 一般设置为:tf.data.experimental.AUTOTUNE,由TensorFlow 自动选择合适数值。

6. 未设置共享内存 pin_memory;未设置 torch.utils.data.DataLoader 方法的 pin_memory 或者设置成 False,则数据需从 CPU 传入到缓存 RAM 里面,再传输到 GPU 上;优化,如内存富裕,可设置 pin_memory=True,直接将数据映射到 GPU 的相关内存块上,省掉一点数据传输时间。

数据预处理问题

1. 数据预处理逻辑复杂;数据预处理部分超过一个 for 循环,都不予 GPU 训练放到一起;

优化:设置 tf.data.Dataset.map 的 num_parallel_calls 参数,提高并行度,一般设置为 tf.data.experimental.AUTOTUNE,由 TensorFlow 自动选择合适的数值。

将部分数据预处理挪出训练任务,如对图片的归一化操作,提前开启一个 spark 分布式任务或者 cpu 任务处理好,再进行训练。

提前将预处理部分需要用到的配置文件加载到内存中,不需要每次计算读取。

关于查询操作,多使用 dict 加速查询操作,减少 for、while 循环,降低预处理复杂度。

利用 GPU 进行数据预处理;Nvidia DALI 是专门用于加速数据预处理过程的库,既支持 GPU 又支持 CPU;采用 DALI,将基于 CPU 的数据预处理流程改造成用 GPU 来计算。

模型保存问题

1. 模型保存频繁;模型保存为 CPU 操作,频繁操作会导致 GPU 等待。

指标问题

1. loss 计算复杂;含有 for 循环的复杂 loss 计算,导致 CPU 计算时间长,阻塞 GPU,该用低复杂度的 loss 或者使用多进程或多线程进行加速。

2. 指标上报频繁;CPU 和 GPU 频繁切换导致 GPU 利用率低;可抽样上报,如每 100/step 上报

日志问题

1. 日志打印频繁;日志打印操作太频繁,CPU 和 GPU 频繁切换导致 GPU 利用率低;使用抽样打印,如每 100/step 打印一次。

分布式任务中 GPU 利用率低问题

分布式任务相比单机任务多了机器间通信环节。如扩展到多机后出现 GPU 利用率低,运行速度慢等问题,很可能是机器间通信时间太长导致的,可检测如下几项:

1. 机器节点是否处在同一 modules:机器节点处于不同 modules 时,多机间通信时间会长很多,deepspeed 组件已从平台层面增加调度到同一 modules 的策略,用户不需要操作。

2、多机时是否启用 GDRDMA:能否启用 GDRDMA 与 NCCL 版本有关,PyTorch1.7 自带 NCCL2.7.8 时,启动 GDRDMA 失败,此为 NCCL 高版本 bug,可使用的运行注入的方式来修复;使用 PyTorch1.6 自带 NCCL2.4.8 时,能够启用 GDRDMA。NCCL2.4.8 + 启用 GDRDMA 比 NCCL2.7.8 + 未启用 GDRDMA 提升了 4%。设置 export NCCL_DEBUG=INFO,查看日志中是否出现[receive] via NET/IB/0/GDRDMA 和 [send] via NET/IB/0/GDRDMA,出现则说明启用 GDRDMA 成功,否则失败。

3、pytorch 数据并行是否采用 DistributedDataParallel:PyTorch 里的数据并行训练,涉及 nn.DataParallel (DP) 和nn.parallel.DistributedDataParallel (DDP) ,推荐使用 nn.parallel.DistributedDataParallel (DDP)。

 

参考:

【他山之石】GPU 利用率低常见原因分析及优化 (qq.com)


推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • 这个问题困扰了我两天,卸载Dr.COM客户端(我们学校上网要装这个客户端登陆服务器,以后只能在网页里输入用户名和密码了),问题解决了。问题的现象:在实验室机台式机上安装openfire和sp ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
author-avatar
秋天的紫丁香
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有