こんにちは!金融ソリューション事業部の山下です。
本記事では、こちらの記事でも紹介したUnreal Engineが提供する「Pixel Streaiming」プラグインを使ってAWSサーバーからリアルタイムCGストリーミング配信を行います。
説明をシンプルにする為、AWSの基本的な知識(EC2, セキュリティグループ、IAMロールなど)の説明は割愛いたします。
また、本検証を行う場合、使用するGPUインスタンスの利用料金が発生する点にご注意ください。
実施手順
手順は、以下のとおりです。
前提知識
1. Pixel Streaming
(画像:https://docs.unrealengine.com/5.0/ja/overview-of-pixel-streaming-in-unreal-engine/)
- UEアプリケーションをサーバーサイドで実行して、レンダリング結果をWebRTCでストリーム配信する、EpicGames公式プラグインです。
- インターネットに繋がったWebブラウザがあれば、スマホやタブレット、ノートPCなど特別な端末スペック不要でUEアプリを楽しむことができます。
- キーボード、マウス、タッチスクリーン入力などユーザーによるコントロールも提供可能です。
使用環境/ツール
- Unreal Engine 5.0.3
- Pixel Streaming plugin 1.0
- AWS EC2
- NICE DCV 2022.1 Client
手順1. AWS EC2でGPUインスタンスを作成
AMIには、Ubuntu 20.04 LTS AMIを選択します。
このAMIには、PixelStreamingの動作要件として必要となるNVIDIAのCUDAドライバーがプリインストールされています。
インスタンスタイプは、NVIDIA GPUが利用可能なG4dnインスタンスを選択します。
今回は動作検証が目的の為、最小サイズのxlargeを選択しました。
これから実施するUnreal Engineのコンパイルやアプリケーションのビルドにあまり時間をかけたくない方は、より高性能なインスタンスタイプをおすすめします。
また、vCPU使用リミットの引き上げが必要になる場合、AWSに事前に申請が必要になります(今回選択したg4dn.xlargeの場合、vCPUは"4"になります)。
インスタンスの作成が完了したら、IAMロールでS3へのRead Permisionを付与します(AWSがEC2向けに提供するNVIDIAドライバをダウンロードする為に必要となります)。
また、HTTPとSSHアクセス以外に、NICE DCV接続用のUDP/TCPポートも開放します。
(※上記は検証用の設定なので、本番環境には使用しないでください。一応最低限のセキュリティとしてSSH接続にはkey pair、およびNICE DCV接続にはユーザー名とパスワードおよびセッションIDが必要になります)
手順2. インスタンス環境構築
インスタンスにSSHなどで接続して、環境構築を実施します。
こちらのAWS for Games Blogのチュートリアルを参考に、以下を実施します。
- Ubuntu desctop managerのインストール
- NVIDIAドライバのインストール
- DCVサーバーの起動、セッションの開始
- AWS SecretsManagerを使用した、Ubuntuユーザーのパスワード生成
実行コマンド:
#!/bin/bash #Installing the Ubuntu desktop manager sudo apt update -y sudo apt install -y ubuntu-desktop sudo apt install x11-xserver-utils sudo apt install awscli -y sudo apt install -y dpkg-dev sudo systemctl restart gdm3 sudo apt-get install xorg-dev -y #............................ # Disable the Wayland protocol. NICE DCV doesn't support the Wayland protocol. sudo sed -i '/WaylandEnable/s/^#//g' /etc/gdm3/custom.conf # ............................. # Install NVIDIA Drivers #.............................. sudo apt-get install -y unzip gcc make linux-headers-$(uname -r) cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf blacklist vga16fb blacklist nouveau blacklist rivafb blacklist nvidiafb blacklist rivatv EOF # ........ sudo sed -i -e '$a GRUB_CMDLINE_LINUX="rdblacklist=nouveau"' /etc/default/grub sudo update-grub # Make sure to give the EC2 instance S3 read permissions, otherwise this will fail sudo aws s3 cp --recursive s3://ec2-linux-nvidia-drivers/latest/ . sudo chmod +x NVIDIA-Linux-x86_64*.run sudo /bin/sh ./NVIDIA-Linux-x86_64*.run nvidia-smi -q | head# Configure the X Server sudo systemctl set-default graphical.target sudo systemctl isolate graphical.target sudo apt install -y mesa-utils sudo init 3 sudo init 5 sudo nvidia-xconfig --preserve-busid --enable-all-gpus sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep \ | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') glxinfo | grep -i "opengl.*version" sudo systemctl isolate multi-user.target sudo systemctl isolate graphical.target# Install DCV wget https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY gpg --import NICE-GPG-KEY sudo rm NICE-GPG-KEY sudo dcvstartx & sudo wget https://d1uj6qtbmh3dt5.cloudfront.net/2022.0/Servers/nice-dcv-2022.0-12123-ubuntu2004-x86_64.tgz sudo tar xvzf nice-dcv-*ubun*.tgz && cd nice-dcv-*64 sudo apt install -y ./nice-dcv-ser*.deb sudo apt install -y ./nice-x*.deb sudo apt install -y ./nice-dcv-web*.deb sudo usermod -aG video ubuntu sudo usermod -aG video dcv # Start the DCV Server and DCV session sudo systemctl enable dcvserver sudo systemctl start dcvserver sudo dcv create-session --type=console --owner=ubuntu newsession sudo dcv list-sessions #sudo dcv close-session newsession # Create random password for the user Ubuntu PASS=$(aws secretsmanager get-random-password --require-each-included-type --password-length 20 --query RandomPassword) INSTANCE=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-hostname) aws secretsmanager create-secret --name DCV/$INSTANCE --description "Credentials for $INSTANCE." --secret-string "{\"user\":\"ubuntu\",\"password\":$PASS}" sudo systemctl isolate multi-user.target sudo systemctl isolate graphical.target
(参考URL)
環境構築が完了したら、DCVサーバーとセッションが立ち上がっているはずです。
事前にダウンロードした(DCV Client)https://download.nice-dcv.com/を起動して、インスタンスにリモートデスクトップで接続しましょう。
NICE DCV接続に必要な情報として、以下の情報が必要になります。
- サーバーのホスト名 or IP
- ポート番号
- (手順2.で設定した)セッションID
- (手順2.で設定した)インスタンス ユーザー名/パスワード
以下の構文で入力します。
server_hostname_or_IP:port#session_id
このリモートデスクトップ接続は、UEプロジェクトのビルドの為に行うものです。
その為、もし事前にLinux向けビルド済のUEアプリケーションをお持ちの方は、次の手順3.は不要です。
手順3. UEプロジェクトのビルド
Unreal EngineのGitHubレポジトリより、Unreal Engineをダウンロードしてコンパイルします。
クローン:
git clone git@github.com:EpicGames/UnrealEngine.git
cd UnrealEngine/ ./Setup.sh ./GenerateProjectFiles.sh make
UnrealEngine GitHubレポジトリへのアクセスには、EpicGamesアカウントとGitHubアカウントとの紐付けが事前に必要になります。
もしお済みでない方は、EpicGames公式サイトのFAQよりアカウントの紐付けを行ってください。
こちらのコンパイルには物凄く時間がかかります。私が行った際は数時間程度かかったので、一旦放置しましょう。
無事コンパイルが完了したら、Unreal Editorを立ち上げます。
cd Engine/Binaries/Linux/ ./UnrealEditor
デモ用に、Architectureテンプレートから「Collab Viewer」テンプレートを選択します。
PixelStreaming用に、プロジェクト設定とビルドを行います。
詳細な解説は、こちらのUnreal Engine公式Documentationを参考にしてください。
Pixel Streamingプラグインの選択、再起動
メニュー「Edit」 -> 「Plugins」より、Pixel Streamingを検索して、チェックボックスをONにします。
再起動が求められるので、実施します。
Additional Launch Parametersの設定
メニュー「Edit」 -> 「Editor Preferences」 -> 「Level Editor」 -> 「Play」カテゴリより、
Additional Launch Parametersに以下を入力して、音声とIP/ポートを設定します。
AudioMixer -PixelStreamingIP=localhost -PixelStreamingPort=8888
UEアプリのLinux向けビルド
メニュー「Platforms」 -> 「Linux」 -> 「Package Project」より、プロジェクトのビルドを行います。
適切なディレクトリを設定してください( このビルドにもかなり時間がかかるので、ご注意ください)。
ビルドが完了したら、指定したディレクトリに「Linux」フォルダが作成されます。
手順4. UEアプリケーション、WebRTCサーバーの起動
まず、WebRTCサーバーを立ち上げます。
Unreal Engineが提供する「SignallingWebServer」(Node.jsベースのCirrus.jsを使用)を起動します。
セットアップ:
cd ~/Desktop/UnrealEngine/Samples/PixelStreaming/WebServers/SignallingWebServer/platform_scripts/bash chmod +x ./setup.sh ./setup.sh
SignallingServerの起動:
chmod +x ./Start_SignallingServer.sh ./Start_SignallingServer.sh
次に、UEアプリケーションを立ち上げます。
ビルド先のディレクトリに移動して、プロジェクト名のついたファイル(今回は「ps_test」)を実行します。
オプションとして、UEアプリのヘッドレス起動、Pixel StreamingのIP/ポートを指定します。
cd ~/Desktop/Linux chmod +x ./ps_test.sh ./ps_test.sh -RenderOffScreen -PixelStreamingIP=127.0.0.1 -PixelStreamingPort=888
無事に両方のサーバーが起動すると、以下のログ(「Streamer connected: ::ffff:127.0.0.1」)が表示されます。
無事起動できたら、接続確認をしましょう!
手順5. Webブラウザで接続確認
インスタンスのグローパルIPアドレスを指定して、お好きなWebブラウザからアクセスします。
モバイルでも問題なく動きます。
終わりに
今回、Unreal Engine 5アプリケーションを、Webブラウザ向けにリアルタイムストリーミング配信を行いました。
以前の記事でも紹介したように、Unreal Engineは非常に高精細なCGをリアルタイムレンダリングできる為、いわゆる"ノンゲーム"領域への活用も今後進んでいくと思われます。
課題を挙げるとすると、サーバーにある程度スペックの高いGPUマシンが必要になる為、コストが一定かかってしまう点です(今回の検証では、AWS利用料金が約12ドル程かかりました)。
また、ゲームエンジン以外にクラウドやWebの専門知識を必要とする点も、課題として挙げられます。
現在ISIDはweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。
もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
ISID採用ページ(Web3/メタバース/AI)
TODO
- コンテナ化
- スケーリング
- セルフヒーリング
- ネットワーク構成、各種セキュリティ
- CI/CD
参考
- White Paper: Streaming Unreal Engine content to multiple platforms
- AWS for Games Blog: Unreal Engine Pixel Streaming in AWS with Ubuntu OS
- Github: aws-samples/deploying-unreal-engine-pixel-streaming-server-on-ec2
執筆:@yamashita.yuki、レビュー:@mizuno.kazuhiro (Shodoで執筆されました)