電通総研 テックブログ

電通総研が運営する技術ブログ

UE5 Pixel StreamingでリアルタイムCGストリーミング配信 on AWS

rendered gif image

こんにちは!金融ソリューション事業部の山下です。

本記事では、こちらの記事でも紹介したUnreal Engineが提供する「Pixel Streaiming」プラグインを使ってAWSサーバーからリアルタイムCGストリーミング配信を行います。

説明をシンプルにする為、AWSの基本的な知識(EC2, セキュリティグループ、IAMロールなど)の説明は割愛いたします。
また、本検証を行う場合、使用するGPUインスタンスの利用料金が発生する点にご注意ください。

実施手順

手順は、以下のとおりです。

  1. AWS EC2でGPUインスタンスを作成
  2. インスタンス環境構築
  3. UEプロジェクトのビルド
  4. UEアプリケーション、WebRTCサーバーの起動
  5. Webブラウザで接続確認

前提知識

1. Pixel Streaming

pixel streaming graph
(画像: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
    • Instance type
      • g4dn.xlarge
    • AMI
    • Architecture
    • EBS
      • 250GB
  • NICE DCV 2022.1 Client

手順1. AWS EC2でGPUインスタンスを作成

AWS EC2コンソールからインスタンスを作成します。

AMIには、Ubuntu 20.04 LTS AMIを選択します。
このAMIには、PixelStreamingの動作要件として必要となるNVIDIAのCUDAドライバーがプリインストールされています。 AWS EC2 AMI setting

インスタンスタイプは、NVIDIA GPUが利用可能なG4dnインスタンスを選択します。
今回は動作検証が目的の為、最小サイズのxlargeを選択しました。
これから実施するUnreal Engineコンパイルやアプリケーションのビルドにあまり時間をかけたくない方は、より高性能なインスタンスタイプをおすすめします。
AWS EC2 Instance setting

また、vCPU使用リミットの引き上げが必要になる場合、AWSに事前に申請が必要になります(今回選択したg4dn.xlargeの場合、vCPUは"4"になります)。 AWS EC2 vCPU calculator

インスタンスの作成が完了したら、IAMロールでS3へのRead Permisionを付与します(AWSがEC2向けに提供するNVIDIAドライバをダウンロードする為に必要となります)。

また、HTTPとSSHアクセス以外に、NICE DCV接続用のUDP/TCPポートも開放します。 AWS EC2 Security Group
(※上記は検証用の設定なので、本番環境には使用しないでください。一応最低限のセキュリティとしてSSH接続にはkey pair、およびNICE DCV接続にはユーザー名とパスワードおよびセッションIDが必要になります)

手順2. インスタンス環境構築

インスタンスSSHなどで接続して、環境構築を実施します。
こちらのAWS for Games Blogのチュートリアルを参考に、以下を実施します。

  1. Ubuntu desctop managerのインストール
  2. NVIDIAドライバのインストール
  3. DCVサーバーの起動、セッションの開始
  4. 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/を起動して、インスタンスリモートデスクトップで接続しましょう。

DCV Client login

NICE DCV接続に必要な情報として、以下の情報が必要になります。

  • サーバーのホスト名 or IP
  • ポート番号
  • (手順2.で設定した)セッションID
  • (手順2.で設定した)インスタンス ユーザー名/パスワード

以下の構文で入力します。
server_hostname_or_IP:port#session_id

このリモートデスクトップ接続は、UEプロジェクトのビルドの為に行うものです。
その為、もし事前にLinux向けビルド済のUEアプリケーションをお持ちの方は、次の手順3.は不要です。

手順3. UEプロジェクトのビルド

Unreal EngineGitHubレポジトリより、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」テンプレートを選択します。

UE Start menu

PixelStreaming用に、プロジェクト設定とビルドを行います。
詳細な解説は、こちらのUnreal Engine公式Documentationを参考にしてください。

Pixel Streamingプラグインの選択、再起動

メニュー「Edit」 -> 「Plugins」より、Pixel Streamingを検索して、チェックボックスをONにします。
再起動が求められるので、実施します。 UE Plugin

Additional Launch Parametersの設定

メニュー「Edit」 -> 「Editor Preferences」 -> 「Level Editor」 -> 「Play」カテゴリより、
Additional Launch Parametersに以下を入力して、音声とIP/ポートを設定します。

AudioMixer -PixelStreamingIP=localhost -PixelStreamingPort=8888

UEアプリのLinux向けビルド

メニュー「Platforms」 -> 「Linux」 -> 「Package Project」より、プロジェクトのビルドを行います。
適切なディレクトリを設定してください( このビルドにもかなり時間がかかるので、ご注意ください)。
UE Build Target

ビルドが完了したら、指定したディレクトリに「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」)が表示されます。 UE PixelStreaming log

無事起動できたら、接続確認をしましょう!

手順5. Webブラウザで接続確認

インスタンスのグローパルIPアドレスを指定して、お好きなWebブラウザからアクセスします。

Pixel Streaming PC

モバイルでも問題なく動きます。
Pixel Streaming Mobile

終わりに

今回、Unreal Engine 5アプリケーションを、Webブラウザ向けにリアルタイムストリーミング配信を行いました。

以前の記事でも紹介したように、Unreal Engineは非常に高精細なCGをリアルタイムレンダリングできる為、いわゆる"ノンゲーム"領域への活用も今後進んでいくと思われます。

課題を挙げるとすると、サーバーにある程度スペックの高いGPUマシンが必要になる為、コストが一定かかってしまう点です(今回の検証では、AWS利用料金が約12ドル程かかりました)。
また、ゲームエンジン以外にクラウドやWebの専門知識を必要とする点も、課題として挙げられます。

現在ISIDはweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
ISID採用ページ(Web3/メタバース/AI)

TODO

  • コンテナ化
  • スケーリング
  • セルフヒーリング
  • ネットワーク構成、各種セキュリティ
  • CI/CD

参考

執筆:@yamashita.yuki、レビュー:@mizuno.kazuhiroShodoで執筆されました