Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
kubernetesでGPUを 管理するために スケジューラをいじってみた
Search
uesyn
September 17, 2018
Technology
3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
kubernetesでGPUを 管理するために スケジューラをいじってみた
uesyn
September 17, 2018
More Decks by uesyn
See All by uesyn
PodSecurityPolicyの安全な移行の道のり / On the safe migration of PodSecurityPolicy
uesyn
1
1.2k
PodSecurityPolicyの廃止に備えて、 一足先にPodSecurity Admissionを試してみよう! / from-psp-to-podsecurity
uesyn
4
1.9k
Kubernetes v1.19 変更点調査のまとめ / k8s-v119-updates
uesyn
1
300
そのクラスタ本当にアップグレードして大丈夫? Storage Version の更新も忘れずにしよう! / k8s-storage-version-migration
uesyn
2
4k
次世代のログ基盤 Grafana Lokiを始めよう! / prometheus-meetup-tokyo-3-lets-start-the-loki
uesyn
7
15k
kindでも"type LoadBalancer"を使いたい! / kubernetes-meetup-tokyo-24-kind-with-type-loadbalancer
uesyn
0
1.8k
Loki入門
uesyn
8
2.8k
Cortexの話をKubeConで聞きたかったっていう話
uesyn
4
2.1k
Other Decks in Technology
See All in Technology
データレイクの「見えない問題」を可視化する
sansantech
PRO
1
240
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
230
背中から、背中へ /paying forward to community
naitosatoshi
0
170
PostgreSQL 19 新機能概要 OSC Hokkaido 2026
nori_shinoda
0
260
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
270
Amazon Redshift zero-ETL 統合を活用した軽量なマルチプロダクトデータ可視化基盤 / Lightweight Multi-Product Data Visualization with Amazon Redshift Zero-ETL
kaminashi
0
120
感情と身体を置き去りにしない、エンジニアの生きのこり方 ──いまから、ここから「自分の状態」を扱うという選択
saorimurooka
0
410
デジタル・デザイン:次の50年を描く「進化する青写真」
y150saya
0
440
Microsoft のサポートとフィードバック総まとめ
murachiakira
PRO
0
120
AI時代における最適なQA組織の作り方
ymty
3
230
技術・能力を向上する原理原則 #きのこセッションa #きのこ2026
bash0c7
0
190
認証認可だけじゃない! ID管理の構成要素と ライフサイクルを意識しよう
ritou
1
310
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
440
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
330
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
450
Faster Mobile Websites
deanohume
310
32k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
400
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
400
Building Adaptive Systems
keathley
44
3.1k
How to Ace a Technical Interview
jacobian
281
24k
What's in a price? How to price your products and services
michaelherold
247
13k
Visualization
eitanlees
152
17k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Transcript
kubernetesでGPUを 管理するために スケジューラをいじってみた
• 名前:上村 真也(@uesyn) • 所属:KDDI株式会社 • 主な業務内容 ◦ 新しいサーバインフラ基盤の検証 (NFV向け/コンテナ/GPU)
◦ NFV人材育成講師 • 趣味 ◦ ゲーム(特にFPS) 自己紹介 Gopher君
皆さん kubernetes 使ってますか?
それでは本題
背景〜ある会社の研究所のお話〜 • 研究者がGPUを欲しがる • GPUを割り当てたリソースをユーザに提供(手動) GPUを1つください 研究者 研究者 兼 研究所インフラ担当者
はい、どうぞ 社内の GPU搭載サーバ群
Problems 丹精込めた愛情たっぷり手作り GPUリソース • 管理者がボトルネックとなり払い出しに時間がかかる 社内で利用するGPUリソースを共通化できていない • 規模の経済が働かない パブリッククラウドの GPUリソースを利用できない
• 社外に出せないデータの存在 • 必然的に社内基盤が必要 共通GPU演算基盤が必要!!!
Can we solve them with kubernetes? 7
GPUをkubernetesで管理する 検証環境を作ってみました!
kubernetes Master GPU Servers CPU Servers Ingress Controller(ユーザごとに分離) ストレージ Kubernetesのワーカーノード
GPUを使わない処理用 実際に作った環境の構成
基板上に作ったサンプルアプリ アプリについて • 動画上の物体検出 • アップロードされた動画を リアルタイム処理 ・解析するワーカーをいつでも増減可能 ・GPUでもCPUでも解析可能
やったこと 1) GPUを使うコンテナのスケジューリング 2) 1クラスタでマルチテナント環境な基盤 • GPU搭載ノードは共有 • GPU非搭載ノードは専有 3)
コンテナ基盤のセキュリティの検証 • スケジューラに関しては ドキュメントがない部分も。。。 • セキュリティは社内利用なので甘々に 今日はここのお話
kubernetesのGPUリソースの管理 • kubeletでは最小限のデバイスディスカバリのみサポート ◦ CPUやメモリやディスク ◦ GPUは標準で管理されない • ベンダー固有のデバイスはExtended ResourceとDevice
Pluginとで管理
Extended ResourceとDevice Plugin Extended Resource • Built-inされているリソース以外の数を表現 ◦ ResourceNameと数(integer) ◦
0.5個GPUが欲しいといった要求不可能 • コンテナ間の共有・オーバーコミット不可能 Device Plugin • ベンダー固有デバイスを kubeletへ通知 • デバイスをAllocateする情報をkubeletへ渡す • kubernetesのコアコードをいじらず実装可能 • NVIDIAのGPUを扱うにはNVIDIA/k8s-device-plugin ◦ https://github.com/NVIDIA/k8s-device-plugin
Device Pluginについて • Registry ◦ Device Pluginをkubeletへ登録 ◦ 利用するExtended ResourceNameを通知
• ListAndWatch ◦ 利用可能なデバイスをkubeletへ通知 • Allocate ◦ コンテナ作成前にCRI-Specへ下記の値を挿入 ▪ 環境変数 ▪ マウント ▪ デバイス ▪ アノテーション 出典:https://github.com/kubernetes/community/blob/master/contributors/ design-proposals/resource-management/device-plugin.md
NVIDIAのGPU用Device Pluginのコードを読んでみると・・・ 15 NVIDIA/k8s-device-plugin • NVIDIAのGPUをkubernetesで扱うためのDevice Plugin • Allocateで実装されているのは 環境変数をコンテナ作成時に挿入するのみ
https://github.com/NVIDIA/k8s-device-plugin/blob/v1.10/server.go
Device PluginだけじゃGPUは使えない! NVIDIA container runtime • コンテナでNVIDIAのGPUを利用できるようにしたものの総称 ◦ libnvidia-containerやツール等 •
特定の環境変数(NVIDIA_VISIBLE_DEVICES)が入っていればGPUを割り当て • OCIで定義されるprestart hookでnvidia-container-runtime-hookを呼び出す ◦ コイツがGPUをコンテナに割り当てる 出典:https://devblogs.nvidia.com/wp-content/uploads/2018/05/pasted-image-0-27.png
GPUを持ったコンテナの起動 • CPUやmemoryのようにrequests, limitsを指定して利用 • GPUの場合limitsのみで動作 ◦ limitsのみを指定した場合requestsも同じ値になる ◦ requestsを書く場合limitsも同じ値を指定する必要
GPUコンテナのスケジューリングの課題 実際に発生した状況 • GPUを2つ搭載するノードが2台ある • 以下の順番でPodを起動 1. GPUを1つ使うPod① → ◦ 2. GPUを1つ使うPod② → ◦
3. GPUを2つ使うPod③ → X • でも2つのGPU空きリソースが存在 ノード1 ノード2 Pod① Pod③ Pod②
GPUコンテナのスケジューリングの課題 理想としては・・・ • リソース効率を考えると GPUは使用率が高くなるように 埋まってくれると嬉しい ノード1 ノード2 Pod③ Pod②
Pod①
スケジューリングを実施するコンポーネント kube-apiserver kube-scheduler kube-controller-manager kubelet kube-proxy これがスケジューリングする マスター側 ノード側
スケジューラの設定を変えれば いけるんじゃないか?
kubernetesのスケジューリング • kube-schedulerがPodをスケジューリング ◦ Predicates ▪ Podを配置可能なノードを通すフィルタ ◦ Priorities ▪
Podが配置できるノードの中で最適なノードを決定 ノード A ノード B ノード C ノード A ノード B Predicates (フィルタ) ノード C Priorities (ランキング付け) ノード A ノード B この設定を変更すれば…?
Prioritiesのざっくりとした仕組み PriorityC のスコア PriorityA のスコア PriorityB のスコア 重み 重み 合計がノードのスコア
Priorities • いくつかのPriorityを付ける処理の組み合わせで構成 ◦ 例: ▪ LeastRequestedPriority: PodのリソースのRequest合計が少ないノード優先 ▪ BalancedResourcePriority: CPUとメモリの使用率のバランスをとるように 重み
使えそうなPriorityを探してみた(1/2) • pkg/scheduler/algorithm/prioritiesの中で使えそうなPriorityはないか? ◦ ImageLocalityPriority ◦ InterPodAffinityPriority ◦ NodeAffinityPriority ◦
NodeLabelPriority ◦ NodePreferAvoidPodsPriority ◦ ResourceLimitsPriority ◦ SelectorSpreadPriority ◦ TaintTolerationPriority ◦ LeastRequestedPriority ◦ BalancedResourcePriority ◦ MostRequestedPriority • 漏れがあったらごめんなさい 使えそう?
• CPUとメモリの使用率が高いノードを優先的にコンテナを起動する設定は存在 • GPU(Extended Resource)は対象外 https://github.com/kubernetes/kubernetes/blob/release-1.10/pkg/scheduler/algorithm/priorities/most_requested.go 使えそうなPriorityを探してみた(2/2)
なら、スケジューラを拡張 するしかない!
kubernetesのschedulerの拡張方法 1. kube-schedulerに手を加えて、既存のものと置き換える • 基盤をVerUPするたびに手を加える必要があり 2. Multiple-scheduler • 実はkubernetesでは複数のスケジューラを起動可能 ▪
実際に使うスケジューラはどれか一つ ▪ 既存のものと拡張したものを配置すれば • PodのSpecにスケジューラを指定 • ユーザ側の操作が不可欠なため、好ましい方法ではない 3. Scheduler extender • kube-schedulerが呼び出す外部APIとして実装される 今回はこれを採用
Scheduler extenderの作り方 Scheduler extenderを利用したスケジューリング kube-scheduler Predicates kube-scheduler Priorities ノード A
ノード B ノード scheduler-extender Predicates scheduler-extender Priorities • 標準のkube-schedulerで管理されていないリソースのスケジューリングのために必要だと書いてあった 出典:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md
Scheduler Extenderをこんな感じで作ろう ノード1 ノード2 • GPUの専有枚数の多いほどがスコアが高くなるように ◦ Priorityのみ実装 • スコア
= ( リクエストGPU数 + ノード上の専有されている GPU数) / ノードが持ってるGPU数 * 10 ◦ Maxが10になるように正規化 ▪ Priorityのルール Pod① GPUを1つください スコア = (1+1) / 2 * 10 = 10 スコア = (1+0) / 2 * 10= 5
Scheduler extenderの実装 • ↓こんなリクエストがくるので https://github.com/kubernetes/kubernetes/blob/release-1.10/pkg/scheduler/api/types.go
Scheduler extenderの実装 • ↑こんなリプライを返してあげる https://github.com/kubernetes/kubernetes/blob/release-1.10/pkg/scheduler/api/types.go https://github.com/kubernetes/kubernetes/blob/release-1.10/pkg/scheduler/api/types.go
実装していい感じに動きました!
Scheduler Extenderが動作していない時の挙動 https://github.com/kubernetes/kubernetes/blob/release-1.11/pkg/scheduler/api/v1/types.go • v1.10 ◦ Ignorableがtrueの挙動 • v1.11 ◦
Configで設定可
Scheduler Extenderが動作していない時の挙動 https://github.com/kubernetes/kubernetes/blob/release-1.10/pkg/scheduler/api/v1/types.go
GPU何枚使ってるかどうやって調べるの? ~ノード単位で見る場合①~ • とりあえずkubectl describe node (Client v1.10) 何枚使ってるかわからん!
GPU何枚使ってるかどうやって調べるの? ~ノード単位で見る場合②~ • とりあえずkubectl describe node (Client v1.11) ◦ 1.11からExtended
ResourceのAllocated resoucesも見れるように!
GPU何枚使ってるかどうやって調べるの? ~クラスタ全体で見る場合~ • kube-state-metricを使う ◦ v1.4.0からExtended Resourceもmetricsとして収集可能に! https://github.com/kubernetes/kube-state-metrics/pull/451
おわり