🦙

g6f.xlargeのセットアップとDINOv3を動かすまでの手順

に公開

本記事の目標

先端技術開発グループ(WAND)の佐藤碧です。2025年7月末にGPUの分割利用ができるG6fインスタンスがGAされました。このインスタンスをセットアップしてDINOv3を動かす手順を解説します。

G6fインスタンスとは

G6fインスタンスは、AWSが提供するフラクショナルGPU G6インスタンスで、1枚のNVIDIA L4 Tensor Core GPUを複数の仮想スライスに分け、各インスタンスに割り当てています。G6f は小容量プロファイルが選べるため、時間単価を抑えつつ「必要なだけ」GPUを確保できるのが強みです。下記の表はAWS公式サイトより掲載しています。

インスタンスタイプ vCPU メモリ (GiB) NVIDIA L4 Tensor Core GPU GPU メモリ (GiB) us-east-1 料金 (ドル/h)
g6f.large 2 8 1/8 3 $0.202
g6f.xlarge 4 16 1/8 3 $0.2375
g6f.2xlarge 8 32 1/4 6 $0.475
g6f.4xlarge 16 64 1/2 12 $0.95
g6.xlarge 4 16 1 24 $0.8048

※上記はEC2のオンデマンドインスタンスの1時間あたりの料金(2025年7月現在、AWSの公式より)。g6f.largeであれば、g6.xlargeと同じ種類のGPUを1/3以下の値段で使用できています。

事前準備1:DINOv3

DINOv3の詳しい解説は、弊社のエンジニアが書いた記事があります。そちらをご覧ください。

DINOv3のREADMEに記載の通り、モデルの重みをダウンロードするためには事前に承認が必要です。リンクから申請を送ります。

事前準備2:VPCの作成

Amazon EC2インスタンス用のVPCを作成します。DINOv3のGitHubリポジトリとDINOv3で使用する重みをダウンロードする必要があるため、インターネットにアクセスできる形で作成します。

検証時にはパブリックサブネットにインスタンスを作成しました。

EC2のセットアップ

EC2の作成

AWSコンソールから、g6f.xlargeインスタンスを作成します。AMIは以下のコマンドで検索することができます。

$ aws ec2 describe-images \
  --owners 099720109477 \
  --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*" \
  --query 'Images[?starts_with(Name, `ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-`)] | sort_by(@, &CreationDate)[-1].ImageId' \
  --region us-east-1 \
  --output text

上記のコマンドは、Ubuntu Linux公式(正確にはCanonical)が提供する「仮想化タイプがHVMでルートボリュームがEBSのSSDバックエンドである」「Ubuntu20.04LTS」「アーキテクチャがx86_64」「サーバー型」のAMIを検索しています。検証では、ami-0fb0b230890ccd1e6を使用しました。

AmazonSSMManagedInstanceCoreポリシー(セッションマネージャー用)とAmazonS3ReadOnlyAccessポリシー(S3バケットからのファイルダウンロード用)を持ったIAMロールを作成し、EC2作成時にインスタンスプロファイルとしてアタッチしておきます。

NVIDIAドライバのインストール

「EC2 > インスタンス > 自分の作成したインスタンス」で、接続をクリックし、セッションマネージャーで接続します。AWSの公式ドキュメントを参考にインストールを進めていきます。このドキュメントは日本語版もありますが、一部アップデートが追いついていない部分があります。そのため、英語版を参照してインストールを進めていきます。

上記に記載の通り、G6fインスタンスではGRIDドライバしかサポートされていません。

GRIDドライバをインストールする際にも注意が必要で、GRID18.4以降GRID19.0以前のバージョンを使用する必要があります。日本語版のドキュメントには19.0以前のバージョンが必要との説明が抜けていました。以降はドキュメントに従って進めていきます。

# パッケージをアップデート
$ sudo apt-get update -y

# `gcc`, `make` をインストール
$ sudo apt-get install -y gcc make

# `linux-aws` をアップグレード
$ sudo apt-get upgrade -y linux-aws

# 最新のカーネルバージョンをロードするために再起動
$ sudo reboot

sudo rebootコマンドを使用するとインスタンスが再起動します。このときセッションマネージャーによる接続が切れてしまうので、再接続する必要があります。

# 使用しているカーネルのバージョン用のカーネルヘッダーパッケージをインストール
$ sudo apt-get install -y linux-headers-$(uname -r) linux-modules-extra-$(uname -r)

# NVIDIAグラフィックスカード用の`nouveau`オープンソースドライバを無効にする
## `nouveau` をブラックリストファイルに追記する
$ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
EOF

## `/etc/default/grub`ファイルを編集する
## `root`権限でしか編集できないファイルなので`sudo`をつけてエディタを起動する必要があります。
$ sudo vi /etc/default/grub
## `GRUB_CMDLINE_LINUX=""`と記載の場所の`""`を`"rdblacklist=nouveau"`に書き換えます。

## grubの設定変更を反映する
$ sudo update-grub

次に、対応するGRIDドライバを探します。こちらはs3://ec2-linux-nvidia-driversというS3バケットにAWSが用意してくれています。

# AWS CLIのインストール
$ sudo apt-get install -y awscli

# 該当のGRIDドライバを探す
$ aws s3 ls --recursive s3://ec2-linux-nvidia-drivers/
2023-01-16 15:41:08      28971 LicenseAgreement/NvidiaGridAWSUserLicenseAgreement.DOCX
2023-01-16 15:41:09   79069931 NVIDIA-Linux-x86_64-367.106-grid.run
2023-01-16 15:41:08       1428 RELEASE_NOTES.txt
2023-01-16 15:41:10  148762595 g4/grid-10.0/NVIDIA-Linux-x86_64-440.43-grid-aws.run
...
2025-06-17 05:54:11  381616109 grid-18.2/NVIDIA-Linux-x86_64-570.148.08-grid-aws.run
2025-07-23 22:48:32  381726019 grid-18.4/NVIDIA-Linux-x86_64-570.172.08-grid-aws.run
2025-09-12 22:59:38          0 grid-19.0/
2025-09-12 23:00:47  399150339 grid-19.0/NVIDIA-Linux-x86_64-580.65.06-grid-aws.run
2025-09-20 00:00:00  402271765 grid-19.1/NVIDIA-Linux-x86_64-580.82.07-grid-aws.run
...
2023-01-16 15:41:53  118818518 grid-9.1/NVIDIA-Linux-x86_64-430.46-grid.run
2025-09-20 00:00:02  402271765 latest/NVIDIA-Linux-x86_64-580.82.07-grid-aws.run

上記のような結果になります。あまりにも長すぎるので一部省略しました。今回使用可能なのは、grid-18.4/NVIDIA-Linux-x86_64-570.172.08-grid-aws.runのみだと分かります。

# 該当のNVIDIAドライバインストールユーティリティをダウンロードする
$ sudo aws s3 cp --recursive s3://ec2-linux-nvidia-drivers/grid-18.4/ .

# 実行権限を付与する
$ sudo chmod +x NVIDIA-Linux-x86_64*.run

# セルフインストールスクリプトを実行し、GRIDドライバをインストールする
$ sudo /bin/sh ./NVIDIA-Linux-x86_64*.run
## ここでインストール画面が開きます。全てデフォルト設定で問題なく動きました。

# ドライバが機能していることを確認する
$ nvidia-smi
Fri Sep 26 11:13:47 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08             Driver Version: 570.172.08     CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| 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 L4-3Q                   On  |   00000000:31:00.0 Off |                    0 |
| N/A   N/A    P0            N/A  /  N/A  |       0MiB /   3072MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

上記のコマンドの結果を見ることで、ドライバが機能しておりGPUメモリが3GB割り当てられていることが分かります。

Python用仮想環境を作成する

DINOv3はPython3.11以上を要求します。そのためPython3.11の仮想環境を作成します。

# ubuntuユーザーに切り替える
$ sudo su ubuntu
# ホームディレクトリに移動する
$ cd ~

# パッケージをアップデート
$ sudo apt update

# Python3.11のインストール
$ sudo apt install -y software-properties-common
$ sudo add-apt-repository -y ppa:deadsnakes/ppa
$ sudo apt update
$ sudo apt install -y python3.11 python3.11-venv python3.11-distutils

# 仮想環境の作成
$ python3.11 -m venv ~/venv-dinov3-py311
$ source ~/venv-dinov3-py311/bin/activate
$ pip install --upgrade pip setuptools wheel

# PyTorchと依存パッケージのインストール
$ pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
$ pip install numpy scipy scikit-learn opencv-python matplotlib seaborn tqdm jupyter ipykernel
$ pip install einops timm requests pillow ftfy omegaconf regex submitit termcolor torchmetrics

DINOv3のインストール

DINOv3は公式リポジトリからインストールします。

$ git clone https://github.com/facebookresearch/dinov3.git
$ cd ~/dinov3
$ pip install -e .

重みは、事前準備の申請が通ると公式からメールが送られます。ここに記載のpre-signed URLを使用することで重みがダウンロードできるようになります。

# 重みを置くディレクトリを作成する
$ mkdir -p /home/ubuntu/.cache/torch/hub/checkpoints

# ディレクトリを移動する
$ cd /home/ubuntu/.cache/torch/hub/checkpoints

# 重みをダウンロードする
$ wget -O dinov3_<重みの種類>.pth "<メールに記載のpre-signed URL>"

Jupyter Notebookの起動

EC2インスタンス上でJupyter Notebookを起動し、ローカルPCのターミナルからセッションマネージャーを使ってポートフォワーディング接続します。

# ディレクトリを移動する
$ cd /home/ubuntu/dinov3

# Jupyterカーネルを登録する
$ python -m ipykernel install --user --name dinov3-py311 --display-name "Python 3.11 (dinov3)"

# Jupyter Notebookを起動する
$ jupyter notebook --no-browser --port 8888

ここからのコマンドはローカルPCのターミナルで実行することを想定しています。AWSコマンドラインインタフェースおよびセッションマネージャープラグインがインストール済みであることを前提とします。

$ aws ssm start-session \
  --target <インスタンスID> \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{"portNumber":["8888"],"localPortNumber":["8888"]}' \
  --region us-east-1

これによって、http://localhost:8888 でJupyter Notebookにアクセスできます。

DINOv3を動かす

軽量モデル

まずは、軽量な重みである/home/ubuntu/.cache/torch/hub/checkpoints/dinov3_vits16_pretrain_<バージョン名>.pthを試してみます。
Notebookとして用意されているnotebooks/pca.ipynbを行うことを目標にします。そのために事前準備としてnotebooks/foreground_segmentation.ipynbを行います。事前にダウンロードした重みを使用するように、一部のコードを下記のように変えて実行します。

# 変数の設定
DINOV3_LOCATION = "/home/ubuntu/dinov3"
DINOV3_GITHUB_LOCATION = "facebookresearch/dinov3"

MODEL_NAME = "dinov3_vits16"
LOCAL_WEIGHTS = "/home/ubuntu/.cache/torch/hub/checkpoints/dinov3_vits16_pretrain_<バージョン名>.pth"

# モデルのロード
model = torch.hub.load(
    repo_or_dir=DINOV3_LOCATION,
    model=MODEL_NAME,
    source="local" if DINOV3_LOCATION != DINOV3_GITHUB_LOCATION else "github",
    weights=LOCAL_WEIGHTS,
)
$ nvidia-smi
Sun Sep 28 23:31:32 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08             Driver Version: 570.172.08     CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| 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 L4-3Q                   On  |   00000000:31:00.0 Off |                    0 |
| N/A   N/A    P0            N/A  /  N/A  |     274MiB /   3072MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            1181      C   ...v-dinov3-py311/bin/python3.11        273MiB |
+-----------------------------------------------------------------------------------------+

モデルをロードした時点でのGPUメモリ使用量は上記のようになっていました。軽量なモデルであることもあり、GPUのメモリのうち1割程度しか使っていません。このような軽量なモデルでは、GPUメモリを3GB以上使うことはほとんどありません。このようなモデルをデプロイするインスタンスとして、G6fインスタンス系は有効です。

$ nvidia-smi
Sun Sep 28 23:40:20 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08             Driver Version: 570.172.08     CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| 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 L4-3Q                   On  |   00000000:31:00.0 Off |                    0 |
| N/A   N/A    P0            N/A  /  N/A  |     542MiB /   3072MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            1181      C   ...v-dinov3-py311/bin/python3.11        541MiB |
+-----------------------------------------------------------------------------------------+

上記がnotebooks/foreground_segmentation.ipynbを行った時点でのGPUメモリ使用量です。使用感としては、g6.xlargeなどの通常のインスタンスと全く同じように感じます。

同じようにpca.ipynbも行います。先ほどと同様にモデルロード時の変数を置き換えて実行します。

PCAを適用して背景をマスキングした結果は以下のようになりました。

元イメージが、

に対して、

という結果になりました。

$ nvidia-smi
Sun Sep 28 23:44:00 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08             Driver Version: 570.172.08     CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| 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 L4-3Q                   On  |   00000000:31:00.0 Off |                    0 |
| N/A   N/A    P0            N/A  /  N/A  |     941MiB /   3072MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            1181      C   ...v-dinov3-py311/bin/python3.11        541MiB |
|    0   N/A  N/A            1514      C   ...v-dinov3-py311/bin/python3.11        399MiB |
+-----------------------------------------------------------------------------------------+

上記のように、GPUメモリは余裕があります。

重たいモデル

次は、より大きいモデルを動かしてみます。カーネルをリスタートしてGPUメモリ使用量を0にしておきます。

MODEL_NAME = "dinov3_vitl16"
LOCAL_WEIGHTS = "/home/ubuntu/.cache/torch/hub/checkpoints/dinov3_vitl16_pretrain_<バージョン名>.pth"
$ nvidia-smi
Fri Sep 26 11:11:46 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 570.172.08             Driver Version: 570.172.08     CUDA Version: 12.8     |
|-----------------------------------------+------------------------+----------------------+
| 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 L4-3Q                   On  |   00000000:31:00.0 Off |                    0 |
| N/A   N/A    P0            N/A  /  N/A  |    2358MiB /   3072MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A           52152      C   ...v-dinov3-py311/bin/python3.11       2357MiB |
+-----------------------------------------------------------------------------------------+

モデルをロードした時点で上記のように7割以上のGPUメモリが使用されていました。その後、特徴量とラベルの抽出時にOutOfMemoryError: CUDA out of memoryが発生しました。このように推論時にメモリ不足となるケースもあるので、そのことを踏まえてインスタンスを選ぶ必要があると感じました。

今後の応用

G6f系インスタンスのようなフラクショナルGPUを選ぶと、通常のG6インスタンスと比べてどのような違いがあるのかを負荷テストによって計測したいと感じました。特に垂直スケール(スケールアップ)と水平スケール(スケールアウト)のどちらを選択すべきかという戦略をどのようにとるべきかなど、実運用時に迷うであろう箇所についてです。これは今後機会があれば書いていきたいです。

まとめ

本記事では、G6f系インスタンスを使用してDINOv3を動かす一連の手順を解説しました。
日本語版のドキュメントにある説明の不足点を補足し、NVIDIAドライバをインストールし、その後Jupyter NotebookでDINOv3を動かしました。

今後は「Application Load Balancer」、「EC2 Auto Scaling」や「ECS on EC2」などと組み合わせてこのインスタンスを実際に本番環境で使用することが考えられます。機会があれば、そちらも検証していきたいです。

エクサウィザーズ Tech Blog

Discussion