Ubuntu 환경에서 Docker 컨테이너에서 GPU를 사용하기 위한 환경 설정을 설명한다.
[ Host OS ]
├─ NVIDIA Driver (필수)
│ └─ libcuda.so (커널 + 유저스페이스)
│
└─ Docker
└─ Container
├─ CUDA Runtime (libcudart.so)
├─ cuBLAS / cuDNN
└─ Ollama
사용하려는 Docker 이미지인 ollama에 CUDA runtime이 포함되므로, 호스트에는 CUDA Toolkit 설치를 따로 진행하지 않는다.
#!/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를 커널에 로드할 수 있다고 한다.

서명되지 않은 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 화면이 뜬다.

이는 드라이버가 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 불필요)

이제 이후 과정을 진행하면 된다.
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}
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
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 명령어를 실행하면 컨테이너 내부에서도 확인되는 것을 알 수 있다.
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 자체는 지정할 수 없다.
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
Linux용 Azure N 시리즈 GPU 드라이버 설치 - Azure Virtual Machines
Azure에서 Linux를 실행하는 N 시리즈 VM의 NVIDIA GPU 드라이버를 설정하는 방법
learn.microsoft.com
| ansible 사용해서 로컬 배포해보기 (0) | 2026.01.30 |
|---|---|
| Android Studio를 활용한 안드로이드 프로그래밍 (0) | 2021.07.16 |
| Install Oracle in docker (도커에서 오라클 사용하기) (0) | 2021.05.19 |
| [ORACLE] sqlplus 출력 화면 설정 (0) | 2021.04.05 |
| 코딩 테스트 연습하기 (0) | 2021.01.04 |