Windows 下编译 TensorFlow 2.9.1 CC库
参考 Intel 的 tensorflow 编译指导,不过项目还是可以用 TF原本的,不是一定要选择Intel 的TF版本。
安装 MSVC 2019
安装 Intel OneDNN OneMKL
似乎也可以不安装 ( @ & @ )
https://www.intel.cn/content/www/cn/zh/developer/articles/tool/oneapi-standalone-components.html#onednn
安装 Python
TensorFlow文档一般都是推荐安装Python3.8,但高一点版本也没关系,我用的是 Python 3.10.11 。
安装 pip 和其他工具。 pip的安装不记得了,应该不难。
python -m ensurepip --default-pip
安装 numpy 等模块,numpy肯定需要,其他的也可以在编译错误提示的时候安装。
pip install idna
pip install numpy
pip install psutil
安装 Msys2 及 基本工具
下载 MSYS2-x86_64-20231026.exe 并安装。
安装开发有关的包,宁滥毋缺。其实 TF的编译不在 MSYS2环境中,就是利用 MSYS2提供的工具。
pacman -S --noconfirm --needed base-devel vim tar wget unzip protobufpacman -S --noconfirm --needed \${MINGW_PACKAGE_PREFIX}-cmake \${MINGW_PACKAGE_PREFIX}-gcc \${MINGW_PACKAGE_PREFIX}-toolchain \${MINGW_PACKAGE_PREFIX}-boost \${MINGW_PACKAGE_PREFIX}-ccache \${MINGW_PACKAGE_PREFIX}-eigen3 \${MINGW_PACKAGE_PREFIX}-gcc-libgfortran \${MINGW_PACKAGE_PREFIX}-grpc \${MINGW_PACKAGE_PREFIX}-gtk3 \${MINGW_PACKAGE_PREFIX}-julia \${MINGW_PACKAGE_PREFIX}-dlfcn \${MINGW_PACKAGE_PREFIX}-ogre3d \${MINGW_PACKAGE_PREFIX}-python \${MINGW_PACKAGE_PREFIX}-vtk
pacman -S --noconfirm --needed \${MINGW_PACKAGE_PREFIX}-libpng \${MINGW_PACKAGE_PREFIX}-libjpeg \${MINGW_PACKAGE_PREFIX}-libtiff \${MINGW_PACKAGE_PREFIX}-libwebp \${MINGW_PACKAGE_PREFIX}-dlib \${MINGW_PACKAGE_PREFIX}-ffmpeg \${MINGW_PACKAGE_PREFIX}-harfbuzz \${MINGW_PACKAGE_PREFIX}-lapack \${MINGW_PACKAGE_PREFIX}-openblas \${MINGW_PACKAGE_PREFIX}-opencl-clhpp \${MINGW_PACKAGE_PREFIX}-opencl-headers \${MINGW_PACKAGE_PREFIX}-opencl-icd \${MINGW_PACKAGE_PREFIX}-openmp
安装Bazel
不同tensorflow版本对应的Bazel版本是不同的,提前确定好。
对于 tensorflow 2.9.1,下载安装 Windows 版本 bazel 5.4.0,复制到 C:\Program Files\Bazel-5.4.0 或 D:\Bazel-5.4.0 目录,改名为 bazel.exe。
## 官方下载
wget https://github.com/bazelbuild/bazel/releases/download/5.4.0/bazel-5.4.0-windows-x86_64.exe
## 国内镜像
wget https://hub.nuaa.cf/bazelbuild/bazel/releases/download/5.4.0/bazel-5.4.0-windows-x86_64.exe
下载 tensorflow
git 克隆后切换到指定版本
git clone --recursive https://github.com/tensorflow/tensorflow.git
cd tensorflow
# switch to the branch you want to build
git checkout r2.9.1 # r1.9, r1.10, etc.
或下载源码包并解压
## 官网地址
wget https://github.com/tensorflow/tensorflow/archive/refs/tags/v2.9.1.zip## 国内镜像
wget https://hub.nuaa.cf/tensorflow/tensorflow/archive/refs/tags/v2.9.1.zip## 解压
unzip v2.9.1.zip
编译 TF 2.9.1
在开始菜单中点击“Developer Command Prompt for VS 2019” 进入 MSVC2019 命令行环境。
进入tensorflow 目录,将下面脚本写入 build_TF2.9.1.bat 批处理文件 。
BAZEL_DIR:指向你的 bazel执行文件所在目录
OUT_DIR : 通过 bazel 参数 --output_base=指定的编译工作目录,不指定的话会指向 C:\Users\yourname\_bazel_compiler\<hashcode>,对C盘容量是巨大的挑战,特别是你同时编译几个版本的时候。
其他参数就看你实际的安装路径了。
set BAZEL_DIR=D:\Program Files\Bazel-5.4.0
set OUT_DIR=D:\TF2.9.1_OUTset MSYS64_BASPATH=D:\msys64set BAZEL_SH=%MSYS64_BASPATH%\usr\bin\bash.exe
set BAZEL_VS=D:\Program Files (x86)\Microsoft Visual Studio
set BAZEL_VC=D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC
set TF_VC_VERSION=16.6set OneMKL_DIR=D:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0set PYTHON_3_10=C:\Users\Administrator\AppData\Local\Programs\Python\Python310set GIT_PATHS=D:\Program Files\Git\cmd;D:\Program Files\Git\usr\binset PATH=%PYTHON_3_10%;%PYTHON_3_10%\Scripts;%OneMKL_DIR%\;%BAZEL_DIR%;%MSYS64_PATHS%;%MSYS64_BASPATH%\usr\bin;%GIT_PATHS%;%PATH%python configure.pybazel --output_base=%OUT_DIR% build --announce_rc --config=opt --config=mkl --define=no_tensorflow_py_deps=true --local_cpu_resources=5 //tensorflow:tensorflow_cc.dllbazel --output_base=%OUT_DIR% build --announce_rc --config=opt --config=mkl --define=no_tensorflow_py_deps=true --local_cpu_resources=5 //tensorflow:tensorflow_framework.dll
执行这个批处理文件就好了。生成路径如下图

问题:
github下载超时
将bazel脚本中 github.com链接换成国内github 镜像,加速下载,这里我使用hub.yzuu.cf,你看到的时候这个镜像大概率不能用了,自己搜一个就好。
sed -i -e 's#https:\/\/github\.com#https://hub.yzuu.cf#g' \*/*.bzl */*/*.bzl */*/*/*.bzl */*/*/*/*.bzl \*/*.py */*/*.py */*/*/*.py */*/*/*/*.py
但是部分 bazel 脚本会将 github URL 替换成 镜像站 URL。
https://github.com/...........
--> https://storage.googleapis.com/mirror.tensorflow.org/github.com/..........
这会造成 https://hub.yzuu.cf/.......... 被转换成 https://storage.googleapis.com/mirror.tensorflow.org/hub.yzuu.cf/...........
所以,当发现这种错误引起的下载失败的话,再将 github镜像 url 转换回原url,继续编译。
sed -i -e 's#https\:\/\/hub\.yzuu\.cf#https://github.com#g' \*/*.bzl */*/*.bzl */*/*/*.bzl */*/*/*/*.bzl \*/*.py */*/*.py */*/*/*.py */*/*/*/*.py
pip下载超时
可以看看 pip有没有设置镜像URL,如果没有,设置到镜像站,我选用清华镜像站
pip config get global.index-url
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
报错:用户没有权限
执行 os.symlink(target, link_name)时,报告用户没有权限。我即使以管理员执行 msys2也无法解决这个问题。
最后 直接用管理员账号登录,重新准备所有环境才解决
报错:Couldn't find undname.exe under。。。
一般是使用的 MSVC版本不合适,我安装 VS2019后这个问题被解决。
BAZEL_VC does not work when vs2019 and vs2022 exist on windows 11. · Issue #14232 · bazelbuild/bazel · GitHub
Auto-Configuration Error: Couldn't find undname.exe under C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\ · Issue #31608 · tensorflow/tensorflow · GitHubb
报错:fatal error C1007: 无法识别的标志“-ReducedOptimizeHugeFunctions”(在“p2”中)
VS2015,VS2017 还不支持这个选项,一定要安装 VS2019。
(VS2022 我没有成功,保留意见)。
参考 tensorflow源码根目录配置文件.bazelrc 的说明

为了保证进入 Msys2界面后 VS2019 编译环境 正常,在~/.bashrc 中追加初始化指令,你需要修改为你机器的VS2019安装路径。
"D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
报错:ERROR: No matching distribution found for numpy==1.23.5
默认版本不兼容,安装指定版本的 python-numpy
wget https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/mingw-w64-x86_64-python-numpy-1.23.5-1-any.pkg.tar.zst
pacman -U mingw-w64-x86_64-python-numpy-1.23.5-1-any.pkg.tar.zst
指定安装包版本
wget https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/mingw-w64-x86_64-python-psutil-5.9.5-2-any.pkg.tar.zstwget https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/mingw-w64-x86_64-python-idna-3.4-2-any.pkg.tar.zst
报错 : fatal error C1060: 编译器的堆空间不足

限制 bazel 占用资源数。实际使用下来效果改善不大,只能反复编译个几十遍。
bazel build --config=opt \--local_ram_resources=HOST_RAM*.8 \--local_cpu_resources=HOST_CPUS-2 \//tensorflow/tools/pip_package:build_pip_package
报错 :无法打开 legalize_tf_xla_call_module_to_stablehlo_pass.obj.params
windows下 有MAX_PATH=260 的限制,--output_base 设置编译输出路径尽量短小就好。 
相关文章:
Windows 下编译 TensorFlow 2.9.1 CC库
参考 Intel 的 tensorflow 编译指导,不过项目还是可以用 TF原本的,不是一定要选择Intel 的TF版本。 安装 MSVC 2019 安装 Intel OneDNN OneMKL 似乎也可以不安装 ( & ) https://www.intel.cn/content/www/cn/zh/developer/articles/tool/one…...
Databricks 入门之连接外部数据库
连接方式应该很多,现在记录本人目前学习到的一种方式。 一、读取外部数据库 1.notebook执行语言为sql时可以通过JDBC方式加载数据库数据。 以下代码将可以将sqlserver中的表加载到databricks视图中,当然也可创建表来接收外部数据。 %sqlCREATE TEMPOR…...
家庭互动新维度:TikTok的亲子体验
在数字时代,家庭互动的方式正在发生翻天覆地的改变。社交媒体平台TikTok崭露头角,不仅在年轻用户中广受欢迎,还为家庭带来了全新的互动维度。本文将深入探讨TikTok如何成为家庭互动的新元素,以及它如何改变亲子体验。 TikTok&…...
redis教程 一 redis中的常用命令
文章目录 redis常见命令Redis数据结构介绍redis通用命令String类型String的常见命令Key结构 Hash类型List类型Set类型SortedSet类型 redis常见命令 Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样&…...
【第28例】IPD体系进阶 | 需求管理:需求实现过程
目录 简介 内容详解 CSDN学院相关推荐 作者简介 简介 继续 IPD 体系中的需求管理相关的专题。 先来看看整个需求管理涉及的过程内容: 需求管理流程主要包含五个阶段: 需求收集; 需求分析; 需求分发/分配;...
聊聊我对AI Agents技术的一些看法
小伙伴们!我来兑现承诺啦~ ps:接下来期待什么内容,欢迎在评论区留言! 今天,我们就来聊聊大模型 Agent。 最近这几个月,Agent 这一概念可谓火出天际,从 AutoGPT 一周 6 万 star 刷新…...
32 mysql in 的实现
前言 这里我们主要是来探讨一下 mysql 中 in 的使用, find_in_set 的使用 这两者 在我们实际应用中应该也是 非常常用的了 测试数据表如下 CREATE TABLE tz_test (id int(11) unsigned NOT NULL AUTO_INCREMENT,field1 varchar(16) DEFAULT NULL,field2 varchar(16) DEFAU…...
Qt QtCreator添加自定义注释
在写代码的时候我们为了规范化,一般会加文件注释、类注释和函数注释;用注释来说明我们的代码,也方便模块化开发,那么我们在写注释的时候经常会写一些重复的内容,我们会复制粘贴。这样一来二去,就显得很繁琐…...
docker 各种命令
-v 或 --volume 由三个由冒号(:)分隔的字段组成,[HOST-DIR:]CONTAINER-DIR[:OPTIONS]。 HOST-DIR 代表主机上的目录或数据卷的名字。省略该部分时,会自动创建一个匿名卷。如果是指定主机上的目录,需要使用绝对路径。 C…...
【优选算法系列】【专题五位运算】第一节.常见的位运算(面试题 01.01. 判定字符是否唯一和268. 丢失的数字)
文章目录 前言常见的位运算一、判定字符是否唯一 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、丢失的数字 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 常见的…...
学习笔记二十八:K8S控制器Daemonset入门到企业实战应用
DaemonSet控制器:概念、原理解读 DaemonSet概述DaemonSet工作原理:如何管理PodDaemonset典型的应用场景DaemonSet 与 Deployment 的区别DaemonSet资源清单文件编写技巧 DaemonSet使用案例:部署日志收集组件fluentdDaemonset管理pod࿱…...
您对互联网有多“上瘾”?
萨里大学的科学家决定检查现代用户的网络成瘾程度。他们的一篇文章最近发表在 《旅行与旅游营销杂志》上 ,其中包含对受此问题困扰的年轻人(而不仅仅是年轻人)的研究和分类结果。 796名不同年龄段的人参加了实验。科学家们仔细监测了他们的行…...
数据挖掘题目:设ε= 2倍的格网间距,MinPts = 6, 采用基于1-范数距离的DBSCAN算法对下图中的实心格网点进行聚类,并给出聚类结果(代码解答)
问题 代码 import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import DBSCAN #pip install matplotlib #pip install numpy #pip install scikit-learn # 实心格网点的坐标 solid_points np.array([[1, 1], [2, 1],[3, 1], [1, 2], [2, 2], [3, 2],[…...
STM32HAL-完全解耦面向对象思维的架构-时间轮片法使用(timeslice)
目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、代码解释 六、总结 概述 timeslice是一个时间片轮询框架,完全解耦的时间片轮询框架,非常适合裸机单片机引用。接下来将该框架移植到stm32单片机运行,单片机…...
C++ 程序员入门需要多久,怎样才能学好?
我们都知道,C是所有语言的基础 !记得在大学毕业之后,做了C的后端开发当然还有一些嵌入式的相关的工作,到现在换工作,工作机会依然那么多,到了一定的阶段,我想你不是在找工作,而是工作…...
SpringBoot项目打war包部署到tomcat访问路径去掉项目名
方法一:手动修改包名 1.先将Tomcat webapp目录下文件全部删除 2.将war包文件放在webapps文件夹下 2.运行tomcat,war文件自动解压成文件夹 3.关闭tomcat,,将步骤2解压的文件夹直接改名为ROOT 4.重新运行tomcat,即可。 5…...
58同城面试
一、Java八股 1、ThreadLocal的底层原理是什么? ThreadLocal 在Java中用于提供线程局部变量,这些变量在每个线程中都有独立的副本,互不干扰。其底层原理可以简要描述如下: 数据存储: 每个线程中都有一个 ThreadLocalMap 的实例&…...
【数据结构】归并排序 的递归实现与非递归实现
归并排序 前言一、归并排序递归实现(1)归并排序的核心思路(2)归并排序实现的核心步骤(3)归并排序码源详解(4)归并排序效率分析1)时间复杂度 O(N*logN…...
Go的命令行工具开发:使用Cobra库
今天我们将深入探讨如何使用Go语言和Cobra库来开发命令行工具。 命令行工具在软件开发中有着广泛的应用,它们快速、高效,且易于自动化。 Go语言因其简洁、高效而被广泛用于命令行工具的开发。Cobra库则是Go中用于构建命令行工具的重要库之一。 为什么选…...
坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法
阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法,亲测有效: Mobax好卡啊,那就直接在阿里云后台操作即可,阿里云后台也可以上传文件。 Navicat mysql好卡啊,那就直接在阿里云后台最上面帮助的右边有个数据库&…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
