Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jbking/184b40dd31653255a1e04bbc612f1506 to your computer and use it in GitHub Desktop.
Save jbking/184b40dd31653255a1e04bbc612f1506 to your computer and use it in GitHub Desktop.

MacBook Pro Retina Mid 2012にPyTorchをGPU付きでセットアップするまで

これは

以前のMBPではNVIDIAのGPUが搭載されていました。 そのうちの一つがMBP Retina Mid 2012です。この機種にはNVIDIAのGeForce GT 650Mが搭載されており、CUDA Capability3.0と今となっては古いながらもCUDAが動作するようでした。 昨今GPUといえばGPGPU、とにもかくにも機械学習ということでPyTorchをGPUで動かせるか?ということを調べました。

結果

警告はされてしまいますが動いているようです。 (TODO PyTorchのチュートリアルを一通り流して動くことを確認する。)

>>> import torch
>>> device = torch.device('cuda:0')
>>> x = torch.randn(64, 1000, device=device, dtype=torch.float)
/Users/yusuke/tools/pytorch-env/lib/python3.6/site-packages/torch/cuda/__init__.py:116: UserWarning:
    Found GPU0 GeForce GT 650M which is of cuda capability 3.0.
    PyTorch no longer supports this GPU because it is too old.

  warnings.warn(old_gpu_warn % (d, name, major, capability[1]))
>>> x
tensor([[ 0.2779, -1.1269, -2.5424,  ...,  1.0921,  0.4272,  1.3088],
        [-0.2226,  0.3135, -0.6431,  ..., -1.1219,  0.4650, -0.4865],
        [ 0.5027,  0.5330,  1.8955,  ...,  0.0572, -1.5892,  0.1195],
        ...,
        [ 1.0906, -0.3807, -3.0540,  ..., -0.5997, -0.6176, -1.2519],
        [-0.3231, -2.2492,  0.3612,  ...,  0.2269,  0.9206, -0.5945],
        [ 0.6855, -1.8381, -0.4789,  ..., -0.5904,  1.0664,  0.5057]],
       device='cuda:0')
>>> x.shape
torch.Size([64, 1000])
>>> y = torch.randn(64, 1000, device=device, dtype=torch.float)
>>> x
tensor([[ 0.2779, -1.1269, -2.5424,  ...,  1.0921,  0.4272,  1.3088],
        [-0.2226,  0.3135, -0.6431,  ..., -1.1219,  0.4650, -0.4865],
        [ 0.5027,  0.5330,  1.8955,  ...,  0.0572, -1.5892,  0.1195],
        ...,
        [ 1.0906, -0.3807, -3.0540,  ..., -0.5997, -0.6176, -1.2519],
        [-0.3231, -2.2492,  0.3612,  ...,  0.2269,  0.9206, -0.5945],
        [ 0.6855, -1.8381, -0.4789,  ..., -0.5904,  1.0664,  0.5057]],
       device='cuda:0')
>>> y
tensor([[ 1.7785, -1.0892, -0.4136,  ...,  0.3208,  0.0312, -0.0625],
        [ 0.8819, -0.4625,  1.0818,  ...,  0.3681, -1.4640, -1.4612],
        [-0.3986,  0.2592, -0.6026,  ...,  1.3393, -1.0793, -0.5775],
        ...,
        [-0.9534,  1.0134, -0.4863,  ...,  0.2617, -1.5385, -0.4822],
        [-1.3387, -0.2943, -0.4213,  ..., -0.4213,  0.6845, -1.1517],
        [ 1.9836, -1.0806,  1.8277,  ...,  0.4554, -1.5910,  0.0791]],
       device='cuda:0')

セットアップ

セットアップは2段階に分かれ、それぞれハマりどころがあるので順に説明します。 対象のMBPはmacOS High Sierraにアップデートしてあり、CUDA Toolkitは9.1をセットアップすることとします。(CUDA Toolkitは9.2でもいけそうな気はしているけども未検証)

CUDA Toolkitをセットアップする

全体の流れはこのスレッドを参考にしました。

CUDAドライバをセットアップする

まずCUDAドライバをセットアップします。公式サイトCUDA Drivers for MAC Archiveからドライバをとってきてインストールしても動きません。理由は不明ですが、現在この方法ではドライバが正常に認識されません。 代わりにNvidia Web Driver 387.10.10.10.30.103をインストールしても動きません。こちらも理由は不明です。webdriver.shを使ったらドライバが正常に認識されました。理由は不明です。

% ./webdriver.sh -l
Password:
Checking for updates...
Current driver: 387.10.10.10.35.106
Running on: macOS 10.13.5 (17F77)

     1.  387.10.10.10.35.106  17F77          6.  387.10.10.10.25.157  17D2047       11.  378.10.10.10.25.103  17C89         16.  378.10.10.10.15.121  17A405
     2.  387.10.10.10.30.107  17E202         7.  387.10.10.10.25.156  17D47         12.  378.10.10.10.25.102  17C88         17.  378.10.10.10.15.114  17A365
     3.  387.10.10.10.30.106  17E199         8.  378.10.10.10.25.106  17C2205       13.  378.10.10.10.20.109  17B1003
     4.  387.10.10.10.25.160  17D2102        9.  378.10.10.10.25.105  17C2120       14.  378.10.10.10.20.108  17B1002
     5.  387.10.10.10.25.161  17D102        10.  378.10.10.10.25.104  17C205        15.  378.10.10.10.20.107  17B48

CUDA Toolkitをセットアップする

CUDA Toolkitは公式ドキュメントにあるように、Xcodeに含まれている最新バージョンのコンパイラには対応していません。Xcode 9.2をアップルの開発者サイトからダウンロードして展開します。Xcode.appができるので名前変えたりして(この例ではXcode_9.2.appと名前を変えた)分からなくならないようにしながら配置します。そのあと、 xcode-selectでコンパイラを切り換えます。

$ sudo xcode-select -s /Applications/Xcode_9.2.app/Contents/Developer
$ clang --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin17.6.0
Thread model: posix
InstalledDir: /Applications/Xcode_9.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

そのあと公式のアーカイブからCUDA Toolkit 9.1をとってきてインストールします。個人的にはInstaller Typedmg (network)のほうが良い気がする。

cuDNNをセットアップする

公式のアーカイブからCUDA 9.1向けのものをとってきて展開します。現在ではDownload cuDNN v7.0.5 (Dec 11, 2017), for CUDA 9.1が最新なので選びました。 展開するとライブラリとヘッダファイルがでてくるので、どこかに配置します。今回はCUDA Toolkitのなかに入れてしまいました。

$ sudo mv lib/libcudnn* /Developer/NVIDIA/CUDA-9.1/lib/
$ sudo mv include/cudnn.h /Developer/NVIDIA/CUDA-9.1/include/

deviceQueryでセットアップできたことを確認する

CUDA Toolkitにはサンプルコードがついているのでビルドします。そのなかのdeviceQueryの出力が以下のようになっていたらCUDA Toolkitのセットアップは完了です。

$ ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 650M"
  CUDA Driver Version / Runtime Version          9.1 / 9.1
  CUDA Capability Major/Minor version number:    3.0
  Total amount of global memory:                 1024 MBytes (1073414144 bytes)
  ( 2) Multiprocessors, (192) CUDA Cores/MP:     384 CUDA Cores
  GPU Max Clock rate:                            900 MHz (0.90 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
  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.1, CUDA Runtime Version = 9.1, NumDevs = 1
Result = PASS

cuda-smiで空きメモリを確認する

macOSのCUDAにはnvidia-smiが無いのでcuda-smiをインストールします。

空きメモリがほとんどないと出力されますが、実際にメモリ確保してみると500MBくらいメモリが使えます。(GCみたいなものが効いていない?)

$ cuda-smi
Device 0 [PCIe 0:1:0.0]: GeForce GT 650M (CC 3.0): 17.316 of 1023.7 MB (i.e. 1.69%) Free

PyTorchをセットアップする

公式のバイナリはCPU向けにビルドしてあるのでCUDAが認識されていません。 なのでビルドする必要があります。前項のCUDAがセットアップされていれば難しいことはありません。

PyTorchをgit cloneしてインストールします。

$ git clone https://github.com/pytorch/pytorch.git
$ cd pytorch
$ git log -n 1
commit 6402a4278b25e0307a09ab7fda9df496bf268adb (HEAD -> master, origin/master, origin/HEAD)
Author: Will Feng <yf225@cornell.edu>
Date:   Wed Jun 20 09:41:50 2018 -0400

    Improve win-build.sh for local build (#8674)
$ MACOSX_DEPLOYMENT_TARGET=10.13.5 CFLAGS='-stdlib=libc++' PATH=/Developer/NVIDIA/CUDA-9.1/bin:$PATH CUDA_HOME=/Developer/NVIDIA/CUDA-9.1 python setup.py install

ちゃんとCUDAが認識されていると、ログのなかに以下の出力が確認できます。もし以下の出力がされないようならpython setup.py cleanすると問題が解決する可能性が高いです。

...
-- Found CUDA: /Developer/NVIDIA/CUDA-9.1 (found suitable version "9.1", minimum required is "7.0")
-- Caffe2: CUDA detected: 9.1
-- Caffe2: CUDA nvcc is: /Developer/NVIDIA/CUDA-9.1/bin/nvcc
-- Caffe2: CUDA toolkit directory: /Developer/NVIDIA/CUDA-9.1
-- Caffe2: Header version is: 9.1
-- Found CUDNN: /Developer/NVIDIA/CUDA-9.1/include
-- Found cuDNN: v7.0.5  (include: /Developer/NVIDIA/CUDA-9.1/include, library: /Developer/NVIDIA/CUDA-9.1/lib/libcudnn.7.dylib)
-- Autodetected CUDA architecture(s): 3.0
-- Added CUDA NVCC flags for: -gencode;arch=compute_30,code=sm_30
...
-- ******** Summary ********
...
--   USE_CUDA              : 1
--     CUDA static link    : OFF
--     USE_CUDNN           : ON
--     CUDA version        : 9.1
--     cuDNN version       : 7.0.5
--     CUDA root directory : /Developer/NVIDIA/CUDA-9.1
--     CUDA library        : /Library/Frameworks/cuda.framework
--     cudart library      : /Developer/NVIDIA/CUDA-9.1/lib/libcudart_static.a;-Wl,-rpath,/usr/local/cuda/lib
--     cublas library      : /Developer/NVIDIA/CUDA-9.1/lib/libcublas.dylib;/Developer/NVIDIA/CUDA-9.1/lib/libcublas_device.a
--     cufft library       : /Developer/NVIDIA/CUDA-9.1/lib/libcufft.dylib
--     curand library      : /Developer/NVIDIA/CUDA-9.1/lib/libcurand.dylib
--     cuDNN library       : /Developer/NVIDIA/CUDA-9.1/lib/libcudnn.7.dylib
--     nvrtc               : /Developer/NVIDIA/CUDA-9.1/lib/libnvrtc.dylib
--     CUDA include path   : /Developer/NVIDIA/CUDA-9.1/include
--     NVCC executable     : /Developer/NVIDIA/CUDA-9.1/bin/nvcc
--     CUDA host compiler  : /Applications/Xcode_9.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
--     USE_TENSORRT        : OFF
...

個人的な確認項目

そのままpytorchディレクトリのなかでGPUが有効になったのを確認しようとするとエラーがでるので、違うディレクトリに移動してから確認しましょう。

$ python
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/yusuke/src/pytorch/torch/__init__.py", line 78, in <module>
    from torch._C import *
ModuleNotFoundError: No module named 'torch._C'
>>> ^D
$ cd /tmp
$ python
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment