[初心者用]Pythonの環境構築とSSHとCUDAを使ってGPUサーバーで機械学習をする方法

[初心者用]Pythonの環境構築とSSHとCUDAを使ってGPUサーバーで機械学習をする方法

こんにちは、はじめまして。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)に行って以下を実行

* userは人によって違う
途中利用規約やインストールパスを聞かれる。
Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/m/.bashrc
はyes Microsoft VSCodeのインストールはEclipseを使うならいらない。
インストールが終わったら一旦再起動
再起動したらターミナルを開いて仮想環境を作る

-n の後ろに環境名をかく

pythonのバージョンを環境名に入れておくと複数の環境を作った時にバージョンを間違えないから便利

で環境に入る、。するとターミナルのパスの前に環境名がつく

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

機械学習によく使うパッケージをインストール

その後

と打ってエラーが出なければ成功。Ctr+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をチェック

inetアドレス:192.168.101.48 と書かれているこれがサーバーのIPアドレス。

長く使うならIPは固定したほうがいい。

SSHをインストールして、サーバーと接続。パスワードを聞かれるので、サーバーのユーザーのログイン時のパスワードを入れる。

こうなったらサーバーとの接続は成功。このターミナルともう一つターミナルを開くことでクライアント側のパソコンだけで処理が全てできる。

CUDAの設定

デフォルトのドライバではパフォーマンスが出ないので、NVIDIAから搭載しているGPU専用のドライバを取ってくる。

基本NVIDIAの公式インストールガイドに沿っていくがこの工程で結構バグが出て戦ったので最終的にできたやつを書いておく。公式の存在を知ったのが結構戦ったあとだったのが長引いた原因かも。

下手すると最悪OS再インストールになるので大事なデータなどは退避させたほうがいい。

4.5行目は人によって変える必要あり

最後にこんなのが出てきたらドライバのインストールはできている。

cuDNNの設定

これも公式サイトを参考にする。

最初にcuDNNの公式サイトからcuDNNをダウンロード。画面が必要なのでクライアント側でダウンロードしてサーバーに送りつけることにする。Nvidia Developer Programに登録しないとダウンロードできない。

scpでファイルを送りつけてその後は公式サイトをなぞるだけの作業。cudaとかcuDNNのバージョンだけ注意

これでサーバーでプログラムを動かせるが、まだanacondaのライブラリたちが使えない。

‘/home/user/Downloads/Anaconda3-5.1.0-Linux-x86_64.sh’をサーバーに送りつけて先ほどと同じことをすれば使えるようになる。

パッケージが増えたらAnacondaの環境を複製する方法を使うと楽そう。

サーバー側ではGPUを使うのでKeras-GPUとtensorflow-GPUもインストールする。

テスト

ついに環境ができたのでテスト。

使用したのはKerasライブラリのCNNを使った数字識別のサンプルコード mnist_cnn.pyに時間を計るコードだけを追加したもの。

試しに手元のノートパソコンideapadの結果はこうなった。

accuracyが正解率でtimeがかかった秒数、大体46分かかっている。

次にサーバーでやってみよう、サンプルをサーバーに送り、走らせる、

結果はこれ。

手元のノートパソコン(ideapad 720S) GPUサーバー
Time 2753.96s 100.28s
Accuracy 0.9913 0.9917

ちょうど100秒で終わった。速度は27.5倍くらい速くなっているだけでなくaccuracyも若干上がっている。1回しかテストしてないのでたまたまかもしれないが、Teslaのほうが倍精度をより正確に計算できるので、それが影響してるのかもしれない。ちなみにTeslaは2基搭載されているが、簡単のためそのうち1つしか使っていない。

まとめ

今回はGPUサーバーでPythonを使った機械学習を行う準備方法の解説でした。

次回からの自分の担当分はいろんな機械学習の手法を手元のデータに使っていって、そのやり方や結果を書いていきたいです。