DGX SparkでMMDetectionの環境構築
はじめに
こんにちは。トグルホールディングスの竹本です。こちらはtoggle Advent Calendar 2025の
10日目の記事です。
トグルホールディングスでは全エンジニアにDGX-sparkが配布されており、好きなだけ機械学習のモデルの学習をすることができる環境にあります!
機械学習の物体検出では色々なモデルを簡単に試すことができる、MMDetectionというライブラリが一つの選択肢になります。今回はDGX Spark上での環境構築にかなり手間取ったので、自分が上手くいった方法を共有します!
MMDetectionとは?
MMDetectionの最大の魅力は、モデルの豊富さとカスタマイズ性にあります。 画像認識(物体検出・インスタンスセグメンテーション等)において、このライブラリはまさに「モデルのデパート」です。
-
CNN系: Faster R-CNN, YOLOシリーズ, EfficientDet など
-
Transformer系: Swin Transformer, ViT, DETR, Grounding-Dino など
これら全く構造の異なるモデルたちを、統一されたインターフェースで扱うことができます。
通常、CNNからTransformerへモデルを変更しようとすると、コードの書き直しやデータパイプラインの修正など、面倒な作業が発生しがちです。しかし、MMDetectionならConfigファイル(設定ファイル)をサクッと書き換えるだけです。
近年のライブラリの開発は停滞しているようですが、画像認識を試行錯誤するにはもってこいといえるでしょう。
DGX Sparkについて
「DGX Spark」に搭載されているのが、最新GPU 「NVIDIA GB10」 です。
どれくらい最新かというと、Compute Capability(演算能力) のバージョンが12.1となっています。実はこのバージョンに対応しているGPUが執筆時点ではDGX Sparkしかなく、pytorchのライブラリなどの対応が追いついていません。
既存のビルド済みパッケージがAmd64ベースであることがほとんどです。しかし、DGX SparkのCPUはArmベースであり、その意味でも環境構築が難しくなっています。
実験環境の構築方針
Pytorchは最新バージョンを使う
現状、DGX Sparkで古いバージョンのPytorchを使おうとすると、以下のようなWarningに遭遇します。
UserWarning:
NVIDIA GB10 with CUDA capability sm_121 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_52 sm_60 sm_61 sm_70 sm_72 sm_75 sm_80 sm_86 sm_87 sm_90 compute_90.
If you want to use the NVIDIA GB10 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/
実際、このWarningを無視してMMDetectionのデモを実行すると、途中でエラーになってしまいます。
そのため、Pytorchは最新の2.91を使う方針にしています。
MMCVは自前でビルドする
MMDetectionのインストールで一番手間取るのが、依存パッケージであるMMCVです。
ビルドに時間がかかるので、一般的にはビルド済みのバイナリが用いられます。しかし、CPUがArmベースかつPytorchが最新のビルド済みバイナリは自分が探した限りではなく、自前でビルドする方針にしました。
MMCVのビルドはsetup.pyを通して行われるのですが、Pythonのバージョン3.12以降で使えなくなった、pkgutil.ImpImporterに依存しているため、Pythonのバージョンは3.11未満にする必要があります。
ローカルでの環境構築
環境変数とパッケージの管理にmiseを利用
今回の用途では多少オーバーキルな気がしますが、できるだけ環境を汚したくないということで、miseを使って、pythonとuvのパッケージを管理しています。
また、MMCVのビルド時に環境変数を設定する必要があり、そちらの管理にもmiseを使っています。
[tools]
python = "3.11"
uv = "latest"
[env]
TORCH_CUDA_ARCH_LIST="12.1" # DGX Sparkのcompute capability
FORCE_CUDA=1 # CUDA版のMMCVのビルドを強制
MMCV_WITH_OPS=1
Pythonのパッケージのインストール
pythonパッケージ管理はuvを使います。uvを使うと、pyproject.tomlに依存パッケージのビルドの設定などの情報もまとめて記載できるので非常に便利です。
[project]
name = "mmdet_setup"
version = "0.1.0"
readme = "README.md"
requires-python = ">= 3.10, < 3.12"
dependencies = [
"numpy < 2.0.0",
"torch >= 2.9.0",
"torchvision >= 0.24.0",
"mmengine >= 0.10.7",
"mmcv == 2.1.0",
"mmdet == 3.3.0",
# mmcvのビルドに必要なパッケージ
"setuptools >= 80.9.0",
"cython >= 3.2.2",
"cmake >= 4.2.0",
"ninja >= 1.13.0",
# Grounding-dinoのモデルを使用するために必要なパッケージ
"fairscale >= 0.4.13",
"jsonlines >= 4.0.0",
"nltk >= 3.9.1",
"pycocoevalcap >= 1.2",
"transformers >= 4.57.0",
]
[tool.uv.sources]
torch = [
{ index = "pytorch-cu130" },
]
torchvision = [
{ index = "pytorch-cu130" },
]
mmcv = [
{ git = "https://github.com/open-mmlab/mmcv.git", tag = "v2.1.0" } ,
]
mmdet = [
{ git = "https://github.com/open-mmlab/mmdetection.git", tag = "v3.3.0" },
]
[[tool.uv.index]]
name = "pytorch-cu130"
url = "https://download.pytorch.org/whl/cu130"
explicit = true
[tool.uv]
no-build-isolation-package = ["mmcv", "mmdet"]
このファイルを作業ディレクトリのルートに置いた状態で、以下のコマンドを実行するだけでGPUに対応したpytorchのインストールやmmcvのビルドが走ります。
uv sync
デモの推論を実行
今回は動作確認として、MMDetectionの中の一番新しいモデルであるGrounding-Dinoを使った推論をしてみます! MMDetectionのリポジトリの中にデモ用の実行ファイルがあるので、git cloneでローカルにコピーします。
git clone https://github.com/open-mmlab/mmdetection.git
次に推論のために事前学習済みの重みファイルをダウンロードします。
wget https://download.openmmlab.com/mmdetection/v3.0/grounding_dino/groundingdino_swint_ogc_mmdet-822d7e9d.pth
Grounding-Dinoの実行時にnltkのダウンロード先が見つからないと怒られるので、事前にuvで作成した.venv内にnltkのダウンロードを行います
uv run python -c "import nltk;nltk.download('punkt_tab', './.venv/nltk_data');nltk.download('averaged_perceptron_tagger_eng', './.venv/nltk_data');"
デモ画像の推論をしてみます
uv run mmdetection/demo/image_demo.py \
mmdetection/demo/demo.jpg \
mmdetection/configs/grounding_dino/grounding_dino_swin-t_pretrain_obj365_goldg_cap4m.py \
--weights groundingdino_swint_ogc_mmdet-822d7e9d.pth \
--texts ' bench . car . tree .'
うまく動きました!

Docker上での環境構築
Dockerの方でも環境構築できたので、共有します。Dockerの場合、NGCでCUDAとPytorchがまとめられているイメージもあります。しかし、DGX Spark上で動作するイメージは全てPythonのバージョンが3.12のため、MMCVのビルドができません。そのため、CUDAのみのイメージを用います。
また、ローカル環境では自前でビルドするパッケージをpyproject.tomlに記載していましたが、Docker上で同様に行うと、エラーになってしまうので、自前ビルドの部分はDockerfileの方に移動しています。
[project]
name = "mmdet_setup_for_docker"
version = "0.1.0"
readme = "README.md"
requires-python = ">= 3.10, < 3.12"
dependencies = [
"numpy < 2.0.0",
"torch >= 2.9.0",
"torchvision >= 0.24.0",
"mmengine >= 0.10.7",
# setuptools
"setuptools >= 80.9.0",
"cython >= 3.2.2",
"cmake >= 4.2.0",
"ninja >= 1.13.0",
# multimodal
"fairscale >= 0.4.13",
"jsonlines >= 4.0.0",
"nltk >= 3.9.1",
"pycocoevalcap >= 1.2",
"transformers >= 4.57.0",
]
[tool.uv.sources]
torch = [
{ index = "pytorch-cu130" },
]
torchvision = [
{ index = "pytorch-cu130" },
]
[[tool.uv.index]]
name = "pytorch-cu130"
url = "https://download.pytorch.org/whl/cu130"
explicit = true
# ベースイメージ
FROM nvidia/cuda:13.0.0-devel-ubuntu22.04
COPY /uv /uvx /bin/
# 作業ディレクトリ
WORKDIR /opt
ENV TORCH_CUDA_ARCH_LIST="12.1"
# --- system deps ---
RUN apt-get update && apt-get install -y --no-install-recommends \
git build-essential cmake ninja-build curl ca-certificates pkg-config \
python3-dev python3-venv python3-pip \
libglib2.0-0 libsm6 libxext6 libxrender-dev libjpeg-dev zlib1g-dev \
libgl1 wget unzip ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# --- Copy pyproject.toml (プロジェクト依存はここで管理) ---
COPY pyproject.toml /opt/pyproject.toml
RUN uv venv /opt/.venv
RUN uv sync
# --- mmcv (v2.1.0) build & install (no build isolation so it uses venv environment) ---
RUN git clone https://github.com/open-mmlab/mmcv.git /opt/mmcv && \
cd /opt/mmcv && git fetch --all --tags && git checkout v2.1.0 && \
echo "Building mmcv v2.1.0 with ops (TORCH_CUDA_ARCH_LIST=${TORCH_CUDA_ARCH_LIST})" && \
FORCE_CUDA=1 MMCV_WITH_OPS=1 TORCH_CUDA_ARCH_LIST=${TORCH_CUDA_ARCH_LIST} uv pip install -v --no-build-isolation -e .
# --- mmdetection (v3.3.0) install (no build isolation to use venv torch) ---
RUN git clone https://github.com/open-mmlab/mmdetection.git /opt/mmdetection && \
cd /opt/mmdetection && git fetch --all --tags && git checkout v3.3.0 && \
echo "Installing mmdetection v3.3.0" && \
uv pip install -v --no-build-isolation -e .
# --- NLTK dataをあらかじめダウンロード(Grounding dinoの実行時エラーを避けるため) ---
RUN uv run python -c "import nltk; nltk.download('punkt_tab', download_dir='/opt/.venv/nltk_data'); \
nltk.download('averaged_perceptron_tagger_eng', download_dir='/opt/.venv/nltk_data')"
# デフォルトシェル
CMD ["/bin/bash"]
Dockerをビルドして環境を立ち上げたあとはローカル環境と同様に推論できるので、以降は省略します。
以上、参考になれば幸いです。
Discussion