最大化TensorFlow* CPU性能

2023-11-08

用户可以在v2.5之后的官方x86-64 TensorFlow 设置环境变量TF_ENABLE_ONEDNN_OPTS=1来启用这些CPU优化。

export TF_ENABLE_ONEDNN_OPTS=1

大多数建议都适用于官方x86-64 TensorFlow和英特尔®TensorFlow优化。OpenMP调优等一些建议只适用于TensorFlow的英特尔®优化。

TensorFlow图形选项改进性能

LPOT

提供了一个统一的低精度推理接口, 为fp32预训练模型提供了比TensorFlow优化工具optimize_for_inference更多的优化(例如消除公共子表达式)。
用户有不同的选项来优化他们的预训练模型,这些选项包括英特尔®低精度优化工具(英特尔®LPOT),以及TensorFlow github的工具。
建议使用LPOT在Intel架构上进行预训练的模型优化

Tools from TensorFlow github

First, use Freeze_graph
冻结图形可以提供额外的性能好处。freeze_graph工具,由于所有权重都冻结在结果推理图中,可以期望得到更好的推理时间.
Second, Use Optimize_for_inference
在图形被冻结后,额外的转换可以帮助优化用于推理的图形。

TensorFlow运行时选项提高性能

在这里插入图片描述

intra_/inter_op_parallelism_threads

intra_op_parallelism = number of physical core per socket
#每个插槽的物理内核数
 inter_op_parallelism = number of sockets

通过执行bash脚本文件, get the number of physical core per socket and number of sockets on your platform

#!/bin/bash
total_cpu_cores=$(nproc)
number_sockets=$(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))
number_cpu_cores=$(( (total_cpu_cores/2) / number_sockets))

echo "number of CPU cores per socket: $number_cpu_cores";
echo "number of socket: $number_sockets";

intra_op_parallelelism_threads和inter_op_parallelelism_threads是TensorFlow中定义的运行时变量。

ConfigProto

ConfigProto用于创建会话时进行配置。这两个变量控制要使用的内核数:

intra_op_parallelism_threads
此运行时设置控制操作内部的并行性。例如,如果打算在多个线程中执行矩阵乘法或简化,则应该设置这个变量。 TensorFlow将在包含intra_op_parallelelism_threads线程的线程池中调度任务。建议将此环境变量设置为可用物理核的数量。

inter_op_parallelism_threads

NOTE: This setting is highly dependent on hardware and topologies, so it’s best to empirically confirm the best setting on your workload.

运行时设置控制独立操作之间的并行性。由于这些操作彼此不相关,TensorFlow将尝试在包含inter_op_parallelelism_threads线程的线程池中并发运行它们。这个变量应该设置为您希望运行代码的并行路径的数量。对于TensorFlow的英特尔®优化,我们建议从设置“2”开始,并在实证测试后进行调整。

Data Layout

data_format = NHWC

数据布局,即如何存储和访问数据
有效地使用缓存和内存可以显著提高整体性能。良好的内存访问模式可以最小化访问内存中的数据的额外成本,并提高整体处理能力
Data Layout 描述了多维数组如何在内存地址空间中线性存储。
在大多数情况下,数据布局用四个字母表示一个二维图像:
在这里插入图片描述

N:Batch size,批量大小,表示每批图像的数量。
C:Channel,“通道”表示图像的通道数。
W:Width,宽度,表示图像的水平像素数。
H: Height,高度,表示图像的垂直像素数。

这四个字母的顺序表示像素数据在一维存储空间中的存储方式。
例如,NCHW表示像素数据先存储为宽度,然后存储为高度,然后存储为通道,最后存储为批处理(如图2所示)。然后使用通道优先索引从左到右访问数据。NCHW是使用oneDNN的推荐数据布局,因为这种格式对于CPU来说是一种有效的数据布局。TensorFlow使用NHWC作为默认的数据布局,但它也支持NCHW。

NOTE : Intel Optimized TensorFlow supports both plain data formats like NCHW/NHWC and also oneDNN blocked data format since version 2.4. Using blocked format might help on vectorization but might introduce some data reordering operations in TensorFlow.

用户可以通过TF_ENABLE_MKL_NATIVE_FORMAT环境变量在Tensorflow中启用/禁用oneDNN阻塞数据格式。
通过export TF_ENABLE_MKL_NATIVE_FORMAT=0, TensorFlow将使用oneDNN阻塞数据格式代替。
建议通过下面的命令启用NATIVE_FORMAT,以获得良好的开箱即用性能。(to achieve good out-of-box performance.)

export TF_ENABLE_MKL_NATIVE_FORMAT=1 (or 0)

NUMA (Non-uniform memory access)控制影响性能

numactl --cpunodebind=0 --membind=0 python

NUMA,或称非均匀内存访问,是一种用于数据中心机器的内存布局设计,旨在利用具有多个内存控制器和块的多插槽机器中的内存位置。
在支持numa的机器上运行会带来一些特殊的注意事项。
当将执行和内存使用限制在单个NUMA节点时,TensorFlow的Intel®Optimization运行推理工作负载最佳。
在启用numa的系统上运行时,建议将intra_op_parallelelism_threads设置为每个numa节点的本地内核数。

并行执行
可以通过将工作负载分解为多个数据分片,然后在多个NUMA节点上并发运行它们来优化性能。在每个节点(N)上执行如下命令:

numactl --cpunodebind=N --membind=N python

可以使用" & "命令在多个NUMA节点上同时启动进程:

numactl --cpunodebind=0 --membind=0 python & numactl --cpunodebind=1 --membind=1 python

英特尔®TensorFlow优化的OpenMP技术性能

英特尔®TensorFlow优化利用OpenMP并行化CPU内核之间的深度学习模型执行。

在这里插入图片描述针对其特定的神经网络模型和平台调整这些环境变量的值,来调优英特尔®优化的TensorFlow性能.

OMP_NUM_THREADS

export OMP_NUM_THREADS=num physical cores

如果应用程序中没有指定其他值,则此环境变量设置OpenMP并行区域使用的最大线程数

启用超线程后,一个物理CPU核心有多个硬件线程,但建议仅为一个物理CPU核心使用一个硬件线程,以避免缓存丢失问题。

用户可以将OpenMP线程绑定到物理处理单元。KMP_AFFINITY用于利用这个功能。它将某些线程的执行限制为多处理器计算机中物理处理单元的子集。

该值可以是一个整数,在这种情况下,它指定所有并行区域的线程数。该值也可以是一个逗号分隔的整数列表,在这种情况下,每个整数指定嵌套级别上并行区域的线程数。(列表中的第一个位置表示最外部的并行嵌套级别,第二个位置表示下一个内部的并行嵌套级别,以此类推。)

默认值是执行程序的操作系统可见的逻辑处理器的数量。建议与物理核数相同。

KMP_AFFINITY

export KMP_AFFINITY=granularity=fine,compact,1,0

用户可以将OpenMP线程绑定到物理处理单元。KMP_AFFINITY用于利用这个功能。它将某些线程的执行限制为多处理器计算机中物理处理单元的子集。

NOTE The recommendation changes if Hyperthreading is disabled on your machine. In that case, the recommendation is: KMP_AFFINITY=granularity=fine,verbose,compact if hyperthreading is disabled.

KMP_BLOCKTIME

export KMP_BLOCKTIME=0 (or 1)

这个环境变量设置线程在完成一个并行区域的执行后,在进入睡眠之前应该等待的时间(以毫秒为单位)。缺省值是200ms。(The default value is 200ms.)
在完成一个并行区域的执行后,线程会等待新的并行工作可用。经过一段时间后,它们停止等待,进入睡眠状态。在更多的并行工作可用之前,休眠允许非openmp线程代码或其他应用程序使用线程,这些代码可以在并行区域之间执行。
如果线程仅为OpenMP执行而保留,但可能会惩罚其他并发运行的OpenMP或线程化应用程序,那么更大的KMP_BLOCKTIME值可能更合适。对于基于卷积神经网络(CNN)的模型,建议设置为0。

KMP_SETTINGS

export KMP_SETTINGS=TRUE

这个环境变量启用(TRUE)或禁用(FALSE)在程序执行期间打印OpenMP运行时库环境变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最大化TensorFlow* CPU性能 的相关文章

随机推荐

  • Kubernetes中的etcd访问

    前言 Kubernetes中的etcd访问 正常安装了k8s 没有特意去安装etcd 利用K8s中附带的etcd 感受一下etcd的读写操作 提示 以下是本篇文章正文内容 下面案例可供参考 一 etcd是什么 etcd是一个分布式的key
  • UE4换装系统(合并骨骼模型)

    前面那篇UE4换装系统https blog csdn net luomogenhaoqi article details 88350580 事实上每个身体模型还是各自渲染 现在介绍把每个身体模型合并输出一个模型 把Lod 材质 网格等合并
  • 软件工程第二版(判断题答案)

    判断题 第一章 软件就是程序 编写软件就是编写程序 软件危机的主要表现是软件需求增加 软件价格上升 软件工程学科出现的主要原因是软件危机的出现 软件工具的作用是为了延长软件产品的寿命 第二章 瀑布模型的最大优点是将软件开发的各个阶段划分得十
  • Notepad++ 配置 支持jquery、html、css、javascript、php代码提示

    官网下载 http notepad plus plus org 获取插件的方法 打开软件 窗口工具栏有有一个问号 点获取插件 我使用的插件 安装方法都是官方的方法 QuickText v0 2 1 zip 自定义缩写词 按快捷键后输出 定义
  • Java网络编程Socket(使用字节流)

    套接字 Socket 开发网络应用程序被广泛采用 以至于成为事实上的标准 Socket通信原理 通信的两端都要有Socket 是两台机器间通信的端点 网络通信其实就是Socket间的通信 Socket允许程序把网络连接当成一个流 数据在两个
  • java private 构造函数_JAVA private私有类的 默认构造函数 的生成过程

    如果一个类没有定义任何构造函数 则编译器将生成一个缺省的构造函数 该构造函数的访问修改符和类的访问修改符相同 例如 class test将生成test 构造函数 public class test将生成public test 构造函数 在使
  • JPA使用雪花算法生成主键ID

    实现方式 通过 GenericGenerator注解自定义主键生成策略 需要实现org hibernate id IdentifierGenerator接口 根据官网例子进行改造 官网链接 https docs jboss org hibe
  • Qt中多线程的使用(二)

    线程池 当线程的任务量比较大时 频繁创建和销毁线程会有很大的内存开销 此时使用QThread的方法就不合适 应该使用线程池QThreadPool QThread适用于常驻内存的任务 QThreadPool适用于不常驻内存 任务量比较大的情况
  • Element-UI官方文档阅读笔记(VUE)—持续更新中····

    前言 本人前端新手一枚 目前工作中接触Element UI较多 但其中很多组件布局什么的都不是很清楚 所以想稍微花点时间简单过一遍Element UI官方文档 并作以记录 其中有什么不对的地方 还请各位路过的大佬不吝赐教 以下内容按elem
  • Hive建表实例——定义serdeproperties属性

    创建table时 直接定义serdeproperties属性 create table wzhg c0 string c1 string c2 string row format serde org apache hadoop hive c
  • 代理模式 【设计模式之禅作者】

    代理模式 12 1 我是游戏至尊 2007年 感觉很无聊 于是就玩了一段时间的网络游戏 游戏名就不说了 要不就有做广告的嫌疑 反正就是打怪 升级 砍人 被人砍 然后继续打怪 升级 打怪 升级 我花了两个月的时间升级到80级 已经很有成就感了
  • Leetcode每日一题:57. 插入区间

    原题 给你一个 无重叠的 按照区间起始端点排序的区间列表 在列表中插入一个新的区间 你需要确保列表中的区间仍然有序且不重叠 如果有必要的话 可以合并区间 示例 1 输入 intervals 1 3 6 9 newInterval 2 5 输
  • 00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问(kafka)

    产生此问题的原因 在window下使用kafka导致 在linux下使用kafka没有此问题 window下kafka报错 linux下kafka正常
  • 文本挖掘学习笔记(二):文档信息向量化与主题关键词提取

    注 学习笔记基于文彤老师文本挖掘的系列课程 全文基于 射雕英雄传 语料库 下面是读入数据的一个基于Pandas的通用操作框架 读入为数据框 import pandas as pd from matplotlib import pyplot
  • element表格复选框,弹框关闭取消选择

    弹框表格复选框清空 this nextTick gt this refs tabledata clearSelection
  • 面向工业物联网的拍赫兹通信

    摘要 相比于传统无线射频通信 拍赫兹通信 PetaCom petahertz communication 具有高速率 低时延和高确定性等显著优势 在工业物联网 IIoT industrial internet of things 中可以发挥
  • [1178]数据库like和rlike区别

    like 通配符 使用时需指定具体值 如 用like筛选某张表姓张的人全部信息 或名字叫张三的信息 张或张三就必须写为具体值 sql语法的 模糊匹配 通配符 代表零个或任意字符 代表1个字符 rlike 正则 模糊查询 区间范围判断 如 用
  • 链表问题处理

    今天主要是对一些链表相关问题的理解和处理 下面所有问题处理的都是这种链表 struct ListNode int val struct ListNode next 话不多说 我直接进入正题 1 删除链表中等于给定值 val 的所有节点 给你
  • 【音效处理】Reverb 混响算法简介

    系列文章目录 Delay Line 简介及其 C C 实现 LFO 低频振荡器简介及其 C C 实现 音效处理 Delay Echo 简介 音效处理 Vibrato 简介 文章目录 系列文章目录 一 混响 二 人工混响 三 数字混响算法 3
  • 最大化TensorFlow* CPU性能

    用户可以在v2 5之后的官方x86 64 TensorFlow 设置环境变量TF ENABLE ONEDNN OPTS 1来启用这些CPU优化 export TF ENABLE ONEDNN OPTS 1 大多数建议都适用于官方x86 64