kuroの覚え書き

96の個人的覚え書き

CentOS7に仮想環境を構築

だいぶ仕事がまとまってきて、新しく学生なども入ってくるようになった。こうなるとそのうちインフォマティクスをやりたいという学生もきっと入ってくるだろう。最初のうちはとりあえず自分のPCでどうにかしてもらえばいいが、そのうちきっとサーバを触ることになるに違いない。
自分の経験からして、最初の頃はメモリオーバーフローだとかでしょっちゅうハングアップさせてたから、やはり最初は実機ではなく仮想環境だけでやってもらうのが得策だろう。
ということで、休日を利用して仮想環境構築を試してみるのであった。

まずは昨日RAIDをキャンセルしてCentOS7をインストールしたRX200S6 (E5630*2/4G/100G)を用意する。ネットワーク上はメインサーバの内側のサブLANに位置しているが、クラスタには組み込んでおらず、NISによるユーザー共有もあえて行っていない。とりあえずはできるだけシンプルな構成で試してみたいからね。

# yum install -y qemu-kvm libvirt virt-install libvirt-python libvirt-client

んでサクッと起動

# systemctl start libvirtd
# systemctl enable libvirtd

NASにおいてあったCentOS-7-x86_64-DVD-1908.isoを/tmp/にコピーしておいて

# virt-install --name kvm1 --memory 1024 --disk size=20 --vcpu 4 --location /tmp/CentOS-7-x86_64-DVD-1908.iso --network default --graphics none --extra-args='console=tty0 console=ttyS0'

実機のメモリ・HDDスペックにあまり余裕が無いのでミニマムなサイズで試す。

インストールの開始中...
ファイル .treeinfo を読み出し中...                      |  354 B  00:00     
ファイル vmlinuz を読み出し中...                        | 6.4 MB  00:00     
ファイル initrd.img を読み出し中...                     |  53 MB  00:00     
割り当て中 'kvm1.qcow2'                                |  20 GB  00:05     
ドメイン kvm1 に接続しました
エスケープ文字は ^] です
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.10.0-1062.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Wed Aug 7 18:08:02 UTC 2019
[    0.000000] Command line: console=tty0 console=ttyS0

・・・・・・・

Starting installer, one moment...
anaconda 21.48.22.156-1 for CentOS 7 started.
 * installation log files are stored in /tmp during the installation
 * shell is available on TTY2
 * when reporting a bug add logs from /tmp as separate text/plain attachments
02:32:38 Not asking for VNC because we don't have a network
================================================================================
================================================================================
Installation

 1) [x] Language settings                 2) [!] Time settings
        (English (United States))                (Timezone is not set.)
 3) [!] Installation source               4) [!] Software selection
        (Processing...)                          (Processing...)
 5) [!] Installation Destination          6) [x] Kdump
        (No disks selected)                      (Kdump is enabled)
 7) [ ] Network configuration             8) [!] Root password
        (Not connected)                          (Password is not set.)
 9) [!] User creation
        (No user will be created)
  Please make your choice from above ['q' to quit | 'b' to begin installation |
  'r' to refresh]:

sshでアクセスしてインストールしているのでGUIは開かずこんな感じでcuiインストーラが立ち上がる。
まあ設定内容はGUIのインストールをやったことがあればだいたい想像できるはず。
とりあえずネットワークだけ何も設定せずにインストールしてみる。

Performing post-installation setup tasks
.

Configuring installed system
.
Writing network configuration
.
Creating users
.
Configuring addons
.
Generating initramfs
.
Running post-installation scripts
.
        Use of this product is subject to the license agreement found at /usr/share/centos-release/EULA

        Installation complete.  Press return to quit

こんな感じでインストール完了。

returnを押すとずらずらと見慣れた起動シークエンスが流れ、

CentOS Linux 7 (Core)
Kernel 3.10.0-1062.el7.x86_64 on an x86_64

localhost login: 

と無事に起動した。

なお、インストール〜再起動するとKVM内でシステムが立ち上がるが、起動していない状態から起動するにはコンソールから

# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 4     kvm1                           実行中

# virsh start kvm1

とする
シャットダウンは普通に仮想環境内で
sudo shutdown -h now
すればいいが、
仮想環境外から

# virsh shutdown kvm1

で強制終了もできるようだ。

なお起動しても裏で起動しているだけでコンソールに入れないので

# virsh console kvm1

としてコンソールに入る。

仮想環境をGUIで作成したときは

# virt-viewer kvm1

でデスクトップを表示できる。

この状態ではネットワークにはつながっていないので、次はネットワークの設定だな。
まずはお手軽なIPマスカレードによるNAT方式を試す。
f:id:k-kuro:20200620122334p:plain

この場合一旦ホストにログインしないと仮想環境に外から直接アクセスできないのでちょっと不便。ただしその分セキュリティーも高くできるかな。
現在の場合ホストがサブLANに接続しているし、完全に外部からアクセスしようとすると外→VPN→学内LAN→Lab内LAN→クラスタ用サブLAN→KVMホスト→仮想環境という感じでめちゃめちゃ奥底にあることになる。最終的にはLab内LANから直接アクセスできるくらいにはしたい。

# virsh attach-interface kvm1 network default

以上。
これだけで仮想環境kvm1から外のネットワークまで出ることができる様になった。pingyum updateもOKなはず。

設定を変更すべくネットワークを遮断するなら

virsh detach-interface kvm1 --type network --mac XX:XX:XX:XX:XX:XX

MACアドレスはkvm1のなかでip aで調べる。仮想MACなのでattach-interfaceするたびにランダムに変更されるため注意。


次にブリッジ接続をためす。
これだと物理NICに仮想アドレスを接続するのでホストに一旦ログインしなくてもsshで入れるはず。
f:id:k-kuro:20200620122434p:plain
とおもって早速ちょっと設定をし始めたらすぐにホストごとハングして、にっちもさっちもいかなくなった。

# brctl addbr br0
# brctl addif br0 eno0

こうするとだめだった。

やっぱブリッジは難しい。少なくとも実機のそばでやらないと、遠隔地からネットワーク越しにやってると、ネットワークの設定をミスった時点で何もできなくなる。というわけで休日の遠隔アクセス終了っと。


ちなみにコンソールから抜けるときはctrl+]

RX200S6のオンボードSATA software RAIDを使わないでCentOS7をインストール

諸般の事情でRX200S6のRAIDカードを他に回したところ、enbedded MegaRAIDがCentOS7ではドライバがなくて使えないということになり、まあ引退して部品取りでもいいかと思っていたのだけれど、せっかくあるハードウェアを眠らせておくのももったいないということで、活用の方法を考える。

結論としてはオンボードソフトウェアRAIDは殺してしまって普通のAHCISATAとして使うことが可能であった。
F2でbios設定に入り、AdvancedからAdvanced system configurationに進み、RAID enable をdisabledに、SATA AHCI enableをenabledに設定してやる。
HDDは前もってRAIDで使っていた状態から適当な機械でExFATなどに初期化しておく必要がある。

これだけ設定すれば普通にSATAディスクとして認識してインストールも普通にできるようになる。
NASとして使うならFreeNASなど入れてOSの機能でsoftware RAIDを使うと良さげである。

まあRX200S6をNASに使うのは無駄に電気代かかりそうではあるけど、CPUを1個に減らして4コア程度に適当にデチューンしてやれば良いような気もする。ただ、そのままでは2.5インチディスクなので最大容量、容量あたりコストはイマイチではあるので、3.5インチHDDをどうにか外付けするとかの工夫はしたほうがいいかもしれない。しかしそうすると今度は冷却に難が出てくるわけで、なかなか一筋縄には行かないのだな。RX200はMBが巨大なので3.5インチバージョンはそもそも無いしな。


追記
CentOS7のインストール時にターゲットディスクとして複数HDDを指定して、パーティション自動設定を行うと、複数のHDDをsoftware RAID0で束ねてくれるようだ。ストライピングしたくないなら、逆に自分で設定を行う必要がある。もしくはあとからdiskを追加するとか。

Express5800/R110e-1EにCentOS7をインストールしてファイルサーバにする

ここまで基本FujitsuPrimergyシリーズでサーバを構築してきたのだが、ファイルサーバを別個に立てる必要性が出てきた。
ファイルサーバなのでそんなに強力なCPUもいらないけど、3.5インチHDDが4台くらいは内蔵できてほしい&ラック型1Uで場所を取らない&お金はできるだけかけない、という条件にマッチするものはFujitsuにはなかった。
なのでNECに手を出してしまった。
いつものごとくオークションを徘徊しているとExpress5800/110e-1EのCPU/HDD/memoryを抜き取ったドンガラが100円(送料2000円)で出ていて入札したらそのまま100円で落札できてしまった。
Express5800/110e-1EというとFujitsuでいうとRX100S8くらいの世代だと思う。ivy bridgeくらいのCPUか。
本来のラインナップはPentium G640、XEON E3-1220v2 だな。やはりsandy bridge~ivy bridgeだな。

これに余っていたメモリ4Gを乗っけ、CPUもPentiumG2020を650円で落として装着。
まあ大体3000円位でファイルサーバが出来上がった。これに12TくらいHDDを乗っけてやれば十分だろ。

で、早速CentOS7をインストールしてやろうと思ったのだが、色々Fujitsuとは勝手が違う。
MegaRAIDのソフトウェアRAIDを使うにはMBのジャンパーを差し替えてやらないとbiosに設定が出てこない。
これは本体の蓋の裏に説明があるのでそのとおりにする。

そうするとディスクを認識しておなじみのCtrl-MでRAIDの設定画面に入れるわけだ。
ところがだ、やはりというかCentOS7のインストーラからはドライバがなくてインストールできないときた。

NECのオフィシャルなガイドによるとそもそもCentOSは6.6までしか対応しているという説明はない。まあこれはFujitsuのRX200S7でもそうだったが。
で、CentOS6にしても、
本OSではオンボードディスクアレイ機能 (LSI Embedded MegaRAID) は使用できません。
というツレない表示が!
Oh NO~

Fujitsuで配布されているドライバが使えたりしないだろうか?
ただ、Fujitsuのドライバ使用条件には抵触するだろうね。
intelのサイトで
Support Home >Drivers & Software>Support Home Drivers & Software>RAID Productsでcentosでfilterすると出てくる
MegaRAID Linux* Drivers
Version: 7.705.04.00 (Latest)
というものも使えるかもしれない。しらんけどw。(この件については自己責任でどーぞ)

ま、無事インストールでき、ファイルサーバ完成。
ちなみに送料は別としてHDD以外の材料費としてはHDDマウンタ2個追加1000円>CPU650円>本体100円とマウンタが一番高かったというw

更に入手したマウンタが世代違いで使えなかったというオチまで・・・

Anacondaの再インストールで躓く

pyenvで仮想化

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

anacondaをインストール

$ pyenv install anaconda3-5.3.1
$ pyenv rehash

$ pyenv global anaconda3-5.3.1
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.3.1/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ conda update conda

深層学習の環境を構築

$ conda install cudatoolkit
$ conda install cudnn

$ conda install python=3.6
$ conda install tensorflow-gpu

という段取りなんだが、condaをアップデートするとconda4.7.10にあげようとする。
ところがこのバージョンはcudatoolkitのインストールが失敗するので

$ conda install conda4.6.14
Solving environment: done

## Package Plan ##

  environment location: /home/kkuro2/.pyenv/versions/anaconda3-5.3.1

  added / updated specs: 
    - conda=4.6.14


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    pyopenssl-19.0.0           |           py37_0          82 KB
    _libgcc_mutex-0.1          |             main           3 KB
    ncurses-6.1                |       he6710b0_1         958 KB
    idna-2.8                   |           py37_0         101 KB
    chardet-3.0.4              |        py37_1003         173 KB
    cffi-1.12.3                |   py37h2e261b9_0         222 KB
    conda-4.6.14               |           py37_0         2.1 MB
    pysocks-1.7.0              |           py37_0          29 KB
    urllib3-1.24.2             |           py37_0         153 KB
    libgcc-ng-9.1.0            |       hdf63c60_0         8.1 MB
    pycparser-2.19             |           py37_0         172 KB
    openssl-1.1.1c             |       h7b6447c_1         3.8 MB
    cryptography-2.7           |   py37h1ba5d50_0         608 KB
    ca-certificates-2019.5.15  |                0         133 KB
    six-1.12.0                 |           py37_0          22 KB
    setuptools-41.0.1          |           py37_0         648 KB
    pip-19.1.1                 |           py37_0         1.8 MB
    zlib-1.2.11                |       h7b6447c_3         120 KB
    requests-2.22.0            |           py37_0          89 KB
    certifi-2019.6.16          |           py37_1         156 KB
    libedit-3.1.20181209       |       hc058e9b_0         188 KB
    wheel-0.33.4               |           py37_0          39 KB
    python-3.7.3               |       h0371630_0        36.7 MB
    sqlite-3.29.0              |       h7b6447c_0         1.9 MB
    ------------------------------------------------------------
                                           Total:        58.2 MB

The following NEW packages will be INSTALLED:

    _libgcc_mutex:   0.1-main               

The following packages will be UPDATED:

    ca-certificates: 2018.03.07-0            --> 2019.5.15-0            
    certifi:         2018.8.24-py37_1        --> 2019.6.16-py37_1       
    cffi:            1.11.5-py37he75722e_1   --> 1.12.3-py37h2e261b9_0  
    chardet:         3.0.4-py37_1            --> 3.0.4-py37_1003        
    conda:           4.5.11-py37_0           --> 4.6.14-py37_0          
    cryptography:    2.3.1-py37hc365091_0    --> 2.7-py37h1ba5d50_0     
    idna:            2.7-py37_0              --> 2.8-py37_0             
    libedit:         3.1.20170329-h6b74fdf_2 --> 3.1.20181209-hc058e9b_0
    libgcc-ng:       8.2.0-hdf63c60_1        --> 9.1.0-hdf63c60_0       
    ncurses:         6.1-hf484d3e_0          --> 6.1-he6710b0_1         
    openssl:         1.0.2p-h14c3975_0       --> 1.1.1c-h7b6447c_1      
    pip:             10.0.1-py37_0           --> 19.1.1-py37_0          
    pycparser:       2.18-py37_1             --> 2.19-py37_0            
    pyopenssl:       18.0.0-py37_0           --> 19.0.0-py37_0          
    pysocks:         1.6.8-py37_0            --> 1.7.0-py37_0           
    python:          3.7.0-hc3d631a_0        --> 3.7.3-h0371630_0       
    requests:        2.19.1-py37_0           --> 2.22.0-py37_0          
    setuptools:      40.2.0-py37_0           --> 41.0.1-py37_0          
    six:             1.11.0-py37_1           --> 1.12.0-py37_0          
    sqlite:          3.24.0-h84994c4_0       --> 3.29.0-h7b6447c_0      
    urllib3:         1.23-py37_0             --> 1.24.2-py37_0          
    wheel:           0.31.1-py37_0           --> 0.33.4-py37_0          
    zlib:            1.2.11-ha838bed_2       --> 1.2.11-h7b6447c_3      

Proceed ([y]/n)? y


Downloading and Extracting Packages
pyopenssl-19.0.0     | 82 KB     | ###################################### | 100% 
_libgcc_mutex-0.1    | 3 KB      | ###################################### | 100% 
ncurses-6.1          | 958 KB    | ###################################### | 100% 
idna-2.8             | 101 KB    | ###################################### | 100% 
chardet-3.0.4        | 173 KB    | ###################################### | 100% 
cffi-1.12.3          | 222 KB    | ###################################### | 100% 
conda-4.6.14         | 2.1 MB    | ###################################### | 100% 
pysocks-1.7.0        | 29 KB     | ###################################### | 100% 
urllib3-1.24.2       | 153 KB    | ###################################### | 100% 
libgcc-ng-9.1.0      | 8.1 MB    | ###################################### | 100% 
pycparser-2.19       | 172 KB    | ###################################### | 100% 
openssl-1.1.1c       | 3.8 MB    | ###################################### | 100% 
cryptography-2.7     | 608 KB    | ###################################### | 100% 
ca-certificates-2019 | 133 KB    | ###################################### | 100% 
six-1.12.0           | 22 KB     | ###################################### | 100% 
setuptools-41.0.1    | 648 KB    | ###################################### | 100% 
pip-19.1.1           | 1.8 MB    | ###################################### | 100% 
zlib-1.2.11          | 120 KB    | ###################################### | 100% 
requests-2.22.0      | 89 KB     | ###################################### | 100% 
certifi-2019.6.16    | 156 KB    | ###################################### | 100% 
libedit-3.1.20181209 | 188 KB    | ###################################### | 100% 
wheel-0.33.4         | 39 KB     | ###################################### | 100% 
python-3.7.3         | 36.7 MB   | ###################################### | 100% 
sqlite-3.29.0        | 1.9 MB    | ###################################### | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

とうまく動いていた頃のバージョンにアップしてやる。
で、cudatoolkitをインストールするとcondaの最新版が4.7.10だからアップデートを自動でしやがって結果インストールに失敗する。

どうせいっちゅうの。

anacondaおよびcondaのバージョンアップで改善するのを待つか・・・


今できる別の方法を考えてみよう。
まず

$ pyenv install anaconda3-4.3.1
$ pyenv global anaconda3-4.3.1 

python 3.6のanacondaを入れる。
次にcudnnをNVIDIAのサイトからダウンロードしてきて

$ tar zxf cudnn-10.1-linux-x64-v7.6.2.24.tgz
$ sudo cp -a cuda/include/* /usr/local/cuda/include/
$ sudo cp -a cuda/lib64/* /usr/local/cuda/lib64/
$ sudo ldconfig

とcudnnの必要なファイルを手動でインストール
必要かはちょっとわからないが

$ sudo ln -s /usr/local/cuda/include/crt/math_functions.hpp /usr/local/cuda/include/math_functions.hpp
$ sudo ln -s /usr/lib64/libcublas.so.10.1.0.105 /usr/local/cuda-10.1/lib64/libcublas.so.10.1.0.105
$ sudo ln -s /usr/local/cuda-10.1/lib64/libcublas.so.10.1.0.105 /usr/local/cuda-10.1/lib64/libcublas.so.10.1
$ sudo ln -s /usr/local/cuda-10.1/lib64/libcublas.so.10.1 /usr/local/cuda-10.1/lib64/libcublas.so
$ sudo ln -s /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcusolver.so.10.1.105 /usr/local/cuda-10.1/lib64/libcusolver.so.10.1
$ sudo ln -s /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcurand.so.10.1.105 /usr/local/cuda-10.1/lib64/libcurand.so.10.1
$ sudo ln -s /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcufft.so.10.1.105 /usr/local/cuda-10.1/lib64/libcufft.so.10.1

とリンクを張っておいて

$ conda install tensorflow-gpu

とtensorflowをインストールする。
この状態で

$ python
Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
2019-08-04 15:00:29.442682: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2019-08-04 15:00:29.442754: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2019-08-04 15:00:29.612838: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-08-04 15:00:29.613333: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties: 
name: GeForce GT 710
major: 3 minor: 5 memoryClockRate (GHz) 0.954
pciBusID 0000:04:00.0
Total memory: 980.94MiB
Free memory: 958.69MiB
2019-08-04 15:00:29.613394: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 
2019-08-04 15:00:29.613416: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0:   Y 
2019-08-04 15:00:29.613452: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GT 710, pci bus id: 0000:04:00.0)
[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 10112316233564255216
, name: "/gpu:0"
device_type: "GPU"
memory_limit: 769327104
locality {
  bus_id: 1
}
incarnation: 15150163897772535855
physical_device_desc: "device: 0, name: GeForce GT 710, pci bus id: 0000:04:00.0"
]
>>> 

とテストすると、ここまでは問題なくインストールできたことがわかる。
問題はこのあとのkerasでcondaでインストールするとまたcondaのバージョンアップで固まり、サンプルプログラムでは

$ python mnist_cnn.py 
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
11493376/11490434 [==============================] - 4s 0us/step
x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Traceback (most recent call last):
  File "mnist_cnn.py", line 57, in <module>
    model.add(Dense(num_classes, activation='softmax'))
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/engine/sequential.py", line 181, in add
    output_tensor = layer(self.outputs[0])
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/engine/base_layer.py", line 457, in __call__
    output = self.call(inputs, **kwargs)
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/layers/core.py", line 883, in call
    output = self.activation(output)
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/activations.py", line 31, in softmax
    return K.softmax(x)
  File "/home/kuro/.pyenv/versions/anaconda3-4.3.1/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py", line 3231, in softmax
    return tf.nn.softmax(x, axis=axis)
TypeError: softmax() got an unexpected keyword argument 'axis'

こんなエラーが出て止まってしまう。
これはなんだ?
なおpipでインストールしても同じエラーが出るので、pythonモジュールに足りないものがあるのかもしれない。

結局

$ conda install keras=2.0.8

と最新版の2.2.4よりちょっと古いバージョンをインストールしてみたところ、とりあえずエラー出さずに完走できることがわかった。
しばらくはこれで様子を見るか。

なお、anaconda環境でpipを使うと最悪環境が壊れてしまうこともあるらしく、あまりおすすめできないとのこと。
なのでcondaでどうにかする方策を基本としたが、condaがバージョンアップしておかしくなっている間は困るのね。

またまたサーバの構成をいじる

サーバ   CPU               メモリ            理論性能
RX1330M3 E3-1230v6(4C/8T, 3.50GHz)   2400 UDIMM 64GB  224.0GFLOPS
RX300S7  E5-2667(6C/12T, 2.90GHz)x2  1600 LV-RDIMM 32GB 278.4GFLOPS
RX300S7  E5-2643(4C/8T, 3.30GHz)x2  1600 LV-UDIMM 24GB    211.2GFLOPS
RX200S7  E5-2630(6C/12T, 2.30GHz)x2  1333 RDIMM 40GB  220.8GFLOPS
RX300S7  E5-2620(6C/12T, 2.00GHz)x2  1600 LV-RDIMM 24GB   192.0GFLOPS    

RX200S6  E5630(4C/8T, 2.50GHz)x2   1333 RDIMM 12GB     80.0GFLOPS         #GPU test機
RX200S6  E5630(4C/8T, 2.50GHz)x2   1333 UDIMM 4GB     80.0GFLOPS   #バックアップ機

ちょいとCPUとメモリを追加して、構成をいじってみた。

ヒートシンクを調達すればE5-2630L→E5-2620 x2 192.0GFLOPSにアップできるので、これもそのうち。
ただし、いまあんまり重いデータ解析をやってないので、ほぼ趣味の範疇に入るかも。
それよりはGPUのバージョンアップのほうが優先かも。
(それよりは深層学習をちゃんと理解できるレベルまで勉強するほうが先決)
(ていうか論文書けよ)


追記
ヒートシンクを調達し、RX300S7をE5-2620 x 2CPUにした。クラスタはこれで十分かな。RX200S6は基本テスト用途かな。
バックアップ機はファンの音が結構うるさいので連続通電運転は辛い。
現状余っている機材はE5-2630L、E5603

ディープラーニングちょっとずつ

なかなか先に進まないが、とりあえずちょとでもいじってみるか。
f:id:k-kuro:20190615223410p:plain
jupyter notebookの使い方を確かめながらmnistのデータを使った練習をやってみる。

いろいろわからないまま言われるままに入力し、その出力をまずは眺めてみる。

VNCとpyenv

deep learning machineの構成をあれこれいじっているうちに動作がおかしくなってきたので、一旦リセットしてOSインストールからやり直すことにした。

ここまでの手順では

CentOS7をデフォルトの最小構成でインストール
ネットワーク設定
一般ユーザー追加
gnome desktopインストール
vncサーバインストール
NVIDIAドライバインストール
CUDAインストール
pyenvインストール
anacondaインストール
python3.6にダウングレード
tensorflow-gpuインストール
kerasインストール

という感じであったのだが、今回最小構成ではなく最初からgnome desktop、開発環境付きでインストールしたところ、これがマズったらしく、かなりツボにはまり未だ脱出できていない。

問題はvncサーバのインストールを忘れていて最後にこれを入れようとして起こった。

どうやらpyenvとvncサーバの組み合わせには難があるらしく、pyenvの環境変数を.bashrcに加えるとvncサーバを起動しても画面が表示できないらしい。

現状解決策としては.bashrcに入るはずの

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="$PYENV_ROOT/versions/anaconda3-5.3.1/bin/:$PATH"

コメントアウトし、systemctlでvncserverを起動してからログイン後にこれら環境変数をexportする、というものだが、メンドウクサス。

どうにかならないものか。

もう一回最初から手順通りにインストールしたほうが早そうだが、そのためにはサーバに直接でむかなくてはならず、これもまた面倒。

ここで気がついた。以前の環境じゃpyenvとvncが共存していたと思っていたが、単にインストールしたあと一回もrebootしてなかっただけなんじゃね?
どうインストールしてもpyenvとは両立しないのかも。


苦肉の解決策
まず、systemdによる自動起動は諦める。
.bashrcには上記環境変数を記載。
.bash_profileには

 User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

vncserver :1 -geometry 1280x1024 -depth 24

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

のように.bashrcを読み込む前にvncserver起動を行うように順番を入れ替える。

ただ、この方法だとvncでアクセスする前にsshでログインをしておく必要があり、sshの方でログアウトしちゃうとvncも終了してしまうのでちょっとなあ。

Deep learning マシンを変更

手持ちのサーバの構成を考え、Deep learningの環境テストを行うノードをPRIMERGY RX200S6に移した。

手順は

  • クラスタから切り離す。
  • 一般ユーザを作成。
  • グラボを移し替え。
  • NVIDIAのドライバインストール。
  • CUDAのインストール。
  • pyenvインストール。
  • anacondaインストール。
  • pythonのバージョンを3.6に落とす。
  • tensorflow-gpuインストール。
  • kerasインストール。

以上。
以前やったとおりで特に問題なく構築完了。
CPUが1世代前になって、理論速度では96GFLOPSから80GFLOPSに落ちたが、mnist_cnn.pyのテストで1EPOCHあたりにかかった時間は76秒と全く同じ。CPUの速度はほぼ関係ないということだろう。ということでRX300S7の方をクラスタに組み込むことにする。


EPOCH=1のトータルタイムは
GPUあり85.33秒
GPUなし138.65秒
sandy bridgeの96GFLOPSマシンで108秒だったのが80GFLOPSになったのでGPUなしは確実に遅くなったが、GPUありだとほとんど一緒だな。

キーボードレイアウトの設定

サーバにはCentOS7をインストールして使っている。
基本的にサーバにはsshvncで接続して使っているわけだが、端末としてはMacOSXを使用しており、キーボードもmacの(それもかなりレガシーな)US配列のものを使っているため、いまいちキーマップが一致せず、意図した動作ができないということが多かったので、その辺の環境を一度整理してみることにした。あとあまり必要ではないのだけれど日本語の入力、表示も一応できるようにしたい。

初期状況:
CentOS7はlocaleを日本語としている。
super keyが割り当てられていない?
日本語入力ができない。
Macで作成した日本語ファイルが文字化けする。日本語をmacからCentOSにコピペすると化ける。

まず行ったこと:日本語入力環境を入れる。
アプリケーション→システムツール→設定
を開く
地域と言語を選択すると
f:id:k-kuro:20190421191828p:plain
こんな感じになっている。入力ソースに日本語、とあるから日本語が入力できるのかと思ったら、どうやらできない。
したのプラスボタンを押して
f:id:k-kuro:20190421192005p:plainf:id:k-kuro:20190421192028p:plain
日本語(かな漢字)を追加してやると入力、漢字変換もできるようになるというわけ。
f:id:k-kuro:20190421192148p:plain
変換のショートカットなどを変更するならここをいろいろいじる。

で、普通に半角英数入力とちゃっちゃと切り替えて使うには
f:id:k-kuro:20190421192315p:plain
この英語(US)も足しておく必要がある。(特にmacのUSキーボードで入力しているなら以下の理由によりマストだと思う)

さて、これで漢字変換できるようになったが、英数・かな漢字の切り替えのショートカットがこのままでは使えない(VNC環境で)
というのもMacのUSキーボードにはかな・漢字キーなどがないからね。
入力ソースのオプションというボタンを押すと
f:id:k-kuro:20190421192850p:plain
こんな風に書かれていて、変更を受け付けない状態になっているのだが、このsuperキーってのがMacにはないのね。
なので切り替えようがない。

いろいろ悩んだが、これはMacVNC viewerの側で解決できた。

VNC viewerのPreferenceで
f:id:k-kuro:20190421193244p:plain
このようにLeftCmdKeyをSuper_Lに、LeftOptKeyをAlt_Lに設定してやると良い。
ちなみにデフォルトではLeftCmdKeyがAlt_Lに設定されている。
まあこの辺はWindowsのキーボードのWinキーとAltキーの並び順に従っているのだろうけど、macのoptionキーにはAltと表示されているんだがな。でsuperキーを設定せずに放置しているのってどういうことよ、って思うね。

なおSSHVNCの端末はUSキーボードだからといってlocalectlでキーボードレイアウトをUSにしておく必要はないようだ。localectlでは直接サーバにつないだキーボードの設定を変えるコマンドで、SSHVNCで接続した場合はそれぞれの端末でキーボードレイアウトを読み取って送信しているのだね。


なお、日本語のコピペが文字化けるのは仕様のようで。

サーバのメモリ構成を整理

サーバ   CPU                メモリ              理論性能
RX1330M3 E3-1230v6(4C/8T, 3.50GHz)    2400 UDIMM 64GB       224.0GFLOPS
RX300S7  E5-2667(6C/12T, 2.90GHz)x2   1600 LV-RDIMM 32GB      278.4GFLOPS
RX300S7  E5-2643(4C/8T, 3.30GHz)x2   1600 LV-UDIMM 24GB      211.2GFLOPS
RX200S7  E5-2620(6C/12T, 2.00GHz)x2   1333 RDIMM 22GB       192.0GFLOPS
RX200S6  E5630(4C/8T, 2.50GHz)x2    1333 RDIMM 24GB       80.0GFLOPS
RX200S6  E5630(4C/8T, 2.50GHz)x2    1333 UDIMM 4GB       80.0GFLOPS   #バックアップ機
以上クラスタ

RX300S7  E5-2630L(6C/12T, 2.00GHz)   1600 LV-RDIMM 16GB     96.0GFLOPS  GeForce GT 710  #GPU test機

S6世代の使用頻度が下がってきていたので24GBのRDIMM(PC3-10600R)をRX200S7に移し、RX200S7に入れていた16GBのLV-RDIMMをGPU機に。
とりあえずの感じで付いていた4GB UDIMM(PC3-10600E)をRX200S6に入れて、バックアップ機とすることにした。
いっそこのS6はクラスタから外して、CPUも元々付いていたE5603 x1に戻しちゃってNASとして運用しようかな。無駄に電気食いすぎるか?
むしろこのRX200S6にGPUを乗っけてdeep learningに回すのがいいかも。そもそもRX300S7にCPUをもう一個乗っけてしまえば、S62台分をまかなえちゃうのな。クラスタは台数減らしたほうが管理はしやすいのでそのほうがいいかも。



備考
E56xx系統 Nehalem-EP, Westmere-EP のFLOPS/CLOCK は4
E5-26xx系統 Sandy BridgeのFLOPS/CLOCKは8
E3-1230v6系統 Kaby LakeのFLOPS/CLOCKは16