思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

CUDA×Chainer(or TensorFlow)でDeep Learningするための環境構築レシピ

土用丑の日には「う」の付くものを食すとよいという古来からの慣習に従いUbuntuを食す、

ついでに今世紀最大(決定済)のパズワード「Deep Learning」のお勉強用環境を3時間で作る、

実現する環境

この記事のねらい

  • CUDA×Chainer(or TensorFlow)な環境が緊急に欲しかったのでついカッとなってやった
  • こういう流行の技術の具体的環境構築方法の情報は新参の参入障壁を高めるために通常は奥ゆかしく出し惜しみすべきだが、今やSoftware Designの最新号で具体的なCUDA導入ステップが示され公知となってしまったからもはや隠す理由はない。
  • とはいえ、上記記事のやり方では(実は)RDPでのGUIログインと両立しない問題がある。
  • Ubuntuはいつも端境期にあり、情報がトピック別にひどく散在している。(ていうか古い情報ばっかりひっかかって調査を妨害される。

以上の理由により、ここにまとまった情報として包括的な環境構築レシピを示すもの也、
当記事を読めば、筆者のようなパソコン初心者が思い描くリッチGUIベースなUNIX環境がなんとタダで手に入る…!

使用機材

筆者が使用した環境を一応再現性担保のために記す、

キーボードはWindowsキーがあるやつ推奨。

  • [補助PC]
    • Windows 7 PC
      SSHやRDPによる接続テストに使用する。
  • [DVD-R]
    • 2枚

導入ステップ

Ubuntuの選定

本家を参照すると2017/8/13時点でだいたい次の選択肢がある。

  1. Ubuntu 16.04.3 LTS Desktop
  2. Ubuntu 17.04 Desktop
  3. Ubuntu 16.04.3 LTS Server
  4. Ubuntu 17.04 Server

筆者は最終的に2番(17.04 Desktop)を選んだ。
選定理由はこれ

インストールメディア作成

選定したUbuntuのisoファイル“ubuntu-17.04-desktop-amd64.iso”をダウンロードしてDVDに焼く。
今日日はISOファイルを焼くソフトもタダで手に入る。筆者はISO Workshopを使った。
これを起動して*2、「Burn Image」ボタンを押すと焼ける。

インストールメディアは別にUSBメモリでも良いらしいが試していない。

Windows 10とのデュアルブートのための準備

Ubuntuのインストール先HDD領域を確保する。
ターゲットPCはWindowsプリインストールPCであり、初期状態では下記パーティション構成であった。

ディスク 項番 容量 内容
0 1. 100 MB EFIシステム パーティション
2. 1.86 TB Windows (C:)
3. 891 MB 回復パーティション

Ubuntuをインストールする隙間が無いので、項番2「Windows (C:)」の縮小で空き領域を確保する*3

手順は基本的に下記の記事に従う。当該記事にはWindowsのインストールディスクが要る、みたいなことが書いてあるが、ここではすでにWindowsが入っているHDDを使うので不要。また、縮小対象パーティションの使用状況にもよるかもしれないが、「Revo Uninstaller」も導入することなく、Windows 10の機能とUbuntuの上記インストールDVDだけで何とかなった。

Windows 7Ubuntuが仲良く共存できるデュアルブート環境の作り方
https://www.lifehacker.jp/2009/11/windows_7ubuntu.html

コンピュータのC:ドライブ上にどの程度の空き容量があるのかを確認し、
スタートメニューの検索ボックスに"disk management"と入力し、エンターキーを押します。
Windows 7はハードドライブ上に2つのパーテェションを作成します。
そのうちの一つは100MBほどの大きさでシステム復元に必要なデータを格納しているので、
これには触らないでください。大きいほうのパーティションを右クリックし、
パーティションを縮小」を選択。

この「パーティションを縮小」操作を行う前に、WindowsパーティションWindowsによる占有領域を極力縮小しておくほうが当然良い。
筆者はデフラグをかけた後、(上記リンク先から参照している)下記サイトの手順に従い、最終的に300 GBの空きを捻出した。

■ How to Get Around Windows’ “Shrink Volume” Inadequacy Problems
https://www.howtogeek.com/howto/windows-vista/working-around-windows-vistas-shrink-volume-inadequacy-problems/

1. Run the Disk Cleanup Wizard, making sure to remove the hibernation file and all restore points.
2. Disable System Restore
3. Disable the pagefile ( Open up System in Control Panel, then Advanced System Settings?\ Advanced \ Performance \ Advanced \ Change \ No Paging File.
4. In the same Advanced Settings, go to Startup and Recovery \ Settings and then change the Write debugging information drop-down to “None” to disable the kernel memory dump.
5. Disable Hibernation mode in your power options \ advanced power options screen.
6. Reboot the machine, and then delete your c:\pagefile.sys file, following these instructions if you are having issues.

■ How to Disable System Restore in Windows 7, 8, or 10
https://www.howtogeek.com/howto/windows-vista/disable-system-restore-in-windows-vista/

■ How to Delete a System File in Windows 7 or Vista
https://www.howtogeek.com/howto/windows-vista/how-to-delete-a-system-file-in-windows-vista/

takeown /f C:\Windows\System32\en-US\winload.exe.mui
cacls C:\Windows\System32\en-US\winload.exe.mui /G geek:F

Windows 10だからかメモリが潤沢に積んであるからか知らないが、実際にはステップ6は“c:\pagefile.sys”が存在しなかったため不要だった。(というわけで最後の引用のtakeownコマンドやcalsコマンドでのACL属性変更とかは実際にはやらずに済んだ。)環境依存かもしれないので、一応情報は提示しておく。

以上の操作を行った後「パーティションを縮小」操作を行うと600 GBぐらい縮小できると出たので、今回は300 GB縮小することとし*4、次のパーティション構成となった。

ディスク 項番 容量 内容
0 1. 100 MB EFIシステム パーティション
2. 1.86 TB Windows (C:)
3. 307.6 GB 未使用領域 ← New!
4. 891 MB 回復パーティション

Ubuntuのインストール

インストール

上で焼いたインストールDVDを光学ドライブに挿入し、DVDから起動する。

具体的操作はPCによるが、今回のターゲットPCでは次の通り。

インストールDVDを電源投入後すかさず光学ドライブに挿入し、ただちにキーボードの[F2]押下→[F8]押下。BOOTメニューが出るので、ここで光学ドライブを選択して[ENTER]でUbuntuインストーラが起動する。

(TODO: 画像追加)

Live CD BootかInstall Ubuntuか聞かれるので、「Install Ubuntu」を選択し、[ENTER]

(TODO: 画像追加)

言語を訊かれるので、「日本語」を選ぶ。*5

「Prepare disc space」画面に移るので、「Specify partitions manually(パーティションを手動で指定)」(上から3番目の項目)を選択する。

(TODO: 画像追加)

「インストールの種類」画面にディスク0のパーティション一覧が現れ、その中に先ほど捻出した300 GBがあるはずだ。これをマウスで選択して右クリックしするとこんな画面が現れるので、下記設定で「/boot」パーティションを作る。

[OK]をクリックするとしばらくHDDに書き込みが行われた後「インストールの種類」画面に戻る。

作成された「/boot」パーティションの後ろに300 GBの空き領域があるはずだ。これを右クリックし、下記設定で「/」パーティションを作る。

[OK]をクリックするとしばらくHDDに書き込みが行われた後「インストールの種類」画面に戻る。

次に、「インストールの種類」下部の「ブートローダをインストールするデバイス」として、さきほど作成した「/boot」パーティションのデバイスを指定し(重要)、「インストール」ボタンをクリックする。以上

パーティションは「/boot」と「/」の2つを作成するだけでUbuntuは動く(らしい)。

以降は基本的に画面の指示に従い「次へ」を連打する。途中で管理者の名前、マシン名、管理者のアカウント名、管理者のパスワードを聞かれるので適当に入力する*6

そのうちめでたくGUIログイン画面が表示されるはずだ。

インストール後最初にやるべきこと

vimぐらいは入れておこう。デスクトップを右クリック→「端末を開く」クリックすると端末が出る*7ので、

$ sudo apt install vim

を実行する。以下粛々と進める。

Ubuntuでホームディレクトリの中身を英語にする
http://qiita.com/taiko19xx/items/d1a001bfc25245b91354

$ LANG=C xdg-user-dirs-gtk-update

Ubuntu Server 16.04 コンソールでの文字化け対策
http://qiita.com/ihyomo/items/a66660f11cfa9f9668b4
“~/.bashrc”に下記を追加。場所はファイル末尾で良い。

case $TERM in
    linux) LANG=C ;;
    *) LANG=ja_JP.UTF-8 ;;
esac

SSHサーバ導入

$ sudo apt install ssh
RTCのタイムゾーン解釈の変更

WindowsUbuntuデュアルブート構成特有の問題として、OSを切り替えたら時計が9時間ずれるというのがある。

下記ページに従い対策する。
Ubuntu 16.04で9時間ズレる
https://ameblo.jp/miyou55mane/entry-12178518055.html
ただし上記ページの「従来の手法」はNG。あくまで16.04以降のための次の方法でやる。

$ sudo timedatectl set-local-rtc 1

この設定はRTCの時刻をローカルタイムとして解釈させるという意味で、実は問題が無きにしも非ずらしいが、反対にWinodowsのRTC解釈をUTCに変更するとWindowsの自動時刻合わせが失敗するようになる(らしい)。
ここはWindows優先で、Ubuntuに曲げてもらう。

知っておくべき操作
  • 日本語入力モードのON/OFFは[Windows]+[スペース]
  • [Ctrl]+[Alt]+[t]で端末が出る。
  • 画面左端に並んでいるアイコンの上から2番目がファイラー(Explorerみたいなもの)
  • 隠しファイルや隠しディレクトリを見るには端末から「ls -la」
  • [Ctrl]+[Alt]+[F1]でTTY1が開く(CUIベースのログイン画面に切り替わる)
    以下同様に、[Ctrl]+[Alt]+([F2]〜[F6])でTTY2〜TTY6がそれぞれ開く。
  • [Ctrl]+[Alt]+[F7]でGUI画面に戻る。
  • GUI画面からのログオフは右上の歯車アイコンをクリックして行う。
  • [Ctrl]+[F1]でショートカットのヘルプが出る。
  • GUIのサービスの停止はTTYでログインして「sudo service lightdm stop」

※ [Ctrl]+[Alt]+[ファンクションキー]はRDP接続時は無視されるっぽい?

WindwsのパーティションWindows (C:)」(NTFS)のUbuntuからのアクセス

これはもう単純にUbuntuから「/Windows」でアクセスできる。

SSHによるリモートログインのテスト

補助PCで秘密鍵と公開鍵のペアを作成する。

Git使いならPuttygenが入っているはずなので、下記ページに従いまずSECSH形式の公開鍵ファイル(*.pub)を作成する。

SSH接続を設定したい(Windows)
http://www.backlog.jp/git-guide/reference/ssh.html

次に、作成した公開鍵ファイルを(USBメモリか何かで)ターゲットPCの適当な場所(ホームディレクトリ「~」とか)にコピーする。

ターゲットPCのホームディレクトリの下に「.ssh」フォルダを作る。

$ mkdir ~/.ssh

下記ページに従い「.ssh/authorized_key」に公開鍵を記録

■ 公開鍵の形式を変更する
http://qiita.com/marcie001/items/47a23cfeed00db783d39

ssh-keygen -i -f id_rsa.pub >> ~/.ssh/authorized_keys

補助PCにTeraTermをインストールする。

TeraTermを開き、下記ページに従い接続テストを行う。

SSH 接続
https://ttssh2.osdn.jp/manual/ja/usage/ssh.html

elcome to Ubuntu 17.04 (GNU/Linux 4.10.0-32-generic x86_64)
...

と出てコマンドプロンプトまで出たらOK。

Ubuntuの復元ポイントを作成

ここからは脳外科手術同然の複雑で精密なオペレーションが必要とされる。患者が死んでしまったときの用心のため(マテ、
復活の呪文を用意しておく。

何やらネット上にはUbuntuにシステム復元ポイントはないのかと取り乱していらっしゃる方も散見されるが、これは簡単な話で、上でUbuntuをインストールしたパーティション(「/」)のディスクイメージを保存(バックアップ)しておけば宜しいい。

ディスクイメージ保存には、Ext4が扱えるやつなら何でも良いがここではClonezillaを使う。
細かいことは次の神解説を読めばワカル。

■ (Linux) ext4パーティションのバックアップをClonezillaで行う
http://netlog.jpn.org/r271-635/2014/09/linux_ext4_clonezilla.html

筆者は最新版ということで、“clonezilla-live-2.5.2-17-amd64.iso”をダウンロードしてDVDに焼いてバックアップを遂行した。
イメージファイルの保存先はUSBの外付けハードディスクとする。保存先ディレクトリを指定できるので、保存先HDDにもともとあったデータをそのまま保持可能。
インストール直後のUbuntuの状態なら、イメージファイルのベリファイ込みで5分でバックアップが終わる。

リモートデスクトップ(RDP)接続

Ubuntu 16.04を選んでしまって地獄めぐりをさせられた(しかも結局不成功に終わった)RDP接続だが、17.04だとマジ簡単。
次のページに従えば万事OK。

■ XRDP – How to install XRDP on Ubuntu 17.04 – Easy Way
http://c-nergy.be/blog/?p=10448

$ sudo apt-get install xrdp

これでWindowsGUIで繋がって日本語入力できて相互にコピー&ペーストもできる上に、ログインしたままRDP接続を一時切断もできる(再接続したらもとの画面が開く)。

上記ページを読めばだいたいワカルはずだが、接続手順にはややクセがある。下記に注意。

  • 「Session」は「Xorg」を選ぶ。
  • ユーザー名とパスワードはターゲットPCのアカウント名とパスワードを入力する。
  • GUIセッションは同時には1つだけが可能。ターゲットPC上で誰かがGUIログインしている間はRDP接続できない。
    (TTYログインやSSHでのリモートログインとの併用は実験する限りOKのようである。)
  • ログイン済み状態での再接続で無い限り、接続に成功すると真っ黒な画面になる*8
    マウスで右クリック→コンテキストメニューが出て、「端末を開く」を選ぶと端末が表示されるので、次のコマンドを入力してGUIをアクティブにする。
$ exec unity
  • 「端末を開く」を選んでも真っ黒な画面のままのときは、右クリックで出るコンテキストメニューの「配置を維持する」のチェックを外してから改めて「端末を開く」を選ぶ。

UEFIの設定

CUDAドライバを読み込ませるために、まず*9UEFIと戦わねばならない。なぜなら、UEFIは署名無しのドライバの読み込みを拒否し、CUDAドライバは署名を持たないから(らしい)。

下記ページに従い、野良ドライバも読み込めるようにする。

■ How to Disable or Enable Secure Boot on Your Computer via ASUS UEFI BIOS Utility
https://www.technorms.com/45538/disable-enable-secure-boot-asus-motherboard-uefi-bios-utility
概要としては、UEFIのPK、KEK、DB、DBXの4種類のキーをUSBメモリに保存した上で、PKキーを削除する。
何を言っているのかわかんねーと思うが、筆者にもわからん…
しかしDeep Learningが支配するこれからの世の中においては、操作と効果の相関さえ見出せれば十分である。とにかく意味など考えずに上記ページの手順に従うと良い。


CUDAのインストール

Software Designの8月号に行き届いた説明があるが、その手順に従ってしまうとRDPで接続できなくなるという罠がある。*10

解決策は、下記ページのインストール手順に従うと良い(と思うが今現在トライ中。)

■ Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話
http://qiita.com/tanakatsu1080/items/c97c4ea3b1d349e2f718
https://devtalk.nvidia.com/default/topic/878117/-solved-titan-x-for-cuda-7-5-login-loop-error-ubuntu-14-04-/

sudo apt-get update
sudo apt-get install -y build-essential wget

# /etc/modprobe.d/blacklist-nouveau.conf を作成する
## 内容は以下
## blacklist nouveau
## options nouveau modeset=0

sudo update-initramfs -u

# 再起動する
sudo reboot

# CUI(Ctrl+Alt+F1)でログイン

# NVIDIAのドライバとCUDAをサイトからダウンロード
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/367.57/NVIDIA-Linux-x86_64-367.57.run
wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run

chmod a+x NVIDIA-Linux-x86_64-367.57.run
chmod a+x cuda_7.5.18_linux.run

# X Serverを停止
sudo service lightdm stop

# openglなしでNVIDIAドライバをインストール
sudo ./NVIDIA-Linux-x86_64-367.44.run --no-opengl-files

# CUDAをドライバインストールなしでインストール
sudo ./cuda_7.5.18_linux.run --silent --no-opengl-libs --toolkit

# 環境変数追加
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_ PATH' >> ~/.bashrc
echo 'export CUDA_PATH=/usr/local/cuda' >> ~/.bashrc
source ~/.bashrc

セキュリティー対策

CUDAインストールまで万事うまくいったら、Clonezillaでバックアップでも取った後に下記セキュリティー対策をやっておくべき

Ubuntu 最低限抑えておきたい初期設定
http://qiita.com/kotarella1110/items/f638822d64a43824dfa4

あくまで自己責任で!

補足

Ubuntu 17.04 Desktopを選定した理由

(バージョンの選択)
最初16.04.3 LTS Serverを選んだが、GUIでの日本語入力IMEの設定にちょっと手間取ったのと、RDPが最後まで動いてくれなかったため放棄。

16.04におけるRDP事情についてはここ参照…スゲーややこしい。17.04にしたらすっきりする。17.04 Desktopにしたら両方すんなり動いて給与が上がって彼女もできました!

(ServerかDesktopか)
リモートログインして使役したいだけでメールサーバにもWebサーバにもするつもりはない、というつつましい利用目的の場合はServerを選ぶ理由は全く無い模様
ServerはSSHサーバが最初から入っているが、Desktopには入っていない。筆者が触った範囲ではこれぐらいの違いしか表面化しなかった。SSHサーバのインストールは本文中に述べるように「sudo apt install ssh」で後から簡単にできる。

(その他の選択肢)
ubuntulinux.jpという所が日本語Remixを配布しているようだが後から気づいたので試していない。

仮想環境ではダメなのか、

一言で言って現状ダメである。下記の通り、Hyper-VでもCUDAアクセスができない。筆者は実は最初Hyper-VのゲストOSとしてUbuntuを動かしたが、PCI-Eに挿したグラフィックボードが見つかりすらしねえ!

UbuntuGPGPU+TensorFlowを実行
http://msyksphinz.hatenablog.com/entry/2016/03/20/020000

■ Windows10を導入した
http://msyksphinz.hatenablog.com/entry/2016/03/14/020000

Hyper-V上のUbuntuにTensorFlowのインストール
http://msyksphinz.hatenablog.com/entry/2016/03/16/024623

Hyper-V経由でGPGPUを利用することは無理?
http://msyksphinz.hatenablog.com/entry/2016/03/17/020000

VMware vSphere ESXiを試す + GPGPUの認識に挑戦
http://msyksphinz.hatenablog.com/entry/2016/03/19/025533

UbuntuGPGPU+TensorFlowを実行
http://msyksphinz.hatenablog.com/entry/2016/03/20/020000

UbuntuGUI

17.04はUnityだが、次のリリースからはGNOME2ベースのものになる(戻る?)らしい…
やっとうまくいったRDP周りの話がひっくり返りそう?


(参考)
■ お勧めのLinuxデスクトップ環境6選--「KDE」から「LXDE」まで
https://japan.zdnet.com/article/35051532/

ひょっとしたらGUIベースの接続はRDPとかでなくてX Window Systemプロトコルでやるのが万古不易で安牌なのかもしれないが、日本語入力とかセキュリティーとかどうなのか全くわからないのでパス。今回は調査していない。

何しろパソコン初心者やし…

*1:ディスクイメージ保存にこの記事ではClonezillaを使うが、これの扱えるフォーマットなら何でも良いはず。

*2:Windows 10では管理者権限での起動が必要。

*3:ターゲットPCはロープロファイルのケースだったなのでケース内にHDD増設スペースとか無かったorz

*4:表示された容量をそのまま縮小しようとすると「ディスク領域が足りません」とか言われて縮小できなかった。

*5:試していないが「English」のままだと後で日本語入力とかLANG=ja_JP.UTF-8が必要なシチュエーションとかで苦労が追加されると思う。

*6:動作の再現性確保のため、余計なダウンロードを開始しかねない余計なチェックは一切入れないこと。

*7:もしくは、キーボードで[Ctrl]+[Alt]+[t]でも出る。

*8:青緑色の画面のままのときは失敗。しばらく待つとメッセージが出る。

*9:実際は筆者はドライバインストール後に気づいたので順序はドライバインストール後でも良い感じだが、

*10:OpenGLのライブラリインストールが悪さするらしい。