GPU計算機の作り方【設定篇】
GPU計算機の設定方法について
はじめに
GPU計算機を組み立てた後、CUDAプログラムを走らせる環境づくりまでを以下に記述します。個人的メモの意味合いが強いので、不必要な記述は適宜読み飛ばして下さい。
(組み立て篇はこちら)
作業の要約は以下の通り
- OSのインストール
- Linuxの設定
- Lustre clientの設定
- CUDAのインストール
- 2台目以降の設定
OSのインストール
今回インストールしたOSはCentOS 6.3です。OSのインストールはUSBメモリ(容量は8GB)から行いました。(USBメモリからOSをインストールする方法についてはここにあります。)
たぶん多くのUSBメモリはvfat形式でフォーマットされているため、インストール時には手動での
パーティション設定が必要になると思います。設定は、
- /bootパーティションの作成
- 標準パーティションの作成
- ファイルシステムタイプはext4
- サイズは500MB
- 固定容量と基本パーティションにチェックを入れる
- LVMを作成
- 512MBのswap領域を作成
- 残りのLVMを全て"/"に充てる
Linuxの設定
あまり一般性のない記述になりますが、インストール後にした設定は以下の通りです。- /etc/sysconfig/network-scripts/ifcfg-eth0の編集
- IPADDRの設定
- NETMASKの設定
- GATEWAYの設定
- BOOTPROTOの設定
- 必要であればONBOOTをyesに設定
- /etc/resolv.confにnameserverを記述
- /etc/yum.repos.d/CentOS-Base.repoの編集
- yum updateの実行
- ntpdateとntpのインストール
- /etc/ntp.confの編集
- ntpdateの実行
- ntpdをスタートさせる
- chkconfigでntpdを有効化する
- [root@gpu]# chkconfig ntpd on (有効化)
- [root@gpu]# chkconfig --list | grep ntpd (確認)
- 一般ユーザの作成
- [root@gpu]# groupadd -g gid group
- [root@gpu]# useradd -u uid -g group user
- [root@gpu]# passwd user(パスワードの設定)
gidとuidを直に指定してidを作成しています。
Lustre clientの設定
詳細はここを見て下さい。 大筋の作業は以下のようになります。- Lustreクライアントのインストール
- SELinuxの無効化
- iptablesの設定(988ポートの受信許可)
- /etc/grub.confの編集
- リブートさせてlustreファイルシステムをmountできるか確認
CUDAのインストール
基本的にはインストーラの指示通りにインストールを進めるだけで大丈夫です。インストーラはCUDAのwebページからダウンロードできます。
OS(CentOS 6.3)に合わせてRHEL 6.xのインストーラをダウンロードします。
minimalな構成でCentOSをインストールする場合、足りないパッケージの
インストールをいろいろと求められます。まあ、その都度求められたパッケージを
インストールすれば良いのですが、CUDAインストール時に求められたパッケージを
一応リストしておきます。(下のリストは環境により変化するので、不完全なリストです)
- gcc
- gcc-c++ (CUDAのインストールには必要ないがsampleなどのコンパイルでどのみち必要)
- make
- kernel-devel
- freeglut
[root@gpu]# ln -s /usr/lib64/libglut.so.3 /usr/lib64/libglut.so
とシンボリックリンクをはっておきます。
インストールが終わったらサンプルプログラムを使ってテストしてみます。
たとえば、samples/1_Utilities/deviceQueryを使うとデバイスの情報を得ることができます。
他には、samples/0_Simple/matrixMulCUBLAS/matrixMulCUBLAS.cppを使うとCUBLASを
試すことができます。ためしにmatrixMulCUBLAS.cppをコンパイルして実行してみると、
[user@gpu]$\$$ ./matrixMulCUBLAS
[Matrix Multiply CUBLAS] - Starting...
GPU Device 0: "GeForce GTX 690" with compute capability 3.0
MatrixA(320,640), MatrixB(320,640), MatrixC(320,640)
Computing result using CUBLAS...done.
Performance= 851.89 GFlop/s, Time= 0.154 msec, Size= 131072000 Ops
Computing result using host CPU...done.
Comparing CUBLAS Matrix Multiply with CPU results: OK
851GFlop/sも性能が出ているのが分かりますが、その中身についても簡単に見ることができて、
[user@gpu]$\$$ nvprof ./matrixMulCUBLAS
======== NVPROF is profiling matrixMulCUBLAS...
======== Command: matrixMulCUBALS
[Matrix Multiply CUBLAS] - Starting...
GPU Device 0: "GeForce GTX 690" with compute capability 3.0
MatrixA(320,640), MatrixB(320,640), MatrixC(320,640)
Computing result using CUBLAS...done.
Performance= 849.53 GFlop/s, Time= 0.154 msec, Size= 131072000 Ops
Computing result using host CPU...done.
Comparing CUBLAS Matrix Multiply with CPU results: OK
======== Profiling result:
Time(%) Time Calls Avg Min Max Name
86.36 4.74ms 31 152.75us 150.97us 153.73us void magma_lds64_sgemm_kernel(int, int, int, float const *, int, float const *, int, float*, int, int, int, float const *, float const *, float, float, int)
9.08 497.88us 3 165.96us 1.31us 248.32us [CUDA memcpy HtoD]
4.56 249.76us 1 249.76us 249.76us 249.76us [CUDA memcpy DtoH]
とnvprofコマンドを使うと、matrixMulCUBLASはsgemm(単精度の行列積)に約86%, メモリコピーに14%使っているのが分かりました。
2台目以降の設定
USBメモリにシステムがまるごと入っているので、USBメモリをコピーすれば、2台目、3台目と次々にGPU計算機を立ち上げることができます。
コピーの仕方は、まずGPU計算機をシャットダウンして、USBメモリを取り外し、適当なLinuxマシンに
挿します。それから複製するためのUSBメモリも挿して、sfdiskコマンドでデバイスの確認をします。
[root@linux]# sfdisk -l
...(結果出力)
ここでは、コピーされるオリジナルが/dev/sdc、コピー先が/dev/sddだったとします。
ddコマンドでコピーを実行します。
[root@linux]# dd if=/dev/sdc of=/dev/sdd bs=1M
...
[root@linux]# sync
まるごとコピーするので時間がかかりますが、それでも私の環境で8GBのUSBメモリのコピーが30分ほどで終了しました。
コピーが終わったら、念のためsyncしておきます。
コピーしたUSBメモリの中には1台目の情報がそのまま入っているので、2台目に挿してブートした後、
必要な情報の書き換えを行います。私が行った書き換えリストは以下の通り。
- /etc/sysconfig/networkのHOSTNAMEの書き換え
- /etc/sysconfig/network-scripts/ifcfg-eth0の書き換え
- [root@gpu2]# ifconfig -a を実行して正しいHWADDRをひかえる(eth1の情報として表示される)
- [root@gpu2]# uuidgen を実行して新しいuuidを生成
- ifcfg-eth0中のIPADDR, HWADDRとUUIDを変更(UUIDを書き写すのは面倒なので, uuidgen >> ifcfg-eth0で追記したあと編集する手もあり)
- /etc/udev/rule.d/70-persistent-net.ruleを削除(70-persistent-net.ruleは再起動後、再び生成されます)
- [root@gpu2]# shutdown -r now を実行