
NVIDIA Cosmos 3 NanoをAWSのL40S(g6e.xlarge)で動かしてみた
はじめに
NVIDIAの世界基盤モデルプラットフォームCosmos 3を、AWSのGPUインスタンスで動かしてみました。
Cosmos 3をDGX Spark上で動かした先行記事はすでにありますが、今回はAWS EC2の単一GPU(NVIDIA L40S 48GB)で環境をゼロから構築し、いちばん軽いNanoで動画生成まで通すのがゴールです。
私がCosmosをいじり始めた目的としてはCosmos 3 Superで検証を行いたかったからなのですが、まずは手軽なNanoに触れて感覚を掴んでみようと思いました。
先に結論を書くと、
- Cosmos 3 NanoはAWSのg6e.xlarge(L40S 48GB)1枚で動く(公式モデルカードの対応アーキ一覧はAmpere/Hopper/Blackwellで、検証環境もGB200/H100。L40SのAda Lovelaceは一覧に明記されていないGPUだが、実際には問題なく動いた)。
- 720p / 45フレーム / 30ステップの生成でピークVRAMは43.7GB。48GBにギリギリ収まり、720pがL40Sでの実用上限の目安。
- 環境構築でいくつか詰まりどころがあったので、その回避手順も残します。
DGX Spark上での実験記事
環境と方針
| 項目 | 内容 |
|---|---|
| インスタンス | g6e.xlarge(NVIDIA L40S 48GB × 1, 4 vCPU) |
| リージョン | 東京(ap-northeast-1) |
| AMI | Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04) |
| ドライバ / CUDA | 595.71.05 / CUDA 13.2対応 |
| モデル | nvidia/Cosmos3-Nano(16B: 8B reasoner + 8B generator, BF16) |
| 実行方式 | Hugging Face Diffusers(Cosmos3OmniPipeline) |
なぜL40S(g6e)かというと、環境構築の試行錯誤は安いインスタンスで済ませたいからです。Nanoは軽量なモデルなので、48GBのL40Sでもいけると考えました(結果的にこれは正解でした)。
単一GPUの選択肢としては、AWSには2025年8月から単一H100のp5.4xlarge(80GB)もありますが、まず動かすというフェーズではg6e.xlarge(L40S 48GB)で十分です(GPUインスタンスは高額なので、料金は起動前にリージョンごとの最新オンデマンド単価を必ず確認してください)。
手順
1. サービスクォータの確認
EC2のGPUインスタンスは、アカウント既定ではクォータ(vCPU数)が0のことが多く、増加申請が必要です。今回は既に引き上げ済みのアカウントでしたが、未申請の場合はService Quotasコンソールから以下を申請してください。
- Running On-Demand G and VT instances
2. インスタンスの起動
CLIで進めます。(その方が読者の方が再現しやすいと思うので)まずキーペアとセキュリティグループ(自分のIPからのSSHのみ許可)を用意します。
export AWS_REGION=ap-northeast-1
KEY=cosmos-exp01 ; SG=cosmos-exp01-sg ; AZ=ap-northeast-1a
AMI=ami-xxxxxxxx # 「Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04)」の最新IDを describe-images で取得
VPC=$(aws ec2 describe-vpcs --filters "Name=isDefault,Values=true" --query 'Vpcs[0].VpcId' --output text)
SUBNET=$(aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPC" "Name=availability-zone,Values=$AZ" --query 'Subnets[0].SubnetId' --output text)
aws ec2 create-key-pair --key-name $KEY --query 'KeyMaterial' --output text > ~/.ssh/$KEY.pem
chmod 400 ~/.ssh/$KEY.pem
SGID=$(aws ec2 create-security-group --group-name $SG --description "Cosmos exp SSH" --vpc-id $VPC --query 'GroupId' --output text)
MYIP=$(curl -s https://checkip.amazonaws.com)
aws ec2 authorize-security-group-ingress --group-id $SGID --protocol tcp --port 22 --cidr ${MYIP}/32
AMIの最新IDはこう取れます。
aws ec2 describe-images --owners amazon \
--filters "Name=name,Values=Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04)*" \
--query 'reverse(sort_by(Images,&CreationDate))[:1].[ImageId,Name]' --output table
起動します。ルートディスクはgp3 200GB(モデル重み + HFキャッシュ + 生成物)、DeleteOnTermination=trueで消し忘れによるEBSの課金を防ぎます。
ROOT=$(aws ec2 describe-images --image-ids $AMI --query 'Images[0].RootDeviceName' --output text)
IID=$(aws ec2 run-instances \
--image-id $AMI --instance-type g6e.xlarge \
--key-name $KEY --security-group-ids $SGID --subnet-id $SUBNET \
--block-device-mappings "DeviceName=$ROOT,Ebs={VolumeSize=200,VolumeType=gp3,DeleteOnTermination=true}" \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=cosmos-exp01}]' \
--count 1 --query 'Instances[0].InstanceId' --output text)
aws ec2 wait instance-running --instance-ids $IID
aws ec2 describe-instances --instance-ids $IID \
--query 'Reservations[0].Instances[0].[State.Name,PublicIpAddress]' --output table
3. SSHしてGPUを確認
ssh -i ~/.ssh/cosmos-exp01.pem ubuntu@<PublicIP>
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv
name, memory.total [MiB], driver_version
NVIDIA L40S, 46068 MiB, 595.71.05
L40S 48GB、ドライバ595.71.05(CUDA 13.2対応)を確認。Cosmos 3はCUDA 13.0(推奨)または12.8を前提とするので、このドライバなら問題ありません。
4. Cosmos 3のセットアップ
Cosmos 3のセットアップは、公式手順がどの経路(Diffusers/Transformers/vLLM)でもuv + Python 3.13を指定しています(uv venv --python 3.13)。今回は公式どおりuv + Python 3.13で進めて問題なく通りました。DLAMIの既定Pythonは使わず、uvに3.13の仮想環境を管理させます。長い処理があるのでtmuxの中で進めるのがおすすめです。
# システム依存(headless サーバ用の libgl 等も入れる)
sudo apt-get update
sudo apt-get install -y --no-install-recommends curl ffmpeg git-lfs libx11-dev tree wget libxcb1 libgl1 libglib2.0-0
git lfs install
# uv
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
# 仮想環境(Python 3.13)と依存インストール
mkdir -p ~/cosmos3 && cd ~/cosmos3
uv venv --python 3.13 --seed --managed-python
source .venv/bin/activate
uv pip install --torch-backend=auto \
"diffusers @ git+https://github.com/huggingface/diffusers.git" \
accelerate av cosmos_guardrail huggingface_hub imageio \
imageio-ffmpeg torch torchvision transformers
+ torch==2.12.1+cu130
+ torchvision==0.27.1+cu130
+ transformers==5.12.1
...
5. Hugging Faceの認証
Cosmos3-Nano本体はOpenMDW-1.1ライセンスでオープンですが、生成時に読み込むガードレール(nvidia/Cosmos-1.0-Guardrail)はアクセス承認が必要です。HFのモデルページでAcceptしておきます。
認証はhf auth loginのブラウザdevice-codeフローを使うと、headlessサーバでは待ち時間が短くタイムアウトしがちでした。
Error: Login failed: Device code expired (timeout). Please try again.
トークンを環境変数で渡す方式にすると一発です(huggingface_hubが自動で参照します)。
export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxx # Read 権限のトークン
hf auth whoami # ユーザー名が出れば OK
6. 推論
推論は公式の例と同じくCosmos3OmniPipelineを使います。以下はtext-to-videoの最小スクリプトです。
import time, torch
from diffusers import Cosmos3OmniPipeline
from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler
from diffusers.utils import export_to_video
pipe = Cosmos3OmniPipeline.from_pretrained(
"nvidia/Cosmos3-Nano", torch_dtype=torch.bfloat16, device_map="cuda",
enable_safety_checker=True,
)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=10.0)
torch.cuda.reset_peak_memory_stats()
t0 = time.time()
result = pipe(
prompt="A warehouse robot picks up a cardboard box from a shelf, cinematic, high detail.",
num_frames=45, height=704, width=1280,
num_inference_steps=30, guidance_scale=6.0,
generator=torch.Generator(device="cuda").manual_seed(7),
)
export_to_video(result.video, "/tmp/cosmos3_t2v_720p.mp4", fps=16)
print(f"OK elapsed={time.time()-t0:.1f}s peakVRAM={torch.cuda.max_memory_allocated()/1e9:.1f}GB")
初回はNanoの重み(リポジトリ全体で約35GB)とガードレールを自動ダウンロードするので時間がかかります。実行結果はこちら。
100%|██████████████████████████| 30/30 [01:19<00:00, 2.67s/it]
OK elapsed=102.0s peakVRAM=43.7GB
結果と考察
720p
スモークテストで生成したもの
| 設定 | 生成時間 | ピークVRAM |
|---|---|---|
| 480×832 / 17フレーム / 20ステップ(スモーク) | 約8秒(生成ステップ) | — |
| 704×1280(720p) / 45フレーム / 30ステップ | 102秒 | 43.7GB |
ポイントは720pで43.7GBという数字です。L40Sの48GBに対して余裕は約4GB。これ以上の解像度・長尺はOOMのリスクが高く、720pがL40S(48GB)での実用上限と考えてよさそうです。より高解像度・長尺を狙うなら、80GBのH100(p5.4xlarge)や、そもそもマルチGPUが要る上位のSuperクラスの出番になります。
逆に言えば、Nanoクラスでの軽い生成ならL40S 1枚でも回せるということでもあります。学習・検証用途にはありです。
なお、NVIDIAは公式にはNanoを「RTX PRO 6000などのワークステーション級コンピュート」向けと位置づけており、開発者ブログやモデルカードを見てもVRAMの最小要件は明記されていません(モデルカードの対応アーキはAmpere/Hopper/Blackwell、検証環境はGB200/H100、精度はBF16のみ)。その想定より小さいL40S 48GBでも、720p・45フレームで43.7GBに収まって動作しました。「もっと高解像度・長尺・長いコンテキストを狙うなら96GB級が要る」という話であって、控えめな設定なら48GBで動く、というのが実測での結論です。
コストと後片付け
GPUインスタンスは高額なので、終わったら必ず撤去します。DeleteOnTermination=trueにしておいたので、EBSも一緒に消えます。
aws ec2 terminate-instances --instance-ids <InstanceId>
# 数分後
aws ec2 describe-instances --instance-ids <InstanceId> \
--query 'Reservations[0].Instances[0].State.Name' --output text # terminated を確認
使い終わったらすぐ terminate し、コンソールで残っているインスタンス・EBS・Elastic IPが無いかも確認しておくと安心です。
おわりに
NVIDIA Cosmos 3 NanoがAWSのL40S(g6e.xlarge)1枚で動くことを確認できました。環境構築の要点は、
- Python 3.13 + uv、Diffusersはmainを使う(
Cosmos3OmniPipelineを明示)。 - HF認証は
HF_TOKEN環境変数が確実。ガードレールのアクセス承認を忘れずに。 - 720pでピーク43.7GB=L40S 48GBの実用上限の目安。
次回は、そもそもの目的だったCosmos 3 Superの環境構築に進みます。Super(64B)は単一GPUには載らず複数GPU構成が要る見込み(公式の推奨serving構成も8基)なので、そのインスタンス選定と環境づくりが主題になる予定です。
Built on NVIDIA Cosmos. 生成物はnvidia/Cosmos3-Nanoを使用しています。





