こんにちは、はじめまして。Link-Uの町屋敷です。
技術ブログを立ち上げるとのことで、ちょうど機械学習の環境を整える必要があったのでその詳細を書きます。環境構築って初投稿っぽいですし。
次にやる人のためのときのメモも兼ねてるからできるだけ色んなサイトに行かなくていいようにしたら結構長くなった。どこか間違ってたらごめんなさい。
折角なので最後に手元のノートパソコンとGPUサーバーの両方で実行して手書き文字認識のベンチマークを取ってみます。
環境
手元のノートパソコン(ideapad 720S) | GPUサーバー | |
---|---|---|
CPU | Core i7 8550U 1.8Ghz 4コア8スレッド | Xeon Silver 4116 × 2 2.1Ghz 24コア48スレッド |
メモリ | 8GB | 128GB |
GPU | なし | Tesla V100 × 2 + 1080Ti × 2 |
OS | Ubuntu 16.04 Desktop | Ubuntu 16.04 Server |
Pythonを使う準備
今回はIDEとしてEclipse、環境構築用にAnacondaを使います。PythonのIDEでEclipse使う人は少数派らしいけど。
Eclipseの設定
公式サイトのダウンロードボタンを押す。

ファイルを保存を選択して、ダウンロードしたフォルダに行き右クリックをして「ここに展開する」を選択。
出来上がったeclipse-installerフォルダ内のeclipse-instをダブルクリックする。

今回はjreがないと怒られたから取りに行きます。
Oracleの公式サイトからjreをダウンロード

規約の同意(Accept License Agreement)をチェックしないとダウンロードできないので注意

先ほどと同様にダウンロードしてきたファイルを展開して、生成されたjreから始まるフォルダをjreにリネームしてeclipse-installerの中に置けばeclipse-instが通るようになる。
pythonが選択肢にないのでとりあえずEclipse IDE for java Developpersを選択、フォルダを選択してインストール。インストールが完了したらLaunchボタンを押して起動。
ここでWorkspaceの選択をする。選択したフォルダ内にpythonのプロジェクトを置いていくことになる。

起動したら上のHelpタブからEclipse Marketplaceを選択し、pydevを検索。



installボタンからインストールする。インストールが完了すると、Eclipseを再起動するか聞かれるので再起動
初めはWelcomeタブが出ていると思うのでそれをxを押して消す。右上のOpenPerspectiveボタンを押して表示されるウィンドウにPydevが含まれていれば成功。

Anacondaの設定
仮想環境を使わないとpythonのバージョンが変わった時やバグった時に最悪OSから入れなおしになる事件が発生するかもしれないので、Anacondaを使って仮想環境を使えるようにする。
Anacondaを公式サイトからダウンロード。
よほどのことがない限りpython3.6バージョンでいい。
ターミナル(Ctr+Alt+T)に行って以下を実行
sudo sh '/home/user/ダウンロード/Anaconda3-5.1.0-Linux-x86_64.sh'
*userは人によって違う
途中利用規約やインストールパスを聞かれる。
Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/m/.bashrc
はyes Microsoft VSCodeのインストールはEclipseを使うならいらない。
インストールが終わったら一旦再起動
再起動したらターミナルを開いて仮想環境を作る
conda create -n python3.6-env
-n の後ろに環境名をかく
pythonのバージョンを環境名に入れておくと複数の環境を作った時にバージョンを間違えないから便利
source activate python3.6-env
で環境に入る。するとターミナルのパスの前に環境名がつく

which pythonと打つと現在使用しているpython.exeの場所がわかる。

機械学習によく使うパッケージをインストール
conda install numpy scipy sikit-learn keras pandas matplotlib
その後
python import numpy, scipy, pandas, sklearn, matplotlib, keras
と打ってエラーが出なければ成功。Ctrl+Dで抜けます。
パッケージをインストールをインストールする方法にはpipとconda (とgit)があるけど基本的にpipとconda両方あるパッケージはcondaを使ったほうが良さそう。
pipはソースからコンパイルするものもあるからハマった時はCやFORTRANなどの闇と戦わなければならんらしい。
EclipseでAnacondaの仮想環境でインストールしたパッケージを使う
先にインストールしたEclipseのpydevで普通にpythonスクリプトを書いても反映されない。
反映させるには、まずeclipseを開き、penPerspectiveボタンを押して表示されるウィンドウにのPydevを選択してopenする。すると右上にpythonマークが出てくるのでこれを選択し、上のFile->New->PydevProjectを選択すると以下のようなウィンドウが出てくるのでプロジェクト名を適当に決めて真ん中付近のplease configure an interpreter before proceedingをクリックしManual Configを選択

その後右のNewからInterpreterNameを適当に決め、Browseを選択し、Anacondaの仮想環境内でwhich pythonを打った時に出てくるpythonを登録する。あとはOKを2回押してApply.Interpreterが変更したものになってることを確認してFinishを押す。
できたか確認しよう。
File→New→Fileから作ったプロジェクトを選択し、ファイルを名前の最後が.pyになるように生成。
短い名前はライブラリにすでに使われているファイル名と被った時めんどくさいことになるので避ける。
GPUサーバーの設定
このままでも機械学習を始められるが、ノートパソコンなどの普通の性能のパソコンだとビッグデータを使おうとすると処理にかなり時間がかかってその間パソコンが使えなくなったり、そもそもメモリが足りなくて動かないことのないよう小さいデータセットでテストしたら処理を別のものにやらせたほうがいい。今回はGPUサーバーがあるのでそれを使う。
サーバーといってもOSを入れれば普通のパソコンと同様に設定できる。OSはUSBからUbuntu16.04をインストールした。SSHをつなげるまではサーバーに画面とキーボードを直接つなげて設定した。繋げずにやる方法もあるらしいが試してない。
ログイン画面でAlt+Ctr+F1でCUIに入れる。OSにUbuntu Serverを選んだなら元々CUI。
SSHでサーバーと接続する
GPUサーバーは起動時に100dB超えるくらいの爆音であまり近づいて作業したくないのでSSHで全部やってしまう。
ここからサーバー側とクライアント側の操作がどっちがどっちかややこしくなるので行の先頭にサーバー側なら[S],クライアント側なら[C]をつける。
まずサーバーのIPをチェック
[S]ifconfig
inetアドレス:192.168.101.48 と書かれているこれがサーバーのIPアドレス。
長く使うならIPは固定したほうがいい。
[C]sudo apt-get install ssh [C]ssh 192.168.101.48 -l [サーバー名]
SSHをインストールして、サーバーと接続。パスワードを聞かれるので、サーバーのユーザーのログイン時のパスワードを入れる。

こうなったらサーバーとの接続は成功。このターミナルともう一つターミナルを開くことでクライアント側のパソコンだけで処理が全てできる。
CUDAの設定
デフォルトのドライバではパフォーマンスが出ないので、NVIDIAから搭載しているGPU専用のドライバを取ってくる。
基本NVIDIAの公式インストールガイドに沿っていくがこの工程で結構バグが出て戦ったので最終的にできたやつを書いておく。公式の存在を知ったのが結構戦ったあとだったのが長引いた原因かも。
下手すると最悪OS再インストールになるので大事なデータなどは退避させたほうがいい。
sudo apt-get purge cuda*
sudo apt-get purge nvidia*
dpkg -l | grep nvidia
sudo wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install cuda
sudo nvidia-xconfig
export CUDA_HOME=/usr/local/cuda-9.1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64
export PATH=$PATH:{$CUDA_HOME}/bin
sudo reboot
nvidia-smi
4, 5行目は人によって変える必要あり

最後にこんなのが出てきたらドライバのインストールはできている。
cuDNNの設定
これも公式サイトを参考にする。
最初にcuDNNの公式サイトからcuDNNをダウンロード。画面が必要なのでクライアント側でダウンロードしてサーバーに送りつけることにする。Nvidia Developer Programに登録しないとダウンロードできない。
[C] sudo scp '/home/[クライアントユーザー名]/Downloads/cudnn-9.1-linux-x64-v7.1.tgz' [サーバー名]@[サーバーIPアドレス]:/home/[サーバーユーザー名]
[S] sudo tar -xzvf ../../home/[サーバーユーザー名]/cudnn-9.1-linux-x64-v7.1.tgz
[S] sudo cp -P cuda/include/cudnn.h /usr/local/cuda-9.1/include
[S] sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda-9.1/lib64/
[S] sudo chmod a+r /usr/local/cuda-9.1/lib64/libcudnn*
scpでファイルを送りつけてその後は公式サイトをなぞるだけの作業。cudaとかcuDNNのバージョンだけ注意
これでサーバーでプログラムを動かせるが、まだanacondaのライブラリたちが使えない。
‘/home/user/Downloads/Anaconda3-5.1.0-Linux-x86_64.sh’をサーバーに送りつけて先ほどと同じことをすれば使えるようになる。
[C] sudo scp '/home/[クライアントユーザー名]/Downloads/Anaconda3-5.1.0-Linux-x86_64.sh' [サーバー名]@[サーバーIPアドレス]:/home/[サーバーユーザー名
[S] sudo sh ./Anaconda3-5.1.0-Linux-x86_64.sh 以下同様
パッケージが増えたらAnacondaの環境を複製する方法を使うと楽そう。
サーバー側ではGPUを使うのでKeras-GPUとtensorflow-GPUもインストールする。
テスト
ついに環境ができたのでテスト。
使用したのはKerasライブラリのCNNを使った数字識別のサンプルコード mnist_cnn.pyに時間を計るコードだけを追加したもの。
試しに手元のノートパソコンideapadの結果はこうなった。

accuracyが正解率でtimeがかかった秒数、大体46分かかっている。
次にサーバーでやってみよう、サンプルをサーバーに送り、走らせる、
[S] source activate [環境名]
[S] python [ファイルを追加したフォルダのパス]mnist_cnn.py
結果はこれ。

手元のノートパソコン(ideapad 720S) | GPUサーバー | |
---|---|---|
Time | 2753.96s | 100.28s |
Accuracy | 0.9913 | 0.9917 |
ちょうど100秒で終わった。速度は27.5倍くらい速くなっているだけでなくaccuracyも若干上がっている。1回しかテストしてないのでたまたまかもしれないが、Teslaのほうが倍精度をより正確に計算できるので、それが影響してるのかもしれない。ちなみにTeslaは2基搭載されているが、簡単のためそのうち1つしか使っていない。
まとめ
今回はGPUサーバーでPythonを使った機械学習を行う準備方法の解説でした。
次回からの自分の担当分はいろんな機械学習の手法を手元のデータに使っていって、そのやり方や結果を書いていきたいです。