LoginSignup
13

More than 5 years have passed since last update.

NVidia Optimusを搭載したノートPCでUbuntu14.04+CUDA7.0を動かしてみた

Last updated at Posted at 2016-04-02

こんにちは~

機械学習の勉強のため、Tensor flowを触りたいということで、二台目のノートPCにubuntuを入れました!

なぜubuntuかといえば Tensor flowのGPU機能がlinuxしか対応していないからです。。。(2016年4月時点)

Chainerを触ったことがありますが、GPUあるなしで性能に雲泥の差がでるのは間違いないので、本気でGPU対応するように挑戦してきました。

現状、Tensor flowはCUDA 7.0が必要です

色々調べてみたら、CUDA 7.0をインストールする記事は結構ありましたが、NVidia Optimusを搭載したPCでCUDAを入れる方法はありませんでした。

なので、色々記事を参考にして、どうにかCUDAをいれました。。

ここまでの道のりがものすごく大変でしたので、今後のために備忘録として紹介します!

環境は次のとおりです

  • PC: ASUS K55VD
  • OS: Ubuntu 14.04
  • GPU: Geforce 610M(NVidia Optimus対応)

bumblebeeインストール

NVidia OptimusでGPUを使用する場合は、ただ単にドライバのインストールしても動きません!

そこで、NVidia Optimus環境でもGPUを使うためのツールとして, bumblebeeがあります!

これをインストールしましょう!

# bumblebeeのリポジトリ追加+最新版へ更新
sudo add-apt-repository ppa:bumblebee/stable
sudo apt-get update

# bumblebee一式のインストール(公式ページでのubuntu14.04のインストール方法を参考)
sudo apt-get install bumblebee bumblebee-nvidia primus linux-headers-generic

nvidia-352 nvidia-settingsインストール

CUDA7.0を入れるため、nvidiaのドライバは352以上が必要です。ここでインストールしましょう!

sudo apt-get install nvidia-352 nvidia-settings

/etc/bumblebee/bumblebee.confでnvidia-352を設定

nvidia-352をbumblebeeで利用するようにしましょう!

sudo vim /etc/bumblebee/bumblebee.conf

# 次のように変更します

22行: Driver=nvidia
55行: KernelDriver=nvidia-352
58行: LibraryPath=/usr/lib/nvidia-352:/usr/lib32/nvidia-352
61行: XorgModulePath=/usr/lib/nvidia-352/xorg,/usr/lib/xorg/modules

/etc/modprobe.d/bumblebee.confでnvidia-352をブラックリストに入れることでロードを抑制

nvidia-352をインストールした場合、bumblebeeを起動する前にnvidia-352を有効になってしまいます。そうなると、bumblebeeが起動せず、Ubuntuが正しく起動しません(原因がわかるまで、UbuntuのGUI起動後真っ暗になっていて大変でした。。。)

そこで、/etc/modprobe.d/bumblebee.confでnvidia-352をブラックリストに入れることでロードを抑制させます!

sudo vim /etc/modprobe.d/bumblebee.conf

# 以下を追加
blacklist nvidia-352
blacklist nvidia-352-updates
blacklist nvidia-experimental-352

これで、Nvidiaの新しいドライバをbumblebee上で動かせるようになりました。

CUDAのダウンロード

つぎはCUDAを入れていきます。

まずは、CUDAをダウンロードします。debパッケージでもインストールできますが、細かいオプションが利かないため、runパッケージをダウンロードします!

下記ページからubuntu14.04のrunパッケージを選択してダウンロードするか、

あるいは直接落とします。

wget http://developer.download.nvidia.com/compute/cuda/7_0/Prod/local_installers/cuda_7.0.28_linux.run

落としたら、ホームディレクトリ(~/)へ移動させます

CUDAのインストール

何も考えずにインストールすると、OpenGLライブラリもインストールされます。このライブラリがインストールすることによって、Ubuntuがログインできなくなります!(アンインストールしても元に戻らなかったため、ここでUbuntuを再インストールするハメになりました。。。)

なので、OpenGLライブラリをいれずにインストールします!

./cuda_7.0.28_linux.run --no-opengl-libs

以下指示が出ますが、つぎのように選択します

# 当然accept
Do you accept the previously read EULA? (accept/decline/quit): accept

# 必要らしいので, y
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 346.46? ((y)es/(n)o/(q)uit): y

# CUDA本体なので, y
Install the CUDA 7.0 Toolkit? ((y)es/(n)o/(q)uit): y

# CUDAの入れる場所を尋ねられます。ここはデフォルトのままなので、そのままENTER
Enter Toolkit Location [ default is /usr/local/cuda-7.0 ]:

# sudoで実行しない場合これがでます。sudoで実行させないとインストールできないので、 y
/usr/local/cuda-7.0 is not writable.
Do you wish to run the installation with 'sudo'? ((y)es/(n)o): y
Please enter your password:

# シンボリックリンクをはるか尋ねられますが、実効に必要なので y
Do you want to install a symbolic link at /usr/local/cuda? ((y)es/(n)o/(q)uit): y

# サンプルを入れるかどうか尋ねられますが、動作確認したいので y
Install the CUDA 7.0 Samples? ((y)es/(n)o/(q)uit): y

# サンプルの入れる場所はデフォルトにしときます
Enter CUDA Samples Location [ default is /home/faithnh ]: 

問題なければこれでインストールできます!

最後にこの指示がでますので、

Please make sure that

 -   PATH includes /usr/local/cuda-7.0/bin

 -   LD_LIBRARY_PATH includes /usr/local/cuda-7.0/lib64, or, add /usr/local/cuda-7.0/lib64 to /etc/ld.so.conf and run ldconfig as root

~/.bashrc上に設定しときましょう!

vim ~/.bashrc

# 以下を追加

# for CUDA
export PATH=$PATH:/usr/local/cuda-7.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-7.0/lib64

そして、設定を反映させます。

source ~/.bashrc

CUDAサンプルをビルド、実行

上記手順でインストールしたら、ホームディレクトリに配置されますので、サンプルにアクセスし、makeでビルドします。

makeするには、gccなどの環境が必要なので、開発環境一式をインストールしておきます

sudo apt-get install build-essential

そのあと、makeしてビルドしていきます。ビルドは大変時間がかかります(ここで1時間ほどとられました)

cd ~/NVIDIA_CUDA-7.0_Samples
make

最後にFinished building CUDA samplesがでればOKです!

実行してみるものの、問題が・・・

マージソートのサンプルを実行してみます。

cd ~/NVIDIA_CUDA-7.0_Samples/bin/x86_64/linux/release
./mergeSort

./mergeSort Starting...
CUDA error at ../../common/inc/helper_cuda.h:1105 code=38(cudaErrorNoDevice) "cudaGetDeviceCount(&device_count)"

あらら、問題が。。。

色々調べたところ、bumblebeeでは、デフォルトGPUは有効になっていないため、GPUは認識しないようです。

GPUを有効にして実行させるためにはoptirunコマンドを挟んで実行しなければなりません。

使い方はこんな感じです。

optirun [オプション] アプリ実行コマンド

オプションはなしでも実行できるので実質こうなります。

optirun アプリ実行コマンド

それでは実行してみましょう。

optirun ./mergeSort
./mergeSort Starting...modprobe: FATAL: Module nvidia-uvm not found.
CUDA error at ../../common/inc/helper_cuda.h:1105 code=30(cudaErrorUnknown) "cudaGetDeviceCount(&device_count)"

今度は別の問題がでました、、、nvidia-uvmがないと怒られてます。

つぎは、nvidia-uvmを有効にして対処していきましょう。

nvidia-uvmを有効化

CUDAを動かすにはnvidia-uvmが必要だが、bumblebeeで動作する場合、なぜか有効になっていないため、対処していきます。

まずはbumblebee.confをこのように修正していきます。nvidia-352-uvmをnvidia-uvmとして利用できるようにします。

sudo vim /etc/modprobe.d/bumblebee.conf

alias nvidia-uvm nvidia-352-uvm

設定を反映させ、nvidia-uvmを有効にしていきます!

sudo updatedb
sudo optirun modprobe nvidia_uvm

再度実行

再度マージソートのサンプルを実行してみます。

optirun ./mergeSort
./mergeSort Starting...modprobe: FATAL: Module nvidia-uvm not found.
CUDA error at ../../common/inc/helper_cuda.h:1105 code=30(cudaErrorUnknown) "cudaGetDeviceCount(&device_count)"

うーん、まだ動かないな。。。

あ、よく考えたらnvidia_uvmではsudoで実行してたので、sudo入れたら動くのでは。。。。

と思い、sudo を入れてみました。

cd ~/NVIDIA_CUDA-7.0_Samples/bin/x86_64/linux/release
sudo optirun ./mergeSort 

./mergeSort Starting...

GPU Device 0: "GeForce 610M" with compute capability 2.1

Allocating and initializing host arrays...

Allocating and initializing CUDA arrays...

Initializing GPU merge sort...
Running GPU merge sort...
Time: 1037.418945 ms
Reading back GPU merge sort results...
Inspecting the results...
...inspecting keys array: OK
...inspecting keys and values array: OK
...stability property: stable!
Shutting down...

う、うごいた~!

なぜsudo入れないといけないのかがよく分かりませんが、これで動きました!(後で理由を調べたいと思います)

終わりに

CUDAを入れるだけでものすごい労力がかかってしまったため、残念ながらcuDDN以降は紹介できませんでした

が、Tensor flowが無事に入れた暁に紹介していきたいと思います!

参考記事

http://ry0.github.io/blog/2015/08/12/ubuntu-nvidia-cuda-7.0/
http://ubuntuforums.org/showthread.php?t=2262882&page=7
http://www.linuxveda.com/2015/07/16/how-to-install-drivers-for-nvidia-optimus-cards/
https://ask.fedoraproject.org/en/question/77633/install-nvidia-driver-for-cuda-without-turn-it-on-for-xwindows/

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13