官方文档:https://mxnet.apache.org/versions/1.9.1/get_started/windows_s…
1.简介
最近在学习 mxnet,虽然它过气了,但是还是一个很好的学习平台,毕竟教程搞得好,大家都来搞。
既然搞了深度学习那必须用gpu啦,但是mxnet的预编译包最多只支持 cuda11.7,而且好像还不支持windows平台
看这张图片,前面说了支持 Linux 和 Windows 平台,后面又说 Windows 是其他平台,需要从源码构建
还可以查找下这个链接:https://dist.mxnet.io/python,反正我是没找到1.9.1且适配cuda117的windows的.whl文件
官方文档呢,给出的是 vs2017 + cuda9.2 的编译,cuda9.2 是不能支持 rtx4090 显卡的最大计算能力8.9的
所以还是有坑,而且官方文档你不一定能编译的出来…
而且找遍了全网好像也没有最新的编译流程,只好自己搞一遍了,果然是过气了啊。
2.准备
最基础的cmake和vs2022就不说了
2.1 cuda
首先我们要选择合适的 cuda 版本,官方已经给出了cuda11.7的构建包,虽然是Linux上的,也说明了兼容11.7 ,十有八九不兼容12
所以我们的选择范围就是cuda11.x
nvidia显卡还有一个特性叫计算能力,或者叫做架构,每一代的显卡有不同的架构,在编译时会自动选择当前显卡支持的最新架构
所以需要使用可以兼容当前显卡最新架构的cuda版本,首先查看显卡信息
由于使用的是4090显卡,需要查看显卡支持的最大计算能力:https://developer.nvidia.com/cuda-gpus
下图可以看到30系显卡支持8.6的计算能力,40系支持到8.9
而cuda本身对计算能力有一个支持列表,实际上,cuda11.7不支持8.9,只有cuda11.8才支持8.6
尽管我们可以编译较低等级的架构,也可以在高等级架构的gpu上运行,但是这可能会产生其他问题
所以最好直接编译当前gpu支持的最高架构的代码
最后我们选择了cuda11.8,也就是官方没有提供的最近的一个版本
尽管系统里安装了11.8和12.2两个版本,但是它们是可以互不影响的,只需要设置CUDA_PATH为使用的版本,且将其加入PATH
2.2 cudnn
下载支持cuda11.8的cudnn版本:https://developer.nvidia.com/cudnn
2.3 OpenBLAS
首先下载 OpenBLAS https://github.com/xianyi/OpenBLAS/releases
然后配置OpenBLAS_HOME指向其内部的build目录,下面包含了bin和include目录
2.4 OpenCV
使用Chocolatey安装OpenCV,实际上就是从github下载 https://github.com/opencv/opencv/releases
然后配置OpenCV_DIR指向 opencv/build 目录
2.5 mxnet
下载源码 https://github.com/apache/mxnet ,且到1.9.1分支
3.生成
使用cmake生成编译工具链
cmake -DUSE_CUDA=1 -DUSE_CUDNN=1 -DUSE_OPENCV=1 -DUSE_OPENMP=1 -DUSE_BLAS=open -DUSE_LAPACK=1 -DUSE_DIST_KVSTORE=0 -DCUDA_ARCH_LIST=Common -DCUDNN_LIBRARY='D:devIDEnvidiacudnn-8.9.1.23_cuda11libx64cudnn.lib' -DCUDNN_INCLUDE='D:devIDEnvidiacudnn-8.9.1.23_cuda11include' .
CUDNN_LIBRARY:指向cudnn.lib文件
CUDNN_INCLUDE:指向cudnn的include目录
生成完毕后可以看到mxnet.sln文件
但是还有一个小问题,每个cuda版本安装时都会在vs的目录下安装一些文件,我们生成的工具链里使用了12.2版本的文件
因为实际上使用的是cuda11.8,所以需要更改这些文件为11.8
4.编译
打开 native x64 command line , 运行编译,大概一个半小时
msbuild mxnet.sln /p:Configuration=Release;Platform=x64 /maxcpucount
编译完成后会在Release目录下生成 mxnet.dll 和 mxnet_89.dll
5.安装
安装的一个前置工作是,必须保证所有的dll在PATH中可用:
- cudart64_110.dll:来自cuda
- libopenblas.dll:来自openblas
- libgcc_s_seh-1.dll:来自mingw64
- libgfortran-5.dll:来自mingw64
- libquadmath-0.dll:来自mingw64
- libwinpthread-1.dll:来自mingw64
- opencv_world470.dll:来自opencv
- cudnn64_8.dll:来自cudnn
配置MXNET_LIBRARY_PATH 环境变量指向 libmxnet.dll
然后执行安装 pip install ./python
6.测试
import mxnet as mx
print(1)
a = mx.nd.ones((2, 3), mx.gpu(0))
print(a)
b = a * 2 + 1
print(b)
print(b.asnumpy())
得到在gpu 上分配的结果
1
[[1. 1. 1.]
[1. 1. 1.]]
[[3. 3. 3.]
[3. 3. 3.]]
[[3. 3. 3.]
[3. 3. 3.]]
到此为止,使用cuda11.8 编译的兼容8.9架构的mxnet就可以使用了
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
假设后端接口返回时间2023-01-01为截止时间,需要判断当前时间是否到期 逻辑就是将时间转换为时间戳,然后再进行比较。但是注意的是 微信小程序iOS getTime 转换成时间戳为null 我们只需要将“-”符号的替换成“/”即可 function get…