SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
Shingo Omura (@everpeace), Preferred Networks, Inc.
Kubernetes Meetup Tokyo #13 2018-09-28
schedulerとdevice-pluginをカスタムし
て機械学習ジョブクラスタを
作っている話
1
大村伸吾 (おおむらしんご)
• エンジニア, Preferred Networks, Inc.
• 社内向けGPUクラスタの開発運用
• Chainerのクラウドでのユーザビリティ向上
• kubeflow/chainer-operator 開発
– ChainerMNによる分散深層学習も
single yamlで動きます
– 仲間募集中!
– v0.3(今月末予定)で正式リリース!
• @everpeace (twitter)
• shingo.omura (facebook)
2
We’re Hiring!!
Shingo Omura
KeyNote at July Tech Festa 2018
SlideShare
Kubeflow Meetup #1
SlideShare
3
PFNの機械学習クラスタ
の概要
4
構築・運用: NTT Communications / NTT PC Communications
MN-1
5
PFN における Kubernetes クラスタ
credits:                             
gpu by Misha Petrishchev, Cpu Chip by Vectors Market, Memory by Jugalbandi, Network Switch by Creaticca Creative Agency,
Webhooks by Paul Dietzel, label by nauraicon, schedule by Pixel Lab from the Noun Project
128 (P100)
512 (V100)
56 Gbps x 2
100 Gbps x 24608 vCore
192 vCore
24 TiB
4 TiB
64 nodes (MN-1b)
16 nodes (MN-1a) (全体では128 node)
v1.11.1
NVIDIA/k8s-device-plugin
everpeace/k8s-host-device-plugin
custom
admission
webhook
custom
node feature
discovery
custom
kube
-scheduler
6
日々絶賛拡張中
InfiniBand
• 息を吸うように分散機械学習
– ChainerMN ➔ GPU, InfiniBand をスケジュールしたい
• 日常的なグランドチャレンジ
– Preemptionを活用したい
• オンプレなのでキャパは有限
– Preemptionを活用したい(長時間のジョブは優先度低)
– Preemptionが起きないようにパッキング
• 未対応だが将来やりたい
– スケジューリングの改善(100人以上で使うので何らかの公平性を)
– ギャングスケジューリング(複数のpodを同時にschedule)
PFN の Kubernetes クラスタに求められるもの
7
クラスタ全体を専有して
ブレイクスルーを目指す実験
• 息を吸うように分散機械学習
– ChainerMN ➔ GPU, InfiniBand をスケジュールしたい
• 日常的なグランドチャレンジ
– Preemption を 活用したい
• オンプレなのでキャパは有限
– Preemptionを活用したい & カスタムPreemptionロジック
– Preemptionが起きにくいようにパッキング
• 未対応だが将来やりたい
– スケジューリングの改善(100人以上で使うので何らかの公平性を)
– ギャングスケジューリング(複数のpodを同時にschedule)
customized kube-schedulercustomized kube-scheduler
カスタムしているコンポーネント
custom device plugin
8
PriorityClass
Kubernetes Device Plugin
とは
9
Kubernetes Device Pluginとは
• 本体を変更せずに計算リソースを
kubeletにadvertiseする仕組み
– Extended Resourceと呼ばれる
– 非特権コンテナでデバイス利用可
• v1.8 で 登場
• 現 api バージョンは v1beta1
• 通常DeamonSetでデプロイ
• GPU以外にもある(公式ドキュメント)
– GPU (Nvidia, AMD, Intel),
FPGA (Intel), RDMA devices, etc.
# your container spec
resources:
limits:
my-special-device: 1
こんな風にできるようになる
# kubectl describe nodes
Allocatable:
my-special-device: 15
10
Kubernetes Device Plugin の制約
• 整数単位のみでの指定
– 0.5 とかは駄目
• overcommit できない
– 要 requests == limits
• コンテナ同士でシェアはできない
• unlimited リソース は 未対応
– capabilityっぽいリソース
– dirty hack あり (後述)
# your container A
resources:
requests:
nvidia.com/gpu: 1
limits:
nvidia.com/gpu: 1
# your container B
resources:
limits:
nvidia.com/gpu: 1
別々のGPU
要同値&整数
11
● gRPC on unix socket で通信
● device id や deviceファイル情報 をやり取り
● kubelet は起動時に --device, -v オプションを
つけてコンテナを起動
Kubernetes Device Plugin 動作概要
12
/dev/my0 /dev/my1 /dev/my2 /dev/my3
device-plugin
Pod
/dev/my0, 1
--device, -v, --env
等のoption付きで起動
kubelet
Kubernetes Device Plugin の 動作概要
• design doc, api定義(v1beta1) が詳しい
kubelet device plugin
gRPC API
Action
Register
ListAndWatch
Container起動前
Register
ListAndWatch
Allocate
PreStartContainer
kubelet.sock
hoge.sock
unix socket
主に
Register処理
と
2つのAPI
を実装する
13
Kubernetes Device Plugin: Register
kubelet device plugin gRPC API
Action
Register Registerkubelet.sock
unix socket
# rpc Register (RegisterRequest) returns (Empty) {}
RegisterRequest {
version = “v1beta1”
endpoint = “/var/lib/kubelet/device-plugin/hoge.socket” ← pluginのsocket名
resource = “my-device-name” ← デバイス名
options = DevicePluginOptions {
pre_start_required = true ← Allocate 後に PreStartContainer を呼んでほしいか
}
}
問題があればエラー
が返る
14
Kubernetes Device Plugin: ListAndWatch
kubelet device plugin
gRPC API
Action
ListAndWatch ListAndWatchhoge.sock
unix socket
デバイスリストを
更新し続ける
# rpc ListAndWatch (Empty) returns (stream ListAndWatchResponse) {}
# デバイスの状態が変わったら速やかに全デバイスのリストを再送信
ListAndWatchResponse {
devices = [ Device {
ID = “GPU-fef8089b-4820-abfc-e83e-94318197576e” ← デバイスのID
health = “Healthy” ← Healthy or Unhealthy
}, ... ]
}
15
Kubernetes Device Plugin: Allocate
kubelet device plugin gRPC API
Action
Container起動前 Allocatehoge.sock unix socket
デバイスを要求
# rpc Allocate (AllocateRequest) returns (AllocateResponse)
AllocateRequest {
container_requests = [
ContainerAllocateRequest {
deviceIDs = [ “GPU-...”, “GPU-...” ] ← 各コンテナに割り当てたいIDのリスト
} ]
}
16
Kubernetes Device Plugin: Allocate
# rpc Allocate (AllocateRequest) returns (AllocateResponse)
AllocateResponse { container_responses = [
ContainerAllocateResponse {
envs = map( “env_name”: “env_value” ) ← 環境変数
mounts= [ Mount { ← ホストボリュームマウント指定(-v)
host_path = “...”
mount_path = “...”
read_only = true/false
} ]
devices = [ DeviceSpec { ← ホストデバイスマウント指定(--device)
container_path = “/dev/foo”
host_path = “/dev/bar”
permissions = r / w / m ← r = read, w = write, m = mknod 権限
} ]
annotations = map( “key”: “value” ) ← コンテナアノテーション
},
]} 17
Kubernetes Device Plugin: PreStartContainer
kubelet device plugin gRPC API
Action
Container起動前 PreStartContainerhoge.sock unix socket
# rpc PreStartContainer (PreStartContainerRequest) returns (PreStartContainerResponse) {}
PreStartContainerRequest {
devicesIDs = [ “GPU-...”, “GPU-...” ] ← 初期化等の前処理をするデバイスIDs
}
PreStartContainerResponse { } ← レスポンスは中身なし
pre_start_required = true
の場合のみ呼ばれる
18
InfiniBand 用に Unlimited な Extended Resource を擬似的に作る
Pod
PFN における 自作device plugin (everpeace/k8s-host-device-plugin)
19
everpeace/k8s-host-device-plugin
/dev/infiniband/uverbsX
kubelet
/dev/infiniband/uverbsX
/dev/infiniband/rdma_cm
/dev/infiniband/rdma_cm ● 特定のdeviceファイルの集合 に 大量 のdummy
device IDをつける
● Allocate ではどの ID をリクエストされても
同じDeviceSpecを返す
まだまだ発展途上なので注意が必要
• KEP や issueがたくさんあって今後大きく変わる可能性あるかも
– KEP-14: New Resource API proposal (kubernetes/community#2265)
• ResourceClass の提案 (Volume Classみたいな)
• GPUモデルをLabels/Taintsで管理するんじゃなくてもっとちゃんと
– KEP-18: Compute Device Assignment (kubernetes/community#2454)
• ComputeDevice と ComputeDeviceBind 使ってdevice の bindを表現
• kubeletが保存しているlocal checkpoint(containerとdevice IDの対応)からの脱却
– specify hw devices in container (kubernetes/kubernetes#60748)
• Container Spec に hostDevices attributeを追加
20
kube-scheduler
とは
21
• PodをNodeに割り当てる 責務を担うControl Plane のコンポーネント
• kube-schedulerの動作は この2つを読めばほぼ完璧 です
– @tkusumi さんの “Kubernetes: スケジューラの動作”
– チェシャ猫(@y_taka_23) さんの "猫でもわかるPod Preemption"
• 特徴
– schedule policy を 柔軟 にカスタマイズ
• toleration, nodeSelector, affinity といった機能はココ
– priority による preemption
– Extender (Webhook) による拡張
kube-schedulerとは
22
Pod Queue (FIFO)
kube-schedulerの動作
23
Pod を 1個 Pop
対象ノードを選ぶ
ノードに紐づけ
プリエンプション
(犠牲となるPod群を停止)
kube-api
対象ノードがない
Bind リソースを作成
犠牲 Pod群 を Delete
PodをWatch
注: 対象ノードが選べなかった
  時点でPod Statusを更新して
キューの最後尾に入る
Pod Queue (FIFO)
kube-schedulerの動作
24
Pod を 1個 Pop
対象ノードを選ぶ
ノードに紐づけ
プリエンプション
(犠牲になるPod群を停止)
kube-api
Policy 及び Extender
でカスタム可能
Extender
でカスタム可能
Extender
でカスタム可能
対象ノードがない
Bind リソース を作成
犠牲Pod群をDelete
PodをWatch
25出展: Kubernetes: スケジューラの動作 - Qiita by tkusumi
kube-schedulerの動作: ノードを選ぶ
26出展: Kubernetes: スケジューラの動作 - Qiita by tkusumi
kube-schedulerの動作: ノードを選ぶ
● Policyで選べる
● Extenderで独自Predicates
● Policyで選べる
● Extenderで独自ロジック挿せる
kube-schedulerの動作: プリエンプション
27
Node 1
Node 2
Node 3
Node 4
候補ノードを選ぶ
● クリティカルな
FitError以外の
ノード
● 低優先度Podがい
るノード
Node 2
Node 3
Node 4
犠牲Node&Podを選ぶ
1. 低優先Pod全部犠牲候補にして
(抜いてみて) fit するかチェック
2. pdb違反を高優先度から順に
fitする限り救済
3. 残りも高優先度から順にfitする
限り救済
4. 残りを犠牲Podsとする
Node 2
Node 3
Extenderによる調整
● 選ばれたノードと犠牲
Podsを受け取って調
整できる
● Victimを完全に選ぶ
ことはできない
Node 2
Nodeを1つに絞る
下記の順にNodeを絞る
1. PDB違反数最小
2. 最高優先度最小
3. 優先度和最小
4. 犠牲pod数最小
5. ランダム!
kube-scheduler のカスタマイズ方法
• 残念ながらほとんどdocumentはない(記事は幾つか存在する )
• コマンドラインオプションは公式ドキュメント に載っている
– --config でファイルを渡す形式(--write-config-toでdefault書出し可)
– 設定は下記を見ながらyaml, jsonを書くしか無い
• kube-scheduler 自体の設定
→ KubeSchedulerConfiguration (yaml サンプル)
• スケジューリングポリシー(predicates, priorities, extenders, etc.)
→ Policy (json サンプル)
• Extender: ドキュメント(design-doc)
– サンプル: everpeace/k8s-scheduler-extender-example
• 自分で自由にpredicate, priority, preempt, bind等のロジックを
webhookで挿せる
– 応用: everpeace/kube-throttler: Throttle CRDを使ってpodのスケジュールをthrottle
28
PFNでのカスタム事例
• 寄せて詰めたい (= Greedy な Bin Packing)
– podがfitする中で一番空きが少ないところに入れる
– MostRequestedPriority を使う
• Victim を 自由に選びたい
– kube-schedulerが Vicitim Pod を選び、Extenderは調整しか
できないので
– やむなくforkして実装している(諸事情で現在未デプロイ)
• 新バージョンが来たときのrebaseが辛い
• Extenderでもうちょっと柔軟にできるようにしてほしい
29
まだできていないけどやりたい
• キューの改善
– kube-schedulerはFIFO
– 色々と既存のアルゴリズムはある
• ギャングスケジューリング
– 分散学習だとpodを1個ずつscheduleすると簡単にdeadlock
が起きる
• 機械学習を活用したスケジューリング
30
Kubernetes の Scheduler もまだまだ発展途上
• kube-scheduler がものすごく多くのデフォルト機能を実装していて
自作のスケジューラが同じ機能を実装するのが困難なのが実情
• kubernetes-incubator/kube-arbitrator (←やりたいことに近いかも )
– HPC系のスケジューラの機能の実現
– JobQueue, Gang Scheduling, Preemption に対応している
– まだまだ絶賛開発中な模様
• 幾つかのスケジューラ系のKEPも存在
– Add scheduling framework design proposal (kubernetes/community#2281)
• よりカスタマイズできるように schedulerをframework化
– KEP: Gang scheduling (kubernetes/community#2337)
• PodGroup というresourceを導入してGroup単位でschedule
31
PFNでは効率的で柔軟な機械学習クラスタの構築
を一緒に挑戦してみたい人を募集しています
32
https://www.preferred-networks.jp/jobs
We’re Hiring!!
Icons made by Vincent Le Moign from https://icon-icons.com/ licensed by CC 3.0 BY
Thank you for Listening!!
Any Questions?
33
付録
34
ギャングスケジューリング
• 複数のコンテナ(Pod)を同時にノードにスケジュールする
• 分散学習ジョブの場合はギャングスケジューリングでデッドロックを回避できる
– Kubernetes: kubernetes-incubator/kube-arbitrator (未デプロイ)
35
Job A
Job B
Scheduler
Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
gpu by Misha Petrishchev from the Noun Project
MN-1a 構成
36
Total: 1024 GPUs (NVIDIA Tesla P100)
8 GPUs x 16 Servers
56 Gps(InfiniBand FDR) x 2
56 Gbps(InfiniBand FDR) x 2
credits:                             
gpu by Misha Petrishchev from the Noun Project
Network Switch by Creaticca Creative Agency from the Noun Project
MN-1b 構成
37
8 GPUs x 16 Servers
100 Gps(InfiniBand EDR) x 2
100 Gbps(InfiniBand EDR) x 2
credits:                             
gpu by Misha Petrishchev from the Noun Project
Network Switch by Creaticca Creative Agency from the Noun Project
MN-1a
Total: 512 GPUs (NVIDIA Tesla V100)

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
 
深層学習向け計算機クラスター MN-3
深層学習向け計算機クラスター MN-3深層学習向け計算機クラスター MN-3
深層学習向け計算機クラスター MN-3
 
20180729 Preferred Networksの機械学習クラスタを支える技術
20180729 Preferred Networksの機械学習クラスタを支える技術20180729 Preferred Networksの機械学習クラスタを支える技術
20180729 Preferred Networksの機械学習クラスタを支える技術
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
Hive on Tezのベストプラクティス
Hive on TezのベストプラクティスHive on Tezのベストプラクティス
Hive on Tezのベストプラクティス
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた
 
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
 

Ähnlich wie Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster

PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
Yosuke Onoue
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
Etsuji Nakai
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
Etsuji Nakai
 

Ähnlich wie Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster (20)

CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
kube-system落としてみました
kube-system落としてみましたkube-system落としてみました
kube-system落としてみました
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
GKEで半年運用してみた
GKEで半年運用してみたGKEで半年運用してみた
GKEで半年運用してみた
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
 
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみたKubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
 
Rancher2.3とwindows Containerで作るkubernetesクラスタ
Rancher2.3とwindows Containerで作るkubernetesクラスタRancher2.3とwindows Containerで作るkubernetesクラスタ
Rancher2.3とwindows Containerで作るkubernetesクラスタ
 
EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活
 
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
 
[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門
 
OpenContrailのソースコードを探検しよう!
OpenContrailのソースコードを探検しよう!OpenContrailのソースコードを探検しよう!
OpenContrailのソースコードを探検しよう!
 
Rookの基礎・バージョンアップ
Rookの基礎・バージョンアップRookの基礎・バージョンアップ
Rookの基礎・バージョンアップ
 
Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )Operator reading and writing ( Operator SDK 編 )
Operator reading and writing ( Operator SDK 編 )
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
PGOを用いたPostgreSQL on Kubernetes入門(Open Source Conference 2023 Online/Hokkaido...
 

Mehr von Preferred Networks

Mehr von Preferred Networks (20)

PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
 
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
 
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
 
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
 
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
 
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
 
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
 
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
 
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
 
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
 
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語るKubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
 
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
 
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
 
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
 
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
 
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
Playgram開発秘話_2022年1月プログラミングシンポジウム招待講演_西澤勇輝、岡本雄太
 
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
東北大学 先端技術の基礎と実践_深層学習による画像認識とデータの話_菊池悠太
 
MN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOFMN-3, MN-Core and HPL - SC21 Green500 BOF
MN-3, MN-Core and HPL - SC21 Green500 BOF
 
PFP:材料探索のための汎用Neural Network Potential - 2021/10/4 QCMSR + DLAP共催
PFP:材料探索のための汎用Neural Network Potential - 2021/10/4 QCMSR + DLAP共催PFP:材料探索のための汎用Neural Network Potential - 2021/10/4 QCMSR + DLAP共催
PFP:材料探索のための汎用Neural Network Potential - 2021/10/4 QCMSR + DLAP共催
 

Kürzlich hochgeladen

Kürzlich hochgeladen (10)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster

  • 1. Shingo Omura (@everpeace), Preferred Networks, Inc. Kubernetes Meetup Tokyo #13 2018-09-28 schedulerとdevice-pluginをカスタムし て機械学習ジョブクラスタを 作っている話 1
  • 2. 大村伸吾 (おおむらしんご) • エンジニア, Preferred Networks, Inc. • 社内向けGPUクラスタの開発運用 • Chainerのクラウドでのユーザビリティ向上 • kubeflow/chainer-operator 開発 – ChainerMNによる分散深層学習も single yamlで動きます – 仲間募集中! – v0.3(今月末予定)で正式リリース! • @everpeace (twitter) • shingo.omura (facebook) 2 We’re Hiring!!
  • 3. Shingo Omura KeyNote at July Tech Festa 2018 SlideShare Kubeflow Meetup #1 SlideShare 3
  • 5. 構築・運用: NTT Communications / NTT PC Communications MN-1 5
  • 6. PFN における Kubernetes クラスタ credits:                              gpu by Misha Petrishchev, Cpu Chip by Vectors Market, Memory by Jugalbandi, Network Switch by Creaticca Creative Agency, Webhooks by Paul Dietzel, label by nauraicon, schedule by Pixel Lab from the Noun Project 128 (P100) 512 (V100) 56 Gbps x 2 100 Gbps x 24608 vCore 192 vCore 24 TiB 4 TiB 64 nodes (MN-1b) 16 nodes (MN-1a) (全体では128 node) v1.11.1 NVIDIA/k8s-device-plugin everpeace/k8s-host-device-plugin custom admission webhook custom node feature discovery custom kube -scheduler 6 日々絶賛拡張中 InfiniBand
  • 7. • 息を吸うように分散機械学習 – ChainerMN ➔ GPU, InfiniBand をスケジュールしたい • 日常的なグランドチャレンジ – Preemptionを活用したい • オンプレなのでキャパは有限 – Preemptionを活用したい(長時間のジョブは優先度低) – Preemptionが起きないようにパッキング • 未対応だが将来やりたい – スケジューリングの改善(100人以上で使うので何らかの公平性を) – ギャングスケジューリング(複数のpodを同時にschedule) PFN の Kubernetes クラスタに求められるもの 7 クラスタ全体を専有して ブレイクスルーを目指す実験
  • 8. • 息を吸うように分散機械学習 – ChainerMN ➔ GPU, InfiniBand をスケジュールしたい • 日常的なグランドチャレンジ – Preemption を 活用したい • オンプレなのでキャパは有限 – Preemptionを活用したい & カスタムPreemptionロジック – Preemptionが起きにくいようにパッキング • 未対応だが将来やりたい – スケジューリングの改善(100人以上で使うので何らかの公平性を) – ギャングスケジューリング(複数のpodを同時にschedule) customized kube-schedulercustomized kube-scheduler カスタムしているコンポーネント custom device plugin 8 PriorityClass
  • 10. Kubernetes Device Pluginとは • 本体を変更せずに計算リソースを kubeletにadvertiseする仕組み – Extended Resourceと呼ばれる – 非特権コンテナでデバイス利用可 • v1.8 で 登場 • 現 api バージョンは v1beta1 • 通常DeamonSetでデプロイ • GPU以外にもある(公式ドキュメント) – GPU (Nvidia, AMD, Intel), FPGA (Intel), RDMA devices, etc. # your container spec resources: limits: my-special-device: 1 こんな風にできるようになる # kubectl describe nodes Allocatable: my-special-device: 15 10
  • 11. Kubernetes Device Plugin の制約 • 整数単位のみでの指定 – 0.5 とかは駄目 • overcommit できない – 要 requests == limits • コンテナ同士でシェアはできない • unlimited リソース は 未対応 – capabilityっぽいリソース – dirty hack あり (後述) # your container A resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 # your container B resources: limits: nvidia.com/gpu: 1 別々のGPU 要同値&整数 11
  • 12. ● gRPC on unix socket で通信 ● device id や deviceファイル情報 をやり取り ● kubelet は起動時に --device, -v オプションを つけてコンテナを起動 Kubernetes Device Plugin 動作概要 12 /dev/my0 /dev/my1 /dev/my2 /dev/my3 device-plugin Pod /dev/my0, 1 --device, -v, --env 等のoption付きで起動 kubelet
  • 13. Kubernetes Device Plugin の 動作概要 • design doc, api定義(v1beta1) が詳しい kubelet device plugin gRPC API Action Register ListAndWatch Container起動前 Register ListAndWatch Allocate PreStartContainer kubelet.sock hoge.sock unix socket 主に Register処理 と 2つのAPI を実装する 13
  • 14. Kubernetes Device Plugin: Register kubelet device plugin gRPC API Action Register Registerkubelet.sock unix socket # rpc Register (RegisterRequest) returns (Empty) {} RegisterRequest { version = “v1beta1” endpoint = “/var/lib/kubelet/device-plugin/hoge.socket” ← pluginのsocket名 resource = “my-device-name” ← デバイス名 options = DevicePluginOptions { pre_start_required = true ← Allocate 後に PreStartContainer を呼んでほしいか } } 問題があればエラー が返る 14
  • 15. Kubernetes Device Plugin: ListAndWatch kubelet device plugin gRPC API Action ListAndWatch ListAndWatchhoge.sock unix socket デバイスリストを 更新し続ける # rpc ListAndWatch (Empty) returns (stream ListAndWatchResponse) {} # デバイスの状態が変わったら速やかに全デバイスのリストを再送信 ListAndWatchResponse { devices = [ Device { ID = “GPU-fef8089b-4820-abfc-e83e-94318197576e” ← デバイスのID health = “Healthy” ← Healthy or Unhealthy }, ... ] } 15
  • 16. Kubernetes Device Plugin: Allocate kubelet device plugin gRPC API Action Container起動前 Allocatehoge.sock unix socket デバイスを要求 # rpc Allocate (AllocateRequest) returns (AllocateResponse) AllocateRequest { container_requests = [ ContainerAllocateRequest { deviceIDs = [ “GPU-...”, “GPU-...” ] ← 各コンテナに割り当てたいIDのリスト } ] } 16
  • 17. Kubernetes Device Plugin: Allocate # rpc Allocate (AllocateRequest) returns (AllocateResponse) AllocateResponse { container_responses = [ ContainerAllocateResponse { envs = map( “env_name”: “env_value” ) ← 環境変数 mounts= [ Mount { ← ホストボリュームマウント指定(-v) host_path = “...” mount_path = “...” read_only = true/false } ] devices = [ DeviceSpec { ← ホストデバイスマウント指定(--device) container_path = “/dev/foo” host_path = “/dev/bar” permissions = r / w / m ← r = read, w = write, m = mknod 権限 } ] annotations = map( “key”: “value” ) ← コンテナアノテーション }, ]} 17
  • 18. Kubernetes Device Plugin: PreStartContainer kubelet device plugin gRPC API Action Container起動前 PreStartContainerhoge.sock unix socket # rpc PreStartContainer (PreStartContainerRequest) returns (PreStartContainerResponse) {} PreStartContainerRequest { devicesIDs = [ “GPU-...”, “GPU-...” ] ← 初期化等の前処理をするデバイスIDs } PreStartContainerResponse { } ← レスポンスは中身なし pre_start_required = true の場合のみ呼ばれる 18
  • 19. InfiniBand 用に Unlimited な Extended Resource を擬似的に作る Pod PFN における 自作device plugin (everpeace/k8s-host-device-plugin) 19 everpeace/k8s-host-device-plugin /dev/infiniband/uverbsX kubelet /dev/infiniband/uverbsX /dev/infiniband/rdma_cm /dev/infiniband/rdma_cm ● 特定のdeviceファイルの集合 に 大量 のdummy device IDをつける ● Allocate ではどの ID をリクエストされても 同じDeviceSpecを返す
  • 20. まだまだ発展途上なので注意が必要 • KEP や issueがたくさんあって今後大きく変わる可能性あるかも – KEP-14: New Resource API proposal (kubernetes/community#2265) • ResourceClass の提案 (Volume Classみたいな) • GPUモデルをLabels/Taintsで管理するんじゃなくてもっとちゃんと – KEP-18: Compute Device Assignment (kubernetes/community#2454) • ComputeDevice と ComputeDeviceBind 使ってdevice の bindを表現 • kubeletが保存しているlocal checkpoint(containerとdevice IDの対応)からの脱却 – specify hw devices in container (kubernetes/kubernetes#60748) • Container Spec に hostDevices attributeを追加 20
  • 22. • PodをNodeに割り当てる 責務を担うControl Plane のコンポーネント • kube-schedulerの動作は この2つを読めばほぼ完璧 です – @tkusumi さんの “Kubernetes: スケジューラの動作” – チェシャ猫(@y_taka_23) さんの "猫でもわかるPod Preemption" • 特徴 – schedule policy を 柔軟 にカスタマイズ • toleration, nodeSelector, affinity といった機能はココ – priority による preemption – Extender (Webhook) による拡張 kube-schedulerとは 22
  • 23. Pod Queue (FIFO) kube-schedulerの動作 23 Pod を 1個 Pop 対象ノードを選ぶ ノードに紐づけ プリエンプション (犠牲となるPod群を停止) kube-api 対象ノードがない Bind リソースを作成 犠牲 Pod群 を Delete PodをWatch 注: 対象ノードが選べなかった   時点でPod Statusを更新して キューの最後尾に入る
  • 24. Pod Queue (FIFO) kube-schedulerの動作 24 Pod を 1個 Pop 対象ノードを選ぶ ノードに紐づけ プリエンプション (犠牲になるPod群を停止) kube-api Policy 及び Extender でカスタム可能 Extender でカスタム可能 Extender でカスタム可能 対象ノードがない Bind リソース を作成 犠牲Pod群をDelete PodをWatch
  • 25. 25出展: Kubernetes: スケジューラの動作 - Qiita by tkusumi kube-schedulerの動作: ノードを選ぶ
  • 26. 26出展: Kubernetes: スケジューラの動作 - Qiita by tkusumi kube-schedulerの動作: ノードを選ぶ ● Policyで選べる ● Extenderで独自Predicates ● Policyで選べる ● Extenderで独自ロジック挿せる
  • 27. kube-schedulerの動作: プリエンプション 27 Node 1 Node 2 Node 3 Node 4 候補ノードを選ぶ ● クリティカルな FitError以外の ノード ● 低優先度Podがい るノード Node 2 Node 3 Node 4 犠牲Node&Podを選ぶ 1. 低優先Pod全部犠牲候補にして (抜いてみて) fit するかチェック 2. pdb違反を高優先度から順に fitする限り救済 3. 残りも高優先度から順にfitする 限り救済 4. 残りを犠牲Podsとする Node 2 Node 3 Extenderによる調整 ● 選ばれたノードと犠牲 Podsを受け取って調 整できる ● Victimを完全に選ぶ ことはできない Node 2 Nodeを1つに絞る 下記の順にNodeを絞る 1. PDB違反数最小 2. 最高優先度最小 3. 優先度和最小 4. 犠牲pod数最小 5. ランダム!
  • 28. kube-scheduler のカスタマイズ方法 • 残念ながらほとんどdocumentはない(記事は幾つか存在する ) • コマンドラインオプションは公式ドキュメント に載っている – --config でファイルを渡す形式(--write-config-toでdefault書出し可) – 設定は下記を見ながらyaml, jsonを書くしか無い • kube-scheduler 自体の設定 → KubeSchedulerConfiguration (yaml サンプル) • スケジューリングポリシー(predicates, priorities, extenders, etc.) → Policy (json サンプル) • Extender: ドキュメント(design-doc) – サンプル: everpeace/k8s-scheduler-extender-example • 自分で自由にpredicate, priority, preempt, bind等のロジックを webhookで挿せる – 応用: everpeace/kube-throttler: Throttle CRDを使ってpodのスケジュールをthrottle 28
  • 29. PFNでのカスタム事例 • 寄せて詰めたい (= Greedy な Bin Packing) – podがfitする中で一番空きが少ないところに入れる – MostRequestedPriority を使う • Victim を 自由に選びたい – kube-schedulerが Vicitim Pod を選び、Extenderは調整しか できないので – やむなくforkして実装している(諸事情で現在未デプロイ) • 新バージョンが来たときのrebaseが辛い • Extenderでもうちょっと柔軟にできるようにしてほしい 29
  • 30. まだできていないけどやりたい • キューの改善 – kube-schedulerはFIFO – 色々と既存のアルゴリズムはある • ギャングスケジューリング – 分散学習だとpodを1個ずつscheduleすると簡単にdeadlock が起きる • 機械学習を活用したスケジューリング 30
  • 31. Kubernetes の Scheduler もまだまだ発展途上 • kube-scheduler がものすごく多くのデフォルト機能を実装していて 自作のスケジューラが同じ機能を実装するのが困難なのが実情 • kubernetes-incubator/kube-arbitrator (←やりたいことに近いかも ) – HPC系のスケジューラの機能の実現 – JobQueue, Gang Scheduling, Preemption に対応している – まだまだ絶賛開発中な模様 • 幾つかのスケジューラ系のKEPも存在 – Add scheduling framework design proposal (kubernetes/community#2281) • よりカスタマイズできるように schedulerをframework化 – KEP: Gang scheduling (kubernetes/community#2337) • PodGroup というresourceを導入してGroup単位でschedule 31
  • 33. Icons made by Vincent Le Moign from https://icon-icons.com/ licensed by CC 3.0 BY Thank you for Listening!! Any Questions? 33
  • 35. ギャングスケジューリング • 複数のコンテナ(Pod)を同時にノードにスケジュールする • 分散学習ジョブの場合はギャングスケジューリングでデッドロックを回避できる – Kubernetes: kubernetes-incubator/kube-arbitrator (未デプロイ) 35 Job A Job B Scheduler Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY gpu by Misha Petrishchev from the Noun Project
  • 36. MN-1a 構成 36 Total: 1024 GPUs (NVIDIA Tesla P100) 8 GPUs x 16 Servers 56 Gps(InfiniBand FDR) x 2 56 Gbps(InfiniBand FDR) x 2 credits:                              gpu by Misha Petrishchev from the Noun Project Network Switch by Creaticca Creative Agency from the Noun Project
  • 37. MN-1b 構成 37 8 GPUs x 16 Servers 100 Gps(InfiniBand EDR) x 2 100 Gbps(InfiniBand EDR) x 2 credits:                              gpu by Misha Petrishchev from the Noun Project Network Switch by Creaticca Creative Agency from the Noun Project MN-1a Total: 512 GPUs (NVIDIA Tesla V100)