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
1
2.5k
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
990
PodSecurityPolicyの廃止に備えて、 一足先にPodSecurity Admissionを試してみよう! / from-psp-to-podsecurity
uesyn
4
1.7k
Kubernetes v1.19 変更点調査のまとめ / k8s-v119-updates
uesyn
1
220
そのクラスタ本当にアップグレードして大丈夫? Storage Version の更新も忘れずにしよう! / k8s-storage-version-migration
uesyn
2
3.6k
次世代のログ基盤 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.4k
Loki入門
uesyn
8
2.4k
Cortexの話をKubeConで聞きたかったっていう話
uesyn
4
1.9k
Other Decks in Technology
See All in Technology
iOS/Androidで同じUI体験をネ イティブで作成する際に気をつ けたい落とし穴
fumiyasac0921
1
110
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間
oracle4engineer
PRO
28
13k
プロダクト活用度で見えた真実 ホリゾンタルSaaSでの顧客解像度の高め方
tadaken3
0
180
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
390
Terraform Stacks入門 #HashiTalks
msato
0
360
CDCL による厳密解法を採用した MILP ソルバー
imai448
3
140
日経電子版のStoreKit2フルリニューアル
shimastripe
1
140
AWS Lambda のトラブルシュートをしていて思うこと
kazzpapa3
2
180
マルチモーダル / AI Agent / LLMOps 3つの技術トレンドで理解するLLMの今後の展望
hirosatogamo
37
12k
『Firebase Dynamic Links終了に備える』 FlutterアプリでのAdjust導入とDeeplink最適化
techiro
0
130
ドメインの本質を掴む / Get the essence of the domain
sinsoku
2
160
EventHub Startup CTO of the year 2024 ピッチ資料
eventhub
0
120
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
49
11k
GitHub's CSS Performance
jonrohan
1030
460k
Ruby is Unlike a Banana
tanoku
97
11k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Being A Developer After 40
akosma
87
590k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Optimizing for Happiness
mojombo
376
70k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
370
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
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
おわり