• 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肯定需要,其他的也可以在编译错误提示的时候安装。

    1. pip install idna
    2. pip install numpy
    3. pip install psutil

    安装 Msys2 及 基本工具

        下载 MSYS2-x86_64-20231026.exe 并安装。

         安装开发有关的包,宁滥毋缺。其实 TF的编译不在 MSYS2环境中,就是利用 MSYS2提供的工具。

    1. pacman -S --noconfirm --needed base-devel vim tar wget unzip protobuf
    2. pacman -S --noconfirm --needed \
    3. ${MINGW_PACKAGE_PREFIX}-cmake \
    4. ${MINGW_PACKAGE_PREFIX}-gcc \
    5. ${MINGW_PACKAGE_PREFIX}-toolchain \
    6. ${MINGW_PACKAGE_PREFIX}-boost \
    7. ${MINGW_PACKAGE_PREFIX}-ccache \
    8. ${MINGW_PACKAGE_PREFIX}-eigen3 \
    9. ${MINGW_PACKAGE_PREFIX}-gcc-libgfortran \
    10. ${MINGW_PACKAGE_PREFIX}-grpc \
    11. ${MINGW_PACKAGE_PREFIX}-gtk3 \
    12. ${MINGW_PACKAGE_PREFIX}-julia \
    13. ${MINGW_PACKAGE_PREFIX}-dlfcn \
    14. ${MINGW_PACKAGE_PREFIX}-ogre3d \
    15. ${MINGW_PACKAGE_PREFIX}-python \
    16. ${MINGW_PACKAGE_PREFIX}-vtk
    17. pacman -S --noconfirm --needed \
    18. ${MINGW_PACKAGE_PREFIX}-libpng \
    19. ${MINGW_PACKAGE_PREFIX}-libjpeg \
    20. ${MINGW_PACKAGE_PREFIX}-libtiff \
    21. ${MINGW_PACKAGE_PREFIX}-libwebp \
    22. ${MINGW_PACKAGE_PREFIX}-dlib \
    23. ${MINGW_PACKAGE_PREFIX}-ffmpeg \
    24. ${MINGW_PACKAGE_PREFIX}-harfbuzz \
    25. ${MINGW_PACKAGE_PREFIX}-lapack \
    26. ${MINGW_PACKAGE_PREFIX}-openblas \
    27. ${MINGW_PACKAGE_PREFIX}-opencl-clhpp \
    28. ${MINGW_PACKAGE_PREFIX}-opencl-headers \
    29. ${MINGW_PACKAGE_PREFIX}-opencl-icd \
    30. ${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。

    1. ## 官方下载
    2. wget https://github.com/bazelbuild/bazel/releases/download/5.4.0/bazel-5.4.0-windows-x86_64.exe
    3. ## 国内镜像
    4. wget https://hub.nuaa.cf/bazelbuild/bazel/releases/download/5.4.0/bazel-5.4.0-windows-x86_64.exe

    下载 tensorflow 

    git 克隆后切换到指定版本

    1. git clone --recursive https://github.com/tensorflow/tensorflow.git
    2. cd tensorflow
    3. # switch to the branch you want to build
    4. git checkout r2.9.1 # r1.9, r1.10, etc.

    或下载源码包并解压

    1. ## 官网地址
    2. wget https://github.com/tensorflow/tensorflow/archive/refs/tags/v2.9.1.zip
    3. ## 国内镜像
    4. wget https://hub.nuaa.cf/tensorflow/tensorflow/archive/refs/tags/v2.9.1.zip
    5. ## 解压
    6. unzip v2.9.1.zip

    编译 TF 2.9.1 

         在开始菜单中点击“Developer Command Prompt for VS 2019” 进入 MSVC2019 命令行环境。

         进入tensorflow 目录,编辑 prepare-build-TF2.9.bat 批处理文件 。

    1. @echo off
    2. set MSYS64_BASPATH=D:\msys64
    3. set BAZEL_SH=%MSYS64_BASPATH%\usr\bin\bash.exe
    4. set BAZEL_VS=C:\Program Files (x86)\Microsoft Visual Studio
    5. set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC
    6. set TF_VC_VERSION=16.6
    7. set OneMKL_DIR=C:\Program Files (x86)\Intel\oneAPI\mkl\2023.2.0
    8. set OneAPI_DIR=C:\Program Files (x86)\Intel\oneAPI
    9. set BAZEL_DIR=C:\Bazel-5.4.0
    10. set PYTHON_3_10=C:\Users\Tony\AppData\Local\Programs\Python\Python310
    11. set GIT_PATHS=C:\Program Files\Git\cmd;C:\Program Files\Git\usr\bin
    12. set PATH=%OneAPI_DIR%;%PYTHON_3_10%;%PYTHON_3_10%\Scripts;%OneMKL_DIR%\;%BAZEL_DIR%;%GIT_PATHS%;%PATH%;%MSYS64_PATHS%;%MSYS64_BASPATH%\usr\bin
    13. setvars.bat
    14. configure.cmd

    BAZEL_DIR:指向你的 bazel执行文件所在目录,其他参数就看你实际的安装路径了。

    编辑 build-TF2.9.bat 批处理文件。

    1. @echo off
    2. set OUT_DIR=K:\TF2.9.1_OUT
    3. for %%i in ( 1 ) do (
    4. echo " -------------------- ROUND %1 : START on %time% --------------------- "
    5. bazel --output_base=%OUT_DIR% build --config=opt --config=mkl --define=no_tensorflow_py_deps=true --local_ram_resources=HOST_RAM*.6 --local_cpu_resources=7 //tensorflow:tensorflow_cc
    6. bazel --output_base=%OUT_DIR% build --config=opt --config=mkl --define=no_tensorflow_py_deps=true --local_ram_resources=HOST_RAM*.6 --local_cpu_resources=7 //tensorflow:tensorflow_cc.lib
    7. bazel --output_base=%OUT_DIR% build --config=opt --config=mkl --define=no_tensorflow_py_deps=true --local_ram_resources=HOST_RAM*.6 --local_cpu_resources=7 //tensorflow:install_headers
    8. echo " ------------------- ROUND %1 : DONE on %time% --------------------- "

     OUT_DIR : 通过 bazel 参数 --output_base=指定的编译工作目录,不指定的话会指向 C:\Users\yourname\_bazel_compiler\,对C盘容量是巨大的挑战,特别是你同时编译几个版本的时候。

        执行这个批处理文件就好了。生成路径如下图

    问题:

    github下载超时

     将bazel脚本中 github.com链接换成国内github 镜像,加速下载,这里我使用https://hub.nuaa.cf,你看到的时候这个镜像大概率不能用了,自己搜一个就好。

    1. sed -i -e 's#https:\/\/github\.com#​​​​​​​​​​​​​​https://hub.nuaa.cf#g' \
    2. */*.bzl */*/*.bzl */*/*/*.bzl */*/*/*/*.bzl \
    3. */*.py */*/*.py */*/*/*.py */*/*/*/*.py

    但是部分 bazel 脚本会将 github  URL 替换成 镜像站 URL。

      https://github.com/...........

       -->  https://storage.googleapis.com/mirror.tensorflow.org/github.com/..........

    这会造成  https://hub.nuaa.cf/.......... 被转换成  https://storage.googleapis.com/mirror.tensorflow.org/hub.nuaa.cf/...........

    所以,当发现这种错误引起的下载失败的话,再将 github镜像 url 转换回原url,继续编译。

    1. sed -i -e 's#​​​​​​​​​​​​​​https:\/\/hub\.nuaa\.cf#https://github.com#g' \
    2. */*.bzl */*/*.bzl */*/*/*.bzl */*/*/*/*.bzl \
    3. */*.py */*/*.py */*/*/*.py */*/*/*/*.py

    pip下载超时

    可以看看 pip有没有设置镜像URL,如果没有,设置到镜像站,我选用清华镜像站

    1. pip config get global.index-url
    2. 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

    1. 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
    2. pacman -U mingw-w64-x86_64-python-numpy-1.23.5-1-any.pkg.tar.zst

    指定安装包版本

    1. wget https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/mingw-w64-x86_64-python-psutil-5.9.5-2-any.pkg.tar.zst
    2. wget 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 占用资源数。实际使用下来效果改善不大,只能反复编译个几十遍。

    1. bazel build --config=opt \
    2. --local_ram_resources=HOST_RAM*.8 \
    3. --local_cpu_resources=HOST_CPUS-2 \
    4. //tensorflow/tools/pip_package:build_pip_package

     报错 :无法打开 legalize_tf_xla_call_module_to_stablehlo_pass.obj.params

     windows下 有MAX_PATH=260 的限制,--output_base 设置编译输出路径尽量短小就好。 

    报错:“prefix_sum_shifted”: 未声明的标识符

    tensorflow/compiler/tf2xla/kernels/where_op.cc(242): error C2065: “prefix_sum_shifted”: 未声明的标识符 

     解决方法:在 MSys2 命令行界面中对报错文件执行 unix2dos 

  • 相关阅读:
    Java学习笔记 --- 作用域
    ElasticSearch从入门到精通(一)
    实例Python对比两个word文档并找出不同
    35道最新【软件测试】面试题,常见面试题及答案汇总
    新版Android Studio中设置gradle的JDK版本
    实现寄生组合继承
    Linux内存管理(三十一):内存规整简介和 kcompactd详解
    电化学传感器使用-电子学角度分析
    Pymol做B因子图
    ConvNext模型复现--CVPR2022
  • 原文地址:https://blog.csdn.net/Tonyfield/article/details/134208326