@@ -8,50 +8,46 @@ description: 클러스터의 노드별로 리소스로 사용할 GPU를 구성
88
99<!-- overview -->
1010
11- {{< feature-state state="beta" for_k8s_version="v1.10" >}}
12-
13- 쿠버네티스는 AMD 및 NVIDIA GPU(그래픽 프로세싱 유닛)를 노드들에 걸쳐 관리하기 위한 ** 실험적인**
14- 지원을 포함한다.
15-
16- 이 페이지는 여러 쿠버네티스 버전에서 사용자가 GPU를 활용할 수 있는 방법과
17- 현재의 제약 사항을 설명한다.
18-
11+ {{< feature-state state="stable" for_k8s_version="v1.26" >}}
1912
13+ 쿠버네티스는 {{< glossary_tooltip text="디바이스 플러그인" term_id="device-plugin" >}}을 사용하여
14+ AMD 및 NVIDIA GPU(그래픽 프로세싱 유닛)를 여러 노드들에 걸쳐 관리하기 위한
15+ ** 안정적인** 지원을 포함한다.
2016
17+ 이 페이지는 사용자가 GPU를 활용할 수 있는 방법과,
18+ 몇 가지 제한 사항에 대하여 설명한다.
2119
2220<!-- body -->
2321
2422## 디바이스 플러그인 사용하기
2523
26- 쿠버네티스는 {{< glossary_tooltip text="디바이스 플러그인" term_id="device-plugin" >}}을 구현하여
27- 파드가 GPU와 같이 특별한 하드웨어 기능에 접근할 수 있게 한다.
24+ 쿠버네티스는 디바이스 플러그인을 구현하여 파드가 GPU와 같이 특별한 하드웨어 기능에 접근할 수 있게 한다.
25+
26+ {{% thirdparty-content %}}
2827
2928관리자는 해당하는 하드웨어 벤더의 GPU 드라이버를 노드에
3029설치해야 하며, GPU 벤더가 제공하는 디바이스 플러그인을
31- 실행해야 한다.
30+ 실행해야 한다. 다음은 몇몇 벤더의 지침에 대한 웹페이지이다.
3231
33- * [ AMD] ( #amd-gpu-디바이스-플러그인-배치하기 )
34- * [ NVIDIA] ( #nvidia-gpu-디바이스-플러그인-배치하기 )
32+ * [ AMD] ( https://github.com/RadeonOpenCompute/k8s-device-plugin#deployment )
33+ * [ Intel] ( https://intel.github.io/intel-device-plugins-for-kubernetes/cmd/gpu_plugin/README.html )
34+ * [ NVIDIA] ( https://github.com/NVIDIA/k8s-device-plugin#quick-start )
3535
36- 위의 조건이 만족되면, 쿠버네티스는 ` amd.com/gpu ` 또는
37- ` nvidia.com/gpu ` 를 스케줄 가능한 리소스로써 노출시킨다.
36+ 플러그인을 한 번 설치하고 나면, 클러스터는 ` amd.com/gpu ` 또는 ` nvidia.com/gpu ` 를 스케줄 가능한 리소스로써 노출시킨다.
3837
39- 사용자는 이 GPU들을 ` cpu ` 나 ` memory ` 를 요청하는 방식과 동일하게
40- ` <vendor>.com/gpu ` 를 요청함으로써 컨테이너에서 활용할 수 있다.
41- 그러나 GPU를 사용할 때는 리소스 요구 사항을 명시하는 방식에 약간의
42- 제약이 있다.
38+ 사용자는 이 GPU들을 ` cpu ` 나 ` memory ` 를 요청하는 방식과 동일하게
39+ GPU 자원을 요청함으로써 컨테이너에서 활용할 수 있다.
40+ 그러나 리소스의 요구 사항을 명시하는 방식에
41+ 약간의 제약이 있다.
4342
44- - GPU는 ` limits ` 섹션에서만 명시되는 것을 가정한다. 그 의미는 다음과 같다.
45- * 쿠버네티스는 limits를 requests의 기본 값으로 사용하게 되므로
46- 사용자는 GPU ` limits ` 를 명시할 때 ` requests ` 명시하지 않아도 된다.
47- * 사용자는 ` limits ` 과 ` requests ` 를 모두 명시할 수 있지만, 두 값은
48- 동일해야 한다.
49- * 사용자는 ` limits ` 명시 없이는 GPU ` requests ` 를 명시할 수 없다.
50- - 컨테이너들(그리고 파드들)은 GPU를 공유하지 않는다. GPU에 대한 초과 할당(overcommitting)은 제공되지 않는다.
51- - 각 컨테이너는 하나 이상의 GPU를 요청할 수 있다. GPU의 일부(fraction)를 요청하는 것은
52- 불가능하다.
43+ GPU는 ` limits ` 섹션에서만 명시되는 것을 가정한다. 그 의미는 다음과 같다.
44+ * 쿠버네티스는 limits를 requests의 기본 값으로 사용하게 되므로
45+ 사용자는 GPU ` limits ` 를 명시할 때 ` requests ` 명시하지 않아도 된다.
46+ * 사용자는 ` limits ` 과 ` requests ` 를 모두 명시할 수 있지만, 두 값은
47+ 동일해야 한다.
48+ * 사용자는 ` limits ` 명시 없이는 GPU ` requests ` 를 명시할 수 없다.
5349
54- 다음은 한 예제를 보여준다.
50+ 다음은 GPU를 요청하는 파드에 대한 예제 매니페스트를 보여준다.
5551
5652``` yaml
5753apiVersion : v1
@@ -61,81 +57,12 @@ metadata:
6157spec :
6258 restartPolicy : OnFailure
6359 containers :
64- - name : cuda-vector-add
65- # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
66- image : " registry.k8s.io/cuda-vector-add:v0.1"
60+ - name : example-vector-add
61+ image : " registry.example/example-vector-add:v42"
6762 resources :
6863 limits :
69- nvidia.com/gpu : 1 # GPU 1개 요청하기
70- ` ` `
71-
72- ### AMD GPU 디바이스 플러그인 배치하기
73-
74- [공식 AMD GPU 디바이스 플러그인](https://github.com/RadeonOpenCompute/k8s-device-plugin)에는
75- 다음의 요구 사항이 있다.
76-
77- - 쿠버네티스 노드들에는 AMD GPU 리눅스 드라이버가 미리 설치되어 있어야 한다.
78-
79- 클러스터가 실행 중이고 위의 요구 사항이 만족된 후, AMD 디바이스 플러그인을 배치하기 위해서는
80- 아래 명령어를 실행한다.
81- ` ` ` shell
82- kubectl create -f https://raw.githubusercontent.com/RadeonOpenCompute/k8s-device-plugin/v1.10/k8s-ds-amdgpu-dp.yaml
83- ```
84-
85- [ RadeonOpenCompute/k8s-device-plugin] ( https://github.com/RadeonOpenCompute/k8s-device-plugin ) 에 이슈를 로깅하여
86- 해당 서드 파티 디바이스 플러그인에 대한 이슈를 리포트할 수 있다.
87-
88- ### NVIDIA GPU 디바이스 플러그인 배치하기
89-
90- 현재는 NVIDIA GPU에 대한 두 개의 디바이스 플러그인 구현체가 있다.
91-
92- #### 공식 NVIDIA GPU 디바이스 플러그인
93-
94- [ 공식 NVIDIA GPU 디바이스 플러그인] ( https://github.com/NVIDIA/k8s-device-plugin ) 은
95- 다음의 요구 사항을 가진다.
96-
97- - 쿠버네티스 노드에는 NVIDIA 드라이버가 미리 설치되어 있어야 한다.
98- - 쿠버네티스 노드에는 [ nvidia-docker 2.0] ( https://github.com/NVIDIA/nvidia-docker ) 이 미리 설치되어 있어야 한다.
99- - Kubelet은 자신의 컨테이너 런타임으로 도커를 사용해야 한다.
100- - 도커는 runc 대신 ` nvidia-container-runtime ` 이 [ 기본 런타임] ( https://github.com/NVIDIA/k8s-device-plugin#preparing-your-gpu-nodes ) 으로
101- 설정되어야 한다.
102- - NVIDIA 드라이버의 버전은 조건 ~ = 384.81을 만족해야 한다.
103-
104- 클러스터가 실행 중이고 위의 요구 사항이 만족된 후, NVIDIA 디바이스 플러그인을 배치하기 위해서는
105- 아래 명령어를 실행한다.
106-
107- ``` shell
108- kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
109- ```
110-
111- [ NVIDIA/k8s-device-plugin] ( https://github.com/NVIDIA/k8s-device-plugin ) 에 이슈를 로깅하여
112- 해당 서드 파티 디바이스 플러그인에 대한 이슈를 리포트할 수 있다.
113-
114- #### GCE에서 사용되는 NVIDIA GPU 디바이스 플러그인
115-
116- [ GCE에서 사용되는 NVIDIA GPU 디바이스 플러그인] ( https://github.com/GoogleCloudPlatform/container-engine-accelerators/tree/master/cmd/nvidia_gpu ) 은
117- nvidia-docker의 사용이 필수가 아니며 컨테이너 런타임 인터페이스(CRI)에
118- 호환되는 다른 컨테이너 런타임을 사용할 수 있다. 해당 사항은
119- [ 컨테이너에 최적화된 OS] ( https://cloud.google.com/container-optimized-os/ ) 에서 테스트되었고,
120- 우분투 1.9 이후 버전에 대한 실험적인 코드를 가지고 있다.
121-
122- 사용자는 다음 커맨드를 사용하여 NVIDIA 드라이버와 디바이스 플러그인을 설치할 수 있다.
123-
124- ``` shell
125- # 컨테이너에 최적회된 OS에 NVIDIA 드라이버 설치:
126- kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/daemonset.yaml
127-
128- # 우분투에 NVIDIA 드라이버 설치(실험적):
129- kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/ubuntu/daemonset.yaml
130-
131- # 디바이스 플러그인 설치:
132- kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.14/cluster/addons/device-plugins/nvidia-gpu/daemonset.yaml
133- ```
134-
135- [ GoogleCloudPlatform/container-engine-accelerators] ( https://github.com/GoogleCloudPlatform/container-engine-accelerators ) 에 이슈를 로깅하여
136- 해당 서드 파티 디바이스 플러그인에 대한 이슈를 리포트할 수 있다.
137-
138- Google은 GKE에서 NVIDIA GPU 사용에 대한 자체 [ 설명서] ( https://cloud.google.com/kubernetes-engine/docs/how-to/gpus ) 를 게재하고 있다.
64+ gpu-vendor.example/example-gpu : 1 # 1 GPU 요청
65+ ` ` `
13966
14067## 다른 타입의 GPU들을 포함하는 클러스터
14168
@@ -147,10 +74,13 @@ Google은 GKE에서 NVIDIA GPU 사용에 대한 자체 [설명서](https://cloud
14774
14875` ` ` shell
14976# 노드가 가진 가속기 타입에 따라 레이블을 단다.
150- kubectl label nodes < node-with-k 80> accelerator=nvidia-tesla-k80
151- kubectl label nodes < node-with-p 100> accelerator=nvidia-tesla-p100
77+ kubectl label nodes node1 accelerator=example-gpu-x100
78+ kubectl label nodes node2 accelerator=other-gpu-k915
15279```
15380
81+ ` accelerator ` 레이블 키를 ` accelerator ` 로 지정한 것은 그저 예시일 뿐이며,
82+ 선호하는 다른 레이블 키를 사용할 수 있다.
83+
15484## 노드 레이블링 자동화 {#node-labeller}
15585
15686만약 AMD GPU 디바이스를 사용하고 있다면,
@@ -179,19 +109,18 @@ kubectl describe node cluster-node-23
179109```
180110
181111```
182- Name: cluster-node-23
183- Roles: <none>
184- Labels: beta.amd.com/gpu.cu-count.64=1
185- beta.amd.com/gpu.device-id.6860=1
186- beta.amd.com/gpu.family.AI=1
187- beta.amd.com/gpu.simd-count.256=1
188- beta.amd.com/gpu.vram.16G=1
189- beta.kubernetes.io/arch=amd64
190- beta.kubernetes.io/os=linux
191- kubernetes.io/hostname=cluster-node-23
192- Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
193- node.alpha.kubernetes.io/ttl: 0
194- …
112+ Name: cluster-node-23
113+ Roles: <none>
114+ Labels: beta.amd.com/gpu.cu-count.64=1
115+ beta.amd.com/gpu.device-id.6860=1
116+ beta.amd.com/gpu.family.AI=1
117+ beta.amd.com/gpu.simd-count.256=1
118+ beta.amd.com/gpu.vram.16G=1
119+ kubernetes.io/arch=amd64
120+ kubernetes.io/os=linux
121+ kubernetes.io/hostname=cluster-node-23
122+ Annotations: node.alpha.kubernetes.io/ttl: 0
123+ …
195124```
196125
197126노드 레이블러가 사용된 경우, GPU 타입을 파드 스펙에 명시할 수 있다.
@@ -210,9 +139,14 @@ spec:
210139 resources :
211140 limits :
212141 nvidia.com/gpu : 1
213- nodeSelector :
214- accelerator : nvidia-tesla-p100 # 또는 nvidia-tesla-k80 등.
142+ affinity :
143+ nodeAffinity :
144+ requiredDuringSchedulingIgnoredDuringExecution :
145+ nodeSelectorTerms :
146+ – matchExpressions :
147+ – key : beta.amd.com/gpu.family.AI # Arctic Islands GPU family
148+ operator : Exist
215149` ` `
216150
217- 이것은 파드가 사용자가 지정한 GPU 타입을 가진 노드에 스케줄 되도록
151+ 이것은 사용자가 지정한 GPU 타입을 가진 노드에 파드가 스케줄 되도록
218152만든다.
0 commit comments