GeForce GTX 1080を搭載したMac ProでTensorFlowを使う

2017-11-06 (月) 11:36:03 (2593d) | Topic path: Top / 機械学習 / GeForce GTX 1080を搭載したMac ProでTensorFlowを使う

はじめに

Mac Pro (2010 Mid)にGeForce GTX 1080を積んで、TensorFlowを動かすまでのメモです。

macOSではGeForce GTX 1080がまだサポートされていないので、UbuntuをインストールしてUbuntu上で動かします。

現在、TensorFlow 1.4, CUDA 9.0, cuDNN 7.0がリリースされていますが、この組み合わせでは動かなかったので、TensorFlow 1.3, CUDA 8.0, cuDNN 6.0の組み合わせで動かしています。

この記事の内容は、次の環境で確認しました。

  • Ubuntu 17.10
  • Nvidia Driver 384.90
  • CUDA 8.0
  • cuDNN 6.0.21
  • TensorFlow 1.3

用意したもの

  • ASUS TURBO-GTX1080-8G
  • Mini PCIe 6 pin to PCIe 6 pinケーブル
  • PCIe 6 pin x 2 to PCIe 8 pinケーブル
  • 2TB 3.5inch SATA HDD
  • 16GB USBメモリー

HDDの容量はもっと小さくても構いません。 USBメモリーの容量は16GB以上必要です。

Ubuntuインストール用USBメモリーを作成する

次のページを参考にしました。

  1. Ubuntu 16.04 LTSをダウンロードします。
  2. ディスクユーティリティを使って、USBメモリーを、MS-DOS (FAT)、GUIDパーティションで消去します。
  3. diskutilコマンドで、USBメモリーのデバイスを調べます。
    $ diskutil list
  4. 調べたデバイスをアンマウントします。(これはデバイスが /dev/disk2 の時の例です。)
    $ diskutil unmountDisk /dev/disk2
  5. ダウンロードしたUbuntuのISOイメージをコピーします。
    $ sudo dd if=ubuntu-16.04-desktop-amd64.iso of=/dev/rdisk2 bs=1m

Ubuntu用のHDDを用意する

  1. macOSをシャットダウンし、HDDを増設します。
  2. macOSを起動し、ディスクユーティリティで増設したHDDを、MS-DOS (FAT)、GUIDパーティションで消去します。

スワップ領域を作りたい場合は2パーティションにすればいいと思いますが、今回のMac Proは32GBのメモリーを積んでいるので、スワップ領域はなしにしました。

ブート・マネージャーを準備する

BootCampはUbuntuをサポートしていません。 そこで、rEFIndというブート・マネージャーを使います。

  1. rEFIndをダウンロードし、展開する。
  2. macOSをシャットダウンし、Command+Rを押しながら起動する。
  3. リカバリー・モードで起動したら、ターミナルを起動し、rEFIndを展開したフォルダーに移動する。
  4. rEFIndをインストールする。
    # ./refind-install
  5. macOSを再起動する。

Ubuntuをインストールする

  1. Ubuntuインストール用のUSBメモリーを接続する。
  2. macOSをシャットダウンし、Optionを押しながら起動する。
  3. 「EFI Boot」を選択する。
  4. 「Try Ubuntu without installing」を選択し、USBメモリーからUbuntuを起動する。
  5. 起動したUbuntuのデスクトップにある「Install Ubuntu 16.04 LTS」をダブルクリックする。

Ubuntuをアップデートする

最新版にアップデートします。

  1. 「システム環境設定」の「ソフトウェアとアップグレード」の「アップデート」にあるUbuntuの新バージョンの通知を「全ての新バージョン」に変更する。
  2. アップデートする
    $ sudo apt update
    $ sudo do-release-upgrade
    $ sudo shutdown -r
    $ sudo do-release-upgrade -d
    $ sudo shutdown -r

UbuntuにSSHをインストールする

リモートで作業できるように、sshdをインストールします。

  1. sshをインストールする。
    $ sudo apt-get install openssh-server
  2. sshが自動で起動するように設定する。
    $ sudo systemctl enable ssh.service
  3. Ubuntuを再起動してリモートからsshでログインできるか確認する。

セキュリティのことを考えると、インターネットから見える環境では、rootでのログインはできないようにしておくべきです。

UbuntuにNvidiaのドライバーをインストールする

次のページを参考にしました。

  1. インストールの準備をする。
    $ sudo add-apt-repository ppa:xorg-edgers/ppa
    $ sudo add-apt-repository ppa:graphics-drivers/ppa
    $ sudo apt-get update
  2. 最新版のドライバーを調べる。
    $ sudo apt-cache search 'nvidia-[0-9]+$'
  3. 最新版のドライバーをインストールする。
    $ sudo apt-get install nvidia-384
    $ sudo apt-get install mesa-common-dev
    $ sudo apt-get install freeglut3-dev

最新版を入れようとしたけど入らなかったので、384にしました。

Mac ProにASUS TURBO-GTX1080-8Gを装着する

Mac Pro (Mid 2010) には、GPU用の電源として、Mini PCIe 6pinのソケットが2つ付いています。 PCIe 6 pinケーブルは75 Wまでしか供給できません。

そこで、PCIe 6 pinケーブル2本をまとめてPCIe 8 pinに変換してくれるケーブルを使います。 PCIe 8 pinは150Wまで供給できます。

PCIeソケットから75W共有できるので、Mac Pro (Mid 2010)は全部で225Wまで供給できます。

GeForce GTX 1080を搭載したビデオカードはたくさん出ていますが、その多くがPCIe 8pin x 2やPCIe 8 pin + PCIe 6 pinだったりします。

ASUS TURBO-GTX1080-8Gは、最大消費電力が225Wで、かつ、補助電源がPCIe 8 pin 1本のみなので、Mac Pro (Mid 2010)でも使うことができます。

  1. Ubuntuをシャットダウンする。
  2. Mac Proから現在のビデオカードを外す
  3. Mini PCIe 6 pin to PCIe 6 pinケーブルを空いているソケットに接続する。
  4. 2本のPCIe 6 pinケーブルをPCIe 6 pin x 2 to PCIe 8 pinケーブルに接続する。
  5. PICe 8 pinケーブルをASUS TURBO-GTX1080-8Gに接続する。
  6. ASUS TURBO-GTX1080-8GをMac Proに装着する。
  7. Ubuntuを起動し、画面が表示されることを確認する

UbuntuにCuda 8.0をインストールする

次のページを参考にしました。

  1. Ubuntuを起動する。
  2. Cudaをダウンロードする(Linux, x86_64, Ubuntu, 16.04, dev(local)を選択して、Downloadボタンからリンクを取得します)。 パッチもダウンロードします。
    $ wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
    $ wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda-repo-ubuntu1604-8-0-local-cublas-performance-update_8.0.61-1_amd64.deb
  3. Cudaをインストールする。
    $ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
    $ sudo apt-key add /var/cuda-repo-8-0-local-ga2/7fa2af80.pub
    $ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-cublas-performance-update_8.0.61-1_amd64.deb
    $ sudo apt-get update
    $ sudo apt-get install cuda-8-0
  4. .bashrcに以下の2行を追加する。
    export PATH="/usr/local/cuda-8.0/bin:$PATH"
    export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH"
  5. Ubuntuを再起動する。
    $ sudo reboot
  6. ログインして、動作確認する。
    $ nvidia-smi

cuDNN 6.0をインストールする

  1. NvidiaのAccelerated Computing Developer Programにメンバー登録する。
  2. cuDNN v6.0 library for Linuxをダウンロードする。
  3. ダウンロードしたファイルを展開してインストールする。
    $ tar zxvf cudnn-8.0-linux-x64-v6.0.tgz
    $ sudo cp -a cuda/lib64/* /usr/local/cuda-8.0/lib64/
    $ sudo cp -a cuda/include/* /usr/local/include/
    $ sudo cp -a cuda/include/* /usr/local/cuda-8.0/include/
    $ sudo ldconfig
    $ rm -R -f cuda cudnn-8.0-linux-x64-v6.0.tgz

LightDMを止める

ディスプレイ・マネージャーのLightDMが動いているとGPUパワーを使ってしまうので、LightDMを止めます。

  1. /etc/default/grub の12行目を以下のように変更する。
    GRUB_CMDLINE_LINUX="systemd.unit=multi-user.target"
  2. 設定を反映させて、Ubuntuを再起動する
    $ sudo update-grub
    $ sudo reboot

画面が出なくなってしまったので、ここからは全てsshでリモート・ログインして作業します。

TensorFlow 1.3をインストールする

次のページを参考にしました。

TensorFlow 1.3.0 GPU版のURLは次のページで調べました。

  1. libcuptiをインストールする。
    $ sudo apt-get install libcupti-dev
  2. pip3とpython3とvirtualenvをインストールする。
    $ sudo apt-get install python3-pip python3-dev python-virtualenv
  3. virtualenvの環境を ~/tensorflow に構築する。
    $ virtualenv --system-site-packages -p python3 ~/tensorflow
  4. virtualenvをアクティベートする。
    $ source ~/tensorflow/bin/activate
  5. TensorFlow 1.3のGPU版をインストールする。
    (tensor flow)$ pip3 install --upgrade https://pypi.python.org/packages/b8/16/14fbe414f2b3c39c5d01521e38e7aaec384f8fbf26eec021d247345260c3/tensorflow_gpu-1.3.0-cp36-cp36m-manylinux1_x86_64.whl#md5=7b694289e1fc977a47cd89f2876d3528
  6. TensorFlowの動作を確認する。
    (tensorflow) $ python3
    >>> import tensorflow as tf
    >>> hello = tf.constant('Hello, TensorFlow!')
    >>> sess = tf.Session()
    >>> print(sess.run(hello))
    >>> a = tf.constant(10)
    >>> b = tf.constant(32)
    >>> print(sess.run(a + b))
トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS