【Windows】【OpenBLAS】MXNet 2.0(dev) + CUDA 11.7(Building From Source)

公開日:2022年9月14日


If you want to use MXNet 1.x, please see this page.
https://touch-sp.hatenablog.com/entry/2022/09/06/004928

Introduction

くわしく手順を公開してくれている人がいたので参考にさせて頂きました。
medium.com
備忘録として自分が行った手順を記録として残しておきます。


(注)oneDNNは使用していません

Environment

Visual Studioを除き、その他はなるべく最新のソフトウェアを使うようにしています。
ちなみにVisual Studio 2022でも問題なくBuild可能です。

Windows 11 (build: 22000.918)
NVIDIA Driver 516.94
Visual Studio Community 2019 v16.11.18
(or Visual Studio Community 2022 v17.3.3)
CMake 3.24.1
Git for Windows 2.37.3

cmake-guiを使用しますのでCMakeのPATHは通ってなくて問題ありません。
Git for Windowsは必ずしも必要ありません。

Preparation

Install CUDA

NVIDIA公式から「cuda_11.7.1_516.94_windows.exe」をdownloadして実行します。

Install cuDNN

NVIDIA公式から「cudnn-windows-x86_64-8.5.0.96_cuda11-archive.zip」をdownloadして解凍します。(downloadにはアカウントが必要です)


解凍したファルダ内に存在する「bin」「include」「lib」フォルダを「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7」フォルダ内にコピーします。


CUDAのPATHがすでに通っているので、cuDNNのPATH設定は不要です。


コマンドプロンプトでインストールの確認が可能です。

D:\>where nvcc
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\nvcc.exe

D:\>where cudnn64_8.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin\cudnn64_8.dll
D:\>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Jun__8_16:59:34_Pacific_Daylight_Time_2022
Cuda compilation tools, release 11.7, V11.7.99
Build cuda_11.7.r11.7/compiler.31442593_0

Install OpenCV

こちらから「opencv-4.6.0-vc14_vc15.exe」をdownloadして実行します。


解凍先はCドライブ直下とし、
システム環境変数 OpenCV_DIRを作成し「C:\opencv\build」を追加しました。
システム環境変数 Pathに「C:\opencv\build\x64\vc15\bin」を追加しました。

Download OpenBLAS binary package

こちらから「OpenBLAS-0.3.21-x64.zip」をdownloadしてDドライブ直下に解凍します。


PATHの設定は不要です。

Download MXNet sources

Dドライブ直下で以下を実行します。

git clone --recursive https://github.com/apache/incubator-mxnet.git mxnet



こちらのリポジトリと「mxnet\include」ファルダを比較するとダウンロードがうまくいっているかどうかがわかります。以降の過程で失敗する時の多くはリンクファイル(ショートカット)がうまく機能していない時でした。

Build

CMake(cmake-gui)を立ち上げます。

「Where is the source code」を「D:/mxnet」、
「Where to build the binaries」を「D:/mxnet/build」
にして「Configure」ボタンを押します。

エラーが出るので修正を加え「Configure」を押します。

OpenBLAS_INCLUDE_DIR:D:/OpenBLAS/include
OpenBLAS_LIB:D:/OpenBLAS/lib/libopenblas.dll.a
USE_CUTENSOR:not checked

上記の部分を修正すると「Configuring done」と表示されました。

「Configuring done」と表示されたら「Generate」ボタンを押します。うまくいっていれば「Generating done」と表示されます。
(警告はたくさん出ると思いますが無視して問題ないようです)


「Generating done」と表示されたら「Open Project」ボタンを押します。


自動的にVisual Studioが立ち上がるので「release」「x64」を選択します。
「ALL_BUILD Debugのプロパティ」で以下の変更を行います。

[CUDA C/C++] Target Machine Platform:32bit → 64bit
[CUDA C/C++ / Device] Code Generation:compute_52,sm_52 → compute_86,sm_86



その後「ソリューションのビルド」を実行します。

Create whl file

DLLsのコピー

「D:\mxnet\python\mxnet」フォルダ内に各種DLLsをコピーします。

「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\bin」から

cudart64_110.dll
cudnn64_8.dll
cufft64_10.dll

「D:\mxnet\build\Release」から

libmxnet.dll
mxnet_86.dll

「D:\OpenBLAS\bin」から

libopenblas.dll

「C:\opencv\build\x64\vc15\bin」から

opencv_world460.dll

こちらからdownloadした「zlib123dllx64.zip」から

zlibwapi.dll

MANIFEST.inの作成

「D:\mxnet\python」フォルダ内に「MANIFEST.in」というファイルを作成し以下を書き込みます。

recursive-include mxnet *

setup.pyの書き換え

「D:\mxnet\python」フォルダ内の「setup.py」の以下の1行を書き換えます。

書き換え前

data_files=[('mxnet', [LIB_PATH[0]])],

書き換え後

include_package_data=True,

whlファイルの作成

実行するPythonにwheelライブラリをインストールします。

pip install wheel

その後以下を実行しました。

python setup.py bdist_wheel --plat-name win_amd64



「D:\mxnet\python\dist」フォルダ内に「mxnet-2.0.0-py3-none-win_amd64.whl」が作成されているはずです。

Install MXNet

「mxnet-2.0.0-py3-none-win_amd64.whl」は好きな場所に移動して問題ありません。

pip install mxnet-2.0.0-py3-none-win_amd64.whl

これでインストールは完了です。

Check installation

>>> from mxnet.runtime import feature_list
>>> feature_list()
[✔ CUDA, ✔ CUDNN, ✖ NCCL, ✖ TENSORRT, ✖ CUTENSOR, ✖ CPU_SSE, ✖ CPU_SSE2, ✖ CPU_SSE3, ✖ CPU_SSE4_1, ✖ CPU_SSE4_2, ✖ CPU_SSE4A, ✖ CPU_AVX, ✖ CPU_AVX2, ✔ OPENMP, ✖ SSE, ✖ F16C, ✖ JEMALLOC, ✔ BLAS_OPEN, ✖ BLAS_ATLAS, ✖ BLAS_MKL, ✖ BLAS_APPLE, ✔ LAPACK, ✖ ONEDNN, ✔ OPENCV, ✖ DIST_KVSTORE, ✔ INT64_TENSOR_SIZE, ✔ SIGNAL_HANDLER, ✖ DEBUG, ✖ TVM_OP]

Check operation

以下のスクリプトで動作確認できています。
touch-sp.hatenablog.com
touch-sp.hatenablog.com
touch-sp.hatenablog.com