※ 2019/12/26追記。この記事の情報は古く、適切なバージョンのライブラリは入手できなくなっているかもしれません。また、以下に記載のバージョンをインストールできても、何故かうまく動作しないことがあります。そのため、あくまで参考程度に読んでいただければと思います。細かなバージョンの機微はいつの時代も難しいですね…
CUDA周りにはあまり詳しくないのだが、MacでCUDAを動かす方法を色々調べたのでまとめておく。
特に、「何が必要か」「今の状況をどうやって確認するか」「何をすれば動くようになるか」を一元的にまとめた記事がなかったので、それを重点的に書こうと思う。
まず、わたしのMacのスペックを載せておく。
- OS: 10.13.6 (High Sierra)
- 型番: MacBook Pro (Retina, 15-inch, Mid 2014)
- メモリ: 16 GB 1600 MHz DDR3
- GPU: NVIDIA GeForce GT 750M 2048 MB
CUDAを動かすのに必要なもの
- CUDA Toolkit
- CUDA driver
- NVIDIA display driver
- nvcc
- cudnn
- Command Line Tools for Xcode
この他、tensorflowを動かそうと思ったら、最近のtensorflowはMacでのGPUをサポートしないらしいので、自分でビルドする必要があるらしい。このあたりは後日改めてまとめようと思う。
今の状況をどうやって確認するのか
CUDA Toolkit
以下のようにCUDA-9.2
のようなディレクトリが存在していれば、CUDAはインストールされている。バージョンは、この例だと9.2だ。
/Developer/NVIDIA/CUDA-9.2
CUDA driver
Macの「システム環境設定」 → 「CUDA」
で表示される。こんな感じだ。
この例だと、バージョンは396.148だ。
NVIDIA display driver
Macの「システム環境設定」 → 「CUDA」
で表示される。上の例ではバージョンは387.10.10.10.40.105だ。
nvcc
以下のコマンドで確認可能。CUDA Toolkitをインストールすればnvccも勝手に入っている。
$ nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2018 NVIDIA Corporation Built on Tue_Jun_12_23:08:12_CDT_2018 Cuda compilation tools, release 9.2, V9.2.148
cudnn
以下のようにlibcudnn.7.dylib
やcudnn.h
のようなファイルが存在していれば、cudnnはインストールされている。ファイル名に7
とあるのでバージョンは7だ。cudnn.h
の中身を見てみると、この中にもバージョン情報が書かれている。
/usr/local/cuda/lib/libcudnn.7.dylib /usr/local/cuda/include/cudnn.h
Command Line Tools for Xcode
少し調べたが、バージョンを確かめる方法はわからなかった。
とりあえず、以下のディレクトリが存在していれば、何らかのバージョンのCommand Line Toolsがインストールしていることがわかる。
/Library/Developer/CommandLineTools
そして、正攻法ではないかもしれないが、以下のファイルを見ればバージョンがわかる(たぶん)。
$ cat /Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/Current/Resources/Info.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> … (省略) … <key>DTSDKName</key> <string>macosx10.12internal</string> <key>DTXcode</key> <string>0820</string> … (省略) … </dict> </plist>
この部分がバージョンぽい。
<key>DTXcode</key> <string>0820</string>
何をすれば動くのか、どうなっていれば動くのか
上で述べたそれぞれのパーツを、相性が合うバージョンで揃えれば良い。
わたしは以下のバージョンで揃えた。
- CUDA Toolkit: 9.2
- CUDA driver: 396.148
- NVIDIA display driver: 387.10.10.10.40.105
- nvcc: 9.2
- cudnn: 7.2
- Command Line Tools for Xcode: 8.2
どういう組み合わせが相性が合うのか? それは、まず、CUDA Toolkit, CUDA driver, NVIDIA display driverの3つに関しては、NVIDIAのドライバのダウンロードページを見て確認しよう。以下のMac用ドライバのダウンロードページを見てほしい。
いずれかのドライバをダウンロードしようとすると、2018年9月3日現在、このようなページが表示される。
ここに、どのOS、どのCUDA Toolkit, どのNVIDIA display driverをサポートしているのかが書かれている。
また、nvccに関しては、CUDA Toolkitをインストールすれば、勝手に同じバージョンのものが手に入る。
cudnnは、cudnnのダウンロードページから、サポートしているCUDAのバージョンを見れば良い。
https://developer.nvidia.com/rdp/cudnn-download
Command Line Tools for Xcodeに関してはよくわからないのだが、最近のXcodeでインストールされるclangではコンパイルできないので、あえて古いバージョンのXcodeをインストールするそうだ。
以下で古いXcodeをダウンロードできる。
Command Line Tools for Xcode_8.2 のようなファイル名のものをインストールすること。
インストールが終わったら、以下のコマンドを打つとバージョンの切り替えができる。
sudo xcode-select --switch /Library/Developer/CommandLineTools
古くなったか確かめてみる。
$ clang --version Apple LLVM version 8.0.0 (clang-800.0.42.1) Target: x86_64-apple-darwin17.7.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
はい、OK。
CUDAが正しく起動するかどうかを確かめるには以下を実行すればOK。
cd /Developer/NVIDIA/CUDA-9.2/samples/1_Utilities/deviceQuery sudo make ./deviceQuery ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce GT 750M" CUDA Driver Version / Runtime Version 9.2 / 9.2 CUDA Capability Major/Minor version number: 3.0 Total amount of global memory: 2048 MBytes (2147024896 bytes) ( 2) Multiprocessors, (192) CUDA Cores/MP: 384 CUDA Cores GPU Max Clock rate: 926 MHz (0.93 GHz) Memory Clock rate: 2508 Mhz Memory Bus Width: 128-bit L2 Cache Size: 262144 bytes Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 1 copy engine(s) Run time limit on kernels: Yes Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Device supports Compute Preemption: No Supports Cooperative Kernel Launch: No Supports MultiDevice Co-op Kernel Launch: No Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 9.2, CUDA Runtime Version = 9.2, NumDevs = 1 Result = PASS
こんな感じになればOK!
以上、今回はMacでCUDAを動かすということをやってみました。良い記事だと思った方は、以下の「★+」ボタンと、「読者になる」ボタンのクリック、記事の拡散、お願いします! ではでは、またの記事で。