그냥 코드단위로 스케줄러 변경
HTTP로 추가적인 프로세스를 실행시켜 filtering과 scoring을 진행한다.
여러개의 custom scheduler를 만들어서 pod마다 다른 scheduler를 실행시킬 수 있다.
scheduling 과정에 있는 여러 개의 plugin들을 추가/제거해 filtering과 scoring 방식을 바꿀 뿐만 아니라 pod queue에 정렬되는 기준들을 변경할 수도 있다.
Custom logic을 만들어서 affinity label등을 추가할 수 있다.
초기의 custom scheduler들은 2017년에 나왔다. 걑은 종류의 자원을 두고 경쟁하는 pod들에 대해 QoS(Quality of Service) class를 제공해서 자원 할당 정도를 조정하는 것 등이 나왔다.
2019년에 나온 custom scheduler는 GPU sharing을 구현하고 utilization 정도를 올리기 위해 scheduler를 제작하였다.
2019년 이후부터는 크게 두 분류의 custom scheduler가 개발됐다. 첫 번째는 fog/edge computing을 지원해주는 custom scheduler를 개발했다. 기존의 K8s scheduler는 fog/edge의 노드들에 대한 topology를 신경쓰지 않았기 때문에 이것을 지원하기 위한 scheduler를 개발했다.
두 번째는 GPT-2나 GPT-3등의 NLP 기반 작업에서 효율성을 높이는 방향으로 custom scheduler를 개발하였다.
Interference and colocation : 같은 resource를 사용하는 multiple workload를 한 노드에 넣으면 resource conflict가 일어난다.
QoS support 부족 : CPU, memory, local storage등의 resource는 scheduling시 고려되지만, network bandwidth에 대한 고려는 이루어지지 않고 있다.
Topology-awareness : edge/fog 상에서 node들 간의 topology가 고려되지 않는 scheduling은 latency를 증가시킨다. 예를 들어 연결되는 작업을 하는 두 pod이 먼 node상에 있을 경우 통신시간이 증가한다.
No support for co-scheduling : 연결된 작업을 하는 여러 pod의 그룹들을 scheduling할 때 동시에 하지 못하고 하나하나씩 차례로 scheduling해야 한다. 따라서 마지막 pod이 스케줄링되지 전까지 작업을 시작하지 못한다.
No support for batch scheduling : batch scheduling이 없기 때문에 multi-priority queuing, fairness, and advanced preemption, multiple schedulers 등으로 대신하고 있다.
No support for data locality awareness : data locality를 인식하도록 개선이 필요하다.
Lack of real load awareness : pod이 스케줄링될 때 request만큼의 여유 resource를 가진 node로 할당되는데, 이 때 실행중인 pod의 resource 소비량은 실제 소비량이 아닌 해당 pod들의 request를 기준으로 계산된다. 따라서 실제 사용량을 기준으로 계산하면 더 효율적인 resource 사용이 가능해진다.
GPU sharing : GPU의 할당량은 정수로밖에 지원되지 않으므로, custom scheduler를 만들어서 여러 pod들이 한 GPU를 사용할 수 있도록 custom scheduler를 개발할 수 있다.
환경을 보존하자!
scheduler의 특징은 다음으로 나눌 수 있다.
Objective : 앞에서 본 3개
Target environment : cloud 환경인지, 아니면 edge/fog 환경인지 나누고, cloud라면 ML/DL 위주인지 체크한다.
Target workloads
(1) AI/ML 환경에서 training or inference
(2) Serverless 환경
(3) Big data Analytics
(4) Stateful apps (ex. DB)
(5) Virtual network functions
(6) Network intensive
(7) Delay sensitive
(8) Heterogeneous
어떤 operation을 건들지
(1) Sorting
(2) Filtering
(3) Scoring
custom 방식
(1) 앞에서 본 5개
성능 평가 방식
(1) Real Cluster
(2) Simulator
(3) None
workload들이 같은 자원을 두고 경쟁하지 못하도록 scheduling하는 것을 목표로 한다.
출처 - Deep Learning-based Job Placement in Distributed
Machine Learning Clusters
출처 - Towards GPU Utilization Prediction for Cloud Deep Learning
Kubernetes에서는 network를 자원의 단위로 간주하지 않으므로 NBW guard라는 network bandwidth 관리 system를 추가한다. NBW guard는 Linux 기반의 network management tool을 사용해서 traffic을 제한한다. 즉 network bandwidth를 할당해줌으로써 pod의 traffic이 특정 수치를 넘지 않도록 조절한다.
Remote DMA(네트워크 상에서 사용되는 DMA)를 관여한다. pod에서 RDMA bandwidth에 대한 request와 limit을 설정하도록 한다. 그리고 한 pod에서 multiple RDMA interface가 할당될 수 있도록 한다. 이를 통해 data transfer의 bandwidth를 조절할 수 있다.
latency-sensitive하고 data-intensive한 edge/fog 환경에서 실시간의 network status 정보를 확인하기 위해서 network-aware-scheduler(NAS)를 개발한다. NAS 상에서 fog에 해당하는 노드는 RTT(round trip time, 패킷 왕복 시간)으로 labeling된다. 또한 available bandwidth를 설정해서 노드에서 할당 가능한 대역폭을 넘기면 filtering시키는 과정을 거친다.
edge/fog에 제한되는 내용이므로 넘어가자.
Serverless workload상에서는 여러 개의 pod이 스케줄링될 때 각 부분의 이미지를 가지는 pod들에 대해서(ex. replicaset등을 말하는것 같다) 노드 탐색을 반복적으로 수행하므로 overhead가 발생한다. 따라서 동일한 이미지를 가지는 pod들을 한번에 스케줄링하는 방식을 사용하면 시간이 절약된다.
Kubernetes의 베타 기능으로 SIG(Special Interest Group)이 있다. pod spec에서 pod이 속한 group을 지정하고 pod 그룹의 우선순위를 비교해서 ready queue에서 정렬작업을 한다.
multi-tenant 클라우드 환경에서 tenant간의 fairness를 보장해야 한다. Kube-batch에서는 fairness 보장 수단이 DRF(Domain Resource Fariness)밖에 존재하지 않으므로, 저자는 Kube-sphere라는 demand-aware와 demand-DRF-aware 2개를 추가로 고려하는 custom scheduler를 제작한다. demand-aware의 경우 많은 resource를 요구하는 유저를 우선하고, demand-DRF-aware는 starvation을 막기 위해 유저의 demand와 dominant resource share를 둘다 고려한다.
두가지의 scheduler를 제안한다. 첫번째는 busy hour에 사용하는, resource requirements를 기반으로 한 queue sorting을 사용해서 fragmentation 문제를 완화한다. 두번째는 GPU-intensive 작업을 위해 사용하는데, 그들의 waiting time과 estimated running time을 잘 고려해서 priority를 동적으로 조절한다.
Kube-batch는 AL/ML 등의 데이터와 CPU 작업이 많이 필요한 작업들을 위해 batch 스케줄링을 목료로 한다. Kube-batch는 다양한 우선순위 class들과 gang scheduling을 지원하며, Kubeflow나 Volcano등에서 사용한다. Apache Yunikorn는 YARN을 같이 사용해서 batch-scheduling을 지원하는 tool이다. stateless workload + statedful service같은 혼합된 workload를 사용가능하게 할 수 있다. hierarchical resource queues, multi-policy job queuing를 사용해서 fairness를 개선하는 한편 scheduling throughput을 향상시킬 수 있다.
gang scheduling이란? 한 process의 여러 thread들을 따로따로 CPU에 실행시킴. pararell programming에서 사용 가능하다.
pod을 scheduling할 때 reqeust값이 아닌 실제 사용량을 기반으로 scheduling plan을 만든다.
edge-computing 환경에서 실시간의 resource consumption을 기반으로 scheduling한다. 실시간의 scheduling 정보(ex. load, temperature, liveness)등을 node로부터 모은 후 node score를 계산해서 schdeuling한다.
modified PSO(particle swarm optimization) 알고리즘을 사용해 scheduling한다. node의 사용량을 CPU와 memory 뿐만 아니라 affinity를 가지고 계산한다.
IBM에서 개발된 Trimaran이라는 load-aware scheduler plugin이 있다. 이 plugin은 pod resource의 request와 실제 사용량 사이의 불일치를 탐지하는데, 이것에 TargetLoadPacking와 LoadVariationRiskBalancing라는 두 가지 plugin을 사용한다. TargetLoadPacking는 각 node에서 실제 resource 사용량을 기준으로 점수를 매긴다.
LoadVariationRiskBalancing는 자원 사용의 평균과 표준편차를 구해서 점수를 매긴다.
Intel에서는 실시간의 telemetry 정보를 이용하는 TAS(Telemetry-aware scheduler)를 사용한다. 이 scheduler에서는 extender mechanism을 사용해 node의 power, CPU, memory등의 사용량을 체크한다.
GAIA는 GPU sharing을 제안한 scheduler이다. GPU cluster를 communication cost를 기반으로 tree 구조로 설계하고 얼마나 사용중인지의 상태를 표시한다. GAIA에서는 이 tree 구조에서 얼마나 GPU를 할당해줄 것인지 확인한다. 그리고 GAIA에서는 device plugin을 사용해서 GPU를 fractional한 virtual GPU들로 나눌 수 있다.
pod이 필요한 GPU 사용량보다 적은 GPU를 가진 node은 filtering한다. GPU 할당을 CPU와 memory처럼 하기 위해 두 개의 Custom Resource를 개발하는데, RESOURCE-MEM은 사용 가능한 VRAM의 크기이고 RESOURCE-COUNT는 사용 가능한 GPU의 수이다. 그리고 NVIDIA device plugin을 사용해서 GPU를 kubelet에서 인지하도록 한다.
KubeShare라는 프레임워크로 GPU sharing을 제안한다. SharePod이라는 Custom Resource를 제안하고, vGPU라는 custom shared device를 붙인다. 그리고 vGPU를 적절하게 continaer에 붙여주는 KubeShare-Sched와 vGPU pool을 관리하는 KubeShare-DevMgr라는 Custom controller를 만든다.
어떤 작업이 CPU나 GPU에서 둘 다 수행 가능할 경우, CPU를 할당받을 때와 GPU를 할당받을 때의 예상 완료 시간을 비교해 더 나은 쪽으로 자원을 할당해준다.
새로운 알고리즘 사용하기
SpeCon이라는 scheduler는 DL training의 application specefic의 효율성을 높이기 위해 제안되었다. DL 작업의 여러 단계들은 각각 자원의 필요량이 차이가 난다. 따라서 DL 작업을 progressing, watching, converge 3분류로 나눈다. 작업 속도가 느린 단계에서 리소스를 빼와서 작업 속도가 빠른 단계에 집중시킨다. 이로부터 DL 수행시간을 줄일 수 있다.
Prediction을 사용해서 CPU노드와 GPU노드 모두에 대한 작업 소요시간을 예상한다. Prediction은 instrcution수, floating point 계산수, 사용하는 resource량 등으로 예측하고, workload들의 우선순위를 조절하고 더 적절한 노드에 할당한다.
Annotation, Label, Extended Resource, CRD, Device Plugin을 추가해서 스케줄러를 확장할 수 있다.