Ubuntu 18.04 + Jupyter Notebookで構築する機械学習環境

こんにちは。
ギークフィードでは講師の方にお越しいただいて機械学習の勉強会を行っています。
勉強会では、Google Colaboratoryを使用して環境構築をすることなく学習をすることができています。
Colabは無料で使用できるので学習には最適ですが、将来的には学習環境をサーバーに構築することもあるのではないかと考え、
手持ちの余っていたGPUを使用して構築を行ってみました。
本音を言うと形から入るのが好きなだけです。
 
Google Colaboratoryとの比較とパフォーマンス考察も行っているのでぜひ最後まで読んでみてください。
 
講師としてお越しいただいているのは株式会社 喋ラボの大橋さんです。
株式会社 喋ラボ

インストールUSBの作成

手元のMacでインストールUSBを作成します。

USBメモリのフォーマット

USBメモリをMacに接続します。
ディスクユーティリティからUSBメモリを選択し、「消去」をクリック。
フォーマット形式はMS-DOS(FAT)を選択します。
名前を適当に決めて「消去」をクリックし、フォーマットは完了です。
 

インストーラーイメージの書き込み

Ubuntu 18.04.3 LTSダウンロード
上記のリンクより、インストーラーイメージをダウンロードします。
今回はデスクトップ環境も使うかもしれないのでDesktop imageを選択しました。
 
イメージの書き込みにはbalenaEtcherを利用します。
Etcherをインストールし、インストーラーイメージとUSBメモリを選択して「Flash!」をクリックします。
 

 
意識高くCUIから書き込む方法もありますが、面倒なので省略します。

Ubuntuのインストール

インストール

biosのbootメニューで起動プライオリティをUSBメモリに変更して再起動。
インストーラー起動後は好みの環境に合わせてインストール作業を行います。
今回「アップデート他のソフトウェア」メニューでは最小インストールを選びました。
 
Install Ubuntu Desktop

インストール後の作業

インストール後に行う準備作業です。

ipを固定

GUIで行う方法はこちらのブログがわかりやすく解説しています。(こっちのほうが簡単!)
 
意識高くCUIから行う方法を紹介します。
まずは現状の状態を確認します。
 

 
LANで接続しています。NICはenp12s0です。
マザーボードに無線LANのNICもありますが、使用していません。
 
nmcliコマンドでipアドレス、ゲートウェイ、DNS、methodを設定します。
コマンド後、設定ファイルが生成されるので確認することができます。
 

opensshの導入

Desktop版はデフォルトでsshサーバーが入っていないのでリモート接続できません。
インストールをして自動起動を有効にします。
 

パッケージの更新

パッケージの更新はしておきましょう。
 

CUDA Toolkit, GPUドライバー, cuDNNのインストール

必要なパッケージのインストール

ソフトウェア開発パッケージとDKMSをインストールします。
 

nouveauを止める

NVIDIAグラフィックスドライバーとnouveauグラフィックスドライバーが同時に動くと問題が発生するのでnouveauを止めます。
まずはモジュールが動いているかをlsmodで確認。
 

 
nouveauが動いているようなので以下のファイルを作成して設定します。
 

 
以下のコマンドで設定を反映します。
 

CUDA Toolkitのインストール

以下のリンクからCUDA Toolkitのrunfileをダウンロードします。
自分の環境に合わせてrunfileを選択してください。
CUDA Toolkit
 
以下のコマンドでもOK。
 

 
ダウンロードしたファイルをUbuntuサーバー上で実行します。
 

 
コンソールには何も表示されずに完了します。
インストールが完了したら、環境変数を設定するファイルを作成します。
 

 
設定をしたら一度ログアウトし、再ログインした際に$CUDA_HOMEが環境変数として認識されていればOKです。

NVIDIA Driverのインストール

以下のリンクからNVIDIA Driverをダウンロードします。
自分の環境に合わせてGPUを選択してください。
NVIDIA Driver Downloads
 
今回は以下のコマンドで行いました。
 

 
ダウンロードしたファイルを実行します。
 

 
今回は途中でwarningが出ましたが、32bit環境に関するものなので問題なさそうです。
インストールが完了すると、以下のようにnvidia-smiコマンドでGPU情報を取得できます。
 

cuDNNのインストール

cuDNNとは、NVIDIAが公開しているディープラーニング用の高速化ライブラリです。
cuDNNをダウンロードするには、NVIDIA Developer Programにサインインする必要があります。
「cuDNN Library for Linux」をダウンロードします。
 

 
ダウンロードしたファイルはscp等でサーバーへアップロードします。
ダウンロードしたtgzファイルを解凍し、ファイルを移動します。
 

 
cuDNNがインストール完了しました。

Jupyter Notebookのインストール

インストール

以下のコマンドでpipとJupyter Notebookをインストールします。
今回はfastaiのライブラリも利用したいのでインストールします。
 

 
一度ログアウト、ログインをするとjupyterコマンドが利用できるようになります。

Jupyter Notebookの設定

Jupyter Notebookへの接続ポートを変更し、tokenではなくパスワードでのログイン管理にしたいため、
以下のコマンドでconfigを生成し、パスワードを設定します。
 

自動起動設定

Ubuntu起動時にJupyter Notebookが起動するようにdaemon化します。
 

 
自動起動の有効化と実行。
 

(オプション)モニターを接続せずにNVIDIA Driverを動かす

基本的にリモートで作業を行うので、サーバーにモニターは接続しません。
その際に、ディスプレイが無いということでNVIDIA Driverがロードされない問題が発生することがあるようです。
その場合は以下のコマンドで解決できるみたいです。
 

動かしてみる

Notebookを実行してみる

Jupyter Notebookのサービスを起動したら、ブラウザから
http://【ubuntuのipアドレス】:【設定したポート】
でアクセスします。
 

 
このようなスーパーシンプルなログイン画面が表示されたらOKです。
先程設定したパスワードでログインしましょう。

Google Colaboratoryとの比較

Google ColaboratoryではGPUはTesla K80を使用しています。
今回はfastaiで公開されているレッスンでパフォーマンスを比較してみました。

lesson1-pets.ipynb

githubURL: lesson1-pets.ipynb
 
最初のレッスンは画像認識をして犬猫を種類ごとに分類するものです。
画像の枚数は枚。resnet34を使用してファインチューニングをしています。
まずはGoogle Colaboratoryの結果から。
 

 
次に今回構築したJupyter Notebookでの結果です。
 

 
3倍くらい早くなりました!
若干error lateが高いのが気になりますが誤差の範囲でしょう。

lesson3-imdb.ipynb

githubURL: lesson3-imdb.ipynb
 
続いてのレッスンは言語認識を行い、 映画のレビューがポジティブかネガティブ化を判定するものです。
wkipediaの言語モデルをimdbのレビューでチューニングし、さらにネガポジ判定のチューニングを行っています。
こちらもGoogle Colaboratoryの結果から。
 

 
そしてJupyter Notebookでの結果です。
 
最初の内はトレーニング完了予想時間が50分弱と好スタートをきっていたのですが。。
 

 
最終的にはこんな結果に。
まさかの6時間コースへ。
 

なぜパフォーマンスが落ちてしまったのか?

lesson1では高パフォーマンスを出していたのに、lesson3では急激なパフォーマンス低下を起こしてしまいました。
原因は単純です。それは、GPUの冷却能力が低いことにあります。
lesson3のトレーニング中のGPU状態を計測すると以下のような状態でした。
 

 
97Cという箇所がありますが、これはGPUの温度を表しています。
一般的にGPUの適正温度は80℃以下と言われています。97℃はかなりマズい温度です。
このまま使い続けるとGPUの寿命を削ってしまいますし、高温ではほとんどパフォーマンスを発揮することはできません。

GPUメモリについて

また今回使用してみてわかったことは、GPUのメモリは6GBでしたがこれは全然足りないということです。
上記のnvidia-smiの結果から、lesson3のトレーニングでは約5GBのメモリを使用しています。
そしてこのメモリですが、Jupyter Notebookではノートのプロセスを終了しないとメモリが開放されません。
以下はlesson3のトレーニング実行後、lesson1のトレーニングを実行した際のプロセスとメモリ状況です。
 

 
PID3855がlesson3、PID5194がlesson1のノートのプロセスです。
メモリが上限まで使用されており、この時Notebook上ではランタイムエラーが起きています。
 


 
この後lesson3のプロセス、PID3855をkillすると以下のようになります。
 

 
5GBのメモリの空きができました。
このように同時にノートを実行する際は注意が必要です。
一方Google ColaboratoryのTesla K80は12GBのメモリを積んでいます。

おわりに

まとめ

・インストールは結構たいへん
・GPUの温度には気をつけよう
・GPUメモリも見ないとだめだよ
・Google Colaboratory使おう

感想

一言でいうと「Google Colaboratoryすげえ!」です。
 
無料で素晴らしいスペックの環境をブラウザから使用できるというのは圧巻です。
これから機械学習を始める方はColabを利用すればまず間違いないです。
私もメインではColabを使っていこうと思います。
 
一方で今回の構築は良い経験になりました。
改善のためにはサーバー全体(特にGPU)の冷却能力を上げる必要があります。
また、GPUも性能の高いものをSLIで構成したりするといいかもしれません。
消費電力も考えるといくらお金をかければいいのやら。。
 
今回の環境を使う余地があるとすれば、Colabはインスタンスの実行時間が12時間であるという制限があるため、
超長時間の学習の際に活用する可能性があるかもしれません。
その場合は、以下のコマンドでGPUの消費電力を制限することで負荷をかけすぎることなく運用できるかもです。
 

参考にさせていいただいたリンク

CUDA Toolkit/GPUカードドライバー導入手順
Teslaのnvidiaドライバーの正しいインストール方法
モニタを接続しないPCでNvidiaドライバを動かす
【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ