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を作成して起動時にも実行されるようにしておく。

参考: Ubuntu 無線Lan がなまら遅い(速度にムラがある)ときの対処

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!

やったぜ。

で、このあと何をすりゃいいんだ。