search
LoginSignup
17

More than 5 years have passed since last update.

posted at

updated at

VirtualBoxでtensorflowを実行する【GPU版導入挫折報告】

概要

本記事では、Windows環境でVirtualBoxを使ったubuntu仮想環境で、tensorflow(CPU版)をビルドして実行するまでを紹介します。
ホストOSにはwindows 10 Home、ゲストOSにはubuntu 16.04 (LTS)、CUDAのバージョンは8.0を使用しており、NVIDIAドライバをゲストOSにインストールしています。

hyper-Vが搭載されていないWindowsのバージョン(Home Editionとか)ではDockerが使えないため、VirtualBoxでubuntu環境を仮想化してtensorflow(CPU版)を導入するまでの記録です。

本記事を書くにあたり、GPU版を使えるように設定を行っていたのですが、結果的に上手くいかなかったという報告です…
同じような被害者を出さないために、メモがてら本記事に纏めました。
折角のAdvent Calenderなのに、しょうもない記事になってしまって大変申し訳ございませんm(_ _)m

※ 本記事の出来事は1年ぐらい前から報告されており、未だに更新されていない状態です。

VirtualBoxのインストール、Guest Additionsの有効化

以下の記事を参考に、VirtualBoxのインストール、拡張機能の導入、Guest Additonsのインストールを行います。
ゲストOSのubuntuのバージョンは16.04(LTS)を使用しました。

3Dアクセレーションを有効化

VirtualBoxの設定画面にて、3Dアクセレーションを有効化することで、ゲストOSでGPUを使用するようにします。

残念ながら、この設定はホストOSのグラフィック機能を活用した3DレンダリングのためにGPUを使用するための設定であり、tensorflowでのGPGPUプログラミングには機能しません。

PCI passthrough

エクステンションパックを導入することで、PCI passthrough(ホストOSのPCIデバイスをゲストOSへバインドする機能)が使用可能となり、ゲストOSでGPUデバイスを直接使用することができるようになります。
ですが、ホストOSへのシステム障害のリスクがあるため、本記事を書くにあたっては実施しませんでした。

それでもGPGPUに挑戦したい方には、以下の記事が参考になります。

※ 余談ですが、IOMMU(Intel系のマシンでは"Intel VT-d"、AMD系のマシンでは"AMD I/O Virtualization Technology")という機能は、最近のマザーボードとチップセットには大体搭載されていると思います。

Ubuntu 16.04 in VirtualBox

以下の記事を参考に、ubuntu仮想環境でのtensorflowのビルドを試みます。

参考記事では、caffeをインストールして、PyCaffeとexampleを実行するまでが紹介されています。
また、CUDAのバージョンは6.5ですが、本記事ではCUDA 8.0を使用します。

記事内の・Install build essentials:から・Update the library pathまでの流れは、以下の様に実行します。

build-essential、kernel-headers、VBoxLinuxAdditionsのインストール

# build-essentialのインストール
$ sudo apt-get install build-essential

# kernel-headersのインストール
$ sudo apt-get install linux-headers-`uname -r`

# VBoxLinuxAdditionsのインストール
$ cd /media/<USER>/VBOXADDITIONS_4.3.16_95972 (where <USER> is your user name)
$ sudo ./VBoxLinuxAdditions.run

クリップボードを双方向に設定

VirtualBoxの設定画面にて、以下の設定を行います。

qiita161213.png

tensorflowのインストール

参考

※ 参考の手順は古いので、下記の様に実行します。

CUDA 8.0のインストール

公式ページからローカルにrunfileをダウンロードします。

qiita161213-2.png

CUDNN 5.1のインストール

CUDNNも同様にダウンロードします(NVIDIAのメンバー登録が必要です)。

$ tar xvzf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64
$ sudo chmod a+r /usr/local/cuda-8.0/include/cudnn.h  /usr/local/cuda-8.0/lib64/libcudnn*

CUDAのrunfile実行前に、関連ライブラリをインストールしておきます。

# CUDA関連ライブラリのインストール
$ sudo apt-get install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev

CUDA runfileの実行

$ sudo ./cuda_8.0.44_linux_64.run --kernel-source-path=/usr/src/linux-headers-`uname -r`/ --override compiler

実行中の設定は、上記の参考記事と同じで良いです。

Accept the EULA
Do NOT install the graphics card drivers (since we are in a virtual machine)
Install the toolkit (leave path at default)
Install symbolic link
Install samples (leave path at default)

ライブラリパスの更新

$ echo 'export PATH=/usr/local/cuda-8.0/bin:$PATH' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64:/usr/local/lib' >> ~/.bashrc
$ echo 'export CUDA_HOME=/usr/local/cuda-8.0' >> ~/.bashrc
$ source ~/.bashrc

bazelのインストール

公式ページを参考に、レポジトリから取得します。

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ echo "deb [arch=amd64] ttp://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
$ sudo apt-get update && sudo apt-get install bazel
$ sudo apt-get upgrade bazel

tensorflowのビルド

# tensorflowソースコードのダウンロード
$ git clone https://github.com/tensorflow/tensorflow
$ cd tensorflow

# configureスクリプトの設定
$ ./configure
Please specify the location of python. [Default is /usr/bin/python]: [Enter]
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N] N
No Hadoop File System support will be enabled for TensorFlow
Found possible Python library paths:
  /usr/local/lib/python2.7/dist-packages
  /usr/lib/python2.7/dist-packages
Please input the desired Python library path to use.  Default is [/usr/local/lib/python2.7/dist-packages] [Enter]

Using python library path: /usr/local/lib/python2.7/dist-packages
Do you wish to build TensorFlow with OpenCL support? [y/N] N
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N] y
CUDA support will be enabled for TensorFlow
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]: /usr/bin/gcc-4.9
Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 8.0
Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: /usr/local/cuda-8.0
Please specify the Cudnn version you want to use. [Leave empty to use system default]: 5
Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda-8.0]: [Enter]
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.
\[Default is: "3.5,5.2"]: [Enter]
INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes.
........
INFO: All external dependencies fetched successfully.
Configuration finished

# bazelによるビルド
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

tensorflowのインストール

$ cd /tmp/tensorflow_pkg
$ pip install --upgrade tensorflow-0.12.0rc1-*.whl

tensorflowをインポートすると、デバイスがないエラーが出てしまいます。

>>> import tensorflow as tf
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:119] Couldn't open CUDA library libcuda.so.1. LD_LIBRARY_PATH: /usr/local/cuda-8.0/lib64:/usr/local/lib
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:165] hostname: localname-VirtualBox
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: Not found: was unable to find libcuda.so DSO loaded into this program
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: Permission denied: could not open driver version path for reading: /proc/driver/nvidia/version
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:1092] LD_LIBRARY_PATH: /usr/local/cuda-8.0/lib64:/usr/local/lib
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:1093] failed to find libcuda.so on this system: Failed precondition: could not dlopen DSO: libcuda.so.1; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally
>>> sess=tf.Session()
E tensorflow/stream_executor/cuda/cuda_driver.cc:509] failed call to cuInit: CUDA_ERROR_NO_DEVICE
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:145] kernel driver does not appear to be running on this host (localname-VirtualBox): /proc/driver/nvidia/version does not exist

※ libcuda.so.1.がないエラーの解決策はこちらです(意味ないですが)。

tensorflow自体は問題なく動きます。

>>> a=tf.constant(1)
>>> b=tf.constant(2)
>>> sess.run(a+b)
3

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
What you can do with signing up
17