在家中的深度学习电脑上建立监控环境

这篇文章是NTT DoCoMo R&D Advent Calendar 2021第16天的文章。

概括成三行的话

    • PCのGPU使用率などのメトリクスを取得して可視化する方法を紹介

 

    • データの取得にはPrometheus、可視化にはGrafanaを利用

 

    NVIDIAだけではなくAMDのGPUにも対応

首先

我是NTT DoCoMo服务创新部的三浦。

本文将解释如何设置您家中配备GPU的PC的监控环境。由于深度学习的爆炸式流行,有关安装GPU驱动程序和各种框架的文章充斥在各个角落。然而,在完成设置之后,介绍如何进一步优化计算环境以及相关案例的文章似乎并不多见。通过了解程序是否按照预期使用GPU,可以帮助进行代码重构和调试。此外,通过了解程序在其生命周期中的各种指标,可以推动在程序内部考虑并行化以及通过同时执行来提高计算效率。

grafana01.png

建立环境需要一些麻烦,但只要建立好后,数据将自动收集,并能够通过打开浏览器追溯和确认这些数据。这样一来,就可以省去每次在不同的命令行中执行数据获取脚本以及整理输出的麻烦。

以下是对于”以降、最初にモニタリングシステムのベースとなるPrometheusとGrafanaを簡単に説明します。次に、GPUのメトリクスを取得するための一般的なツールの紹介し、最後にそれらを組み合わせてモニタリングシステムを構築する方法を説明します。ただし、各ソフトウェアの技術的な解説や詳細な使い方までは取り扱いませんのでご注意ください。”的近义句:
本文将简单地介绍作为监控系统基础的Prometheus和Grafana,并介绍一些常见工具,用于获取GPU的度量指标,最后解释如何将它们结合起来构建监控系统。请注意,本文不会对每个软件的技术解释或详细用法进行详述。

Prometheus和Grafana的基本知识

如果用一句话来概括Prometheus,那就是“具备处理时序文本数据的数据库的开源监控系统软件”。实际上,它由两个主要要素构成:中央集权的控制器Prometheus和作为被监控对象运行的代理程序exporter。它的基本运作非常简单,Prometheus通过向exporter发送HTTP请求来获取并存储exporter所持有的值。当然,还有其他的组件存在,但是只要记住这个最重要的关系就没有问题了。

另外,作为代理商的出口商,通常会根据特定的目标创建多种类型的出口商。最常用的可能是用于获取计算机CPU、内存、文件系统和IO等基本指标的node_exporter。此外,还存在用于监控API和网络接口的blackbox_exporter,以及用于获取MySQL各种运营数据的mysql_exporter等。本次使用的是node_exporter和下一章将介绍的用于获取GPU指标的出口商。

首先,Grafana是一款开源的仪表盘软件。它可以与各种数据源配合使用,可以利用手头的数据创建图形化的仪表盘。它经常与Prometheus一起使用,是一种非常常见的可视化工具。

获取GPU指标的方法

在前一章中,我們解釋了Prometheus和exporter之間的關係,作為監控系統的基礎。本章將介紹一般獲取GPU指標的方法以及exporter,這也是本次的主要主題。

如果是NVIDIA公司制造的GPU

我认为使用NVIDIA制造的GPU进行计算的人都曾经执行过nvidia-smi命令。nvidia-smi是一个通过NVIDIA的GPU API来获取和整理有关GPU信息的命令。此外,还存在一个名为DCGM(NVIDIA数据中心GPU管理器)的工具。该工具不仅可以获取指标,还可以对多个GPU进行分组设置和管理,以及进行故障诊断。虽然对于家用GTX和RTX来说,可能无法享受到某些功能的好处,但使用本身是可行的。

然后,通过运行DCGM,我们可以获取GPU的度量信息并将其与Prometheus进行集成。这就是我们要介绍的dcgm_exporter。在2021年8月之前,dcgm_exporter是作为NVIDIA/gpu-monitoring-tools的一部分公开发布的,但现在它由NVIDIA公司在NVIDIA/dcgm-exporter的存储库进行开发。

如果是AMD公司制造的GPU

提到深度学习,很多人可能会想到NVIDIA的GPU,但最近AMD ROCm等也在积极开发中,并且尽管不普遍,但AMD公司生产的GPU的GPGPU使用正在扩大。此外,深度学习常用的知名框架PyTorch也在2021年5月发布的1.8版本中宣布支持ROCm。AMD公司的GPU可以使用开源的kernel模块amdgpu。具体细节省略,通过此模块,可以通过/sys/class/drm目录下的设备文件获取GPU的指标数据。

因此,事实上,对于AMD制造的GPU来说,并不需要单独的导出器,而是可以通过node_exporter(版本1.3.0,于2021年11月发布)单独获取,并且可以像获取服务器的CPU使用率、内存使用量和IO信息一样获取GPU的指标!太棒了!

建立监控系统

好的,由于我们已经讨论了各种独立工具,现在我们将开始组合它们以构建监控系统。这次,我们将使用Docker来运行各种工具。此外,由于关于如何使GPU正常工作的步骤已经有很多前辈们留下的文章,所以我们将省略这部分内容。具体来说,我们将基于NVIDIA的GPU来运行nvidia-smi,如果是AMD的GPU,则使用rocm-smi。

系统配置

这次构建的是一个由1个监视节点和2个非监视节点组成的三台系统。为了使功能更清晰明了,我们将节点分开,但是如果只希望通过一台GPU机器来完成,也可以将Grafana、Prometheus和各种exporter集中到一台机器上,实现全能运行。此外,由于这仅仅是在家庭私人网络上构建的环境,因此并未考虑到恶意用户或外部攻击的存在。

硬件信息

    • aone (192.168.1.10)

管理ノード、詳細略

mana (192.168.1.11)

CPU: Intel Core i9 9900K
GPU: NVIDIA Geforce RTX3060

sayu (192.168.1.12)

CPU: AMD Ryzen Threadripper 1950X
GPU: AMD Radeon RX 5500 XT

arch.png

软件信息( )

ソフトウェアバージョンUbuntu (OS)20.04Docker20.10Grafana8.2.5Prometheus2.31.1node_exporter1.3.0DCGM_exporter2.3.1nvidia driver11.5amdgpu21.40

安装到GPU搭载的PC的导出程序。

魔力(NVIDIA显卡)

首先,我们将从被监视的对象开始构建。通过使用Docker来运行node_exporter和DCGM_exporter。由于这次监视的主机上没有需要持久化的信息,因此不需要进行特殊的配置更改。

$ sudo docker run -d --net="host" --pid="host" -v "/:/host:ro,rslave" \
    quay.io/prometheus/node-exporter:latest --path.rootfs=/host
$ sudo docker run -d --gpus all --rm -p 9400:9400 \
        nvcr.io/nvidia/k8s/dcgm-exporter:2.3.1-2.6.0-ubuntu20.04

AMD GPU (说友)

这台机器只需要安装node_exporter就可以达到目的,但需要添加选项–collector.drm。这个选项默认情况下是禁用的,它用于收集禁用的drm指标,通过添加此选项,node_exporter可以获取GPU的信息(注:这不是docker run的选项,而是传递给在Docker中运行的node_exporter的选项)。

$ sudo docker run -d --net="host" --pid="host" -v "/:/host:ro,rslave" \
    quay.io/prometheus/node-exporter --path.rootfs=/host --collector.drm

安装 Prometheus 和 Grafana。

在 Prometheus 中,我们决定与主机共享“累积的数据”和“配置文件”。如果未设置这些内容并停止 Prometheus 的容器,那么这些数据将会消失。在下面的命令中,通过第二行将主机上的配置文件挂载到容器中,同样地,在第三行中将 Prometheus 累积的各种数据目录挂载到容器中。本次我们在主机创建了一个名为 /home/miura/prometheus 的目录,并将数据和配置文件存储在其中。请在您自己的环境中进行相应调整后执行。

$ makedir /home/miura/prometheus/data #データを蓄積するディレクトリの作成
$ sudo docker run -d -p 9090:9090 \
    -v /home/miura/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
    -v /home/miura/prometheus/data:/prometheus \
    prom/prometheus

以下是已挂载的设置文件。在scrape_configs下,您可以记录两个监视目标exporter的信息。虽然还可以进行其他定制,但本次仅需设置以下最低限度项目即可开始运行。

global:
  scrape_interval: 15s
  external_labels:
    monitor: 'codelab-monitor'

scrape_configs:
  - job_name: 'gpu_nvidia' # 任意に指定可能な名称
    scrape_interval: 5s # ポーリング間隔(指定しなければglobalの値が利用される)
    static_configs: # 対象のexporterが待ち受けているホスト名(IPアドレス)とポート番号
      - targets: ['192.168.1.11:9100'] # node_exporterのデフォルトポート 9100
      - targets: ['192.168.1.11:9400'] # DCGMのデフォルトポート 9400

  - job_name: 'gpu_amd' # 同上
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.1.12:9100']

使用Grafana进行数据可视化

这是一个简单的仪表板,可将“GPU使用率”、“GPU内存使用量”、“CPU使用量”和“内存使用量”可视化,针对每台GPU机器,就像文章开头的图表所示。Grafana可以创建复杂的仪表板,但在这里,我们尽量简洁,以便查看所需信息。当然,我们还可以根据需要添加或删除更多数据,因为我们收集的数据比这个更多。

首次访问Grafana

由于Grafana默认在3000端口上运行,您可以通过在浏览器中访问<IP地址>:3000来查看。第一次访问时,您将被要求更改密码,请使用默认的 admin:admin 登录后设置新密码。

添加数据源

数据源是指定Grafana处理哪个服务的信息,本次将指定为Prometheus。

请访问<IP地址>:3000/datasources,然后点击添加数据源。在跳转的页面列表的顶部,点击Prometheus。在设置页面中有许多不同的配置值,但这里我们只需要在URL中输入Prometheus所在机器的IP地址和端口即可。如果是在不同的机器上安装,则输入<IP地址>:9090;如果是全一体结构,则输入localhost:9090应该可以访问。在输入后,点击页面底部的保存并测试,如果页面显示数据源正常工作,则准备工作完成。

请查看Data sources | Grafana Labs以获取有关添加数据源的详细信息。您可以加载除Prometheus之外的其他数据。

创建仪表板

接下来,我们将创建一个仪表板来显示所选数据源的数据。

Grafana的主页左侧有一个”+”按钮,用于开始创建仪表盘。点击该按钮将创建一个空的仪表盘。点击屏幕上显示的”add an empty panel”,将会转到以下的图表创建界面。在这里,您可以编写要可视化的数据查询。例如,NVIDIA_exporter获取的GPU使用率数据以DCGM_FI_DEV_GPU_UTIL的名称存储在Prometheus中。

grafana02.png

请参考这里以获取有关所提供的度量标准的详细信息。另外,请参考 Panels | Grafana Labs 以获取有关面板和图表的详细信息。我们提供了各种自定义选项,从设置轴和图例到修改颜色,供您选择。

最后

本文介绍了使用Grafana和Prometheus来获取GPU指标并可视化的方法。目前,除了广泛使用的NVIDIA GPU外,最近GPGPU生态系统的建设也支持了AMD的GPU。确认自己的程序如何利用CPU、内存、GPU等加速器和文件系统等计算资源,不仅是之前提到的有价值的考量材料,而且也非常有趣。那么,你也可以尝试搭建一个更高级的家用深度学习环境吗?

NVIDIA DCGM可以在NVIDIA开发者网站找到。

现在可以通过Python包获取PyTorch适用于AMD ROCm™平台的版本。