关闭
当前位置:首页 - 国际国内新闻 - 正文

俞,干货|格物致知—机器学习使用功能调优,close

admin 2019-05-05 207°c

功用问题无处不在,可是许多同学都可能知道一句话:“过早优化乃万恶之源”,在日常作业中并不太重视功用,然而在机器学习运用里边,功用却关乎运用的存亡。这一波人工智能热潮的源起之一便是深度学习的核算功用获重大突破,然后使问题做到工程可解,到达有用的程度。

在实践作业中,咱们发现算法人员的常识范畴往往偏运用,更了解比方引荐、物体辨认、天然语音处理等事务相关的算法与模型的规划上,而对核算环境,尤其是异构核算环境的杂乱细俞,干货|格物致知—机器学习运用功用调优,close节常识不行了解,然后导致这些算法运用的功用不高,资源运用功率偏低,有的时分还会由于无法满意呼应时刻的要求而无法上线。一起核算渠道的工程师对机器学习的事务流程、运用软件栈构成、模型、功用相关的可调参数和东西、办法等方面了解不多,感觉无处下手。

这篇文章期望能大致整理一下机器学习运用调优的准则、办法及东西,给相关人员做个参阅。咱们将自顶而下介绍机器学习功用调优遇到的技能和东西,期望读者能有一个大局的知道。调优既需求大局纵览,又需求深化毫末,限于篇幅,许多细节点到即止,没有翻开,可是读者能够依据本文说到的信息,运用搜索引擎和文末的参阅资料部分深化学习下去。

准则

  • 功用问题是体系性工程问题,不应该运用兵boot来将挡、水来土掩的救火式的办法去处理问题,而要统筹安排、遵从必定的办法论体系性地提醒和处理。
  • 发现与处理功用问题,好像侦察办案,需求斗胆假定、当心证明。既要有大局观,能找到首要矛盾,又要能够细致入微,深化技能细节,找到问题的根本原因与处理方案。
  • 在查询功用问题的进程中,需求随时记载查询进程,便利随时复盘,调整查询方向和手法。
  • 在查询进程中,假如有多个影响要素,应该一次改动一个要素,查询成果,便利差异不同影响,而不应该一次改动多个要素。

办法论

  • 调优循环

功用调优是进程是一个继续改善进程,是一个动态改造的进程,能够笼统成一个优化循环。这个循环从开发功用基准测验开端,功用基准测验集需求具有典型性,也便是能反映事务的典型场景,要么从最重要的事务简化出来,要么依照典型事务的功用特征结构出来。并且这个功用基准要具有稳定性,也便是在相同条件下能够重复得出核算意义上共同的功用成果。功用基准测验最好是做成彻底自动化的,即装备、运转与输入均不须人工干预。一旦承认好功用基准测验集,就能够运转测验,获取和记载功用基准数据。重红警2共和国之辉复运转测验,运用功用勘探、剖析东西搜集、剖析运用的功用瓶颈,然后针对瓶颈,对体系装备、运用装备或许代码作出shelf相应改动,经过正确性验证后,再次运转功用基准测验,得到新的功用数据,比较功用,如有增强,则承认这次改动,运用版别办理体系记载改动,这样就完结了一次功用调优迭代,循此办法,直至功用到达要求或许挨近理论预估值。

  • 根底坚实

在调优开端前,需求承认测验作业环境功用、功用正常,保证作业在正确的根底上进行。这一步十分重要,但一般都被省掉掉。不在正常的环境里作业均为糟蹋,南辕北辙。

关于单机环境,首要是 CPU、内存、磁盘、网络、GPU 等部件的根底功用。这会触及到比方 BIOS 里功用偏好的设置、C-State 的设置、NUMA 设置,Hyper-Threading 的设置,内存条在插槽的散布办法、GPGPU 的 PCIe 插槽的散布办法以及操作体系内核相关调优参数的设置等。运转相关单项根底功用测验,对照各物理部件的理论功用,假如误差太大,需求找到相应原因处理。关于多机的集群环境,在单机功用验证完今后,首要考虑互联的吞吐量和推迟功用是否合格,这会触及到界面卡相关的物理和操作体系装备的修正,RDMA 的装备以及交换机的装备等等。

  • 自上而下

在大规模散布式运用,比方散布式练习中,首要要优化的是加快比,也便是每添加一台核算设备(服务器或许 GPGPU 卡)的功用添加与单机功用的比值,比方单机功用为 100,而参加集群后,集群功用添加了 60,则加快比为 60%。进步加快比能够从并行算法规划、完结架构以及互联设备层面上着手,削减核算节点间的数据依靠,削减数据交换推迟,进步并行度。加快比是进步大作业吞吐量功用的要害。

单核算设备或许称为单机的功用,图行天下一般来讲改动算法和数据结构收益最大,在机器学习运用里对应的便是挑选适宜的模型。而在实践中,调优阶段很难做这么大改动,一般从数据输入优化、结构装备等方面下手。然后才是运转库调优,操作体系相关功用参数调整,比方 IO 调度战略,大页内存,CPU 核绑定等等。一步一步发掘,依据发现的功用瓶颈逐步深化优化。

自上而下的优化次序,有助于首要处理首要问题,获取最大收益,快速完结调优方针。

功用方针

关于运用功用的衡量,一般有两个方针 - 吞吐量和推迟。吞吐量指的是单位时刻内完结的处理事务总数。推迟指的是一个恳求发出到完结的耗时。为了到达这两个方针的技能完结办法是不一样的,调优办法也有沦为所差异。进步吞吐量一般是经过进步并行度、运用并行流水线、增大缓存、异步等办法充分发挥资源运用率的办法。减低推迟一般是缩短要害途径,削减同步等候,进步缓存命中率,空间换时刻等办法完结。进步核算资源的运用率一般对这两种功用均有优点,可是进步 IO 资源的运用率则未必。

运用功用特征

运用的功用特征指的是运用在资源运用上的偏好和形式14,比方常见的核算密集型运用,IO 密集型运用等说法便是一种大略的功用特征描绘。比较准确的描绘是首要承认资源维度,也便是哪些资源类型,能够包含硬件资源与软件资源,比方 CPU、内存、磁盘、网络、GPU、数据库服务等等,然后针对这些资源维度,给出量化的运用率方针,比方 CPU 运用率,内存运用量,IO 运用率,IOPS,网络流量, QPS 等,运用功用监控,在一个典型事务场景下,搜集各方针,按资源维度耗费就能够描绘出这个运用的功用特征。

运用功用特征能够用来辅导功用优化的大方向,依据功用木桶理论,一般来讲首要的优化方向便是运用率最高的那个维度。

机器学习功用相关技能构成

如上文所说,调优是一个逐层深化的进程,有必要对整个技能构成有比较深化的了解才干知道查询的方向和每层需求重视的问题。咱们先由远而近地了解一下机器学习运用功用的相关技能构成。在现阶段,互联网运用的机器学习首要有两个运用:练习与推理。练习是一个大规模数据处理的进程,一般比较重视吞吐量,推理则又分为在线推理事务和离线推理事务,关于在线推理,一般推迟是最首要的功用方针,而离线推理则比较重视吞吐量。首要的运用范畴以图形图像的处理、语音处理、天然言语处理、引荐等,对应的 CNN,RNN,BERT,Wide & Deep 模型与算法。

机器学习的意图是得到一个模型,能够把模型当作一个函数,练习便是程序读入很多数据,经过不断迭代核算,得出模型的参数,然后使这个函数比较好的模仿实在的规则,在读入新数据时,得出与现实附近的揣度成果,这称为推理。

下面咱们以比较典型的深度学习的卷积神经网络的练习进程为例,一层层地深化了解它的技能构成与功用调优相关技能。

IO

练习数据输入能够有多种来历 - 本地磁盘,网络文件体系,散布式文件体系服务等,练习数据的格局与存储办法也各异,功用关怀的是数据输入的吞吐量带宽,IOPS (每秒 IO 操作量),IO 行列深度等。一般来说,很多小文件输入的状况下,IOPS 对功用的影响更大。除了替换更强壮的硬件以外,软件层面上能做的是运用缓存、预取以及将数据的 ETL(Extract, Transform, Load)各部分和练习部分组成 pipeline 以掩盖操作推迟、添加资源运用率,整合数据以削减 IO 操作等,假如运用网络存储或许 SSD 等能支撑更高 IOPS 或并发拜访的资源上,拓荒更多 IO 线程也会带来优点。在 TensorFlow 结构上,运用 tf.data API 尤其是 TFRecord 是投入产俞,干货|格物致知—机器学习运用功用调优,close出比最好的办法。

在实践的代码中常常见到单线程的次序式的数据读取、解码、预处理、洗牌、安排 batch 的代码,这个进程触及很多 IO 操作和 CPU 核算操作、内存仿制操作,假如运用 GPU 还会有 PCIe 俞,干货|格物致知—机器学习运用功用调优,close的数据传输操作。这些操作简略的次序履行,进程缓慢而冗长,导致 CPU 和 GPU 强壮的核算才能根本搁置等候的状况。这个运用 htop 指令和 NVIDIA-smi dmon 指令能够清楚的看到 CPU 与 GPU 的忙闲程度。

还有一个小技巧能够判别是不是 IO 导致练习功用低下的首恶。将被练习的模型核算换成最简略的核算,然后再测验练习功用,假如改动不大,做阐明晰核算速度对功用影响不大,根本能够定位 IO 是功用瓶颈。

核算

有了适宜的数据输入后,就prime正式进入模型练习阶段了。关于 TensorFlow 1.x 版别结构下构建的程序而言,一般会构建 tf.Graph 核算图,核算图描绘了数据的核算流程,图的节点是运算操作(Ops),运算操作代表了特定的笼统运算,会依据详细硬件设备(device)有详细的运算核(kernel)完结,运算核会运用不同的运算库,比方 Eigen,NVIDIA CuDNN,Intel的 MKL DNN 等,不同的库一般都会有相应的功用调理办法,能够在需华润水泥供货商门户要的时分运用。

在核算图节点间活动的是数据,称为张量(Tensor),如下图所示。核算图能够经过 TensorBoard 检查。

双击 namespase 方框,能够翻开和收拢细节。直至用椭圆形标明的 Ops,单击 俞,干货|格物致知—机器学习运用功用调优,closeOps 图标,能够看到 Ops 的 Operation,特点、输入、输出等细节。这些细节信息会在后边的精密化调优的时分用到。

TensorFlow 程序的客户端,会经过 Session 接口与 Master 进行交互,Master 担任办理一个或多个 worker, worker 与一个或多个硬件设备(device)相连。Session 的 run() 办法会发动 worker 运转核算图,依照事前的完结进行核算。如下图所示。你会发现 worker 之间(worker 到 parameter server,worker 到 worker)会有数据传输,这些数据传输会跨过不同设备,了解传输的途径有助于发现瓶颈和优化。

在模型练习时,尤其是神经网络练习,假如能够运用预先练习好的相关模型,固化靠前的部分层(所谓通用概念层),完结增量式练习,将大幅下降练习的核算量,进步练习功率。

在实践作业中,咱们发现精密调优过的机器学习代码的功用远好于简略直接运转,有的乃至到达10倍以上。下面让咱们来看一下,怎么充分发挥核算才能,优化核算功用。

在模型练习中,batch size 对功用的影响较大,所谓 俞,干货|格物致知—机器学习运用功用调优,closebatch size 便是处理完这些数意图样本后,才去更新模型的参数,这样能够大幅度削减模型参数更新的核管用量和相关的数据交换开支。一起在必定范围内改动 batch size 的值,并不会对模型的准确度有影响,所以理论上来讲,在可能范围内 batch size 越大则功用越好,可是受限于核算设备的内俞,干货|格物致知—机器学习运用功用调优,close存巨细。一般来讲 CPU 上练习的 batch size 上限大于 GPU 的。此外还有 learning rate 等参数,概况请参阅相关文档。

别的一个对功用有显着影响的便是核算用的浮点数标明格局,浮点数标明办法有双精度/DP64(64位)、单精度/FP32(32位),半精度/FP16(16位)等, 一般来讲机器学惯用的是 FP32 格局,可是有依据标明在神经网络中下降核管用的精度,对终究的模型精度影响能够很小。运用 FP16,由于下面会阐明的向量化数据并行运算,功用比 FP32 理论上高了 1 倍,可是在不调整模型的状况下精度丢失在 3% 以下乃至更小,因而能够价值很小的运用 FP16 替代 FP32,可是需求监控模型的精度。更近一步还能够运用 int8 乃至更小的数据类型,可是更小意味着更简单溢出和更多精度丢失,在实践运转中核算梯度改动值的时分仍是运用FP32,但在每层更新参数时转化为 int8,因而会有很多隐式数据转化进程,所以运用 XLA、nGraph 或许其他核算图编译的交融优化,能削减这种数据转化和仿制操作,然后带来比较大的改善。

有一种重要的优化能够进步推理的功用和缩小模型的巨细,便是模型量化(Quantization),所谓模型量化便是将模型的权值限制为有限个取值,相似于量子学的电子能级,这样就能够用很银杏少的 bit 数标明了,极点的状况包含二值化和三值化。模型量化能够在练习好的模型上进行优化,也能够在练习的时分运用量化感知练习办法,将相关信息保存下来供模型量化运用,保证精度,起到更好作用。感兴趣的同学能够参阅相关论文。

还有一些优化需求对底层的硬件渠道了解透彻。咱们以一个典型的机器学习服务器为例,一般来讲是一个 2U 或许 4U 的 X86 服务器,有两块 CPU,PCIe 插槽上插着 4 块或许 8 块 NVIDIA 的 GPU,比方 V100。

咱们先来看看 CPU,服务器上的这两块 CPU 放在两个插槽(socket)里,中心有 QPI/UPI 衔接。QPI/UPI 的数目依据 CPU 的层次不同有 1 根到 3 根,带宽也有不同,这个会影响两个 CPU 之间的数据交换的功用。每块 CPU 都有自己的内存操控器,内存操控器有不同的通道数目,每个通道又支撑必定数目和频率的内存条,通道数目、内存条的频率以及内存条的插法会影响内存的带宽功用。运用 dmidecode 指令能够检查内存的频率、类型、插槽方位等信息。CPU 拜访自己内存操控器下的内存和拜访别的一个 CPU 下的内存速度显然是不一样的,这个称之为非共同性内存拜访,简称为 NUMA 架构,在 BIOS 里能够设置为 NUMA 办法或许穿插混合(interleave)办法,现代的 Linux 操作体系都是所谓 NUMA aware 的,在进程调度以及内存办理上,会按间隔差异对待不同区域的内存,因而功用体现会更好,所以主张翻开 NUMA 设置。一起 CPU 功耗偏好也能够设置为功用形式,而不是省电形式。

每块 CPU 又有多个物理核(core),每个核依据 CPU 类型(有的类型不支撑超线程)和 BIOS 设置,又有可能有 2 个超线程(Hyper-Threading),necessary称为逻辑核。这些信息能够经过 lscpu 指令看到。NUMA 信息能够经过 numactl -H 指令检查。

在每个核里边又有多个算术逻辑运算单元,其间对机器学习最重要的为乘加器(FMA),依据 CPU 类型,有 1 到 2 个乘加器,乘加器支撑单指令多数据运算(SIMD/AVX),也便是履行一条指令就能够完结多个数据的相同核算操作,比方一条指令完结8 个浮点型数和别的 8 个浮点型数的别离相乘核算。这样的数据并行能够数倍进步核算功用,可是需求编译器和代码中做称为向量化的支撑,好消息便是 Intel 的 MKL 数学库现已完结了常用的核算,比方矩阵乘,运用的时分直接调用即可。关于 TensorFlow 而言,缺省下载的官方履行程序或许 docker image 没有针对 AVX 编译,不能充分发挥 CPU 的功用,主张运用 Intel 发行的 docker image 或许 conda channel 获取,还有自己从 TensorFlow 源代码自行编译,提速作用十分显着。

运用 MKLVGpro enabled Tensorflow,会有一些环境变量影响功用,比方 KMP_AFFINITY, OMP_NUM_THREADS,KMP_BLOCKTIME,以及 TensorFlow 的两个运转参数intra_op_parallelism_threads,inter_op_paralleliscouldm_threads。详细请拜见

Tensor腾讯手机管家下载Flow Performance Overview

,这儿就不翻开了。更多 Session 运转参数拜见:

tf.ConfigProto

,依据不同的运转环境和模型状况,里边有相当多选项对功用有显着影响。

由于服务器有两个物理 CPU,在一般开了 Hyper-Threading 的状况下每个物理核展现为两个逻辑核,这样就现实将一台服务器的悉数逻辑核分成了 4 个不同的组,因而在 TensorFlow 里边将这些核当成 4 个不同的核算设备在实践中也会部分进步功用,详细能够运用 numactl 指令将 4 个TensorFlowworker 与特定核组绑定,一起相应调整 intra_op_parallelism_threads,inter_op_parallelism_threads 参数与实践共同。

让咱们来看看 GPU。在大规模或许杂乱模型的练习中,一般会运用多个卡。如前面的图所示,运算设备上的 worker 会跟 parameter server (PS)有很多数据交换,PS 能够放在CPU 上,也能够放在 GPU 上,在所有 GPU 都插在同一个 PCIe Root Complex 或许运用 NVLi数英网nk 的状况下,NVIDIA 的 NCCL 会运用硬件的P2P 协议,大幅度削减数据通讯的推迟。假如这些条件都不满意,则 PS 就应该指定放在 CPU 上运转,以获取最佳功用。

在功用调优中,常常需求揭开功用的黑盒子,常用东西便是各种功用剖析东西。常见的TensorFlow 程序开发言语是 Python,因而能够运用 Python profile、cProfile 模块进行整体性的剖析。

深化到 TensorFlow 运转层面,就能够使黑科技用 TFProf 或许 Timeline 深化了解各 Ops 的时刻占比信息,以便利进一步优化首要的功用拖慢操作。TFProf 概况请见文末的参阅资料。

Timeline 用法如下:

1.在代码中添加 trace 数据输出部分

sess.run(...

options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE),

run_metadata=run_metadata)

trace = timeline.Timeline(step_stats=run_metadata.step_stcrashats)

with open('timeline.ctf.json', 'w') as trace_file:

trace_file.write(trace.generate_chrome_trace_format())

2.运转下后就会发生一个名为 timeline.ctf.json 的文件。

3.然后在 Chro英语翻译器me 浏览器地址栏中输入 chrome://tracing/,然后点击 Load 按钮,加载方才的 timeline.ctf.json 的文件,就能够看到运转时刻线,能够扩大、缩小检查,也能够点击相关 Ops 检查概况。

在这个时刻追寻的剖析图上,很简单发现最耗时的操作,或是并行度凹凸的状况,XLA 能够用来协助优化。XLA 是一个编译器,运用 JIT 即时编译技能剖析核算图,找出能够交融的操作,将多个操作兼并,并生成对应核算设备的原生代码。也能够运用编译器的优化算法进明末强国梦行数据流、操控流剖析,削减核算。英特尔有相似的东西称为 nGraph,也能够试一试。

假如上述东西都没有能帮你到达功用方针劲爆体育,你还能够自己完结 Ops,然后参加 TensorFlow 中,并调用它,这在许多需求低推迟的算法中有较多运用,但难度最大,所以请承认别无他法再用。详细能够拜见 TensorFlow 的

Adding a New Op

文档。

散布式练习

这是一个相当大的论题,期望后续有时机再讲。

参阅资料

  • Linux 功用大师 Brendan Gregg 的 Blog
  • TensorFlow Performance Overview
  • TensorFlow Data Input Pipeline Performance
  • TensorFlow Architecture
  • TensorFlow Graph俞,干货|格物致知—机器学习运用功用调优,closes and Seesions
  • tf.ConfigProto
  • TensorFlow Benchmark
  • TensorBoard: Graph Visualization
  • TensorFlow Profile and Advisor
  • nVidia CUDA Profiler User's Guide
  • nVidia CUDA Optimization Guide
  • Intel Processor for Deep Learning Tranining
  • Improving TensorFlow Inference Performance on Intel Xeon Processors
  • Intel Optimized Models
  • Intel OpenVINO Inference Engine

End

admin 14文章 0评论 主页

相关文章

  用户登录