ゲーム開発環境をAWSで!IncrediBuild Cloudを使用してUnreal Engine 4の分散ビルドをやってみた

2021.04.12

どうも、コンサルティング部の後藤です!

近年の社会情勢として、様々な業界でリモートワーク化が進んでいると思います。しかし、「アプリケーションの開発に高性能な端末が必要なのに自宅に持ってこれない……」や、「社内のビルドサーバを利用するために出社する必要がある……」等々、まだリモートワークを実践するのに解決しなければならない課題が多いのではないでしょうか。

そこで、今回はそんな課題を解決するために Unreal Engine 4のゲーム開発環境をAWSで構築し、IncrediBuild Cloudを使用して分散ビルドをやってみました。

今回の構成図

今回構築したAWS環境の構成図になります。

開発環境構築

開発環境は以下のような構成になっております。

EC2       : g4dn.2xlarge
OS        : Windows Server 2019
開発環境   : Unreal Engine 4.25
接続ツール : NICE DCV

G4dnのEC2に対してUnreal Engine 4を導入し、NICE DCVで手元の端末から接続を行います。

NVIDIA ドライバー導入

G4dn系インスタンスには NVIDIA製のGPU TeslaシリーズのT4が搭載されております。このためG4dnの性能を発揮するためにはNVIDIAのドライバーを導入する必要があります。

EC2におけるNVIDIAのドライバー導入は以下ドキュメントを参考に行います。(また、今回はオプション3に記載ある GRIDドライバーを導入します。
Windows インスタンスへの NVIDIA ドライバーのインストール

NVIDIAのドライバー及びライセンスはS3に保存されているため、EC2にAmazonS3ReadOnlyAccessのポリシーが設定されたIAMロールを付与し、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のフォルダが作成されるため、その中からWindowsOSに合ったドライバーを使用します。

表示された画面に従いながら導入進めます。今回インストールオプションは高速で導入を進めています。

ドライバー導入後、デバイスマネージャーからNVIDIA Tesla T4を確認し、「このデバイスは正常に動作しています。」と表示されていればドライバーの導入は完了です。

Unreal Engine 4とNICE DCVの導入

Unreal Engine 4とNICE DCVの導入に関しては過去のブログにてまとめているため、今回は詳細を割愛します。

導入に関する詳細を知りたい方は以下ブログをご参考ください。
Unreal Engine 4をソースコードから導入する方法をまとめてみた

リモートでのゲーム開発にオススメ?EC2にでNICE DCVを導入してみた

通常のEC2で起動するWindowsではディスプレイ解像度が低く設定されていますが、NVIDIAのドライバーを導入したG4dnインスタンスにNICE DCVで接続すると最大4K解像度の出力が可能です。

ビルドサーバ構築

IncrediBuild Coordinator、Helper Agentの設定

今回ビルドサーバにはIncrediBuild Cloudを利用して分散ビルドを行います。各ビルドサーバの構成は以下の通りです。

・Cooridnator
EC2 : t3.small
OS  : Windows Server 2019

・Helper
EC2 : c5.4xlarge

IncrediBuildはイスラエル発のソフトウェアで、ネットワーク内の複数のマシンに演算処理を分散させることで高速なビルドを実現するソフトウェアになります。日本ではゲーム会社様での事例が多く見られます。

IncrediBuildにはInitiator , Coordinator , Helperと異なる役割によって構成されています。

  • Initiator Agent
    IncrediBuild Agentを導入した端末が分散を必要とするジョブを実行するとInitiator Agentとして動作します。

  • Helper Agent
    IncrediBuild Agentを導入した端末が分散に加わり、演算処理の分散ビルドに参加することでHelper Agentとして動作します。

  • Coordinator
    IncrediBuildのリソースを管理する中心的な役割を持っており、各Agentとの通信を行いリソース状況を確認したり、InitiatorのジョブをHelperに割り当て、分散を行ったりします。また、IncrediBuild CloudではCoordinatorが必要に応じてHelperとなるEC2を自動的に作成、削除を行います。

今回はUnreal Engine 4を動かす開発環境がInitiatorとなるため、Coordinatorを構築していきます。また、今回導入するIncrediBuild CloudはEnterprize版になります。

導入に必要な.exeファイルをダウンロードした後、画面に従い導入を進めていきます。

途中、CoordinatorとなるEC2にAgentも導入するか問われますが、今回はCoordinatorのみで動作頂くためAgentの導入は行っておりません。

IncrediBuild Coordinatorはデフォルトでポート31104を使用します。こちらは変更せずデフォルトのまま設定しています。

インストールを進めていき、以下のような画面が表示されたCoordinatorの導入は完了となります。

次に IncrediBuild Cloudの設定を行っていきます。IncrediBuild Coordinatorの画面上にあるAdd Cloud Coresを選択します。

すると、ブラウザ上にて以下のような画面が表示されるため、SCALE TO CLOUD NOWAWSを選択します。

すると、IncrediBuild CloudでAWSの権限が必要となるため、Administratorの権限を持ったIAMユーザのアクセスキーとシークレットキーが求められます。しかし、Administratorは非常に高い権限であるため嫌がる方が多いかと思います。

しかし大丈夫です。画面にもある通り No Worries! 心配ありません!

IncrediBuild CloudはAmazonEC2FullAccessと、ServiceQuotasReadOnlyAccessの権限を持ったIAMロール、及びIAMユーザを作成することで利用することができます。

IAMユーザのアクセスキー、シークレットキーを設定した後、IAMロールのARN、ExternalIDを求められます。

IAMロールのARNは上記で作成したARNで良いですが、ExternalIDは以下の信頼関係を設定する必要があります。

{
  "Version": "<img src="https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/04/incredibuild10.png" alt="" width="860" height="991" class="aligncenter size-full wp-image-714419" />2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::827268715074:user/incrediCloud"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "<New_String_for_Your_External_ID>"
        }
      }
    }
  ]
}

<New_String_for_Your_External_ID>のみ任意の文字列に変更してください。

IAMユーザのCredential , IAMロールのARN、外部IDを入力して権限の設定は完了となります。

次にIncrediBuild Cloudの設定画面が表示されます。

  • General
    管理者名や通知先等を設定します。

  • Resource Management
    Helper Agentを立ち上げるリージョンを指定します。Private Networkを設定しない場合、IncrediBuildは新規にVPC、Subnetを作成してHelper AgentとなるEC2を立ち上げます。

  • VMs
    Helper AgentとなるEC2の設定します。各設定項目は以下の通りです。

    項目 説明
    VM Type EC2インスタンスサイズ
    VM Idle timeout(seconds) Helperのアイドル時間(指定した時間を過ぎると停止、終了します
    Total Cores Limit Helperのコア総数(VM Typeで設定したコア数の倍数を設定
    No. of VMs in Pool プール内に常に存在するHelperの台数(最小1から設定
    HDD volume size in GB Helperのストレージサイズ設定
    Cache Volume size in GB Helperで利用するキャッシュサイズを4GB-8GBで設定

注意すべき点はVM TypeとTotal Cores Limitでしょうか。例として VM Typec5.4xlarge(16コア)を選択してNo. of VMs in Pool1 と設定、都度作成するHelperインスタンスを仮に最大3台必要とする場合、Total Cores Limitの値は16x4=64となります。

そのため、仮にVM Typeで低いコア数を設定してTotal Cores Limitで大きい値を設定すると、ビルド時に非常に多い台数のインスタンスが立ち上がってしまいます。

また、Helperはコンパイル等の分散処理に参加する際、足りないライブラリ等をCoordinator経由でInitiatorから取得します。そのため低いコア数のインスタンスを多く立ててしまうと取得する回数も多くなり、ネットワークの帯域を多く使ってしまう可能性があります。そのため、VM Typeは16コア以上のものを選択するのが良いかと思います。

  • Network
    CoordinatorとHelperで利用するポート番号を設定します。(デフォルトではCoordinatorが31104、Helperが31106となります。

上記項目を全て設定した後、Saveを選択して設定完了です。

IncrediBuild Cloudの設定が完了すると、No. of VMs in Poolで設定した数のEC2インスタンスが立ち上がります。CoordinatorとHelperの接続が上手く行っていれば、Coordinatorの画面にあるCloud Machinesに追加されます。

Initiator Agentの設定

開発環境に戻り、Coordinatorに分散ビルドの処理を送信するためIncrediBuild Agentが必要となります。

まずInitiator Agentとなる開発環境と、Coordinatorとなるビルドサーバが通信が可能なようにセキュリティグループで許可する必要があります。Initiator Agentはデフォルトポート31105、Coordinatorは31104となります。

次にIncrediBuild Agentの導入方法ですが、IncrediBuild Agentの場合はCoordinator Selectionの部分で既存のCoordinatorと接続するよう設定する必要があります。

Agent Settingsの項目にあるVisual Studio Integrationにチェックを入れておきます。

後は画面の指示に従って、IncrediBuild Agentの導入が完了となります。

IncrediBuild Agentの導入が完了したら、まずCoordinatorと接続出来るか確認を行います。

IncrediBuild Agent Settingsを開き、Network -> Coordinator -> TESTを選択します。 以下のように接続確認が取れれば導入完了となります。

また、IncrediBuild Coordinatorを確認するとOn Premiss Machinesに一台Agentのマシンが登録されていることが分かります。

分散ビルド実践

さぁいよいよIncrediBuildを使用したUnreal Engine 4の分散ビルドの準備が整ったので、Unreal Engine 4のブループリントのゲームを立ち上げてパッケージ化を行います。Unreal EditorはIncrediBuild Agentが導入されていると自動的にIncrediBuildでビルドを実施するよう設定されています。

パッケージ化はUnreal Editorからファイル -> プロジェクトをパッケージ化 -> Windows(64-bit) から行えます。

パッケージ化を実施すると、IncrediBuild Coordinator側でInitiator AgentのステータスがBuildingに変わります。

そして、IncrediBuild Coordinatorは分散ビルドを行うため、Helper Agentを自動で起動していきます。

Build Monitorを確認してみると、パッケージ化の処理が幾つも分散されていることがわかると思います。

パッケージ化が完了し、IncrediBuild CloudのVM Idle timeoutで設定した秒数、次のジョブが無いとHelper Agentは自動的に停止、もしくは削除されます。

もちろん、パッケージ化出来たゲームはEC2上にて動かす事も可能で、NICE DCVで接続しているためWindows標準のリモートデスクトップ接続に比べてより高解像度、よりシームレスに動作を確認出来ています。

最後に

如何だったでしょうか。今回はゲーム開発に必要な開発環境、ビルド環境をAWSで構築し、それぞれを自宅のPCからNICE DCVで接続して動かせるところまでを実践してみました。

ブループリントのゲームだったためIncrediBuildによる分散ビルドの時間短縮はそこまで大きくありませんでしたが、容量の大きいゲームではより時間短縮の恩恵を受けられると感じました。また、手元の端末の性能だとUnreal Engine 4を動かす事が難しいですが、G4dnインスタンスとNICE DCVを利用することで不自由なく動かす事が出来たと感じます。

記事の冒頭で挙げさせて頂いたような悩みがある方はゲーム開発環境のクラウド化を検討されては如何でしょうか。本記事が何方かのお役立てば幸いです。