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
2
2.6k
kubernetesでGPUを 管理するために スケジューラをいじってみた
uesyn
September 17, 2018
Tweet
Share
More Decks by uesyn
See All by uesyn
PodSecurityPolicyの安全な移行の道のり / On the safe migration of PodSecurityPolicy
uesyn
1
1k
PodSecurityPolicyの廃止に備えて、 一足先にPodSecurity Admissionを試してみよう! / from-psp-to-podsecurity
uesyn
4
1.7k
Kubernetes v1.19 変更点調査のまとめ / k8s-v119-updates
uesyn
1
230
そのクラスタ本当にアップグレードして大丈夫? Storage Version の更新も忘れずにしよう! / k8s-storage-version-migration
uesyn
2
3.7k
次世代のログ基盤 Grafana Lokiを始めよう! / prometheus-meetup-tokyo-3-lets-start-the-loki
uesyn
7
14k
kindでも"type LoadBalancer"を使いたい! / kubernetes-meetup-tokyo-24-kind-with-type-loadbalancer
uesyn
0
1.5k
Loki入門
uesyn
8
2.5k
Cortexの話をKubeConで聞きたかったっていう話
uesyn
4
1.9k
Other Decks in Technology
See All in Technology
Ask! NIKKEI RAG検索技術の深層
hotchpotch
13
2.8k
『衛星データ利用の方々にとって近いようで触れる機会のなさそうな小話 ~ 衛星搭載ソフトウェアと衛星運用ソフトウェア (実物) を動かしながらわいわいする編 ~』 @日本衛星データコミニティ勉強会
meltingrabbit
0
120
転生CISOサバイバル・ガイド / CISO Career Transition Survival Guide
kanny
2
390
インフラをつくるとはどういうことなのか、 あるいはPlatform Engineeringについて
nwiizo
5
2.1k
第13回 Data-Centric AI勉強会, 画像認識におけるData-centric AI
ksaito_osx
0
360
SA Night #2 FinatextのSA思想/SA Night #2 Finatext session
satoshiimai
1
100
2.5Dモデルのすべて
yu4u
2
610
Developer Summit 2025 [14-D-1] Yuki Hattori
yuhattor
19
5.1k
PL900試験から学ぶ Power Platform 基礎知識講座
kumikeyy
0
110
AndroidデバイスにFTPサーバを建立する
e10dokup
0
240
事業継続を支える自動テストの考え方
tsuemura
0
300
マルチモーダル理解と生成の統合 DeepSeek Janus, etc... / Multimodal Understanding and Generation Integration
hiroga
0
360
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.4k
Navigating Team Friction
lara
183
15k
We Have a Design System, Now What?
morganepeng
51
7.4k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
99
18k
How STYLIGHT went responsive
nonsquared
98
5.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
950
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
4 Signs Your Business is Dying
shpigford
182
22k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
YesSQL, Process and Tooling at Scale
rocio
171
14k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
240
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
おわり