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
エンジニア人生の拡張性を高める 「探索型キャリア設計」の提案
tenshoku_draft
1
120
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
140
Can We Measure Developer Productivity?
ewolff
1
150
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件
tubone24
1
430
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
530
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
370
Amazon Personalizeのレコメンドシステム構築、実際何するの?〜大体10分で具体的なイメージをつかむ〜
kniino
1
100
なぜ今 AI Agent なのか _近藤憲児
kenjikondobai
4
1.3k
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
410
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
380
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
190
Featured
See All Featured
Fireside Chat
paigeccino
34
3k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
Become a Pro
speakerdeck
PRO
25
5k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
Why Our Code Smells
bkeepers
PRO
334
57k
BBQ
matthewcrist
85
9.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
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
おわり