脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

gangliaでGPUの情報を監視しようとしてえらい苦労した話

gangliaでGPGPUサーバのデータを監視しようとしたのですが、はまりポイントが多数あって苦労しました

Gangliaのインストール

1. Master server
### install packages
sudo apt-get install ganglia-monitor rrdtool gmetad ganglia-webfrontend
ps -eaf | egrep "gmon|gmeta"
  ganglia  14057     1  0 06:05 ?        00:00:00 /usr/sbin/gmond --pid-file=/var/run/ganglia-monitor.pid
  nobody   14071     1  0 06:05 ?        00:00:00 /usr/sbin/gmetad --pid-file=/var/run/gmetad.pid
ss -lntp | egrep "86[0-9]{2}"
  LISTEN     0      5                         *:8649                     *:*
  LISTEN     0      10                        *:8651                     *:*
  LISTEN     0      10                        *:8652                     *:*
  
### setting configuration(gmetad)
sudo cp -ip /etc/ganglia-webfrontend/apache.conf /etc/apache2/sites-enabled/ganglia.conf
sudo cp -ip /etc/ganglia/gmetad.conf{,.org}
sudo vi /etc/ganglia/gmetad.conf
=================================================
 44 #data_source "my cluster" localhost
 45 data_source "好きなクラスター名" 60 localhost
=================================================
 
### setting configuration(gmond)
sudo cp -ip /etc/ganglia/gmond.conf{,.org}
sudo vi /etc/ganglia/gmond.conf
=================================================
 20 cluster {
 21   name = "設定したクラスター名"
 22   owner = "unspecified"
 23   latlong = "unspecified"
 24   url = "unspecified"
 25 }
・
・
 34 udp_send_channel {
 35   #mcast_join = 239.2.11.71 # => commentout
 36   host = localhost           # => add
 37   port = 8649
 38   ttl = 1
 39 }
.
.
 42 udp_recv_channel {
 43   #mcast_join = 239.2.11.71  # => commentout
 44   port = 8649
 45   #bind = 239.2.11.71        # => commentout
 46 }
=================================================
 
### gmond & gmetad & apache restart
sudo service ganglia-monitor restart
sudo service gmetad restart
sudo service apache2 restart
  • はまりポイント1:スクリプトで全部同時に起動しようとしたらうまく起動しなかった
    • 手動でやったりsleepをかませたらうまくいった
2. Client server
### install package
sudo apt-get install ganglia-monitor
ps -eaf | grep gmond
  ganglia   1952     1 99 04:26 ?        00:02:21 /usr/sbin/gmond --pid-file=/var/run/ganglia-monitor.p
  
### setting configuration(gmond)
sudo cp -ip /etc/ganglia/gmond.conf{,.org}
sudo vi /etc/ganglia/gmond.conf
===============================================================================
  .
  .
 10   deaf = yes  # => change to yes
  .
  .
 20 cluster {
 21   name = "設定したクラスター名"  # => Change name
 22   owner = "unspecified"
 23   latlong = "unspecified"
 24   url = "unspecified"
 25 }
  .
  .
 34 udp_send_channel {
 35   # mcast_join = 239.2.11.71 # commment out
 36   host = 192.168.33.11       # add(master serverIP)
 37   port = 8649
 38   ttl = 1
 39 }
 .
 .
 41 /* You can specify as many udp_recv_channels as you like as well. */
 42 #udp_recv_channel {          # comment out
 43 #  mcast_join = 239.2.11.71  # comment out
 44 #  port = 8649               # comment out
 45 #  bind = 239.2.11.71        # comment out
 46 #}                           # comment out
===============================================================================
  
### ganglia monitor restart
sudo /etc/init.d/ganglia-monitor restart

この時点でGangliaのViewが表示されて、基本的な情報の取得ができるようになる

GPUのMetricsの設定

1. Client server
### modify gmond.conf
sudo vi /etc/ganglia/gmond.conf
======================================================================
 59 modules {・
・
・
 91   module {                                          # add
 92     name = "python_module"                          # add
 93     path = "/usr/lib/ganglia/modpython.so"          # add
 94     params = "/usr/lib/ganglia/python_modules/"     # add
 95   }                                                 # add
 96 }
 97
 98 include ('/etc/ganglia/conf.d/*.conf')
 99 include ('/etc/ganglia/conf.d/*.pyconf')            # add
======================================================================
  
### make dir
sudo mkdir /etc/ganglia/conf.d
sudo mkdir /usr/lib/ganglia/python_modules
  
### prepare python module
cd /usr/local/src
git clone https://github.com/ganglia/gmond_python_modules.git
cd ${download directory}/gpu/nvidia
wget https://pypi.python.org/packages/72/31/378ca145e919ca415641a0f17f2669fa98c482a81f1f8fdfb72b1f9dbb37/nvidia-ml-py-7.352.0.tar.gz
tar xvfpz nvidia-ml-py-7.352.0.tar.gz
ls -l
  drwxr-xr-x 2 root     root      4096 May 10 16:26 conf.d
  -rw-r--r-- 1 root     root      5093 May 10 16:26 ganglia_web.patch
  drwxr-xr-x 2 root     root      4096 May 10 16:26 graph.d
  drwxr-xr-x 3 root     root      4096 May 10 16:26 nvidia-ml-py-3.295.00
  drwxrwxr-x 3 root     root      4096 May 10 16:27 nvidia-ml-py-7.352.0
  -rw-r--r-- 1 root     root     20524 Apr 23 23:13 nvidia-ml-py-7.352.0.tar.gz
  drwxr-xr-x 2 root     root      4096 May 10 16:26 python_modules
  -rw-r--r-- 1 root     root      1661 May 10 16:26 README
  
cd nvidia-ml-py-7.352.0
sudo python setup.py install


cd ../  
sudo cp -ip python_modules/nvidia.py /usr/lib/ganglia/python_modules/.
sudo cp -ip conf.d/nvidia.pyconf /etc/ganglia/conf.d/.

### restart
sudo service ganglia-monitor restart
  • はまりポイント2:python_moduleの設定でpathは相対でいいって書いてあるドキュメントがあったけど絶対パスじゃないと動かなかった
  • はまりポイント3:git cloneで取得できるgmond_python_modules内のnvidiaパッケージは古くて(nvida-ml-py3.295.00)、setup.pyを実行すると使えないパッケージがinstallされてしまう
    • 対応としてnvidia-ml-py-7.352.0を直接取得する
  • はまりポイント4:しかし逆にnvidia-ml-py-7.352.0の方のpython_moduleファイルは使用できず、confファイルは存在すらしないため、この二つはnvida-ml-py3.295.00の方のものを使用しなければいけない
  • はまりポイント5:一度nvida-ml-py3.295.00の方のsetupスクリプトを使用すると手動で関連ファイルを削除したりPythonのload_pathを戻さなければならない
2. master server
cd /usr/local/src
git clone https://github.com/ganglia/gmond_python_modules.git
cd ${download directory}
cd gpu/nvidia/graph.d
ls -l
  total 24
  -rw-r--r-- 1 root root  596 Mar 18 09:12 gpu_common.php
  -rw-r--r-- 1 root root 2139 Mar 18 09:12 gpu_graphics_clock_report.php
  -rw-r--r-- 1 root root 2143 Mar 18 09:12 gpu_mem_clock_report.php
  -rw-r--r-- 1 root root 1526 Mar 18 09:12 gpu_power_usage_report.php
  -rw-r--r-- 1 root root 1586 Mar 18 09:12 gpu_power_violation_report.php
  -rw-r--r-- 1 root root 2169 Mar 18 09:12 gpu_sm_clock_report.php
  
sudo cp -ip * /usr/share/ganglia-webfrontend/graph.d
  
sudo service apache2 restart
  • はまりポイント6:多くのドキュメントでganglia_web.patchを実行する手順があったが、これも古くて動かない
    • 最新のganglia-python-moduleライブラリはnvidia GPU monitoringをサポートしていないので、自分でViewシステムを作る必要がある

Make view system

1. master server
cd /var/lib/ganglia-web/conf/
vi view_gpu1.json
===========================================================
### 環境にあわせて作成
===========================================================
  • このviewファイルの作成の仕方のドキュメントがとても少ない

gangliaで任意のグラフを作成する - 脳汁portal

他はまったポイント

nvidia.pyがデータを取得できない
Failed to build descriptor : gpu0_ecc_db_error : Not Supported
Failed to build descriptor : gpu0_ecc_sb_error : Not Supported
Failed to build descriptor : gpu0_power_violation_report : global name 'nvmlDeviceGetViolationStatus' is not defined
Failed to build descriptor : gpu0_bar1_memory : global name 'nvmlDeviceGetBAR1MemoryInfo' is not defined
Failed to build descriptor : gpu0_bar1_max_memory : global name 'nvmlDeviceGetBAR1MemoryInfo' is not defined
Failed to build descriptor : gpu0_shutdown_temp : global name 'nvmlDeviceGetTemperatureThreshold' is not defined
Failed to build descriptor : gpu0_slowdown_temp : global name 'nvmlDeviceGetTemperatureThreshold' is not defined
Failed to build descriptor : gpu0_encoder_util : global name 'nvmlDeviceGetEncoderUtilization' is not defined
Failed to build descriptor : gpu0_decoder_util : global name 'nvmlDeviceGetDecoderUtilization' is not defined

これは最新版使うことで解決

tpl file
$ sudo patch -p0 < /usr/local/src/gmond_python_modules/gpu/nvidia/ganglia_web.patch
patching file host_view.php
Hunk #1 FAILED at 17.
Hunk #2 FAILED at 37.
Hunk #3 FAILED at 144.
Hunk #4 FAILED at 153.
Hunk #5 FAILED at 169.
5 out of 5 hunks FAILED -- saving rejects to file host_view.php.rej
patching file templates/default/host_view.tpl
Hunk #1 FAILED at 80.
Hunk #2 FAILED at 89.
2 out of 2 hunks FAILED -- saving rejects to file templates/default/host_view.tpl.rej

動かない
現在のversionのgangliaでは不要とのコメントもあったのでそもそもいらないTool?

view ファイルのhost指定
  1 {
  2   "view_name": "GPU1",
  3   "view_type": "standard",
  4   "items": [
  5     {
  6       "aggregate_graph": "true",
  7       "host_regex": [ { "regex":"192.168.33.11" } ],

7行目のように監視対象のHostをIPで指定していたのだが、いつからのversionかHost名で指定しないと動かなくなった
host名で指定したら問題なく動くように戻った