GPU 클러스터 모니터링

GPU 클러스터 모니터링

Ubuntu 14.04 x64에서 실행되는 서버가 10개 있습니다. 각 서버에는 일부 Nvidia GPU가 있습니다. 모든 서버의 GPU 사용량을 한눈에 볼 수 있는 모니터링 프로그램을 찾고 있습니다.

답변1

당신은 그것을 사용할 수 있습니다신경절모니터링 소프트웨어(무료, 오픈 소스) 수량 있어요사용자 기여 Gmond Python DSO 측정항목 모듈, GPU Nvidia 모듈 포함(/ganglia/gmond_python_modules/gpu/nvidia/).

해당 아키텍처는 일반적인 클러스터 모니터링 소프트웨어입니다.

여기에 이미지 설명을 입력하세요.

(이미지 출처)

명확한 문서가 부족한 GPU Nvidia 모듈을 제외하면 설치는 간단합니다(약 30분, 서두르지 않음). (나는 아직도갇힌)


Ganglia를 설치하려면 다음을 수행할 수 있습니다. 서버에서:

sudo apt-get install -y ganglia-monitor rrdtool gmetad ganglia-webfrontend

YesApache에 관해 질문할 때마다 선택하세요.

여기에 이미지 설명을 입력하세요.

첫 번째, Ganglia 서버를 구성합니다. 즉 gmetad:

sudo cp /etc/ganglia-webfrontend/apache.conf /etc/apache2/sites-enabled/ganglia.conf

sudo nano /etc/ganglia/gmetad.conf

에서 gmetad.conf다음과 같이 변경합니다.

바꾸다:

data_source "my cluster" localhost

Pass ( 192.168.10.22서버의 IP로 추정)

data_source "my cluster" 50 192.168.10.22:8649

이는 Ganglia가 포트 8649(Ganglia의 기본 포트)를 수신해야 함을 의미합니다. 모니터링하려는 컴퓨터에서 실행될 Ganglia 클라이언트가 IP 및 포트에 액세스할 수 있는지 확인해야 합니다.

이제 Ganglia 서버를 시작할 수 있습니다:

sudo /etc/init.d/gmetad restart
sudo /etc/init.d/apache2 restart

웹 인터페이스에 액세스할 수 있습니다.http://192.168.10.22/ganglia/( 192.168.10.22서버의 IP는 어디에 있습니까?)

두번째gmond, 동일한 시스템 또는 다른 시스템(즉)에서 Ganglia 클라이언트를 구성합니다.

sudo apt-get install -y ganglia-monitor

sudo nano /etc/ganglia/gmond.conf

에서 gmond.confGanglia 클라이언트(즉)가 gmond서버를 가리키도록 다음과 같이 변경합니다.

바꾸다:

cluster {
name = "unspecified"
owner = "unspecified"
latlong = "unspecified"
url = "unspecified"
}

도착하다

cluster {
name = "my cluster"
owner = "unspecified"
latlong = "unspecified"
url = "unspecified"
}

바꾸다

udp_send_channel {
mcast_join = 239.2.11.71
port = 8649
ttl = 1
}

통과

udp_send_channel {
# mcast_join = 239.2.11.71
host = 192.168.10.22
port = 8649
ttl = 1
}

바꾸다:

udp_recv_channel {
mcast_join = 239.2.11.71
port = 8649
bind = 239.2.11.71
}

도착하다

udp_recv_channel {
# mcast_join = 239.2.11.71
port = 8649
# bind = 239.2.11.71
}

이제 Ganglia 클라이언트를 시작할 수 있습니다:

sudo /etc/init.d/ganglia-monitor restart

이는 30초 이내에 서버의 Ganglia 웹 인터페이스에 나타나야 합니다(예:http://192.168.10.22/ganglia/).

gmond.conf 파일은 모든 클라이언트에 대해 동일하므로 몇 초 만에 신경절 모니터링을 새 컴퓨터에 추가할 수 있습니다 .

sudo apt-get install -y ganglia-monitor
wget http://somewebsite/gmond.conf # this gmond.conf is configured so that it points to the right ganglia server, as described above
sudo cp -f gmond.conf /etc/ganglia/gmond.conf
sudo /etc/init.d/ganglia-monitor restart

나는 다음 가이드를 사용했습니다.


gmond모니터링하려는 모든 서버에서 시작하거나 다시 시작하는 Bash 스크립트:

deploy.sh:

#!/usr/bin/env bash

# Some useful resources:
# while read ip user pass; do : http://unix.stackexchange.com/questions/92664/how-to-deploy-programs-on-multiple-machines
# -o StrictHostKeyChecking=no: http://askubuntu.com/questions/180860/regarding-host-key-verification-failed
# -T: http://stackoverflow.com/questions/21659637/how-to-fix-sudo-no-tty-present-and-no-askpass-program-specified-error
# echo $pass |: http://stackoverflow.com/questions/11955298/use-sudo-with-password-as-parameter
# http://stackoverflow.com/questions/36805184/why-is-this-while-loop-not-looping


while read ip user pass <&3; do 
  echo $ip
  sshpass -p "$pass" ssh $user@$ip  -o StrictHostKeyChecking=no -T "
  echo $pass | sudo -S sudo /etc/init.d/ganglia-monitor restart
  "
  echo 'done'
done 3<servers.txt

servers.txt:

53.12.45.74 my_username my_password
54.12.45.74 my_username my_password
57.12.45.74 my_username my_password
‌‌ 

웹 인터페이스 홈 페이지의 스크린샷:

여기에 이미지 설명을 입력하세요.

여기에 이미지 설명을 입력하세요.

https://www.safaribooksonline.com/library/view/monitoring-with-ganglia/9781449330637/ch04.htmlGanglia 웹 인터페이스에 대한 좋은 개요를 제공합니다:

여기에 이미지 설명을 입력하세요.

답변2

무닌적어도 하나끼워 넣다nvidia GPU 모니터링용( nvidia-smi데이터를 수집하려면 이 유틸리티를 사용하십시오).

muninGPU 서버 중 하나 또는 클러스터의 헤드 노드에 서버를 설정한 다음 munin-node각각에 클라이언트 및 NVIDIA 플러그인(및 관심 있는 기타 플러그인)을 설치할 수 있습니다. GPU 서버.

이를 통해 각 서버의 munin 데이터를 자세히 보거나 모든 서버의 nvidia 데이터 개요를 볼 수 있습니다. 여기에는 시간 경과에 따른 GPU 온도 그래프가 포함됩니다.

그렇지 않으면 ssh를 사용하는 스크립트를 작성할 수 있습니다(또는PDSH) 각 서버에서 유틸리티를 실행하고 nvidia-smi, 필요한 데이터를 추출하고, 원하는 형식으로 렌더링합니다.

답변3

카스처럼설명하다, 나만의 도구를 작성할 수 있으므로 다음과 같습니다(전혀 다듬어지지 않았지만 작동합니다.).

클라이언트(예: GPU 노드)

gpu_monitoring.sh(웹페이지를 모니터링하는 서버 IP는 이라고 가정 128.52.200.39)

while true; 
do 
    nvidia-smi --query-gpu=utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv >> gpu_utilization.log; 
    python gpu_monitoring.py
    sshpass -p 'my_password' scp -o StrictHostKeyChecking=no ./gpu_utilization_100.png [email protected]:/var/www/html/gpu_utilization_100_server1.png
    sshpass -p 'my_password' scp -o StrictHostKeyChecking=no ./gpu_utilization_10000.png [email protected]:/var/www/html/gpu_utilization_10000_server1.png
    sleep 10; 
done

gpu_monitoring.py:

'''
Monitor GPU use
'''

from __future__ import print_function
from __future__ import division

import numpy as np

import matplotlib
import os
matplotlib.use('Agg') # http://stackoverflow.com/questions/2801882/generating-a-png-with-matplotlib-when-display-is-undefined
import matplotlib.pyplot as plt
import time
import datetime




def get_current_milliseconds():
    '''
    http://stackoverflow.com/questions/5998245/get-current-time-in-milliseconds-in-python
    '''
    return(int(round(time.time() * 1000)))


def get_current_time_in_seconds():
    '''
    http://stackoverflow.com/questions/415511/how-to-get-current-time-in-python
    '''
    return(time.strftime("%Y-%m-%d_%H-%M-%S", time.gmtime()))

def get_current_time_in_miliseconds():
    '''
    http://stackoverflow.com/questions/5998245/get-current-time-in-milliseconds-in-python
    '''
    return(get_current_time_in_seconds() + '-' + str(datetime.datetime.now().microsecond))




def generate_plot(gpu_log_filepath, max_history_size, graph_filepath):
    '''

    '''
    # Get data
    history_size = 0
    number_of_gpus = -1
    gpu_utilization = []
    gpu_utilization_one_timestep = []
    for line_number, line in enumerate(reversed(open(gpu_log_filepath).readlines())): # http://stackoverflow.com/questions/2301789/read-a-file-in-reverse-order-using-python
        if history_size > max_history_size: break
        line = line.split(',')

        if line[0].startswith('util') or len(gpu_utilization_one_timestep) == number_of_gpus:
            if number_of_gpus == -1 and len(gpu_utilization_one_timestep) > 0:
                 number_of_gpus = len(gpu_utilization_one_timestep)
            if len(gpu_utilization_one_timestep) == number_of_gpus:
                gpu_utilization.append(list(reversed(gpu_utilization_one_timestep))) # reversed because since we read the log file from button to up, GPU order is reversed.
                #print('gpu_utilization_one_timestep: {0}'.format(gpu_utilization_one_timestep))
                history_size += 1

            else: #len(gpu_utilization_one_timestep) <> number_of_gpus:
                pass
                #print('gpu_utilization_one_timestep: {0}'.format(gpu_utilization_one_timestep))

            gpu_utilization_one_timestep = []

        if line[0].startswith('util'): continue

        try:
            current_gpu_utilization = int(line[0].strip().replace(' %', ''))
        except:
            print('line: {0}'.format(line))
            print('line_number: {0}'.format(line_number))
            1/0
        gpu_utilization_one_timestep.append(current_gpu_utilization)

    # Plot graph
    #print('gpu_utilization: {0}'.format(gpu_utilization))
    gpu_utilization = np.array(list(reversed(gpu_utilization))) # We read the log backward, i.e., ante-chronological. We reverse again to get the chronological order.

    #print('gpu_utilization.shape: {0}'.format(gpu_utilization.shape))
    fig = plt.figure(1)
    ax = fig.add_subplot(111)
    ax.plot(range(gpu_utilization.shape[0]), gpu_utilization)
    ax.set_title('GPU utilization over time ({0})'.format(get_current_time_in_miliseconds()))
    ax.set_xlabel('Time')
    ax.set_ylabel('GPU utilization (%)')
    gpu_utilization_mean_per_gpu = np.mean(gpu_utilization, axis=0)
    lgd = ax.legend( [ 'GPU {0} (avg {1})'.format(gpu_number, np.round(gpu_utilization_mean, 1)) for gpu_number, gpu_utilization_mean in zip(range(gpu_utilization.shape[1]), gpu_utilization_mean_per_gpu)]
                     , loc='center right', bbox_to_anchor=(1.45, 0.5))
    plt.savefig(graph_filepath, dpi=300, format='png', bbox_inches='tight')
    plt.close()



def main():
    '''
    This is the main function
    '''
    # Parameters
    gpu_log_filepath = 'gpu_utilization.log' 
    max_history_size = 100

    max_history_sizes =[100, 10000] 
    for max_history_size in max_history_sizes:
        graph_filepath = 'gpu_utillization_{0}.png'.format(max_history_size)
        generate_plot(gpu_log_filepath, max_history_size, graph_filepath)


if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling

서버 측(예: 웹 서버)

gpu.html:

<!DOCTYPE html>
<html>
<body>


<h2>gpu_utilization_server1.png</h2>
<img src="gpu_utilization_100_server1.png" alt="Mountain View" style="height:508px;"><img src="gpu_utilization_10000_server1.png" alt="Mountain View" style="height:508px;">


</body>
</html>

답변4

아니면 간단히 사용하세요

https://github.com/PatWie/cluster-smi

이는 터미널과 정확히 동일하게 작동 nvidia-smi하지만 컬렉션 클러스터 내에서 실행됩니다 cluster-smi-node.

+---------+------------------------+---------------------+----------+----------+
| Node    | Gpu                    | Memory-Usage        | Mem-Util | GPU-Util |
+---------+------------------------+---------------------+----------+----------+
| node-00 | 0: TITAN Xp            |  3857MiB / 12189MiB | 31%      | 0%       |
|         | 1: TITAN Xp            | 11689MiB / 12189MiB | 95%      | 0%       |
|         | 2: TITAN Xp            | 10787MiB / 12189MiB | 88%      | 0%       |
|         | 3: TITAN Xp            | 10965MiB / 12189MiB | 89%      | 100%     |
+---------+------------------------+---------------------+----------+----------+
| node-01 | 0: TITAN Xp            | 11667MiB / 12189MiB | 95%      | 100%     |
|         | 1: TITAN Xp            | 11667MiB / 12189MiB | 95%      | 96%      |
|         | 2: TITAN Xp            |  8497MiB / 12189MiB | 69%      | 100%     |
|         | 3: TITAN Xp            |  8499MiB / 12189MiB | 69%      | 98%      |
+---------+------------------------+---------------------+----------+----------+
| node-02 | 0: GeForce GTX 1080 Ti |  1447MiB / 11172MiB | 12%      | 8%       |
|         | 1: GeForce GTX 1080 Ti |  1453MiB / 11172MiB | 13%      | 99%      |
|         | 2: GeForce GTX 1080 Ti |  1673MiB / 11172MiB | 14%      | 0%       |
|         | 3: GeForce GTX 1080 Ti |  6812MiB / 11172MiB | 60%      | 36%      |
+---------+------------------------+---------------------+----------+----------+

3개 노드를 사용하는 경우.

효율성을 위해 NVML을 사용하여 이러한 값을 직접 읽습니다. 나는 추천한다아니요nvidia-smi다른 답변에서 제안한 대로 출력이 구문 분석되었습니다. 또한 cluster-smiPython+ZMQ를 사용하여 이 정보를 추적할 수 있습니다.

관련 정보