nvidia/cuda imageを使ってDockerコンテナでGPUを使用する

Hiromasa Kakutani

2025.3.27

はじめに

Sreake事業部アプリケーション開発チームの角谷です!

最近、機械学習やディープラーニング、特に生成AIの分野で、GPUの活用がますます重要になってきています。 Stable DiffusionやChatGPTのような大規模モデルは、ものすごい計算リソースを必要としますが、NVIDIAのCUDAを使えば、GPUの力をフルに引き出すことができるのです!

GPUを使ったアプリケーションの開発では、Dockerコンテナを使うと、開発環境のセットアップや管理がとても楽になります。 この記事では、DockerコンテナでNVIDIAのGPUを使うためのnvidia/cudaコンテナについて、簡単に解説していこうと思います。

nvidia/cudaとは?

nvidia/cudaは、NVIDIAが公式に提供しているDockerイメージで、CUDA環境を簡単にセットアップできるように作られています。

このコンテナを使えば、ホストマシンに直接CUDAをインストールしなくても、コンテナ内でCUDAを動かすことが可能となっています。

CUDAについて

そもそも、CUDA(クーダ)ってなんなんすかね?という話。

CUDA(Compute Unified Device Architecture)は、NVIDIAが開発した並列コンピューティングプラットフォームおよびプログラミングモデルで、以下のような特徴があります。

  • GPUの計算能力を汎用的な用途で活用可能にする技術(GPGPU)
  • C/C++言語をベースとした開発環境を提供
  • 画像処理、機械学習、科学計算など、並列処理が効果的な処理に特に有効
  • PyTorchやTensorFlowなどの主要な機械学習フレームワークでサポート

CUDAを使うと、今までCPUでやっていた計算をGPUで並列に処理できるので、処理速度がグッとアップします。

特に、深層学習のモデル学習や推論、画像生成などでその力を発揮します。

ユースケース

  • 生成AI(Generative AI): Stable Diffusion、GPT、BERT、Llamaなどの大規模モデルの推論・学習
  • 機械学習・ディープラーニング: TensorFlow, PyTorch, JAX などのフレームワークをGPU上で高速に実行
  • HPC(高性能計算): 科学技術計算、シミュレーションなどの計算処理

nvidia/cudaで使用されている技術

nvidia/cudaは、CUDAだけでなく、いろんな技術が組み合わさってGPUの計算リソースを効率的に活用できるようになっています。

  • cuDNN(CUDA Deep Neural Network library)
    • ディープラーニング向けに最適化されたライブラリ。
    • 畳み込み層、プーリング層、活性化関数などの計算を最適化し、高速化を実現。
    • 特にCNN(畳み込みニューラルネットワーク)の学習と推論の効率を向上。
    • 生成AIにおいて、画像生成や音声合成などのディープラーニングモデルの学習で頻繁に活用される。
  • TensorRT
    • 推論処理を最適化するためのNVIDIA製ライブラリ。
    • モデルの量子化、最適化を行い、推論速度を向上。
    • 低レイテンシーかつ高スループットな推論が求められる生成AIアプリケーションに最適。
    • GPTなどの大規模言語モデル(LLM)の推論時に使用される。
  • cuBLAS(CUDA Basic Linear Algebra Subprograms)
    • 線形代数演算を高速化するためのライブラリ。
    • 行列計算、ベクトル演算、行列分解などの基本的な線形代数操作を最適化。
    • 生成AIでは、モデルのパラメータ更新や推論時の計算に利用される。

Dockerfile, compose.yamlを書いてコンテナでGPUを使ってみよう

今回はコンテナ上でComfyUIを動作させるための設定を行ってみましょう。

動作環境

EC2を使用しています。インスタンスタイプは g5.2xlarge を使用。

# OSの情報
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.5 LTS
Release:        22.04
Codename:       jammy

# CPUの情報
$ sudo lshw -class processor
       description: CPU
       product: AMD EPYC 7R32
       vendor: Advanced Micro Devices [AMD]
       physical id: 4
       bus info: cpu@0
       version: 23.49.0
       slot: CPU 0
       size: 2800MHz
       capacity: 3300MHz
       width: 64 bits
       clock: 100MHz
       capabilities: lm fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp x86-64 constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch topoext ssbd ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr rdpru wbnoinvd arat npt nrip_save rdpid
       configuration: cores=4 enabledcores=4 microcode=137367679 threads=8


# GPUの情報
$ lspci | grep -i nvidia
00:1e.0 3D controller: NVIDIA Corporation GA102GL [A10G] (rev a1)

$ lspci -s 00:1e.0 -v
00:1e.0 3D controller: NVIDIA Corporation GA102GL [A10G] (rev a1)
        Subsystem: NVIDIA Corporation GA102GL [A10G]
        Physical Slot: 30
        Flags: bus master, fast devsel, latency 0, IRQ 10
        Memory at c0000000 (32-bit, non-prefetchable) [size=16M]
        Memory at 1000000000 (64-bit, prefetchable) [size=32G]
        Memory at 840000000 (64-bit, prefetchable) [size=32M]
        Capabilities: <access denied>
        Kernel driver in use: nvidia
        Kernel modules: nvidiafb, nvidia_drm, nvidia

# GPUの使用状況
$ nvidia-smi                                                                       (base) 
Tue Mar  4 18:04:47 2025       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA A10G                    Off | 00000000:00:1E.0 Off |                    0 |
|  0%   17C    P8               9W / 300W |      0MiB / 23028MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

NVIDIA Container Toolkitのインストール

NVIDIA Container Toolkitは、DockerコンテナでNVIDIAのGPUを使うためのツールキットです。

sudo apt update
sudo apt install -y nvidia-container-toolkit
sudo systemctl restart docker

Dockerfileのサンプル

# ベースイメージとしてnvidia/cudaを使用
FROM nvidia/cuda:12.1.0-devel-ubuntu22.04

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    git \
    && rm -rf /var/lib/apt/lists/*

# ComfyUIのリポジトリをクローン & 必要なPythonパッケージをインストール
WORKDIR /app
RUN git clone https://github.com/comfyanonymous/ComfyUI.git ComfyUI && \
    cd ComfyUI && \
    pip3 install -r requirements.txt

# コンテナ起動時に実行するコマンド
CMD ["python3", "/app/ComfyUI/main.py", "--listen", "0.0.0.0", "--port", "8188"]

外部のローカルマシンからEC2で起動するComfyUIに接続するため、ホストを 0.0.0.0 に設定しています。

compose.yamlのサンプル

services:
  cuda-container-comfyui:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8188:8188"
    deploy:
      resources:
        # GPUデバイスの予約設定
        reservations:
          devices:
             # NVIDIAドライバを使用するデバイスの設定
            - driver: nvidia
              device_ids: ["0"]
              capabilities: [all]

capabilities の設定は、DockerコンテナがGPUリソースを使用するために必要な指定です。 以下のような個別の設定項目があります。

  • gpu: この設定を有効にすると、コンテナはGPUリソースを使用することが許可されます。これにより、GPUを利用した計算や処理が可能になります。例えば、深層学習モデルのトレーニングや推論を行う際に必要です。
  • compute: コンテナがGPUの計算能力を使用することを許可します。これは、GPUを使用した計算を行うアプリケーションにとって必須の設定です。特に、数値計算や行列演算を行う際に重要です。
  • display: GUIアプリケーションなど、GPUの表示機能を使用する必要がある場合にこの設定を有効にします。これにより、コンテナ内でグラフィカルなインターフェースを持つアプリケーションを実行することができます。
  • video: ビデオ処理を行うアプリケーションに必要な設定です。コンテナがビデオデバイスにアクセスできるようにすることで、ビデオのエンコードやデコード、ストリーミングなどの処理が可能になります。
  • graphics: グラフィックス処理を行うアプリケーションに必要な設定です。これにより、コンテナがグラフィックスデバイスにアクセスでき、3Dレンダリングや画像処理などが行えるようになります。
  • all: 上記のすべての機能を一度に許可します。この設定を使用することで、特定の機能を個別に設定する手間を省き、コンテナが必要とするすべての機能を一度に有効にすることができます。

コンテナの起動

$ docker compose up --build

これでコンテナが起動するはずです

$ docker ps                                                                                                          (base) 
CONTAINER ID   IMAGE                                       COMMAND                  CREATED          STATUS          PORTS                                       NAMES
9632ffc6d636   nvidia_cuda_docker-cuda-container-comfyui   "/opt/nvidia/nvidia_…"   48 minutes ago   Up 48 minutes   0.0.0.0:8188->8188/tcp, :::8188->8188/tcp   nvidia_cuda_docker-cuda-container-comfyui-1

コンテナが正しくGPUを使うことができてるか確認する

nvidia-smi コマンドを実行して、GPUの使用状況を確認します。

$ nvidia-smi

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA A10G                    Off | 00000000:00:1E.0 Off |                    0 |
|  0%   25C    P0              59W / 300W |    256MiB / 23028MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A     34674      C   python3                                     248MiB |
+---------------------------------------------------------------------------------------+

上記の Processes の箇所を見てみると、PID = 34674 がComfyUIのプロセスとして使用されているようです。

ローカルのマシンからComfyUIに接続

この状態で http://EC2のIPアドレス:8188 にブラウザからアクセスするとこのようにComfyUIを使うことができます。

その他

GPUリソースの管理方法について

今回の環境は1つのGPUしか搭載していません。

複数のGPUを搭載している場合、IDを指定することで、使用するGPUを指定して割り当てることが可能です。 docker-compose.yamlでは以下のように記述することで指定できます。

services:
  cuda-container-comfyui:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8188:8188"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["0", "1"]  # GPU 0, GPU 1 の両方を使用
              capabilities: [all]

GPUの使用状況の測定について

AWSのCloudWatchでGPUのモニタリング等もありますが、nvidia-smi dmon コマンドを実行してGPUの使用状況をリアルタイム監視することが可能になっています。

$ nvidia-smi dmon

# gpu    pwr  gtemp  mtemp     sm    mem    enc    dec    jpg    ofa   mclk   pclk 
# Idx      W      C      C      %      %      %      %      %      %    MHz    MHz 
    0     58     29      -      0      0      0      0      0      0   6250   1710 
    0     58     29      -      0      0      0      0      0      0   6250   1710 
    0     58     29      -      0      0      0      0      0      0   6250   1710 
    ...

出力される項目はそれぞれ以下のようになっています。

項目説明
gpu IdxGPU のインデックス(複数 GPU がある場合は 0, 1, 2… と続く)
pwr (W)現在の消費電力(Watt)。高負荷時に上昇する
gtemp (C)GPU 温度(℃)。高温になりすぎるとサーマルスロットリングが発生する
mtemp (C)メモリ温度(℃)。一部のGPUでは取得できず - になることもある
sm (%)Streaming Multiprocessors(SM)の使用率。GPUの演算リソースの使用状況
mem (%)GPUメモリの使用率。VRAM使用状況を示す
enc (%)ハードウェアエンコーダー(NVENC)の使用率。動画エンコード時に増加
dec (%)ハードウェアデコーダー(NVDEC)の使用率。動画デコード時に増加
jpg (%)JPEGエンジンの使用率。画像処理に関連
ofa (%)Optical Flow Accelerator(光学フローアクセラレータ)の使用率。機械学習やビデオ処理で利用
mclk (MHz)メモリクロック(MHz)
pclk (MHz)GPUコアクロック(MHz)

まとめ

nvidia/cudaコンテナを使用することで、複雑なCUDA環境の構築が容易になって嬉しみが発生します。

今回の環境構築手順や設定例が、みなさんのGPUを活用したアプリケーション開発の参考になれば幸いです。 特に生成AIやディープラーニングの分野では、GPUの活用が不可欠となっていますので、本記事の知識を基に、より効率的な開発環境の構築にお役立てください〜。

ブログ一覧へ戻る

お気軽にお問い合わせください

SREの設計・技術支援から、
SRE運用内で使用する
ツールの導入など、
SRE全般についてご支援しています。

資料請求・お問い合わせ