2015-03-27

【MacOSX 10.10.2編】MacでThunderbolt外付けBOXにGPGPUを認識させるには【Yosemite】

各所から要望(?)されていたThunderboltの外付けPCI-Expressボックスを介したGPGPUの認識方法のYosemite編です。
やる事はさほど変わらないのですが少し手間が増えているので、改めてイチから記してみようと思います。

用意するもの

  1. Mac (今回もMacBookPro Early2013)
  2. MAXSERVE Thunderbolt接続PCI-Express拡張ボックス NA-211TB
  3. NVIDIA製GPGPUボード (今回はGigabyte製 GeForce GTX970)
  4. TextWrangler (テキストエディタ)
  5. NVIDIA製CUDAドライバ
今回Gigabyte製のGPGPUボードを選んだのは他と比較して安価だったというのもありますが、基板がショートなこと、2スロット専有なので残り1スロットをRAIDカード等に使えそうだという点でこれを選びました。但し補助電源コネクタが垂直方向に伸びている為エンクロージャの天板が閉められないというオチも付きましたが・・・。
ま、気を取り直していきましょう。

手順
  1. NVIDIA製のWebDriverをダウンロードする
  2. ダウンロードしたドライバを少々いじってMacPro以外でも認識させるようにする
  3. ドライバのインストール
  4. CUDAのインストール
  5. kextファイルの書き換え
  6. ターミナルからコマンドを打つ
  7. 再起動してGPUの動作を確認して終了

1) NVIDIA製のWebDriverをダウンロードする
NVIDIA製のWebDriverですが以下に最新版があります。
このドライバがMacOSX 10.10.2まで対応します。

---ここからはお約束です---
---必ずバックアップを取り作業については自己責任でお願いします---

2) ダウンロードしたドライバを少々いじってMacPro以外でも認識させるようにする
ダウンロードしたドライバですが当然ですがこのままですとMacPro(旧型)以外ではインストールすることが出来ません(そもそもゴミ箱MacProもMacBookもグラフィックスボードの装着が出来ませんからね)。インストール時にマシンをチェックしてハネられます。そこで以下の作業をしてドライバのインストールチェックを回避するドライバを作成します。
  • ターミナルを起動し次のコマンドを打ちます
    (ダウンロードしたドライバのあるディレクトリにcdしてからコマンドを打ちます)
    pkgutil --expand WebDriver-343.01.01f03.pkg expanded.pkg
    (pkgutil --expand "ダウンロードしたファイル名" "展開するファイル名")
  • expanded.pkgというファイルが出来上がるのでそれを右クリックから「パッケージの内容を表示」を選択
  • expanded.pkgの中身のファイルが表示されますので、その中にある「Distribution」というファイルを右クリックして「このアプリケーションから開く」からテキストエディットを選択
  • Distributionファイルの中身が表示されますので、その中に”InstallationCheck”メソッドがあります(割と最初の方です)

           function InstallationCheck() 
                {   
                    if (!validateHardware()) return false;
                    if (!validateSoftware()) return false;
                    return true;
                }

   上記の
false行をコメントアウトして常時trueを返すようにします
//if (!validateHardware()) return false;
//if (!validateHardware()) return false;
                ※//を入れるとコメントアウトになります
  • ファイルを保存し閉じます
  • 展開したパッケージを元の形に戻す為にターミナルから以下のコマンドを打ちます
      pkgutil --flatten expanded.pkg ModifiedWebDriver.pkg
  • ModifiedWebDriver.pkgというファイルが出来上がります。これがインストールチェックを回避した改造WebDriverになります
(追記:一応当方でモディファイしたドライバを置いておきます。上記修正を施したものです。https://app.box.com/s/pxmvht8bpko6zpepy4bi31zkbjvzsblf  MacOSX 10.10.2用)

3) ドライバのインストールをする 
上記で出来たWebDriverをインストールしますが、その前にターミナルから作業が必要です。Yosemiteからセキュリティが厳しくなり、いわゆる野良ドライバが動かなくなりました。それを回避する為に以下のコマンドをターミナルから入力します。

  sudo nvram boot-args="kext-dev-mode=1 nvda_drv=1"

そして2)の作業に問題が無ければ作成したドライバをダブルクリックしてインストールします。インストールチェックを回避してインストールが出来る筈です。
一度再起動をしたのちシステム環境設定内の「NVIDIA Driver Manager」を開いてNVIDIAのDriverを使うようになっているか必ず確認してください。ここがOSXのDriverを使うという風になっている場合はGPUが動作しませんので、パネル下の「変更するにはカギをクリックします」を押してロックを解除しNVIDIAのドライバを使うようにしてください。
万が一ここを押してもグレーのままで変更出来ないようであれば、上記コマンドをもう1度実行して再起動すれば選択出来るようになる筈です。
NVIDIA Web Driverの方にチェックが付いている事を確認

4) CUDAのインストール
CUDAは必須です。既にCUDAがインストールされていれば必ずアップデートをしてください。システム環境設定のCUDAからInstall CUDA Updateでアップデート出来ます。
インストールされていない場合は必ず最新版をインストールしてください。
ダウンロードは以下から可能です。
最新版は7.0.29です(2015/3/26現在)


5) kextファイルの書き換え
毎度のお約束です。ここを正確に書き換えないとGPUを認識出来ません。
)ここで使用するTextWranglerはリンク先の開発元からダウンロード出来るものを使用すること。AppStoreからダウンロード出来るものでは書き換え出来ません。
注2) kextファイルの書き換えはOSのアップデート毎にする必要があります。(例:10.10.2から10.10.3へupdate等)

/システム/ライブラリ/Extensions内にあるkextファイルを2つ使用します。
NVDAStartup.kextとIONDRVSupport.kextです。
これらのファイルを右クリックして「このアプリケーションで開く」-TextWrangler」として開きます。その中に「info.plist」という項目がありますので、それをクリックして中身を見てみます。中にはxmlで書かれたkeystringが表示されますので、その中から

<key>CFBundleIdentifier</key>

と書かれたセクションを見つけ出します。上記が記述されたセクションの最後に

<key>IOPCITunnelCompatible</key>
<true/>

とコードを追加します。

</dict>

の手前に追加です。CFBundleIdentifierというセクションが幾つかあるので、それを一つ残らず見落とさないようにして必ず上記コードを追加してください。

青矢印で示したキーがあるセクションの最後に赤矢印の2行を追加で記述

6) ターミナルからコマンドを打つ
最後にターミナルからカーネルエクステンションのキャッシュをクリアするコマンドを打って終了です。
  
  sudo kextcache -system-caches

7) 再起動してGPUの動作を確認して終了
一旦電源を落としてNA-211TBにGPUボードを取付し、補助電源等のケーブルの確認、Thunderboltケーブルの確認等をしてPCの電源をオンにします。
無事MacBookProにてGTX970が動作しました!


如何でしょうか?
もしうまくいかない場合は手順を見直して確認しましょう。特につまづきやすいのはkextファイルの書き換えです。CFBundleIdentifierを見落とさないようにしてくださいね。

今回GTX970をGPUに選択したのはMaxwellアーキテクチャのGPUをテストしてみたかったからです。消費電力量もかなり減っているのでGTX980でも動作させることは出来そうです。