상세 컨텐츠

본문 제목

Ubuntu 도커 GPU 사용 설정 (feat. Azure)

PROGRAMMING

by koharin 2026. 2. 3. 17:15

본문

728x90
반응형

 

Ubuntu 환경에서 Docker 컨테이너에서 GPU를 사용하기 위한 환경 설정을 설명한다.

 

핵심 구조

[ Host OS ]
 ├─ NVIDIA Driver (필수)
 │   └─ libcuda.so (커널 + 유저스페이스)
 │
 └─ Docker
      └─ Container
           ├─ CUDA Runtime (libcudart.so)
           ├─ cuBLAS / cuDNN
           └─ Ollama

사용하려는 Docker 이미지인 ollama에 CUDA runtime이 포함되므로, 호스트에는 CUDA Toolkit 설치를 따로 진행하지 않는다.

 

1. NVIDIA 드라이버 설치

#!/bin/bash
set -x

echo "===== 1. 시스템 업데이트 ====="
sudo apt update -y
sudo apt upgrade -y

echo "===== 2. 필수 패키지 설치 ====="
sudo apt install -y \
  ca-certificates \
  curl \
  gnupg \
  lsb-release \
  software-properties-common

echo "===== 3. NVIDIA 드라이버 설치 ====="
sudo apt install -y ubuntu-drivers-common
sudo ubuntu-drivers autoinstall

echo "===== NVIDIA 드라이버 설치 완료. 재부팅 필요 ====="
sudo reboot

필요 패키지를 설치한 후, NVIDIA driver를 설치하고 시스템 재부팅을 진행한다.

 

nvidia-smi

시스템 재부팅 이후 nvidia-smi 명령어를 통해 NVIDIA driver 정상 설치 여부를 확인한다.

 

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

위 오류가 발생하는데, lspci | grep -i nvidia로 확인해보면 SecureBoot enabled가 되어있다.

지피티씨한테 물어보니, NVIDIA driver가 설치되었지만 커널에 로드되지 않았다고 한다.

근데 lsmod 명령어로 확인해보면 커널에 로드는 되어있다..?

또 물어보니 Azure에서는 일반 NVIDIA driver가 아니라 서명된 NVIDIA driver를 커널에 로드할 수 있다고 한다.

https://learn.microsoft.com/en-us/azure/virtual-machines/extensions/hpccompute-gpu-linux

서명되지 않은 NVIDIA driver로 로드 시도는 해서 lsmod에서 nvidia가 확인은 되어도 gpu 디바이스 노드 접근이 차단되어 nvidia-smi에서 확인되지 않을 수 있다고..

 

따라서 다음 과정을 진행해줬다.

sudo apt update
sudo apt install -y linux-headers-$(uname -r)
sudo apt install -y nvidia-driver-535-server
sudo reboot

nvidia-driver-535-server를 설치하는 과정에서 Configuring Secure Boot 화면이 뜬다.

Configuring Secure Boot 화면

이는 드라이버가 Microsoft/Azure에서 서명한 것이 아니니 신뢰한다고 등록하라는 것이라고 한다.

근데 문제가 발생한 것으로 더이상 진행하지 않는다.

이 경우에는 VM 생성 시 Extension으로 NVIDIA driver 를 선택해야 한다고 한다.

그러면 Secure Boot 상태에서도 서명된 NVIDIA driver를 설치하여 사용할 수 있다.

Azure 포털에서 VM에 들어가서 Settings의 Extension + Application을 선택한 후, Add로 NVIDIA driver Extension을 선택하여 추가할 수 있다.

기존에 설치 흔적이 있어서 vm을 밀고, azure cli의 az vm create로 vm 생성 후 az vm extension set으로 설정해주고 나니 제대로 NVIDIA driver extension이 추가된 것을 확인할 수 있다. 

 

근데도 nvidia-smi로 확인이 안됨...

sudo apt purge -y 'nvidia*' 'cuda*'
sudo rm -rf /usr/local/cuda*
sudo rm -rf /var/lib/dkms/nvidia*
sudo rm -rf /lib/modules/$(uname -r)/updates/dkms/nvidia*
sudo update-initramfs -u
sudo reboot

일단 깨끗하게 삭제 진행

az vm extension delete \
  -g <RG> \
  -n <VM> \
  --name NvidiaGpuDriverLinux
  
az vm extension set \
  -g <RG> \
  -n <VM> \
  --name NvidiaGpuDriverLinux \
  --publisher Microsoft.HpcCompute

extension도 삭제 후 다시 추가한 후 vm 재부팅

cat /proc/driver/nvidia/version

확인해보니, security에 secure boot가 굳이 enabled 안 되어도 되고, vm 생성 시 security-type을 Standard로 설정하면 됐다.

다시 vm의 security-type을 standard로 설정 후, extension delete, extension set으로 NVIDIA driver 설치 후 vm을 확인해보니 nvidia-smi가 확인됐다!!!!!!!! (ubuntu_driver install 불필요)

이제 이후 과정을 진행하면 된다.

 

2. Docker 설치

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker ${USER}

 

3. NVIDIA Container Toolkit 설치

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt update
sudo apt install -y nvidia-container-toolkit

 

4. Docker GPU 연동 설정

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
$ cat /etc/docker/daemon.json
{
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}

/etc/docker/daemon.json 파일을 열어서 nvidia-container-runtime이 확인되면 제대로 설정된 것이다.

docker run으로 nvidia-smi 명령어를 실행하면 컨테이너 내부에서도 확인되는 것을 알 수 있다.

 

5. Ollama 컨테이너 실행 (GPU 활성화)

docker run -d \
  --name ollama \
  --restart unless-stopped \
  --gpus all \
  -p 11434:11434 \
  -v ollama:/root/.ollama \
  ollama/ollama

ollama 이미지를 통해 도커 컨테이너 실행 시 gpus all을 통해 gpu 사용을 설정한다.

version: "3.9"

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama:/root/.ollama
	deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

docker-compose 파일을 사용하는 경우 위와 같이 device로 gpu driver를 설정해준다.

해당 vm은 하나의 서비스 전용 vm이므로 count를 all로 해서 gpu 전체 사용으로 설정해줬다. 

count=1이면 NVIDIA_VISIBLE_DEVICES=0   (첫 번째 GPU) 또는 사용하지 않는 GPU ID로 설정된다. GPU ID 자체는 지정할 수 없다.

 

6. GPU 사용 확인

watch -n 1 nvidia-smi

 

 

참고

https://learn.microsoft.com/ko-kr/azure/virtual-machines/extensions/hpccompute-gpu-linux

 

NVIDIA GPU 드라이버 확장 - Azure Linux VM - Azure Virtual Machines

Linux를 실행하는 N 시리즈 컴퓨팅 VM에서 NVIDIA GPU 드라이버를 설치하기 위한 Microsoft Azure 확장입니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/azure/virtual-machines/linux/n-series-driver-setup?source=recommendations

 

Linux용 Azure N 시리즈 GPU 드라이버 설치 - Azure Virtual Machines

Azure에서 Linux를 실행하는 N 시리즈 VM의 NVIDIA GPU 드라이버를 설정하는 방법

learn.microsoft.com

 

 

728x90
반응형

관련글 더보기