从源码编译 tensorFlow ,启用CPU 指令加速

news/2024/5/19 6:01:06

适合只有cpu,没有显卡的AI 玩家,初学者

问题:AVX AVX2 AVX_VNNI FMA 是什么?

AVX、AVX2、AVX_VNNI 和 FMA 都是针对 Intel CPU 的特殊指令集(instruction set),用于加速数值计算和向量化操作。这些指令集提供了高级别的并行性和向量化支持,可以在适用的硬件上加快特定计算任务的速度。

  1. AVX (Advanced Vector Extensions):AVX 是 Intel CPU 中引入的指令集扩展,其提供了更宽的 SIMD (Single Instruction, Multiple Data) 向量寄存器,允许同时处理更多的数据元素。AVX 可以加速包含向量化计算的一些数值操作,例如加法、乘法和平方根等。

  2. AVX2:AVX2 是对 AVX 指令集的扩展,引入了更多的 SIMD 指令,包括整数运算和更复杂的浮点运算。AVX2 提供更高级别的向量化支持,可以加速更多类型的计算任务。

  3. AVX_VNNI (AVX Vector Neural Network Instructions):AVX_VNNI 是用于加速神经网络计算的指令集扩展。它针对矩阵乘法和卷积等神经网络中常见的计算操作进行了优化,可以显著加快神经网络的训练和推理速度。

  4. FMA (Fused Multiply-Add):FMA 是一种融合乘法和加法操作的指令,可以在单个指令中同时进行乘法和加法运算。FMA 可以加速包含乘法和加法的复杂数值计算,例如矩阵乘法和向量点积等。

这些指令集通常用于高性能计算和深度学习等需要大量数值计算的任务。当软件(如 TensorFlow)在支持这些指令集的硬件上进行优化时,可以显著提高计算速度和性能。因此,在使用 TensorFlow 或其他数值计算库时,如果你的 CPU 支持这些指令集,建议启用它们以获得更好的性能和效率。

使用Docker 环境编译 tensorflow

1 先安装Docker

sudo apt-get install docker

2 拉取 Docker 镜像 tensorflow/tensorflow:devel

docker pull tensorflow/tensorflow:devel

3 运行 TensorFlow 开发版

我这里 $PWD 是当前路径 /home/wmx/software/tensorDocker 挂载到 Docker 目录 /mnt

docker run -it -w /tensorflow_src -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" tensorflow/tensorflow:devel bash

这是一个用于运行 TensorFlow 开发版 Docker 容器的命令。让我们逐步解析这个命令:

  1. docker run: 这是运行 Docker 容器的命令。

  2. -it: 这是两个选项的组合,用于以交互式终端运行容器,并将终端连接到容器的输入/输出(stdin/stdout)。

  3. -w /tensorflow_src: 这是一个选项,指定容器内的工作目录为 /tensorflow_src。换句话说,当容器启动时,它会进入到容器内的 /tensorflow_src 目录,以供后续的命令在该目录下执行。

  4. -v $PWD:/mnt: 这是一个选项,用于将当前主机的当前工作目录 ($PWD) 挂载到容器内的 /mnt 目录。这样,当前主机的文件和目录就可以在容器内通过 /mnt 目录访问。

  5. -e HOST_PERMS="$(id -u):$(id -g)": 这是一个选项,设置名为 HOST_PERMS 的环境变量,并将其值设为当前用户的用户 ID (id -u) 和用户组 ID (id -g)。这样可以确保容器中的操作使用与主机相同的用户权限,避免权限问题。

  6. tensorflow/tensorflow:devel: 这是指定使用的 TensorFlow Docker 镜像及其标签(tag)。devel 是 TensorFlow Docker 镜像的一个标签,表示开发版的 TensorFlow 镜像。

  7. bash: 这是在容器内运行的命令。在这个命令中,我们指定容器在启动后直接运行 bash 终端。

综上所述,这个命令将在一个 TensorFlow 开发版 Docker 容器中启动一个交互式终端,并将主机当前工作目录挂载到容器中的 /mnt 目录,同时设置容器中的用户权限与主机相同。然后,容器启动后会进入 /tensorflow_src 目录,并在该目录下运行 bash 终端,从而可以在容器内进行 TensorFlow 开发和测试工作。

  • 更新tensorflow源码
git pull  
  • 查看所有版本
git branch -a 
  • 使用对应的版本,我这里使用 v2.12.0
git checkout v2.12.0

4 配置 bazel 编译参数

1 ./configure
2 配置python路径,直接回车,使用默认值
3 配置Python library path,直接回车,使用默认配置
4 Do you wish to build TensorFlow with ROCm support? [y/N]: n # 不是AMD显卡 ,我选择 n
5 Do you wish to build TensorFlow with CUDA support? [y/N]: n # 我没有显卡,目前i9-13900k ,所我选择 n
6 Do you wish to download a fresh release of clang? (Experimental) [y/N]: n # 我ubuntu20.04已经安装了clang ,我使用默认的,选择 n
7 Please specify optimization flags to use during compilation when bazel option “–config=opt” is specified [Default is -Wno-sign-compare]: --copt=-march=native # 配置 bazel 编译的参数,我这是纯 cpu 加速,所以填写 --copt=-march=native

到这里配置完毕,上面配置针对纯CPU 加速,如果有显卡,大家根据自己的显卡配置,下面是 配置过程的shell :

(base) wmx@wmx-ubuntu:/media/wmx/ws1/ai/tensorflow_src$ ./configure
You have bazel 5.3.0 installed.
Please specify the location of python. [Default is /bin/python3]: Found possible Python library paths:/home/wmx/software/tensorBuild/lib/python3.11/site-packages/opt/ros/noetic/lib/python3/dist-packages
Please input the desired Python library path to use.  Default is [/usr/lib/python3.8.10/site-packages]Do you wish to build TensorFlow with ROCm support? [y/N]: n
No ROCm support will be enabled for TensorFlow.Do you wish to build TensorFlow with CUDA support? [y/N]: n
No CUDA support will be enabled for TensorFlow.Do you wish to download a fresh release of clang? (Experimental) [y/N]: n
Clang will not be downloaded.Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -Wno-sign-compare]: --copt=-march=nativeWould you like to interactively configure ./WORKSPACE for Android builds? [y/N]: n
Not configuring the WORKSPACE for Android builds.Preconfigured Bazel build configs. You can use any of the below by adding "--config=<>" to your build command. See .bazelrc for more details.--config=mkl         	# Build with MKL support.--config=mkl_aarch64 	# Build with oneDNN and Compute Library for the Arm Architecture (ACL).--config=monolithic  	# Config for mostly static monolithic build.--config=numa        	# Build with NUMA support.--config=dynamic_kernels	# (Experimental) Build kernels into separate shared objects.--config=v1          	# Build with TensorFlow 1 API instead of TF 2 API.
Preconfigured Bazel build configs to DISABLE default on features:--config=nogcp       	# Disable GCP support.--config=nonccl      	# Disable NVIDIA NCCL support.
Configuration finished

5 编译 tensorFlow 源码 ,创建 pip 软件包的工具

需要提前开启科学上网,哈哈哈,不然编译不通过,一些依赖国内获取不了

bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

6 运行该工具,以创建 pip 软件包 ,指定输出目录 /mnt

./bazel-bin/tensorflow/tools/pip_package/build_pip_package /mnt

7 调整文件在容器外部的所有权

我这里是 tensorflow-2.12.0-cp38-cp38-linux_x86_64.whl

chown $HOST_PERMS /mnt/tensorflow-2.12.0-cp38-cp38-linux_x86_64.whl

我这里主机目录 /home/wmx/software/tensorDocker 挂载到 Docker 目录 /mnt

8 在主机环境中安装 生成的 tensorflow-2.12.0-cp38-cp38-linux_x86_64.whl

注意 python版本必须对应

因为我docker 里面默认的python 版本是 3.8.10 ,所以我主机环境需要安装 python3.8.10 才能安装 tensorflow-2.12.0-cp38-cp38-linux_x86_64.whl

conda 创建对应python版本的虚拟环境

	conda create --prefix ./tensorBuild python=3.8.10conda activate ./tensorBuild# 在tensorBuild虚拟环境中,安装python -m pip install /home/wmx/software/tensorDocker/tensorflow-2.12.0-cp38-cp38-linux_x86_64.whl 

9 测试main.py

import tensorflow as tf# 准备数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()# 构建模型
model = tf.keras.Sequential([tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),tf.keras.layers.MaxPooling2D((2, 2)),tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),tf.keras.layers.MaxPooling2D((2, 2)),tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),tf.keras.layers.Flatten(),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test accuracy:', test_acc)# 保存模型
model.save('model.h5')

shell 输出:

2023-07-30 12:31:03.740540: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE3 SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-07-30 12:31:03.795251: I tensorflow/core/util/port.cc:104] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2023-07-30 12:31:03.809482: E tensorflow/tsl/lib/monitoring/collection_registry.cc:81] Cannot register 2 metrics with the same name: /tensorflow/core/bfc_allocator_delay
2023-07-30 12:31:04.681085: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE3 SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Epoch 1/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.8800 - accuracy: 0.3663 - val_loss: 1.5088 - val_accuracy: 0.4526
Epoch 2/10
1563/1563 [==============================] - 4s 3ms/step - loss: 1.3361 - accuracy: 0.5216 - val_loss: 1.4776 - val_accuracy: 0.4846
Epoch 3/10
1563/1563 [==============================] - 4s 3ms/step - loss: 1.1816 - accuracy: 0.5824 - val_loss: 1.1282 - val_accuracy: 0.6061
Epoch 4/10
1563/1563 [==============================] - 4s 3ms/step - loss: 1.0730 - accuracy: 0.6242 - val_loss: 1.1308 - val_accuracy: 0.6108
Epoch 5/10
1563/1563 [==============================] - 5s 3ms/step - loss: 0.9949 - accuracy: 0.6540 - val_loss: 1.1160 - val_accuracy: 0.6223
Epoch 6/10
1563/1563 [==============================] - 4s 3ms/step - loss: 0.9268 - accuracy: 0.6784 - val_loss: 1.0251 - val_accuracy: 0.6576
Epoch 7/10
1563/1563 [==============================] - 4s 3ms/step - loss: 0.8666 - accuracy: 0.6949 - val_loss: 1.0190 - val_accuracy: 0.6523
Epoch 8/10
1563/1563 [==============================] - 4s 3ms/step - loss: 0.8127 - accuracy: 0.7170 - val_loss: 1.0383 - val_accuracy: 0.6534
Epoch 9/10
1563/1563 [==============================] - 5s 3ms/step - loss: 0.7579 - accuracy: 0.7362 - val_loss: 1.0633 - val_accuracy: 0.6542
Epoch 10/10
1563/1563 [==============================] - 5s 3ms/step - loss: 0.7169 - accuracy: 0.7483 - val_loss: 1.0449 - val_accuracy: 0.6719
313/313 [==============================] - 0s 1ms/step - loss: 1.0449 - accuracy: 0.6719
Test accuracy: 0.6718999743461609

可以看到已经启用了 CPU 指令加速 :耗时44秒

对比以下是没有开启CPU 指令加速的输出:

2023-07-30 19:40:50.104394: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-07-30 19:40:51.399995: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.
Epoch 1/10
1563/1563 [==============================] - 144s 92ms/step - loss: 1.6986 - accuracy: 0.4010 - val_loss: 1.3685 - val_accuracy: 0.5083
Epoch 2/10
1563/1563 [==============================] - 135s 87ms/step - loss: 1.2644 - accuracy: 0.5548 - val_loss: 1.3069 - val_accuracy: 0.5370
Epoch 3/10
1563/1563 [==============================] - 158s 101ms/step - loss: 1.1150 - accuracy: 0.6121 - val_loss: 1.1304 - val_accuracy: 0.5997
Epoch 4/10
1563/1563 [==============================] - 160s 103ms/step - loss: 1.0098 - accuracy: 0.6516 - val_loss: 1.0305 - val_accuracy: 0.6457
Epoch 5/10
1563/1563 [==============================] - 167s 107ms/step - loss: 0.9326 - accuracy: 0.6744 - val_loss: 1.0547 - val_accuracy: 0.6364
Epoch 6/10
1563/1563 [==============================] - 176s 113ms/step - loss: 0.8756 - accuracy: 0.6958 - val_loss: 1.0110 - val_accuracy: 0.6595
Epoch 7/10
1563/1563 [==============================] - 177s 113ms/step - loss: 0.8207 - accuracy: 0.7145 - val_loss: 1.0024 - val_accuracy: 0.6663
Epoch 8/10
1563/1563 [==============================] - 173s 111ms/step - loss: 0.7732 - accuracy: 0.7323 - val_loss: 1.0233 - val_accuracy: 0.6614
Epoch 9/10
1563/1563 [==============================] - 162s 103ms/step - loss: 0.7310 - accuracy: 0.7463 - val_loss: 0.9851 - val_accuracy: 0.6783
Epoch 10/10
1563/1563 [==============================] - 169s 108ms/step - loss: 0.6951 - accuracy: 0.7576 - val_loss: 1.0829 - val_accuracy: 0.6524
313/313 [==============================] - 2s 7ms/step - loss: 1.0829 - accuracy: 0.6524
Test accuracy: 0.652400016784668

耗时 (144+135+158+160+167+176+177+173+162+169 ) 秒 / 60 = 1621秒 / 60 = 27分钟

性能

没有cpu加速 耗时增加 1621÷44 = 36.8 倍 ,或者说开启CPU加速,性能提高 36.8 倍
我配置:
CPU是 i9-13900k
华硕z790A-wifi 吹雪 D5 ,开启自动超频
三星990pro 1T
海盗船 ddr5 32x2=64G 6000MHz 内存


http://www.mrgr.cn/p/53677851

相关文章

gin框架内容(三)--中间件

gin框架内容&#xff08;三&#xff09;--中间件 Gin框架允许开发者在处理请求的过程中&#xff0c;加入用户自己的函数。这个函数就叫中间件&#xff0c;中间件适合处理一些公共的业务逻辑&#xff0c;比如登录认证、权限校验、数据分页、记录日志、耗时统计等 即比如&#x…

Generative Diffusion Prior for Unified Image Restoration and Enhancement 论文阅读笔记

这是CVPR2023的一篇用diffusion先验做图像修复和图像增强的论文 之前有一篇工作做了diffusion先验&#xff08;Bahjat Kawar, Michael Elad, Stefano Ermon, and Jiaming Song, “Denoising diffusion restoration models,” arXiv preprint arXiv:2201.11793, 2022. 2, 4, 6,…

rcu链表综合实践

基础知识 rcu-read copy update的缩写。和读写锁起到相同的效果。据说牛逼一点。对于我们普通程序员&#xff0c;要先学会使用&#xff0c;再探究其内部原理。 链表的数据结构&#xff1a; struct list_head {struct list_head *next, *prev; };还有一种&#xff1a;struct h…

【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

VAE-根据李宏毅视频总结的最通俗理解

1.VAE的直观理解 先简单了解一下自编码器&#xff0c;也就是常说的Auto-Encoder。Auto-Encoder包括一个编码器&#xff08;Encoder&#xff09;和一个解码器&#xff08;Decoder&#xff09;。其结构如下&#xff1a; 自编码器是一种先把输入数据压缩为某种编码, 后仅通过该编…

Python - Opencv + pyzbar实时摄像头识别二维码

直接上代码&#xff1a; import cv2 from pyzbar.pyzbar import decodecap cv2.VideoCapture(0) # 打开摄像头while True: # 循环读取摄像头帧ret, frame cap.read()# 在循环中&#xff0c;将每一帧作为图像输入&#xff0c;使用pyzbar的decode()函数识别二维码barcodes …

np.bincount、np.digitize、np.unique、np.histogram、np.searchsorted

np.bincount 简介 np.bincount是统计数组中数字出现数量的函数&#xff0c;数值n在输入数组x中每出现1次&#xff0c;则输出o的o[n]1。 函数 官方文档 函数参数&#xff1a; x: 输入&#xff0c;1维非负数组weights: 权重数组, 可选参数&#xff0c;如果指定了这一参数&am…

函数指针数组

前面学习过数组 指针数组&#xff1a;用来存放数组指针&#xff08;地址&#xff09;的数组 int main() {int arr1[] { 0 };int arr2[] { 0 };int arr3[] { 0 };int* p[3] { arr1,arr2,arr3 };//指针数组return 0; }那么函数指针数组&#xff0c;就是用来存放几个类型相同…

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/&#xff0c;下载对应CUDA版本的PyTorch【不能直接pip install&#xff0c;否则安装上的是CPU版本的】 2. 查看GPU信息 &#xff08;1&#xff09;重要信息 !nvidia-smi我的GPU版本很垃圾&#xff0c;本blog仅…

GitHub上怎么寻找项目?

前言 下面由我精心整理的关于github项目资源搜索的一些方法&#xff0c;这些方法可以帮助你更快更精确的搜寻到你需要的符合你要求的项目。 写文章不易&#xff0c;如果这一篇问文章对你有帮助&#xff0c;求点赞求收藏~ 好&#xff0c;下面我们直接进入正题——> 首先我…

RS485或RS232转ETHERCAT连接ethercat转换器

最近&#xff0c;生产管理设备中经常会遇到两种协议不相同的情况&#xff0c;这严重阻碍了设备之间的通讯&#xff0c;串口设备的数据不能直接传输给ETHERCAT。这可怎么办呢&#xff1f; 别担心&#xff0c;捷米JM-ECT-RS485/232来了&#xff01;这是一款自主研发的ETHERCAT从站…

多线程案例 | 单例模式、阻塞队列、定时器、线程池

多线程案例 1、案例一&#xff1a;线程安全的单例模式 单例模式 单例模式是设计模式的一种 什么是设计模式&#xff1f; 设计模式好比象棋中的 “棋谱”&#xff0c;红方当头炮&#xff0c;黑方马来跳&#xff0c;针对红方的一些走法&#xff0c;黑方应招的时候有一些固定的…

scrcpy2.0+实时将手机画面显示在屏幕上并用鼠标模拟点击2023.7.26

想要用AI代打手游&#xff0c;除了模拟器登录&#xff0c;也可以直接使用第三方工具Scrcpy&#xff0c;来自github&#xff0c;它是一个开源的屏幕镜像工具&#xff0c;可以在电脑上显示Android设备的画面&#xff0c;并支持使用鼠标进行交互。 目录 1. 下载安装2. scrcpy的高级…

【Vue3+Ts+Vite】配置滚动条样式

一、先看效果 二、直接上代码 <template><div class"main-container"><h1 v-for"index in 50" :key"index">这是home页面</h1></div> </template> <style lang"scss" scoped> .main-conta…

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式&#xff1a;https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下&#xff0c;然后引进页面里就行了&#xff0c;全局样式就放app.scss&#xff0c;单页面就引入单页面 注&#xff1a; .title…

目标检测之3维合成

现在有一系列的图片&#xff0c;图片之间可以按照z轴方向进行排列。图片经过了目标检测&#xff0c;输出了一系列的检测框&#xff0c;现在的需求是将检测框按类别进行合成&#xff0c;以在3维上生成检测结果。 思路&#xff1a;将图片按照z轴方向排列&#xff0c;以z轴索引作…

web流程自动化详解

今天给大家带来Selenium的相关解释操作 一、Selenium Selenium是一个用于自动化Web浏览器操作的开源工具和框架。它提供了一组API&#xff08;应用程序接口&#xff09;&#xff0c;可以让开发人员使用多种编程语言&#xff08;如Java、Python、C#等&#xff09;编写测试脚本&…

掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等

目录 专题一 认识主被动无人机遥感数据 专题二 预处理无人机遥感数据 专题三 定量估算农林植被关键性状 专题四 期刊论文插图精细制作与Appdesigner应用开发 近地面无人机植被定量遥感与生理参数反演 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

Flutter:flutter_local_notifications——消息推送的学习

前言 注&#xff1a; 刚开始学习&#xff0c;如果某些案例使用时遇到问题&#xff0c;可以自行百度、查看官方案例、官方github。 简介 Flutter Local Notifications是一个用于在Flutter应用程序中显示本地通知的插件。它提供了一个简单而强大的方法来在设备上发送通知&#…