Ryota Arai, Preferred Networks
Prometheus Tokyo Meetup #2
Prometheus at PFN
だれ
• Ryota Arai / 荒井 良太
• Preferred Networks (PFN)
• Kubernetes GPUクラスタ運⽤
• twitter.com/ryot_a_rai
• OSS: Itamae, Infrataster
Preferred Networks
• 深層学習技術の実⽤化を進め、様々な分野で

イノベーションの実現を⽬指している企業
• 深層学習のワークロードが多い
• 学習を⾼速に進めるためGPUが必要
PFNのクラスタ
https://www.preferred-networks.jp/ja/news/pr20190318
NEW!
= 2,560 GPUs
PFNのクラスタ
• 2,560 GPUs / 320ノード
• Kubernetesクラスタを構築し、PodからGPUを利⽤
• InfiniBand, RoCE (RDMA over Converged Ethernet)
• 低レイテンシ、⾼速なノード間通信を利⽤して

分散学習を⾏っている
Prometheus
• 前述の機械学習基盤のモニタリングに利⽤
• クラスタの利⽤状況など
• Kubernetesとのインテグレーション
• ラベルがついたメトリック、強⼒なクエリ⾔語(PromQL)
• が、むずかしい

(⼊⾨Prometheusで詳しく解説されています)
Nodes
Nodes
Exporters
MN-1 MN-2 (構築中)
Trickster
Grafana
PrometheusThanos
Sidecar
Thanos
sidecar
Thanos Store Thanos StoreThanos Query
Query
Recorder
S3
Prometheus
Operator
構成
Alertmanager
Nodes
Nodes
Exporters
MN-1 MN-2 (構築中)
Trickster
Grafana
PrometheusThanos
Sidecar
Thanos
sidecar
Thanos Store Thanos StoreThanos Query
Query
Recorder
S3
Prometheus
Operator
構成
Alertmanager
Prometheus Operator
• github.com/coreos/prometheus-operator
• Prometheusのデプロイ・設定をKubernetesのカスタム
リソースで⾏える
• Prometheus本体の設定やscrape対象など
• KubernetesのRBACを活⽤できる
• PFNではkube-prometheusを利⽤してデプロイしている
kube-prometheus
• KubernetesでPrometheusを使うときに必要なものをまとめてデプロイできる

(Prometheus本体、エクスポータ、スクレイプ設定など)
• Jsonnetでカスタマイズ可能
• jsonnet/kube-prometheus以下を⾒て頑張る
# Tips: configが⽤意されてないフィールドを変更する例
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + {
prometheus+:: {
prometheus+: {
spec+: {
resources: {limits: {memory: "64Gi"}}}}}};
Nodes
Nodes
Exporters
MN-1 MN-2 (構築中)
Trickster
Grafana
PrometheusThanos
Sidecar
Thanos
sidecar
Thanos Store Thanos StoreThanos Query
Query
Recorder
S3
Prometheus
Operator
構成
Alertmanager
エクスポータ
• kube-prometheusでデプロイされるもの
• Node exporter, kube-state-metrics, kubeletなど
• NVIDIA DCGM exporter
• kube-nvidia-gpu-exporter(内製)
NVIDIA DCGM exporter
• NVIDIA GPUのメトリックを出⼒するエクスポータ
• DCGM (Data Center GPU Manager)の出⼒を

awkで整形してnode exporterのtextfile collectorに流す
• メトリック例: dcgm_gpu_utilization,
dcgm_gpu_temp, dcgm_power_usage,
dcgm_fb_used
kube-nvidia-gpu-exporter
• PodとそのPodが利⽤しているNVIDIA GPUの組を

出⼒するエクスポータ
• これと先程のDCGM exporterを組み合わせると特定のPodのGPUメトリック
がクエリできる
# kube_nvidia_gpu_pod{pod="...", namespace="...", uuid="..."} 1
avg by (uuid) (

dcgm_gpu_utilization{} and on(uuid) 

kube_nvidia_gpu_pod{pod="$pod", namespace="$namespace"}

)
Nodes
Nodes
Exporters
MN-1 MN-2 (構築中)
Trickster
Grafana
PrometheusThanos
Sidecar
Thanos
sidecar
Thanos Store Thanos StoreThanos Query
Query
Recorder
S3
Prometheus
Operator
構成
Alertmanager
アラート
• Alertmanagerを使⽤
• GPUを確保しながら使われていない場合に

ユーザに通知
• Alertmanagerのwebhook receiver
• Podからユーザを特定しSlackでDMする

webhookを実装
Slack
• 毎朝クラスタのメトリックを

Slackに投稿している
• クラスタの利⽤状況などを

意識できるように
• Grafanaでレンダリングした画像を
Slackに投稿(スクリプト例)
Nodes
Nodes
Exporters
MN-1 MN-2 (構築中)
Trickster
Grafana
PrometheusThanos
Sidecar
Thanos
sidecar
Thanos Store Thanos StoreThanos Query
Query
Recorder
S3
Prometheus
Operator
構成
Alertmanager
Thanos
• thanos.io
• "Highly available Prometheus setup with long term storage
capabilities"
• Global Query View
• Unlimited Retention
• Downsampling & Compaction
• 近い⽬的のプロダクトとしてCortexもある
• 少し前までドキュメントがほぼなかったけど、最近増えている
Thanos
PrometheusThanos Sidecar TSDB blocks
Object Store
(S3, GCS)
Thanos QueryThanos Store
Thanos Store
Client
(Grafana, etc.)
TSDB blockを
アップロード
Blockを取得
(Range GETを使⽤)
Store API
Store API
(Blockになっていない

WALの部分を取得するため)
Remote Read API
Prometheus
HTTP API
※Thanos Compactは省略
High Availability
• 複数のPrometheusから保存された

メトリックをdeduplicateする(Thanos Query)
• 特定のラベル(replica label)だけ

異なる場合⼀つだけ使⽤する
• これによりPrometheusの冗⻑化が可能になる
Global Query View
• 複数のPrometheusにまたがったメトリックをクエリできる
• 以前はFederationで1つのPrometheusに集約していた
• Federationする量に⽐例してscrape時間がかかる
• scrape timeoutとの戦い、scrape intervalを
• scrapeによってメトリックが遅延する
• ⼊⾨Prometheusではバッドプラクティスとして

紹介されている(P.338 20.2)
Unlimited Retention
• データストアとしてS3やGCSなどの

オブジェクトストレージを利⽤でき、

無限に蓄積できる 💸
• ただ、メモリ使⽤量の増加には気をつける
• Remote Writeは使⽤していない
Downsampling & Compaction
• ダウンサンプリングは現在のところ利⽤していない
• ダウンサンプルされたメトリックは

単純な間引きではなく

avg, sum, min, maxなどの統計値となる
• クエリする際にはavg_over_timeなどの関数を

使う必要がある
Thanos at PFN
• Thanos Store, Queryはステートを持たない
• かつ、結構メモリを⾷う
• EC2スポットインスタンスを利⽤している
• 既存PrometheusのThanosへの移⾏
• #348 sidecar: Allow to upload old (already compacted blocks).
• 1. meta.jsonにThanos特有のデータを追加する
• 2. aws s3 cp --recursive prometheus-tsdb/ s3://.../
メモリ使⽤量問題
• クエリや時間範囲によっては⼤きなメモリを必要とする
• OOM killerによって殺される
• 学習ジョブによってPod数が増えやすい
• カーディナリティが⾼く、インデックスが⼤きくなる
• クエリ・時間範囲によるので、事前に⾒積もるのが困難
• --query.max-samples で失敗させることは可能
Recording Rule
• Recording Rule
• クエリの結果をメトリックとして保存する機能
• Cons: 過去にさかのぼってレコードすることはできない
ので、あとから追加することは困難
# 例
- record: "instance_path:requests:rate5m"
expr: 'rate(requests_total{job="myjob"}[5m])'
Nodes
Nodes
Exporters
MN-1 MN-2 (構築中)
Trickster
Grafana
PrometheusThanos
Sidecar
Thanos
sidecar
Thanos Store Thanos StoreThanos Query
Query
Recorder
S3
Prometheus
Operator
構成
Alertmanager
Query Recorder
• バックグラウンドでクエリを実⾏し

キャッシュするサーバを開発(内製)
• クエリ先への負荷を抑えるため

ある程度短いレンジで繰り返し

クエリを発⾏
• 00:00-01:00, 01:00-02:00, ...
• Remote Read APIで利⽤する
• Thanosで利⽤するためSidecarを

挟んでいる
Client
Prometheus
Query Recorder
QueryRange
Remote Read
Cached
Metrics
QueryRange
(Range: 1h)
Write Read
Thanos
Sidecar
Thanos
Query
Trickster
• github.com/Comcast/trickster
• クエリの結果をキャッシュするサーバ
• 差分の時間範囲のみオリジンに

問い合わせるためキャッシュを

有効活⽤できる
• Grafanaの前段に配置することで

⼀度表⽰したパネルの⾼速化を図っている
Client
(Grafana)
Trickster
Prometheus
Cache
Data
QueryRange
QueryRange
(when cache miss)
Nodes
Nodes
Exporters
MN-1 MN-2 (構築中)
Trickster
Grafana
PrometheusThanos
Sidecar
Thanos
sidecar
Thanos Store Thanos StoreThanos Query
Query
Recorder
S3
Prometheus
Operator
構成
Alertmanager

Prometheus at Preferred Networks