@@ -8,50 +8,46 @@ description: 클러스터의 노드별로 리소스로 사용할 GPU를 구성
8
8
9
9
<!-- overview -->
10
10
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" >}}
19
12
13
+ 쿠버네티스는 {{< glossary_tooltip text="디바이스 플러그인" term_id="device-plugin" >}}을 사용하여
14
+ AMD 및 NVIDIA GPU(그래픽 프로세싱 유닛)를 여러 노드들에 걸쳐 관리하기 위한
15
+ ** 안정적인** 지원을 포함한다.
20
16
17
+ 이 페이지는 사용자가 GPU를 활용할 수 있는 방법과,
18
+ 몇 가지 제한 사항에 대하여 설명한다.
21
19
22
20
<!-- body -->
23
21
24
22
## 디바이스 플러그인 사용하기
25
23
26
- 쿠버네티스는 {{< glossary_tooltip text="디바이스 플러그인" term_id="device-plugin" >}}을 구현하여
27
- 파드가 GPU와 같이 특별한 하드웨어 기능에 접근할 수 있게 한다.
24
+ 쿠버네티스는 디바이스 플러그인을 구현하여 파드가 GPU와 같이 특별한 하드웨어 기능에 접근할 수 있게 한다.
25
+
26
+ {{% thirdparty-content %}}
28
27
29
28
관리자는 해당하는 하드웨어 벤더의 GPU 드라이버를 노드에
30
29
설치해야 하며, GPU 벤더가 제공하는 디바이스 플러그인을
31
- 실행해야 한다.
30
+ 실행해야 한다. 다음은 몇몇 벤더의 지침에 대한 웹페이지이다.
32
31
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 )
35
35
36
- 위의 조건이 만족되면, 쿠버네티스는 ` amd.com/gpu ` 또는
37
- ` nvidia.com/gpu ` 를 스케줄 가능한 리소스로써 노출시킨다.
36
+ 플러그인을 한 번 설치하고 나면, 클러스터는 ` amd.com/gpu ` 또는 ` nvidia.com/gpu ` 를 스케줄 가능한 리소스로써 노출시킨다.
38
37
39
- 사용자는 이 GPU들을 ` cpu ` 나 ` memory ` 를 요청하는 방식과 동일하게
40
- ` <vendor>.com/gpu ` 를 요청함으로써 컨테이너에서 활용할 수 있다.
41
- 그러나 GPU를 사용할 때는 리소스 요구 사항을 명시하는 방식에 약간의
42
- 제약이 있다.
38
+ 사용자는 이 GPU들을 ` cpu ` 나 ` memory ` 를 요청하는 방식과 동일하게
39
+ GPU 자원을 요청함으로써 컨테이너에서 활용할 수 있다.
40
+ 그러나 리소스의 요구 사항을 명시하는 방식에
41
+ 약간의 제약이 있다.
43
42
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 ` 를 명시할 수 없다.
53
49
54
- 다음은 한 예제를 보여준다.
50
+ 다음은 GPU를 요청하는 파드에 대한 예제 매니페스트를 보여준다.
55
51
56
52
``` yaml
57
53
apiVersion : v1
@@ -61,81 +57,12 @@ metadata:
61
57
spec :
62
58
restartPolicy : OnFailure
63
59
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"
67
62
resources :
68
63
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
+ ` ` `
139
66
140
67
## 다른 타입의 GPU들을 포함하는 클러스터
141
68
@@ -147,10 +74,13 @@ Google은 GKE에서 NVIDIA GPU 사용에 대한 자체 [설명서](https://cloud
147
74
148
75
` ` ` shell
149
76
# 노드가 가진 가속기 타입에 따라 레이블을 단다.
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
152
79
```
153
80
81
+ ` accelerator ` 레이블 키를 ` accelerator ` 로 지정한 것은 그저 예시일 뿐이며,
82
+ 선호하는 다른 레이블 키를 사용할 수 있다.
83
+
154
84
## 노드 레이블링 자동화 {#node-labeller}
155
85
156
86
만약 AMD GPU 디바이스를 사용하고 있다면,
@@ -179,19 +109,18 @@ kubectl describe node cluster-node-23
179
109
```
180
110
181
111
```
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
+ …
195
124
```
196
125
197
126
노드 레이블러가 사용된 경우, GPU 타입을 파드 스펙에 명시할 수 있다.
@@ -210,9 +139,14 @@ spec:
210
139
resources :
211
140
limits :
212
141
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
215
149
` ` `
216
150
217
- 이것은 파드가 사용자가 지정한 GPU 타입을 가진 노드에 스케줄 되도록
151
+ 이것은 사용자가 지정한 GPU 타입을 가진 노드에 파드가 스케줄 되도록
218
152
만든다.
0 commit comments