まひろ量子のハックログ

プログラミングや機械学習などの知識を記録・共有します

GPU搭載のMacBook Pro (Retina, 15-inch, Mid 2014)でCUDAを動かす

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」

で表示される。こんな感じだ。

f:id:twx:20180902225906p:plain

この例だと、バージョンは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.dylibcudnn.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用ドライバのダウンロードページを見てほしい。

MAC アーカイブ用CUDA ドライバ|NVIDIA

いずれかのドライバをダウンロードしようとすると、2018年9月3日現在、このようなページが表示される。

f:id:twx:20180903000244p:plain

ここに、どの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をダウンロードできる。

Sign in with your Apple ID - Apple Developer

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を動かすということをやってみました。良い記事だと思った方は、以下の「★+」ボタンと、「読者になる」ボタンのクリック、記事の拡散、お願いします! ではでは、またの記事で。

Kozuko Mahiro's Hacklog ―― Copyright © 2018 Mahiro Kazuko