以前のMBPではNVIDIAのGPUが搭載されていました。
そのうちの一つがMBP Retina Mid 2012です。この機種にはNVIDIAのGeForce GT 650M
が搭載されており、CUDA Capability
は3.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ドライバをセットアップします。公式サイトの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は公式ドキュメントにあるように、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 Type
はdmg (network)
のほうが良い気がする。
公式のアーカイブから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/
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
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
公式のバイナリは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 <[email protected]>
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