Visual Studio 编译 onnxruntime 1.14.1 更低版本兼容Win7
1. 下载源码
这里的下载源码,包括编译时下载第三方代码对网络环境有一定要求 ^ _ ^
shell
# 1. 下载源码
git clone https://github.com/microsoft/onnxruntime.git
cd onnxruntime
# 2. 切换版本
# 查看所有的tag,找到自己需要的版本
git tag
# 根据我查询到的一些说明: 最高能支持win7的onnxruntime版本是 1.14.1
git checkout v1.14.1
2. 编译
- 参考官方编译的说明: https://onnxruntime.ai/docs/build/inferencing.html
- 全部参数定义和说明参考文件: tools\ci_build\build.py
- 需要系统环境下安装Python3
shell
# --cmake_generator根据情况而定, 示例可以给如下参数
# "Visual Studio 15 2017", "Visual Studio 16 2019", "Visual Studio 17 2022"
# 编译64位的CPU版本动态库
.\build.bat --config RelWithDebInfo --build_shared_lib --parallel --cmake_generator "Visual Studio 16 2019" --skip_tests
# 编译32位的CPU版本动态库
.\build.bat --config RelWithDebInfo --build_shared_lib --parallel --cmake_generator "Visual Studio 16 2019" --x86 --skip_tests
# GPU版本暂未测试, 给出参考网址和参考命令: https://zhuanlan.zhihu.com/p/614293644
# 需要注意 onnxruntime,cuda,cudnn等库之间的版本兼容对应关系
.\build.bat --cmake_generator "Visual Studio 16 2019" --config RelWithDebInfo --parallel 8 \
--use_cuda --use_tensorrt --cuda_version 11.6 \
--cuda_home "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6" \
--cudnn_home "D:\models\static-onnx\CUDNN-8.8.1.3" \
--tensorrt_home "D:/models/static-onnx/TensorRT-8.5.3.1" \
--enable_lto \
--enable_msvc_static_runtime \
--skip_tests --build_shared_lib
3. 编译好的库
- 链接: https://pan.baidu.com/s/1JNQnQZmVCGNvNpf2Ms0gaA?pwd=kfjs 提取码: kfjs
4. 编译失败一些报错和可能的解决方案
如果以上命令编译正常, 则不需要再看了
4.1 masm.targets(70,5): error MSB3721: 命令"ml64.exe ... QgemmU8S8KernelAmx.asm"
- 出现原因
- 这个出现的主要原因是不能找到系统中的 ml.exe 和 ml64.exe 的一些编译汇编代码的工具
- 用 visual studio 图形界面中开启详细的log日志可以得到更详细的报错信息, 就是找不到 ml.exe 和 ml64.exe 文件
- 这个问题相当奇怪, 即使配置了环境变量, cmd终端中也能执行ml.exe, 但是编译是仍然会报错这个 error MSB3721
解决方案
- 自己手动基于ml 和 ml64 工具编译相关文件即可
- 首先在window中配置环境变量
- ml.exe 和 ml64.exe 可以在milvus studio库文件中路径找到, 参考我的路径 (注意一些具体的版本号信息可能不一样, 其他路径一样)
- ml64.exe 路径: C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64
- ml.exe 路径: C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\Hostx86\x86
- 配置好环境变量后, 则可以在cmd终端中执行 ml 命令 和 ml64 命令
- 进入编译目录
- 我的编译命令是 --config RelWithDebInfo, 则进入 build\Windows\RelWithDebInfo 目录中
- 编译时需要 win10 sdk 头文件, 这个需要提前知道 win10 sdk路径, 我安装在 D:\Windows Kits\10
shell
# 需要win10 sdk 中两个头文件路径 (具体的版本号需要根据本机中实际的版本号确定)
D:\Windows Kits\10\Include\10.0.19041.0\shared
D:\Windows Kits\10\Include\10.0.19041.0\um
# ---- 64位编译报错 ------
# 从报错中拷贝出命令(必须从你的报错信息中拷贝出这条命令, 因为一些路径可能不一致)
ml64.exe /c /nologo /Zi /Fo"onnxruntime_mlas.dir\RelWithDebInfo\QgemmU8S8KernelAvx2.obj" /D"WIN32" /D"_WINDOWS" /D"CPUINFO_SUPPORTED" /D"EIGEN_HAS_C99_MATH" /D"NDEBUG" /D"GSL_UNENFORCED_ON_CONTRACT_VIOLATION" /D"EIGEN_USE_THREADS" /D"PLATFORM_WINDOWS" /D"NOGDI" /D"NOMINMAX" /D"_USE_MATH_DEFINES" /D"_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS" /D"EIGEN_MPL2_ONLY" /D"EIGEN_HAS_CONSTEXPR" /D"EIGEN_HAS_VARIADIC_TEMPLATES" /D"EIGEN_HAS_CXX11_MATH" /D"EIGEN_HAS_CXX11_ATOMIC" /D"EIGEN_STRONG_INLINE=inline" /D"WINAPI_FAMILY=100" /D"WINVER=0x0601" /D"_WIN32_WINNT=0x0601" /D"NTDDI_VERSION=0x06010000" /D"CMAKE_INTDIR="RelWithDebInfo"" /I "C:\Users\fulei\Downloads\onnxruntime\include\onnxruntime" /I "C:\Users\fulei\Downloads\onnxruntime\include\onnxruntime\core\session" /I "C:\Users\fulei\Downloads\onnxruntime\build\Windows\RelWithDebInfo" /I "C:\Users\fulei\Downloads\onnxruntime\onnxruntime" /I "C:\Users\fulei\Downloads\onnxruntime\build\Windows\RelWithDebInfo\_deps\abseil_cpp-src" /I "C:\Users\fulei\Downloads\onnxruntime\onnxruntime\core\mlas\inc" /I "C:\Users\fulei\Downloads\onnxruntime\onnxruntime\core\mlas\lib" /W3 /errorReport:prompt /TaC:\Users\fulei\Downloads\onnxruntime\onnxruntime\core\mlas\lib\amd64\QgemmU8S8KernelAvx2.asm
# 在这行命令中添加头文件路径
/I "D:\Windows Kits\10\Include\10.0.19041.0\shared"
# 进入编译路径 (build\Windows\RelWithDebInfo) 执行即可
# 所有需要编译的文件包括:
# 参考: cmake\onnxruntime_mlas.cmake
["QgemmU8S8KernelAmx.asm", "QgemmU8S8KernelAvx2.asm", "QgemmU8U8KernelAvx2.asm", "QgemmU8X8KernelAvx2.asm",
"QgemmU8X8KernelAvx512Core.asm", "QgemvU8S8KernelAvx2.asm", "QgemvU8S8KernelAvx512Core.asm",
"QgemvU8S8KernelAvx512Vnni.asm", "QgemvU8S8KernelAvxVnni.asm", "ConvSymKernelAvx2.asm",
"ConvSymKernelAvx512Core.asm", "DgemmKernelSse2.asm", "DgemmKernelAvx.asm", "DgemmKernelFma3.asm",
"DgemmKernelAvx512F.asm", "SgemmKernelSse2.asm", "SgemmKernelAvx.asm", "SgemmKernelM1Avx.asm",
"SgemmKernelFma3.asm", "SgemmKernelAvx512F.asm", "SconvKernelSse2.asm", "SconvKernelAvx.asm",
"SconvKernelFma3.asm", "SconvKernelAvx512F.asm", "SpoolKernelSse2.asm", "SpoolKernelAvx.asm",
"SpoolKernelAvx512F.asm", "sgemma.asm", "cvtfp16a.asm", "SoftmaxKernelAvx.asm", "TransKernelFma3.asm",
"TransKernelAvx512F.asm", "LogisticKernelFma3.asm", "TanhKernelFma3.asm", "ErfKernelFma3.asm"]
# 只要将 编译命令中的 xxxx.obj 和 xxx.asm 一同修改即可
# ---- 32位编译报错 ------
# 从报错中拷贝出命令(必须从你的报错信息中拷贝出这条命令, 因为一些路径可能不一致)
ml.exe /c /nologo /safeseh /Zi /Fo"onnxruntime_mlas.dir\RelWithDebInfo\SgemmKernelSse2.obj" /D"WIN32" /D"_WINDOWS" /D"CPUINFO_SUPPORTED" /D"EIGEN_HAS_C99_MATH" /D"NDEBUG" /D"GSL_UNENFORCED_ON_CONTRACT_VIOLATION" /D"EIGEN_USE_THREADS" /D"PLATFORM_WINDOWS" /D"NOGDI" /D"NOMINMAX" /D"_USE_MATH_DEFINES" /D"_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS" /D"EIGEN_MPL2_ONLY" /D"EIGEN_HAS_CONSTEXPR" /D"EIGEN_HAS_VARIADIC_TEMPLATES" /D"EIGEN_HAS_CXX11_MATH" /D"EIGEN_HAS_CXX11_ATOMIC" /D"EIGEN_STRONG_INLINE=inline" /D"WINAPI_FAMILY=100" /D"WINVER=0x0601" /D"_WIN32_WINNT=0x0601" /D"NTDDI_VERSION=0x06010000" /D"CMAKE_INTDIR="RelWithDebInfo"" /I "D:\Windows Kits\10\Include\10.0.19041.0\shared" /I "C:\Users\fulei\Downloads\onnxruntime\include\onnxruntime" /I "C:\Users\fulei\Downloads\onnxruntime\include\onnxruntime\core\session" /I "C:\Users\fulei\Downloads\onnxruntime\build\Windows\RelWithDebInfo" /I "C:\Users\fulei\Downloads\onnxruntime\onnxruntime" /I "C:\Users\fulei\Downloads\onnxruntime\build\Windows\RelWithDebInfo\_deps\abseil_cpp-src" /I "C:\Users\fulei\Downloads\onnxruntime\onnxruntime\core\mlas\inc" /I "C:\Users\fulei\Downloads\onnxruntime\onnxruntime\core\mlas\lib" /W3 /errorReport:prompt /TaC:\Users\fulei\Downloads\onnxruntime\onnxruntime\core\mlas\lib\i386\SgemmKernelSse2.asm
# 在这行命令中添加头文件路径
/I "D:\Windows Kits\10\Include\10.0.19041.0\um"
# 进入编译路径 (build\Windows\RelWithDebInfo) 执行即可
# 所有需要编译的文件包括:
# 参考: cmake\onnxruntime_mlas.cmake
["SgemmKernelSse2.asm", "SgemmKernelAvx.asm"]
# 只要将 编译命令中的 xxxx.obj 和 xxx.asm 一同修改即可