機械学習用の計算サーバ構築手順を纏めてみた

技術研究所(技研)のまつけんです。

技研では現在、2台のゲーミングデスクトップPCにLinux (Ubuntu)とJupyterをインストールして、共有で計算(主に機械学習)サーバとして使っています。最近、計算量が増えてきたので、近いうちに3台目を購入し、セットアップする予定です。また、休眠状態だったゲーミングラップトップPCがあったので、一足先にセットアップして計算サーバ化しました。この記事では技研で確立した「機械学習用の計算サーバ構築手順」を紹介したいと思います。OSはUbuntu Server 20.04 LTSです。

※ここに記載されいてる情報は2020年9月現在のものです。また、今回のセットアップ対象は、DELLのゲーミングラップトップG5[1]です。

用意するもの

  • Ubuntu Serverのインストーラ

https://jp.ubuntu.com/download

からISOイメージを入手できます。検索エンジンで「ubuntu server iso」などを検索すれば見つかるかと思います。ダウンロードしたISOイメージのファイル名は「ubuntu-20.04.1-live-server-amd64.iso」です。

  • DVD-RドライブまたはUSBメモリ

ISOイメージファイルから起動メディアを作成します。勿論、DVD-Rに書き込むことも出来ますが、USBメモリに書き込むとスピーディにインストールできます(今回は起動からインストール完了まで3分くらいでした)。ISOファイルからUSBブートデバイスを作るソフトウェアを使います。検索エンジンで「isoファイル usbブート」などと起動すると幾つかヒットしますが、今回はインストールせずに使える「Refus 3.11 Portable」を使いました。USBメモリは7年前に購入した4 GBのもの[2]が余っていたので、それを使いました。

インストールとアップデート

  • インストーラの起動

USBメモリを装着し、起動します。内蔵ストレージのOSが起動してしまう場合は、再起動し、F2キーでBIOSメニューを開いてUSBから起動するように切り替えてください。

  • インストール

インストールは基本的にデフォルト設定で大丈夫ですが、「Install OpenSSH server」にはチェック(X)を入れます。インストール先は内蔵ストレージの「entire disk」を選べば良いのですが、「インストールできるディスクが無い」旨の表示となっていまい、今回、進まなくなってしまいました。原因はRAID設定がONなっていることでした。Ubuntu Serverでは詳しい原因がわからなかったので、Ubuntu Desktopのインストーラに切り替えて試した所、「This computer uses Intel RST (Rapid Storage Technology). You need to turn off RST before isntalling Ubuntu.」と表示されたので、BOISメニューのSystem Configuration→SATA OperationでAHCIを選択することで解決しました。

ホスト名はgiken-ml-11、初期ユーザはgiken、ネットワーク設定はDHCPです(最終的には固定IPアドレスにする)。

  • プロキシ設定

aptのプロキシの設定は/etc/apt/apt.confに以下の2行:

を追加することで設定します。ファイルの末尾に追加する場合は「cat >> /etc/apt/apt.conf」が便利です。必要な内容を入力またはペーストして、ctrl-dで抜けます。またwgetについて、/etc/wgetrcに以下の3行を追加します:

  • アップデート

インストールが終わったら、まず、アップデートを行って最新の状態にします:

sshログインと初期設定

  • sshリモートログイン

リモートログインすることで、コマンドのコピー&ペーストなどが出来ます。ネットで調べ物をして、そこに載っているコマンドをそのまま実行したり出来ます。また、最終的にサーバとして使うのでsshログインが出来ないと管理するのが困難です。普段Windowsを使っている場合は、Windows側にcygwinをインストールしておくと便利です。

リモートログインするには、サーバ(giken-ml-11)のIPアドレスが必要です。今回は、ひとまずDHCPでIPアドレスを自動取得する設定でインストールしたので、ifconfigなどで調べる必要があります。ifconfigを使うには、net-toolsが必要なのでaptでインストールします:

サーバのIPアドレスが192.168.0.10ならば、cygwin側からは、

のように-lでユーザ名を指定してログインします。パスワードはインストール中に設定したものを入力します。

  • タイムゾーン設定

タイムゾーンをアジア/東京に設定し、日付と時刻が合っていることを確認します:

  • クラムシェルモード

ゲーミングラップトップをサーバとして使う場合、シェル(蓋)を閉じた状態でもサスペンドしないように設定すると便利です。この設定は/etc/systemd/logind.confで行います。このファイルに「HandleLidSwitch=ignore」を追記して、

を実行すると蓋を閉じてもサスペンドしなくなります[3]。デスクトップPCの場合は、この作業は不要です。

  • ランレベルの変更

Ubuntu Serverをインストールした直後は起動時にX Window System (以下、X)は起動せず、CUIのログイン画面となります。が、内部的には「グラフィカル」モードに設定されていて、後ほど、nvidiaのデバイスドライバをインストールすると、Xが起動するようになります。サーバとして使うのでXは不要ですから、モードを変更します[4]:

かつて、この設定はrunlevelと呼ばれていて数値で管理されていて、sudo initで変更するようになていたのですが、現在はsudo initでは変更できないようです。

各種デバイスドライバ・ツールのインストール

  • nvidiaドライバとユーティリティ

グラフィックボードのデバイスドライバとユーティリティをインストールします。インストール後は再起動が必要です。

Ubuntuのバージョンによっては事前に「sudo -E add-apt-repository ppa:graphics-drivers/ppa」を実行する必要があります。また、セキュアブートが有効になっている場合は、パスワード設定画面が表示されます。再起動時に「Enrol MOK」を選択して、パスワードを入力します。

再起動したら、nvidia-smiコマンドでグラフィックボードの状態が確認できることを確かめます:

なお、このとき表示される「CUDA Version: 10.2」というのは「バージョン10.2のCUDAまで利用可能」という意味であって、実際に動いているCUDAのバージョンではないようです。実際のCUDAのバージョンは、nvccで調べることが出来ます(最後の「10.1.243」の部分がバージョン番号):

  • Jupyter

Jupyterをインストールします:

  • その他

その他に、動画を扱うことがあるのでffmpegとmediainfo、バージョン管理にsubversionとgit、メインのサーバから/homeをNFSマウントするのに、nfs-commonをインストールします:

固定IPアドレスの設定

サーバとして運用するので、IPアドレスを固定します。これについては計算サーバ構築の本質とは関係ないので、詳しい説明は割愛しますが、/etc/netplan/99_config.yamlを作成しnetplan applyを実行します[5]。ただし、デバイス名が「eth0」とは限らないので、事前にifconfigで確認します:

今回は「enp60s0」でした。

全体の設定(管理者権限での設定)は、ここまでです。ここから先は、個々人のhome directory内の設定となります。

個人設定

  • Jupyterの設定と動作確認

Jupyterの設定は、以下の通りです:

jupyter notebook –generate-configを実行すると、設定ファイル.jupyter/jupyter_notebook_config.pyが作られます。その中の

という行を

に書き換えるのですが、エディタで書き換えるより、sedで書き換えるスクリプトを作った方が、複数のユーザの設定を行うときに楽なので、sedを使っています。

設定が出来たら、Jupyterを起動します:

サーバ側が固定IPアドレスに設定してあり、クライアント側のhostsファイルなどを設定してあれば(またはDNSなどで名前が解決できれば)、ここに表示されている「http://giken-ml-11:8888/?token=xxx」をクライアント側のブラウザで開き、Jupyterが使える筈です(DHCPのままでも「http://192.168.0.10:8888/?token=xxx」のようにIPアドレスを指定すれば使えます)。

確認が終わったら、サーバ側でctrl-cでJupyterを終了させます。

  • Anacondaのインストール

Anacondaのインストーラをダウンロードして実行権限を与えます:

実行します:

インタラクティブなインストーラなので途中の>>>が表示されている部分(4か所)でキーボードからの入力が必要です。デフォルトのインストールを行うには順に、

  1. Enterキー (緑矢印で示した部分)
  2. yesと入力してEnterキー (赤矢印で示した部分)
  3. Enterキー (緑矢印で示した部分)
  4. yesと入力してEnterキー (赤矢印で示した部分)

です。インストールが終わったら、一度ログアウトするなどして、bashを再起動します(.bashrcが変更されているため)。

bashを再起動すると、プロンプトの前に「(base)」が表示されるようになります。この設定を解除するには、インストールの最後に表示されている通り、「conda config –set auto_activate_base false」を実行します。「conda -V」でバージョンを確認できます:

また、この時点でインストールされているパッケージを控えておくと便利です[6]:

最新版にアップデートする場合は「conda update -n base -c defaults conda」を実行します(プロキシの設定が必要な環境の場合は、先にプロキシの設定を行います)。

  • プロキシ設定

プロキシ設定が必要な場合は、~/.condarcの末尾に以下の3行を追加します:

  • TensorFlow (GPU) 環境の作成とパッケージのインストール

以下のように「conda create -n tf-gpu」を実行します:

途中で「Proceed ([y]/n)? 」と聞かれるので、Enterキーを押します。インストーラのメッセージの最後に書いてある通り、この環境を有効にするには「conda activate tf-gpu」、無効にするには「conda deactivate」を実行します。続いて、「tf-gpu」の環境を有効にして、tensorflow-gpuをインストールします。「tf-gpu」を有効化するとプロンプトの「(base)」が「(tf-gpu)」に変化します。

「Proceed ([y]/n)? 」と聞かれたら、Enterキーを押します (緑矢印で示した部分、-yオプションを付ければ、この確認無しにインストールできます)。cudatoolkit、cudnn、numpy、python、scipy、tensorboard、tensorflow、tensorflow-gpuなどがインストールされていることがわかります。続いて、pythonを起動し、tensorflow.python.client.device_lib.list_local_devices()で、CPU/GPUの情報を確認します:

GPUとして「GeForce RTX 2060」とVRAM 5491 MBが正しく認識されています。確認できたら、ctrl-dでPythonを終了します。

  • IPython Kernel for Jupyterのインストール

以下のコマンドでインストールします。例によって「Proceed ([y]/n)?」と聞かれますので、Enterキーを押します。

また、後ほどmatplotlibを使うので、ついでにインストールしておきます:

  • Jupyterで試運転

再び、Jupyter Notebookを起動し、先程と同様にクライアント側のブラウザで「http://giken-ml-11:8888/?token=xxx」を開きます。右上の「New」から「TensorFLow-GPU」を選び、新しいnotebookを作成します:

有名な機械学習の例題MNISTを2段のDenseで学習させてみます:

無事に正解率97%の学習済みモデルが出来ました。学習がCPUではなくGPUで行われているかどうかは、nvidia-smiコマンドで確認します。最下部のジョブのリストに項目が増えている筈です(学習中であれば、消費電力も普段より大きい値になっている筈です):

念のため、PID 3678を調べて自分のタスクであることを確認します:

如何でしたか? Ubuntu Linuxの新規インストールから、Anacondaを使ったMNISTをDenseで学習する実験までを通しで纏めてみました(今回のソースコードはGoogle Colaboratoryでシェアしています[7])。nvidiaのGPUを搭載したPCを機械学習用Jupyterサーバにするときなどに参考にしていただければと思います。詳しいことは、Anacondaのドキュメント[8]を参考にしてみてください。

参考文献など

[1] https://www.dell.com/ja-jp/shop/gaming-and-games/dell-g5-15-スペシャルエディション-ノートパソコン/spd/g-series-15-5590-se-laptop
[2] I-O DATA USB 2.0/1.1対応 フラッシュメモリー「NT」シリーズ 4GB ピンク TB-NT4G/P
[3] 【Ubuntu 20.04/18.04 LTS Server】ノートPCで蓋を閉じてもサスペンドを防止
[4] Ubuntu 16.04 LTS のランレベルを変更して CUI で動かす
[5] Ubuntu 20.04 LTSで固定IPアドレスの設定
[6] conda環境の保存と再構築の仕方
[7] Google Colaboratory: mnist-2-dense-test.ipynb
[8] ANACONDA DOCUMENTATION

  • このエントリーをはてなブックマークに追加