ASUS GL502VSにUbuntuとTensorFlowをインストール
一昨年の年末にVR用マシンとしてゲットしたASUS GL502VS。
割とすぐにVR飽きてしまったので1年近く無為に眠っていたのだが、GeForce GTX 1070が載ってるのに遊ばせてるのはもったいないのでUbuntsuを入れて機械学習に使ってみることにした。
Ubuntuのインストール
USBのインストールドライブを作成する
まずインストールメディアを作らんとUbuntuのダウンロードページへ。
バージョンは無難そうなのでUbuntu 16.04 LTSを選択。
次にUniversal USB Installerを使って上記のイメージをUSBメモリに書き込み、ブートできるようにする。
時にUniversal USB InstallerのダウンロードをしようとするとWindowsのsmartscreenで弾かれてダウンロードできないので無効化。
多分uptodown.comに色々と怪しいものがホスティングされているせいかな。
参考: UbuntuのLive USBをつくる – mktiaの備忘録
BIOSの設定でUSBから起動できるようにする
ASUSのFAQを参照して設定。
起動時にF2連打でBIOSに入り
- Securityタブ > Secure Boot Control を Disabled
- Bootタブ > Launch CSM を Enabled
保存して終了したあと再びBIOSに入り
- Save&Exitタブ > BootOverride > USBドライブを選択
Ubuntsuインストール
起動するとデスクトップに「Ubuntsuをインストール」のアイコンがあるのでこれを実行。
さくっとWindows10とのデュアルブートでインストールできた。すごい簡単で良い。
BIOSでOSの起動順を変更
何もしないで電源を入れるとWindowsが起動するので、Ubuntuをデフォルトにする。
BIOSで起動のプライオリティを入れ替えればOK。
- Boot Option Priorities > Boot P3: HGST HTS72010A…
Hard Drive BBS Prioritiesの方もなんとなく変更しておく。
Ubuntuの初期設定
ここからインストール後の初期設定。
なんやかんやそのまま使えないので一般人向けにはやはり難しい。
無線LANへの接続
デスクトップのメニューバーの右上にある無線LANっぽいマークをクリックして、ネットワークを選択して接続。
これはMacと変わらない操作感。
名前解決ができないので/etc/resolv.confを編集
aptが名前解決できずに引っかかったのでGoogle PublicDNSを使う。
参考: Ubuntu 16.04で “‘jp.archive.ubuntu.com’ が一時的に解決できません”がでたら
クラムシェルにした時のスリープ防止
/etc/systemd/logind.confを編集。
HandleLidSwitch=ignore
このあとsudo restart systemd-logindしたら何やら権限がないとか弾かれたので再起動で適用した。
参考: ubuntuが入ったノートPCでサスペンドを無効にする – あるシステム管理者の日常
パッケージのアップデート
sudo apt update
sudo apt upgrade
sshd
ルータのDHCPで割り振られたIPをifconfig調べてMacからSSHで接続しようとするとconnection refused。
Macから操作したいのでsshdを動かす。
apt install ssh
これでsshdも起動する。
無線LANインターフェースのパワーマネジメントを切る
UbuntuにSSH接続すると妙にレスポンスが悪くラグっているかんじ。
なんでかと思いきやパワーマネジメント機能が悪さをしているらしいのでこれを切る。
/sbin/iwconfig wlp2s0 power off
うまいことラグが解消された。ついでに起動時にもパワーマネジメントが働かないようにする。
/etc/pm/power.d/wireless_power_management_offを編集して
wifi.powersave = 2
に変更すればOK。
参考 How to turn off Wireless power management permanently
CUDA関連の準備
GPUのドライバ周りも含めて右往左往したが、Installing TensorFlow on Ubuntuを起点にインストールを進めていくのがよかったぽい。
CUDA® Toolkit 9.0
公式のNVIDIA CUDA Installation Guide for Linuxを見つつ。
wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
sudo apt update
sudo apt install cuda
最新の9.1を入れるとTensorFlowは動かないのでCUDA Toolkit Archiveのページから9.0を選ぶ。
apt install cudaでドライバから何から色々と一気に入る。
cuDNN v7.0
NVIDIA cuDNNを見つつ。
The NVIDIA CUDA® Deep Neural Network libraryの略でcuDNNということらしい。
NVIDIA Developer Programへの登録とログインが必要なので、これを行った後ダウンロード。
- Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0 > cuDNN v7.0.5 Library for Linux
CUDA関連のインストールにまつわる落とし穴
いくつかハマったのでメモ。
その1
ググったら出てきたページで紹介されていたコマンド。さくっと入るけどバージョンが古いのでやめておいた。後で問題出るといやなので。
nvidia-cuda-toolkit amd64 7.5.18-0ubuntu1
このほかにもGPUドライバを入れるのが必要ということなので、いろいろと試行錯誤していたが、公式のドキュメントに従ったapt install cudaで何もかもが済んだのだった。
その2
9.1じゃなくて9.0じゃないとTensorFlow動かないという罠。
TensorFlow入れた後でHello World貯めそうとしたら以下のように怒られてしまった。
ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory
最初新しい方がよかろうと9.1を入れてしまっていたが、よくなかったらしい。
ので、いったん削除して以下のごとく入れ直した。
sudo apt remove cuda
sudo apt autoremove
sudo dpkg -r cuda-repo-ubuntu1604-9-1-local
sudo rm /etc/apt/sources.list.d/cuda-9-1-local.list
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
sudo apt update
sudo apt install cuda
もしかして両方入ってても問題ないのかもしれない。まあいいや。とにかく9.0が必要。
その3
TensorFlowのインストール手順に
sudo apt-get install cuda-command-line-tools
というコマンドがあるが、これが動かない。
しかし実はapt install cudaしたときにいっしょに入ってるので気にしなくていい。
参考: Unable to locate package cuda-command-line-tools
TensorFlowのインストール
CUDA関連が落ち着いてようやくInstalling TensorFlow on UbuntuのTensorFlowインストールにたどり着く。
Determine how to install TensorFlowってあるけども、どれがいいのかわからんので適当にググって見つけたTensorFlowのインストール方法比較を参考にpipで。
既存のPythonに影響を与えてもかまわん。気を遣う必要があるならDockerでやりたいかな。
Pythonのバージョンを2か3かで選択を迫られたが2.7でいいか。どっちでもいいとも聞くし。
sudo apt install python-pip python-dev
そしてGPUが使えるTensorFlowを入れる。
pip install tensorflow-gpu
Pythonのインタラクティブシェルを立ち上げてHello Worldを試す。
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2018-03-29 13:36:16.989121: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2018-03-29 13:36:17.841274: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-03-29 13:36:17.841791: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1212] Found device 0 with properties:
name: GeForce GTX 1070 major: 6 minor: 1 memoryClockRate(GHz): 1.645
pciBusID: 0000:01:00.0
totalMemory: 7.92GiB freeMemory: 7.81GiB
2018-03-29 13:36:17.841805: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1312] Adding visible gpu devices: 0
2018-03-29 13:36:18.014057: I tensorflow/core/common_runtime/gpu/gpu_device.cc:993] Creating TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7551 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0, compute capability: 6.1)
>>> print(sess.run(hello))
Hello, TensorFlow!
やったぜ。
で、このあと何をすりゃいいんだ。