본문 바로가기
K8S

[kubernetes] 에러 Incompatible platform detected If this is a gpu node, did you configure the nvidia container toolkit

by Rainbound-IT 2024. 12. 9.
반응형

Kubernetes에서 Incompatible platform detected If this is a gpu node, did you configure the nvidia container toolkit라는 에러가 발생하는 주된 원인은 GPU 노드에서 NVIDIA GPU를 사용하는 컨테이너가 실행될 때 NVIDIA 드라이버나 도구가 제대로 설정되지 않았기 때문입니다.

이 에러는 Kubernetes 클러스터에서 GPU를 사용하려는 Pod를 배포할 때, NVIDIA GPU를 위한 필수 도구인 NVIDIA Container Toolkit이나 NVIDIA 드라이버가 올바르게 설정되지 않으면 발생할 수 있습니다.

원인

이 에러는 보통 다음과 같은 이유로 발생합니다:

  1. NVIDIA 드라이버 미설치 또는 잘못된 설치:
    • GPU 노드에 NVIDIA 드라이버가 설치되지 않았거나, 설치된 드라이버 버전이 Kubernetes와 호환되지 않는 경우.
  2. NVIDIA Container Toolkit 미설치:
    • GPU를 사용하는 컨테이너에서 필요한 NVIDIA Container Toolkit이 설치되지 않으면 GPU를 인식할 수 없습니다.
    • NVIDIA Container Toolkit은 Docker와 Kubernetes에서 GPU 리소스를 관리하고, GPU가 장착된 시스템에서 컨테이너가 GPU를 사용할 수 있도록 합니다.
  3. Kubernetes 노드에서 NVIDIA runtime이 설정되지 않음:
    • Kubernetes는 기본적으로 GPU를 사용하기 위한 nvidia runtime을 필요로 합니다. 이 runtime이 설치되지 않거나 설정되지 않으면 GPU 리소스를 사용할 수 없습니다.
  4. NVIDIA device plugin 미설치:
    • Kubernetes에서 GPU 리소스를 할당하고 관리하려면 NVIDIA device plugin이 클러스터에 설치되어야 합니다. 이 플러그인이 없으면 GPU 리소스를 사용할 수 없습니다.
  5. 잘못된 컨테이너 이미지:
    • GPU를 사용하는 컨테이너가 GPU와 호환되지 않는 이미지를 사용할 때 발생할 수 있습니다. 예를 들어, nvidia/cuda 이미지가 아닌 다른 이미지를 사용할 경우 GPU 리소스를 인식하지 못할 수 있습니다.

해결책

1. NVIDIA 드라이버 설치

GPU 노드에서 NVIDIA 드라이버가 설치되어 있는지 확인합니다. 드라이버가 설치되지 않은 경우, 아래와 같은 방법으로 설치할 수 있습니다.

  • Ubuntu의 경우 (버전과 GPU에 따라 다를 수 있음):
  • bash
    코드 복사
    sudo apt-get update sudo apt-get install nvidia-driver-460 # 예시: 사용 중인 드라이버 버전으로 교체
  • CUDA와 NVIDIA 드라이버를 설치하려면, NVIDIA 공식 사이트에서 설치 가이드를 따르세요: NVIDIA 드라이버 다운로드
  • 드라이버 설치 확인:이 명령어를 실행하면 GPU의 상태를 확인할 수 있습니다. GPU 정보가 출력되면 드라이버가 정상적으로 설치된 것입니다.
  • bash
    코드 복사
    nvidia-smi

2. NVIDIA Container Toolkit 설치

NVIDIA GPU를 사용하는 컨테이너를 실행하려면 NVIDIA Container Toolkit을 설치해야 합니다. 이를 통해 GPU가 Docker 컨테이너에서 사용될 수 있습니다.

  • NVIDIA Container Toolkit 설치:
  • bash
    코드 복사
    sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/override.conf <<EOF [Service] ExecStart= ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime EOF sudo systemctl daemon-reload sudo systemctl restart docker
  • NVIDIA Container Toolkit 설치:
    bash
    코드 복사
    sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/override.conf <<EOF [Service] ExecStart= ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime EOF sudo systemctl daemon-reload sudo systemctl restart docker
    위 명령어를 실행하면 Docker가 NVIDIA runtime을 사용하도록 설정됩니다.
  • 먼저 NVIDIA 패키지를 추가하고 설치합니다:

3. Kubernetes에서 NVIDIA device plugin 설치

Kubernetes에서 GPU 리소스를 사용하려면 NVIDIA device plugin을 설치해야 합니다. 이 플러그인은 클러스터에서 GPU 리소스를 관리하고, Pod에 GPU 리소스를 요청할 수 있도록 합니다.

  • NVIDIA device plugin 설치:이 명령어를 실행하면 NVIDIA device plugin이 클러스터에 배포됩니다. 이후, kubectl get pods -n kube-system 명령어로 플러그인이 정상적으로 실행되고 있는지 확인할 수 있습니다.
  • bash
    코드 복사
    kubectl get pods -n kube-system
  • bash
    코드 복사
  • nvidia-device-plugin이 정상적으로 실행 중인지 확인합니다.

4. Pod에서 GPU 리소스 요청

GPU를 사용하는 Pod의 spec에서 GPU 리소스를 요청해야 합니다. 아래는 예시 YAML 파일입니다:

yaml
코드 복사
apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: containers: - name: gpu-container image: nvidia/cuda:11.0-base resources: limits: nvidia.com/gpu: 1 # GPU 1개 요청

이 예시에서는 nvidia.com/gpu 리소스를 요청하여 GPU를 사용하도록 합니다.

5. NVIDIA runtime 설정 확인

nvidia runtime이 Docker와 Kubernetes에서 제대로 설정되어 있는지 확인합니다. Kubernetes에서는 kubelet 설정에서 nvidia runtime을 사용하도록 설정해야 합니다.

  • kubelet의 --container-runtime 플래그를 확인합니다:--container-runtime=nvidia 플래그가 포함되어 있어야 GPU 리소스를 사용할 수 있습니다.
  • bash
    코드 복사
    ps aux | grep kubelet

요약

Incompatible platform detected If this is a gpu node, did you configure the nvidia container toolkit 에러는 다음과 같은 원인으로 발생할 수 있습니다:

  • NVIDIA 드라이버가 설치되지 않음.
  • NVIDIA Container Toolkit이 설치되지 않음.
  • NVIDIA device plugin이 설치되지 않음.
  • GPU를 사용하는 컨테이너 이미지가 잘못됨.

해결 방법은 GPU 드라이버 및 NVIDIA Container Toolkit을 설치하고, Kubernetes 클러스터에 NVIDIA device plugin을 설치한 후, Pod에서 GPU 리소스를 올바르게 요청하는 것입니다.

반응형

댓글