AWSのGPUマシンでVRChatをプレイする
インスタンス構成
- OS: Windows Server 2022
- タイプ: g6e.*xlarge
- g6eシリーズであれば動作することを確認済みです。他のインスタンスタイプについては検証しておりません。
Windows Server 2025 は非推奨
Windows Server 2025 ではオーディオ周りに既知のバグが存在し、VRChat のアニメーション同期に問題が発生する場合があります。
この問題に対し、OS を変更する以外の有効な対処法は確認されていません。
安定した環境のため、Windows Server 2025 以外の OS を使用することを強く推奨します。
AWS 事前準備
G 系の GPU インスタンスを利用するには、vCPU クォータの申請が事前に必要です。
8 vCPU あれば概ね問題ありませんので、事前に申請しておきましょう。
IAM ロール作成 (S3 アクセス用)
EC2 インスタンスから S3 バケットへの読み取りアクセスを許可するための IAM ロールを作成します。
- エンティティタイプ: 「AWS サービス」を選択
- ユースケース: 「EC2」を選択
- 許可ポリシー: 「AmazonS3ReadOnlyAccess」ポリシーをアタッチ
より強力な「AmazonS3FullAccess」ポリシーも利用可能ですが、セキュリティ上のリスクを考慮し、「AmazonS3ReadOnlyAccess」を推奨します。
ロール名は任意のわかりやすい名前を設定してください。他の設定項目はデフォルトのままで問題ありません。
GPU インスタンス作成
EC2 インスタンスを起動し、GPU インスタンスを作成します。
インスタンス作成手順:
-
AMI (Amazon Machine Image) の選択:
- 「インスタンスを起動」画面を開き、「名前とタグ」に任意のインスタンス名を入力します。
-
OS イメージ:
- 「OS イメージ」には必ず Windows Server 2022 Base を選択してください。
-
インスタンスタイプ:
- インスタンスタイプは「g6e.2xlarge」を選択しています。
- より多くの CPU コアが必要な場合は、他の g6e シリーズのインスタンスタイプも選択可能です。
-
キーペア (ログイン認証情報):
- Windows インスタンス用のキーペアを必ず作成し、秘密鍵ファイル (*.pem) を安全な場所に保管してください。
- この秘密鍵は後ほど RDP 接続時に必要になります。
-
ネットワーク設定:
- 特殊な理由がない限り、自分のipだけを許可してください。
-
ストレージ設定:
- ルートボリューム (C ドライブ) は 128GB で十分です。
- g6e.2xlarge インスタンスには、ルートボリュームとは別に 450GB のストレージボリュームが標準で付属します。
- 用途に応じてストレージサイズを調整してください。
-
デプロイ:
- 設定内容を確認し、「インスタンスを起動」をクリックしてデプロイを開始します。
- デプロイが完了するまで数分待ちます。
私の設定例:
IAM ロール割り当て
インスタンス作成前に作成した IAM ロールを GPU インスタンスに割り当てます。
手順:
- EC2 インスタンス一覧から、作成した GPU インスタンスを選択します。
- 「アクション」→「セキュリティ」→「IAM ロールを変更」を選択します。
- 先ほど作成した IAM ロールを選択し、「更新」をクリックします。
RDP 接続設定
インスタンス起動直後は OS の初期設定が行われるため、RDP 接続が可能になるまで 3〜5 分程度待つ必要があります。
RDP 接続手順:
- EC2 インスタンス一覧から、作成した GPU インスタンスを選択します。
- 「接続」をクリックし、「RDP クライアント」タブに移動します。
- 「リモートデスクトップファイルのダウンロード」をクリックし、
{インスタンス名}.rdp
ファイルをダウンロードします。 - 「パスワードを取得」をクリックします。
- 「プライベートキーのアップロード」画面が表示されるので、キーペア作成時にダウンロードした秘密鍵ファイル (*.pem) をアップロードするか、秘密鍵の内容をテキストエリアに貼り付けます。
- 「パスワードを復号化」をクリックすると、「RDP クライアント」タブにパスワードが表示されます。
- 表示されたパスワードをメモしておきます。
- ダウンロードした RDP ファイルを実行し、メモしたパスワードを入力してリモートデスクトップ接続を行います。
Windows Server 設定
GPU ドライバーインストール (NVIDIA L40S)
g6e インスタンスには NVIDIA L40S GPU が搭載されています。
GPU ドライバーは以下の手順でインストールします。
基本的には NVIDIA の公式ドキュメント (AWS EC2 向け) に沿って作業を進めます。
参考: NVIDIA ドライバのインストール - Amazon EC2 Windows インスタンス
1. ドライバダウンロード
PowerShell を管理者権限で開き、以下のコマンドをコピー&ペーストして実行します。
$Bucket = "ec2-windows-nvidia-drivers"
$KeyPrefix = "latest"
$LocalPath = "$home\Desktop\NVIDIA"
$Objects = Get-S3Object -BucketName $Bucket -KeyPrefix $KeyPrefix -Region us-east-1
foreach ($Object in $Objects) {
$LocalFileName = $Object.Key
if ($LocalFileName -ne '' -and $Object.Size -ne 0) {
$LocalFilePath = Join-Path $LocalPath $LocalFileName
Copy-S3Object -BucketName $Bucket -Key $Object.Key -LocalFile $LocalFilePath -Region us-east-1
}
}
処理が完了すると、デスクトップに「NVIDIA」というフォルダが作成されます。
フォルダ内の「latest」フォルダに NVIDIA GPU ドライバのインストーラーが格納されています。
- ドライバインストール
ダウンロードしたインストーラーを実行し、GPU ドライバをインストールします。
インストール完了後、タスクマネージャーを起動し、「パフォーマンス」タブで NVIDIA L40S GPU が認識されていることを確認してください。
- GPU 最適化
GPU のパフォーマンスを最適化するために、以下のコマンドを PowerShell で実行します。
参考: GPU ワークロード向けに最適化 - Amazon EC2 Windows インスタンス
nvidia-smi -ac "9001,2520"
この設定により、GPU のパフォーマンスが向上します。
自動ログイン設定
RDP 接続を常時維持する代わりに、Parsec などのリモートデスクトップクライアントを使用する場合は、Windows Server の自動ログイン設定を有効にすることを推奨します。
自動ログイン設定スクリプト:
自動ログイン設定スクリプト (PowerShell)
# 管理者権限で実行されているか確認
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
Write-Host "このスクリプトは管理者権限で実行する必要があります。" -ForegroundColor Red
Write-Host "PowerShellを管理者権限で開き直して、スクリプトを再実行してください。" -ForegroundColor Red
exit
}
# バナー表示
Write-Host "=================================================" -ForegroundColor Cyan
Write-Host "Windows Server 2022 自動ログイン設定ツール" -ForegroundColor Cyan
Write-Host "=================================================" -ForegroundColor Cyan
Write-Host "このスクリプトはサーバー起動時に自動ログインを設定します。" -ForegroundColor Yellow
Write-Host "警告: 自動ログインを設定するとセキュリティリスクが高まります。" -ForegroundColor Red
Write-Host "パスワードはレジストリに平文で保存されるため、注意が必要です。" -ForegroundColor Red
Write-Host "=================================================" -ForegroundColor Cyan
# ユーザーからの入力を取得
Write-Host "`n自動ログインに使用するアカウント情報を入力してください:" -ForegroundColor Green
$defaultUsername = "Administrator"
$username = Read-Host "ユーザー名 (デフォルト: $defaultUsername)"
if ([string]::IsNullOrWhiteSpace($username)) {
$username = $defaultUsername
}
$securePassword = Read-Host -AsSecureString "パスワード"
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePassword)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR)
if ([string]::IsNullOrWhiteSpace($password)) {
Write-Host "パスワードが入力されていません。自動ログインにはパスワードが必要です。" -ForegroundColor Red
exit
}
# 確認メッセージ
Write-Host "`n以下の設定で自動ログインを構成します:" -ForegroundColor Yellow
Write-Host "ユーザー名: $username" -ForegroundColor Yellow
Write-Host "パスワード: (セキュリティのため非表示)" -ForegroundColor Yellow
$confirmation = Read-Host "`n続行しますか? (Y/N)"
if ($confirmation -ne "Y" -and $confirmation -ne "y") {
Write-Host "`n処理をキャンセルしました。" -ForegroundColor Red
exit
}
# レジストリキーの設定
$winlogonPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
try {
Set-ItemProperty -Path $winlogonPath -Name "AutoAdminLogon" -Value "1" -Force
Set-ItemProperty -Path $winlogonPath -Name "DefaultUserName" -Value $username -Force
Set-ItemProperty -Path $winlogonPath -Name "DefaultPassword" -Value $password -Force
# DefaultDomainNameが不要な場合は削除
if (Get-ItemProperty -Path $winlogonPath -Name "DefaultDomainName" -ErrorAction SilentlyContinue) {
Remove-ItemProperty -Path $winlogonPath -Name "DefaultDomainName" -Force
}
Write-Host "`n自動ログインの設定が完了しました!" -ForegroundColor Green
Write-Host "次回のサーバー再起動時に $username アカウントで自動的にログインされます。" -ForegroundColor Green
} catch {
Write-Host "`nエラーが発生しました: $_" -ForegroundColor Red
exit
}
Write-Host "`n=================================================" -ForegroundColor Cyan
Write-Host "セキュリティ上の注意:" -ForegroundColor Red
Write-Host "・自動ログインは物理的なアクセスに対する保護を弱めます" -ForegroundColor Red
Write-Host "・パスワードはレジストリに平文で保存されています" -ForegroundColor Red
Write-Host "・本番環境での使用は推奨されません" -ForegroundColor Red
Write-Host "=================================================" -ForegroundColor Cyan
注意: 自動ログイン設定はセキュリティリスクを高める可能性があります。パスワードはレジストリに平文で保存されるため、十分注意して利用してください。
Ctrl+Alt+Del 必須解除 (オプション)
デフォルト設定では、Windows Server にログオンする際に Ctrl+Alt+Del キーを押す必要があります。
この手間を省くために、以下の手順で Ctrl+Alt+Del を不要にする設定変更を推奨します。
手順:
- グループポリシーエディター起動:
「gpedit.msc」と入力し、Enter キーを押してグループポリシーエディターを起動します。
- ポリシー移動:
左側のペインで「コンピューターの構成」→「ポリシー」→「Windows の設定」→「セキュリティの設定」→「ローカルポリシー」→「セキュリティオプション」を選択します。
- ポリシー変更:
「対話型ログオン: Ctrl + Alt + Del を必要としない」ポリシーをダブルクリックします。
- ポリシー有効化:
「有効」を選択し、「適用」→「OK」をクリックします。
推奨ソフトウェアのインストール
GPU インスタンス構築後の推奨ソフトウェア:
- Steam
- Virtual Desktop
- Parsec
- VB-Cable (仮想オーディオケーブル)
デスクトップモードで VRChat をプレイする場合は、Parsec の利用を特におすすめします。
動画再生に関する問題と対策
AWS から割り当てられる IP アドレスが YouTube によってブロックされている場合があり、初期状態では動画プレイヤーが正常に再生できないことがあります。
この問題への対策として、プロキシサーバー (Squid) を経由する方法を紹介します。
構成例:
GCP (Google Cloud Platform) などに Squid サーバーを構築します。
Tailscale などの VPN ソフトウェアで GPU インスタンスと Squid サーバーを接続します。
Proxifier などのプロキシクライアントソフトウェアで、GPU インスタンスからの通信先を Squid サーバーに向けるように設定します。
設定例 (Proxifier):
この設定により、動画プレイヤーが正常に動作するようになります。
本来は Cookie を利用した解決方法を検討しましたが、VRChat が使用する yt-dlp が Cookie 設定に対応していないため、プロキシサーバー経由での対策となりました。
yt-dlp を本家版に置き換えることも検討しましたが、エンコーダー周りで問題が発生するため、この方法が現状最も現実的な解決策となります。
VRChat プレイ画面例
以下は、実際に GPU インスタンスで VRChat をプレイしている画面例です。
高負荷なホームワールドでも快適に動作しています。
NVIDIA L40S は大容量 VRAM を搭載しているため、大人数イベントや高解像度 (8K) スクリーンショット撮影など、VRAM 消費の大きい用途で特に性能を発揮できます。
処理性能は GeForce RTX 4060 相当であり、Quest 2 + Virtual Desktop 環境で、Virtual Desktop 側設定 Medium、SteamVR 側設定 300% で、ゴールデンタイムの 50 人規模のパブリック横丁ワールド (ポピ横) にシールドなしで参加した場合でも、40 FPS 前後で安定して動作しました。
VRAM に余裕があるためか、極端な処理落ちやカクつきは見られませんでした。
OBS Studio を使用した 4K/60fps VRChat 録画も可能です。
エンコーダー設定を適切に調整することで、VRChat 側も 60fps 以上を維持しながら高品質な録画が可能です。
Discussion