🕐

Headless Unreal Engine Pixel Streaming を Ubuntu な EC2 で試す

2022/09/01に公開

Unreal Engine Pixel Streaming in AWS with Ubuntu OS を見つけて、まぁすんなりは行かないだろうと思っていたら案の定ハマったので、リトライしつつログを残す。

EC2 インスタンスを起動

記事中では Ubuntu 20.04 を使っているが、できれば最新で動かしたいので今回は 22.04 で進める。どうしてもダメだったら 20.04 にする。
それ以外は基本参考元と同じ。ざっとまとめておくと

name value
OS Ubuntu 22.04
ARCH x86
EC2 Instance g4dn.xlarge
EBS 250GB

途中インスコする NVIDIA のドライバーが x86 のものなので Arm を選択すると振り出しに戻されるので注意。 また、その過程で EC2 から S3 にアクセスできる必要があるので Role で権限を与えておく。 Role 使うとわざわざ Access Key / Secret Key を発行しなくて良いので便利。今回は最低限 S3 の Read 権限があれば問題ないはず。
参考元では Security Group のインバウンドを個別に指定しているが、今回は他にも検証したいことがあったのでインバウンド・アウトバウンドともに全開放にしておいた。

DCV Viewer をインスコ

デバッグに Nice DCV というリモートデスクトップを使うかもなので、ココから環境にあったクライアントをインスコする。基本は Headless な環境を目指すので出番がないほうが好ましい。

Ubuntu の環境を構築

記事中のコマンドを元に必要があれば変更していく。の前にまずは既存のパッケージを最新にするところから。

$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot

もしかしたら「新しいバージョンの Kernel が見つかったよ!」みたいなアテンションが出てくるかも。その時に「どのサービスを再起動する?」とかも聞かれるかも知れないが、アップグレードが終わったら再起動するつもりなので気にせず OK してしまう。

必要なものをインスコ

ふたたびログインしたら必要そうなものをガッとインスコ。記事中だと個別にしているが、ある程度まとめてやってしまっても問題なさそうなので一気につっこむ。

$ sudo apt install -y linux-headers-$(uname -r) \
build-essential \
ubuntu-desktop \
xorg-dev \
x11-xserver-utils \
unzip \
awscli \
mesa-utils

デスクトップ環境まわりをつっこんだので gdm3 を再起動しておく。

$ sudo systemctl restart gdm3

Kernel, GRUB まわりの設定

ココらへんは全く無知なので素直に参照元に従う。ただ、せっかくなのでエディタでファイルを編集しつつ、ついでに内容を眺めることにしてみた。

まずは Kernel の設定から。

$ sudo vim /etc/modprobe.d/blacklist.conf

ロードしてほしくない kernel module を指定する設定ファイルらしいんだけども、内容見ても分からんかった。。。おとなしく指示されている内容を追記する。

/etc/modprobe.d/blacklist.conf
# EDAC driver for amd76x clashes with the agp driver preventing the aperture
# from being initialised (Ubuntu: #297750). Blacklist so that the driver
# continues to build and is installable for the few cases where its
# really needed.
blacklist amd76x_edac
> blacklist vga16fb
> blacklist nouveau
> blacklist rivafb
> blacklist nvidiafb
> blacklist rivatv

次に GLUB も。

$ sudo vim /etc/default/grub

今回変更する GRUB_CMDLINE_LINUX は起動時にコマンドラインへ渡されるオプションらしい。

/etc/default/grub
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
< GRUB_CMDLINE_LINUX=""
> GRUB_CMDLINE_LINUX="rdblacklist=nouveau"

ファイルを保存したら変更を反映しておく。

$ sudo update-grub

NVIDIA ドライバのインスコ

aws を使ってダウンロードするので、先に設定を済ませる。権限は Role で設定してあるはずなので、ココではリージョンを指定するだけで良い。

$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]:

$HOME がぐちゃぐちゃになるのを避けるために適当にディレクトリを掘って、そこで作業する。

$ pwd
/home/ubuntu
$ mkdir src
$ cd ./src
$ aws s3 cp --recursive s3://ec2-linux-nvidia-drivers/latest/ .
$ chmod +x NVIDIA-Linux-x86_64*.run
$ sudo ./NVIDIA-Linux-x86_64*.run
$ sudo nvidia-xconfig --preserve-busid --enable-all-gpus

途中で「ディストリビューターからもパッケージ提供されてるけど、ホントにこれインスコする?」みたいなこと聞かれるが、参照元にしたがってこっちをインスコする。その他「 32bit こんぱてぃぶるなのもインスコする?」も聞かれたがそっちはお断りした。
ひととおりコマンド実行し終えたら無事にインスコされてるか確認してみる。

$ nvidia-smi -q | head
...

Driver Version, CUDA Version や GPU の数や名前がちゃんと表示されれば問題ないと思う。

GUI 環境をデフォルトに設定

Pixel Streaming を動かすのに GUI 環境が必須っぽいのでデフォルトを変更しておく。そしてついでに念の為再起動もしておく。

# ココで graphical.target が出るようであれば問題ナシ
$ systemctl get-default
graphical.target

# multi-user.target などが出るようであれば変更する
$ systemctl get-default
multi-user.target
$ sudo systemctl set-default graphical.target

# 再起動しておく
$ sudo reboot

Nice DCV のインスコ

今回は Headless な UE5 Project の検証環境なのでインスコする必要があるか微妙なんだけども、なにかトラブった時に使えるかもなので入れておく。
Nice DCV は Wayland Protocol 非対応らしいので設定から Off にしておく。

$ sudo vim /etc/gdm3/custom.conf
/etc/gdm3/custom.conf
[daemon]
# Uncomment the line below to force the login screen to use Xorg
< #WaylandEnable=false
> WaylandEnable=false

そして gdm3 を再起動。

$ sudo systemctl restart gdm3

問題なく再起動できたら Nice DCV を落としてきてインスコする。
参照元の記事では Ubuntu 20.04 用のものをインスコしているので、今回はココから 22.04 に合うものを選ぶ。またもや色々ダウンロードしたりするので、先程掘ったディレクトリで作業する。

$ cd $HOME/src
$ wget https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY
$ sudo gpg --import NICE-GPG-KEY
$ wget https://d1uj6qtbmh3dt5.cloudfront.net/nice-dcv-ubuntu2204-x86_64.tgz
$ tar zxf ./nice-dcv-ubuntu2204-x86_64.tgz
$ cd ./nice-dcv-2022.1-13300-ubuntu2204-x86_64
$ sudo apt install -y ./nice-dcv-ser*.deb
$ sudo apt install -y ./nice-x*.deb
$ sudo apt install -y ./nice-dcv-web*.deb

次に DCV を操作するユーザーを video グループに追加する必要があるらしい。確認したところ手元の環境では ubuntu, dcv ともに既にグループに追加済だった。
ココで一度再起動が必要になる。

$ sudo reboot

ログインし直したら DCV を起動してアクセスしてみる。参照元だと Secrets Manager 経由でログイン情報を扱ってるんだけども、どれだけ試しても上手くいかずでやむなくユーザーにパスワードを設定して、それを使ってログインする方向にした。

$ sudo passwd ubuntu

まずは手動で立ち上げて動作確認から。

$ sudo systemctl start dcvserver
$ sudo dcv create-session --type=console --owner=ubuntu newsession
$ dcv list-sessions
Session: 'newsession' (owner:ubuntu type:console)

dcv list-sessions してみて作ったセッションが表示されてれば OK 。先にインスコしておいた DCV Viewer でアクセスしてみる。

  1. サーバの IP Address を入力して Connect
  2. Username は ubuntu 、 Password は先程設定したものを入力して Login

しばらくローディングが流れたあとに Ubuntu のログイン画面が表示されれば接続成功。同じパスワードでログインもできるはず。

毎回手動でセッション作るのはめんどくさいので、起動時に自動でセッション作ってくれるように設定しておく。

$ sudo vim /etc/dcv/dcv.conf
/etc/dcv/dcv.conf
# Property "create-session" requests to automatically create a console session 
# (with ID "console") at DCV startup.
# Can be set to true or false.
# If not specified, no console session will be automatically created.
< #create-session = true
> create-session = true

(snip)

# Property "owner" specifies the username of the owner of the automatically
# created "console" session.
< #owner = ""
> owner = "ubuntu"

これで dcvserver を再起動すれば自動でセッション作ってくれる。

$ sudo systemctl restart dcvserver
$ dcv list-sessions
Session: 'console' (owner:ubuntu type:console)

あとは必要であればインスタンス起動時に dcvserver も自動起動するようにしておく。

$ sudo systemctl enable dcvserver

UE5 Project を設定する

やっとこココまできた!
ココからの作業を進める前に状況の確認をいくつかしておく。

$ sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') glxinfo | grep -i "opengl.*version"

OpenGL まわりの情報がずらっと出たら OK 。もしなにかしらエラーが出るようなら一度再起動する。
そしてもいっちょ確認。

sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') xhost | grep "SI:localuser:dcv$"

こちらもエラーがでたら再起動してリトライしてみる。

どちらの確認も問題なければ sftp なりで事前に受け取っていた UE5 のプロジェクトを固めたファイルをサーバにアップ。

$ sftp -i /path/to/priv_key.pem ubuntu@xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx
sftp> put project.tar.gz
...
sftp> exit

ファイルがあげれたら展開して設定していく。

$ tar zxf ./project.tar.gz
$ cd ./project

ここからは複数のプロセスをごにょるので screen を使ってウィンドウ(タブ)行き来しつつ作業を進める。別に byobu でも tmux でも良いし、どれも使ったこと無いなら複数 ssh で繋いでしまっても良いと思う。

Pixel Streaming の起動

まずひとつめのウィンドウ。
展開したプロジェクトのディレクトリにはいるとプロジェクト名と同じ名前のシェルスクリプトがあるはず。わたしの場合は ps-test.sh だった。まずはこれに実行権限をつける。

$ chmod +x ./ps-test.sh

そしたらあとは適当なオプションをつけて起動してみる。とりあえずは参考元と同じオプションで進める。

$ ps-test.sh \
-RenderOffScreen \
-PixelStreamingIP=127.0.0.1 \
-PixelStreamingPort=8888

だーっとログが流れ出すが途中で止まることなくロギングされ続けたら起動成功なはず。

SignalingWebServer の起動

これは別のウィンドウ。
今回は UE5 に付属のサンプルで疎通確認を行う。だいぶ深いディレクトリにあるので、まずはそこに移動する。

$ pwd
/home/ubuntu/project
# SignalingServer のサンプルディレクトリに入る
$ cd Samples/PixelStreaming/WebServers/SignallingWebServer/
# Linux なので bash 用のサンプルディレクトリに入る
$ cd cd platform_scripts/bash/

で、まずはこのディレクトリにある setup.sh を実行するんだけども、こいつが上手く行かない。 setup.sh の中で coturn っていうパッケージをインスコしようとしてるんだけども、どういうわけか Ubuntu 22.04 のみコイツが標準パッケージで提供されてないらしく 100% コケる。で、雑にぐぐったところドンピシャな記事を発見!ココの手順にしたがってインスコする。

$ sudo add-apt-repository ppa:ubuntuhandbook1/coturn
$ sudo apt update
$ sudo apt install -y coturn

無事インスコされたら setup.sh を実行する。

$ chmod +x ./setup.sh
$ ./setup.sh

ココでわたしの環境ではまたもエラー。 Windows でプロジェクトをビルドしてもらったからか、シェルスプリプトの改行が \r\n になっているらしく以下のようなエラーが出た。

bash: ./setup.sh: /bin/bash^M: bad interpreter: No such file or directory

^M って思いっきり出てる。ので、これを消す。ついでに common_utils.sh も同じ症状が出てたので同じく消す。

$ sed -i s/^M// ./setup.sh
$ sed -i s/^M// ./common_utils.sh

もう一回 setup.sh を実行してみる。

$ ./setup.sh
Checking Pixel Streaming Server dependencies.
...
(snip)
...
All Pixel Streaming Server dependencies up to date.

エラーなく終了すれば OK 。
ついに SignalingWebServer を起動。 Start_SignalingServer.sh を実行するんだけども、こいつも ^M 問題に侵されていたので対処する。

$ sed -i s/^M// ./Start_SignallingServer.sh

そして実行。オプションなしで実行すると Port 80 を開けようとするので、 sudo つけて実行する。

$ sudo ./Start_SignallingServer.sh
...

エラーなくログが表示されてるなら上手く起動できてると思う。のブラウザでアクセスしてみて Unreal Engine 5 なプロジェクトの画面が表示されたら無事成功 :-)

おわりに

色々トラップ踏み抜きながらの作業だったので思った以上に時間かかったけど、無事に疎通確認までたどり着けて良かった。デスクトップまわりと Kernel, GRUB まわりはホントに無知なので、時間見つけて入門せにゃーならんと思いました。
まだ他に検証すべきことがあるので、気が向いたら追記するかも。しないかも。

Discussion