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」などと組み合わせてこのインスタンスを実際に本番環境で使用することが考えられます。機会があれば、そちらも検証していきたいです。
Discussion