コンテンツに飛ぶ | ナビゲーションに飛ぶ

パーソナルツール
セクション
現在位置: ホーム GPU計算機の作り方【設定篇】

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(パスワードの設定)
Lustreを利用する際gidとuidがきっちり決まっていることが重要となるので、
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
freeglutはインストールしてもインストーラがsoファイルを見つけられないようなので、
[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 を実行
ちなみにifcfg-eth0のUUIDは空欄でも問題なく起動しました。UUIDの書き換えが本当に必要かどうかは把握していません。