CUDA×Chainer(or TensorFlow)でDeep Learningするための環境構築レシピ
土用丑の日には「う」の付くものを食すとよいという古来からの慣習に従いUbuntuを食す、
ついでに今世紀最大(決定済)のパズワード「Deep Learning」のお勉強用環境を3時間で作る、
実現する環境
この記事のねらい
- CUDA×Chainer(or TensorFlow)な環境が緊急に欲しかったのでついカッとなってやった
- こういう流行の技術の具体的環境構築方法の情報は新参の参入障壁を高めるために通常は奥ゆかしく出し惜しみすべきだが、今やSoftware Designの最新号で具体的なCUDA導入ステップが示され公知となってしまったからもはや隠す理由はない。
- とはいえ、上記記事のやり方では(実は)RDPでのGUIログインと両立しない問題がある。
- Ubuntuはいつも端境期にあり、情報がトピック別にひどく散在している。(ていうか古い情報ばっかりひっかかって調査を妨害される。
以上の理由により、ここにまとまった情報として包括的な環境構築レシピを示すもの也、
当記事を読めば、筆者のようなパソコン初心者が思い描くリッチGUIベースなUNIX環境がなんとタダで手に入る…!
使用機材
筆者が使用した環境を一応再現性担保のために記す、
- [ターゲットPC]
キーボードはWindowsキーがあるやつ推奨。
- [GPU]
- GeForce GTX 1050搭載ボード
具体的にはこれ。
- GeForce GTX 1050搭載ボード
- [外付けHDD]
- [DVD-R]
- 2枚
- [USBメモリ]
- 16 GBぐらいのやつ。
導入ステップ
インストールメディア作成
選定した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 7とUbuntuが仲良く共存できるデュアルブート環境の作り方
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」パーティションを作る。
- サイズ: 256 MB
- 新しいパーティションのタイプ: 論理パーティション
- 新しいパーティションの場所: この領域の始点
- 利用方法: ext4ジャーナリングファイルシステム
- マウントポイント: /boot
[OK]をクリックするとしばらくHDDに書き込みが行われた後「インストールの種類」画面に戻る。
作成された「/boot」パーティションの後ろに300 GBの空き領域があるはずだ。これを右クリックし、下記設定で「/」パーティションを作る。
- サイズ: (表示されている値を変更しない)
- 新しいパーティションのタイプ: 論理パーティション
- 新しいパーティションの場所: この領域の始点
- 利用方法: ext4ジャーナリングファイルシステム
- マウントポイント: /
[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のタイムゾーン解釈の変更
WindowsとUbuntuのデュアルブート構成特有の問題として、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接続時は無視されるっぽい?
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
これでWindowsとGUIで繋がって日本語入力できて相互にコピー&ペーストもできる上に、ログインしたまま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に挿したグラフィックボードが見つかりすらしねえ!
■ UbuntuでGPGPU+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■ UbuntuでGPGPU+TensorFlowを実行
http://msyksphinz.hatenablog.com/entry/2016/03/20/020000
UbuntuのGUI
17.04はUnityだが、次のリリースからはGNOME2ベースのものになる(戻る?)らしい…
やっとうまくいったRDP周りの話がひっくり返りそう?
(参考)
■ お勧めのLinuxデスクトップ環境6選--「KDE」から「LXDE」まで
https://japan.zdnet.com/article/35051532/
ひょっとしたらGUIベースの接続はRDPとかでなくてX Window Systemのプロトコルでやるのが万古不易で安牌なのかもしれないが、日本語入力とかセキュリティーとかどうなのか全くわからないのでパス。今回は調査していない。
何しろパソコン初心者やし…
*1:ディスクイメージ保存にこの記事ではClonezillaを使うが、これの扱えるフォーマットなら何でも良いはず。
*3:ターゲットPCはロープロファイルのケースだったなのでケース内にHDD増設スペースとか無かったorz
*4:表示された容量をそのまま縮小しようとすると「ディスク領域が足りません」とか言われて縮小できなかった。
*5:試していないが「English」のままだと後で日本語入力とかLANG=ja_JP.UTF-8が必要なシチュエーションとかで苦労が追加されると思う。
*6:動作の再現性確保のため、余計なダウンロードを開始しかねない余計なチェックは一切入れないこと。
*7:もしくは、キーボードで[Ctrl]+[Alt]+[t]でも出る。
*8:青緑色の画面のままのときは失敗。しばらく待つとメッセージが出る。
*9:実際は筆者はドライバインストール後に気づいたので順序はドライバインストール後でも良い感じだが、