쿠버네티스를 통한 효율적인 GPU 리소스 공유 (2024)

AI이슈

쿠버네티스를 통한 효율적인 GPU 리소스 공유

AI솔루션 전문기업 2023. 7. 14. 18:41

URL 복사 이웃추가

본문 기타 기능

신고하기

값비싼 GPU를 경제적으로 쓰고 싶지 않으신가요?🤔

여러 사용자가 같은 GPU를 공유해서 경제적으로 쓸 수 있는 방안을 알려드립니다.

쿠버네티스에서 효율적인 GPU리소스 관리에 관심이 있는 클라우드 인프라 엔지니어, 시스템 관리자, 머신러닝 엔지니어, 데이터 사이언티스트 분들이 계시다면 이 포스팅을 주목해주세요!

AI, 클라우드 그리고 GPU: 쿠버네티스가 GPU를 관리하는 방법

요즘 AI와 클라우드 컴퓨팅의 발전으로 GPU가 중요한 역할을 하고 있습니다. GPU는 과거에는 게임이나 그래픽 처리를 위해 사용되었지만, 현재는 AI학습, 빅데이터 분석, 복잡한 수치 계산 등 다양한 분야에서 활용되고 있습니다. GPU 연산자원은 상대적으로 고가의 장비이기 때문에 클러스터 환경에서는 다수의 사용자를 위한 GPU 자원의 효율적인 관리가 중요합니다.

그럼 어떻게 이런 GPU자원을 관리하고, 효율적으로 분배하고 있을까요? 특히! 쿠버네티스 같은 컨테이너 오케스트레이션 플랫폼에서는 어떻게 GPU자원을 관리하고 있는지 궁금하신 분들도 많을텐데요, 그 방법과 그 안에서 발생하는 문제점들을 알아보도록 하겠습니다.

1. 쿠버네티스의 GPU 관리

우리가 사용하는 PC나 서버는 CPU, 메모리, 디스크 등 다양한 장치들을 가지고 있습니다. 이 중 GPU도 하나의 중요한 자원이죠. 쿠버네티스는 어떻게 이런 장치들을 관리하고 있을까요?

쿠버네티스는 디바이스 플러그인을 통해 각 노드의 장치를 관리합니다. 디바이스 플러그인은 노드 내 설치된 장치의 상태를 확인하고 정상 상태인 장치의 수를 세어 이를 쿠버네티스에 전달합니다. 쿠버네티스는 이 정보를 통해 각 노드에서 사용 가능한 장치를 확인할 수 있습니다.

GPU 장치도 동일한 방식으로 관리됩니다. GPU 장치가 서버 내 두 개가 있으면, 파드 2개만 이 GPU를 동시에 쓸 수 있는 것이죠! 사용자가 요청한 작업이 해당 GPU의 자원을 모두 쓸 수 있다면 괜찮겠지만, GPU자원을 모두 쓰지 않는 간단한 작업이라면 자원 낭비가 매우 크게 발생합니다 😥

2. GPU공유: 더치페이로 GPU쓰기

이 문제를 해결하기 위해 최근에는 GPU의 메모리 크기를 별도의 자원으로 명시하여, GPU를 공유하는 방안들이 제시되었습니다. 이를 위해 쿠버네티스는 노드가 RTX 3090 GPU 1대를 가지고 있는 경우, "이 노드는 GPU 1대를 가지고 있다"가 아닌 "이 노드는 GPU 메모리 24GB를 가지고 있다"라고 노드 내 자원을 명세하게 됩니다. 이렇게 자원을 명세하게 되면 노드는 메모리 단위로 GPU를 분할하여 할당을 시킬 수 있게 됩니다.

예를 들어, 노드 하나에 24GB를 가진 RTX 3090 2대가 설치된 경우를 가정해보겠습니다.

쿠버네티스의 장치 관리 방식을 기반으로 GPU의 메모리를 별도의 자원으로 정의하게 될 경우, 쿠버네티스는 두 GPU 메모리의 합인 48GB로 이 노드가 가진 메모리 크기를 정의합니다.

"이 노드는 GPU 메모리 48GB를 가지고 있다"로 노드 내 자원을 규정합니다. 이러한 자원 정의 방식은 "이 노드에 있는 GPU 장치 중 하나인 RTX 3090는 24GB의 메모리를 가지고 있다"는 사실을 알려주지 않습니다.

즉, 쿠버네티스는 GPU 메모리 자원의 양을 알지만, 이 메모리 자원이 어떤 GPU에 존재하는지 알 수 없죠

그럼, 이 문제를 해결하기 위해

이번에는 각 장치 별 메모리를 별도의 자원으로 정의해보겠습니다.

이 경우, "노드 내 GPU0 메모리 자원의 크기는 24GB이고, GPU1 메모리 자원의 크기는 24GB이다"와 같이 노드 내 자원이 규정됩니다. 이 경우에는 노드 내 자원 정의에는 문제가 없지만, 파드 요청시 문제가 생깁니다.

자원 할당을 위해 파드의 자원 스펙은 "GPU1번 자원의 4GB를 할당해줘"와 같이 정의됩니다. 그러나 이는 이상한 요청입니다. 🤔

왜냐하면, 이 요청 정보에는 파드가 실제로 원하는 자원인 "GPU 메모리 4GB"외에도, 클러스터 자원 구성을 알지 못하면 요청할 수 없는 정보인 "GPU1번"이 포함되기 때문입니다.

3. 알뜰한 GPU 활용을 위한 GPU 공유 스케줄러 개발

앞서 설명한 것처럼, 쿠버네티스의 기본적인 자원 관리 방식으로는 GPU 장치를 공유의 구현이 어렵습니다. 이를 해결하기 위해 써로마인드의 GPU 공유 스케줄러는 클래스의 개념을 빌려 GPU를 정의합니다.

여기서 말하는 클래스란, 우리가 알고 있는, 즉 객체지향 프로그래밍에서 익히 들어본 클래스의 개념입니다. GPU자원은 메모리와 연산처리량을 가진 클래스로 정의됩니다. 프로세스가 GPU자원에 할당되면 가용 가능한 메모리와 연산처리량이 줄어들고, 반대의 경우 가용 가능한 자원량이 늘어납니다. 이런 과정은 GPU 자원 클래스가 가지는 메소드(행위)로 정의할 수 있습니다.

이러한 GPU 클래스를 통해 생성된 각 GPU 객체는 노드 내 각 GPU 장치의 메모리 사용량을 관리합니다. 각 GPU 객체들이 가지고 있는 메모리 사용량은 스케쥴링 및 파드 이벤트에 따라 변화되기 때문에 상황에 따라 파드를 스케쥴링 할 수 있습니다.

4. 아직 해결되지 않은 과제들

할당된 메모리 사용량과 파드의 실제 메모리 사용량의 차이

만약 이 단계까지 완료되었다면, "기능상"으로는 쿠버네티스에서 GPU를 나눠서 사용할 수 있습니다. 그러나 실제로 활용하려면, 파드가 요청한 메모리량보다 파드에서 실제로 사용하는 GPU 메모리량이 낮아야 합니다.

문제는, 이 정보는 파드에서 실행되는 작업의 GPU 메모리 사용량을 프로파일링 하지 않으면 알 수 없다는 점입니다. 이 정보를 알지 못하고, 모든 파드에 할당되는 메모리 크기를 고정된 크기로 지정한다면 어떻게 될까요?

위 그림과 같이, 메모리 낭비가 크게 발생하거나, 어떤 경우에는 OOM 오류가 발생하여 요청한 파드가 실행되지 않을 수 있습니다.

동일한 GPU에 여러 작업이 할당된 경우의 간섭 문제

GPU에 여러 작업이 할당되면, 각 작업들은 서로에게 영향을 줄 수 있습니다. 따라서, 클러스터에서 GPU 자원을 공유하는 파드들은 가능한 한 분산 배치되어야 합니다. 아래 결과는 RTX 3090와 RTX 3090 TI에서 테스트한 결과인데, 추론 응답시간이 선형적으로 증가하는 것을 확인할 수 있습니다.

자원 격리의 문제

이런 방식으로 스케쥴링 하더라도 이는 논리적인 격리일 뿐입니다. 따라서, 파드에서 실행되는 작업이 할당된 메모리보다 많은 메모리를 사용하면, 이를 막을 방법이 없습니다. 이 문제를 해결하기 위해서는 KubeShare나 Alibaba Cloud(Aliyun)의 cGPU와 같은 GPU자원격리 기술이 필요합니다.

그러나 KubeShare의 경우 CUDA, cuDNN 라이브러리를 로드할 때 소비하는 컨텍스트 메모리 정보를 알 수 없으며, cGPU는 Aliyun에서만 사용 가능합니다.

GaiaGPU에서는 격리 기능을 제공하지만, 이는 NVIDIA Tesla GPU에서 제공하는 vGPU를 활용한 것이므로 RTX GPU로 구성된 클러스트에서는 GPU 자원의 격리가 어려울 수 있습니다.

요약

  1. 쿠버네티스는 컴퓨터의 장치들을 관리하며, 그 중 하나인 GPU는 한 번의 하나의 작업만 할당할 수 있습니다.

  2. GPU를 여러 작업이 공유하도록 하는 것은 어렵고, 이를 해결하기 위해 제안된 방법 중 하나는 GPU 메모리 크기를 별도의 자원으로 명시하는 것입니다.

하지만, 여러 GPU가 하나의 노드에 있는 경우 문제를 일으킵니다.

3. 이 문제를 해결하기 위해, 써로마인드는 GPU를 클래스로 정의하고, 이를 이용해 각 GPU의 메모리 사용량을 관리하는 스케쥴러를 구현하였습니다.

Reference:

1. Kubernetes. (n.d.). Device Plugins. Retrieved June 29, 2023, from https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/

2. Yeh, T. A., Chen, H. H., & Chou, J. (2020). Kubeshare: A framework to manage GPUs as first-class and shared resources in container cloud. In Proceedings of the 29th international symposium on high-performance parallel and distributed computing.

3. Gu, J., Zhu, Y., Zhang, Z., & Gong, Y. (2018). GaiaGPU: sharing GPUs in container clouds. In 2018 IEEE Intl Conf on Parallel & Distributed Processing with Applications, Ubiquitous Computing & Communications, Big Data & Cloud Computing, Social Computing & Networking, Sustainable Computing & Communications (ISPA/IUCC/BDCloud/SocialCom/SustainCom). IEEE.

4. Alibaba Cloud. (n.d.). Use cGPU to achieve GPU sharing based on multiple GPUs. Retrieved June 29, 2023, from **https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/use-cgpu-to-achieve-gpu-sharing-based-on-multiple-gpus**

공감이 글에 공감한 블로거 열고 닫기

댓글3 이 글에 댓글 단 블로거 열고 닫기

인쇄

쿠버네티스를 통한 효율적인 GPU 리소스 공유 (2024)
Top Articles
Latest Posts
Article information

Author: Moshe Kshlerin

Last Updated:

Views: 6140

Rating: 4.7 / 5 (77 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Moshe Kshlerin

Birthday: 1994-01-25

Address: Suite 609 315 Lupita Unions, Ronnieburgh, MI 62697

Phone: +2424755286529

Job: District Education Designer

Hobby: Yoga, Gunsmithing, Singing, 3D printing, Nordic skating, Soapmaking, Juggling

Introduction: My name is Moshe Kshlerin, I am a gleaming, attractive, outstanding, pleasant, delightful, outstanding, famous person who loves writing and wants to share my knowledge and understanding with you.