Genvidクラスタのクラウドデプロイに必要なインスタンスの種類（AWS / Azure）

# Genvidのクラウドオーケストレーションで使用されるVM
Genvidは「インタラクティブな動画配信」を実現するSDKです。Genvidの体験を実現するシステム全体を「Genvidサービス」と呼びますが、ゲームの内部データと動画視聴を行うブラウザ、動画配信を行う配信サービスの３つをつなぐ通信処理を行う部分を「Genvidクラスタ」と呼びます。

その大部分はサーバーミドルウェアで構成されており、複数のクラウドサーバーインスタンスを使用します。
クラウドサーバーのオーケストレーションにはHashicorp社 Nomadが採用されており、Terraform、Consul、Vaultといった同社のクラウドリソース管理ツールが活用されています。

![GenvidClusterServices.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/686f237c-a23c-4501-e1de-e75ac002278b.png)

https://www.genvidtech.com/doc/ja/SDK-1.35.0/introduction/services.html

さて、Genvidの利用において具体的にどんなインスタンスタイプ（仮想マシン）が使われるかは、マニュアルに各サーバー設定のデフォルト値として記述があります。


・AWS
https://genvidtech.com/doc/ja/SDK-1.35.0/reference/terraform/modules/basic/basic_cluster.html

・Azure
https://genvidtech.com/doc/ja/SDK-1.35.0/reference/terraform/modules/basic/azurerm_basic_cluster.html

仮想マシンの要求とそれぞれの役割、自動で台数が増えるかどうかといった属性について情報を整理しました。

## Genvidについておさらい
Genvidは、インタラクティブな動画ライブ配信を実現するSDKです。
https://www.genvidtech.com/ja/

Genvidはクラウドサーバー上で動かすサーバミドルウェアと、ブラウザ側で動画と同期した通信処理を行うJavaScriptライブラリで構成されています。
ゲームなどのリアルタイムコンテンツをクラウドサーバー上で動作させ、Twitchに描画結果をストリームで渡して動画としてブロードキャストします。動画の再生環境では、「動画視聴者が触れるUI」をブラウザで動画の上から重ねて表示し、そのデータをクラウドサーバーで集計し、視聴しているリアルタイムコンテンツに影響を与えます。
jsライブラリが動作できる環境であれば配信アプリやプラットフォームは問わず使用でき、主にFacebookとTwitch上で使用されています。

最近では、Facebook Gamingで配信されている『PAC-MAN COMMUNITY』のなかで、視聴者をゲームに招待できるゲーム配信者向けの機能「Play with Streamer」で使用されています。
https://www.facebook.com/fbgaminghome/blog/pac-man-community

# Genvidクラスタを構成するサーバー種類
サーバー種類は、大別して以下の５種類があります。

 - ゲーム動作用サーバー
 - エンコーディングサーバー
 - 内部サーバー
 - パブリックサーバー
 - 監視サーバー

順番に説明します。

## ゲーム動作用サーバー
Genvidの特徴である、クラウドサーバー上でGenvid SDKを組み込んだゲームを動作させ、映像をキャプチャする処理を行うサーバーです。
動画配信したい数だけレンダリングする必要があるので、それによって台数が決まります。
たとえば、4人のキャラクターごとにカメラ描画し、視聴者に切り替えさせたい場合は、それぞれレンダリングする必要がありますから4台配置する必要があります。
これはWindowsサーバーかつ、対象のゲームが動作する十分なスペックが必要です。デフォルト設定では以下が指定されています。

 - AWS: g5.xlarge（旧 g4.xlarge)
https://aws.amazon.com/jp/ec2/instance-types/g5/

 - Azure: Standard_NV12s_v3(旧 Standard_NV6)
https://docs.microsoft.com/ja-jp/azure/virtual-machines/nvv3-series
Azureを使う場合、GenvidのマニュアルではStandard_NV6が指定されていますが、これは廃止予定のため後継のStandard_NV12s_v3を使います。

いずれもNVIDIA GPUのインスタンスですが、これらは機械学習用のTeslaが使われており、ゲームの動作向けには少々オーバースペックです。

そこで、両社が提供しているAMD Radeon系のGPUインスタンスも視野に入れます。AWSもAzureも、グラフィクスソフトウェアのリモートデスクトップ利用やプライベートなクラウドゲーミング用に、AMD Radeon GPUインスタンスを提供しています。
GenvidのデフォルトではNVIDIA系の指定になっていますが、個人的にはAMD Radeon系のほうがスペックのムダがなく、費用もお得と考えています。

 - AWS: g4ad
https://aws.amazon.com/jp/ec2/instance-types/g4/ (下の方)
 - Azure: NVv4
https://docs.microsoft.com/ja-jp/azure/virtual-machines/nvv4-series

私が今作っているGenvid対応ゲームは、Nintendo SwitchとPC向けのアクションゲームです。見下ろし型ですが、2Dゲームではなく3Dゲームです。
この事例では、NVv4シリーズの一番下スペックである「Standard_NV4as_v4」では動作ががギリギリすぎた（最適化前で25FPS）ので、「Standard_NV8as_v4」で動かしています。
ゲームの要求スペックは一概には言えませんが、2DゲームならNV4as、軽量な3DゲームならNV8as、ハイスペック向けゲームならそれ以上といった指標になると思います。

## エンコーディングサーバー
ゲームからキャプチャされた動画・音声ソースのコンポジションとエンコードを処理します。カメラの数分エンコード処理が必要ですので、ゲーム動作用サーバーと同じ数が必要です。
エンコード処理はCPUは強力なもの（HDリソースの動画エンコード）が必要で、サーバー間で動画のrawデータを受けとりますから、データ通信幅も大きめが必要です。
そのかわりにエンコード処理は常に一定の負荷で変化は少なく、メモリの大きさもリアルタイムエンコード用の一時領域があれば大丈夫です。
その背景からか、Genvidのデフォルト設定ではAWSはc5シリーズ、AzureではFsV2が指定されています。動画の解像度を巨大なものにしたい等の用途がないなら、変更する必要はなさそうです。

 - AWS: c5.2xlarge
https://aws.amazon.com/jp/ec2/instance-types/c5/
 - Azure: Standard_F8s_v2
https://docs.microsoft.com/ja-jp/azure/virtual-machines/fsv2-series

## パブリックサーバー、内部サーバー、監視サーバー
これらのサーバーはタスクの種類と動画視聴者数によって数が変わります。Twitchや視聴ウェブサイトと通信を行うパブリックサーバー、Twitchから届いたデータをリダクションする処理などを行う内部サーバー、サーバーで実行中のゲームを含むGenvidクラスタの監視を行う監視サーバーの3種類では、それぞれ同じインスタンスタイプがデフォルト設定に入っています。

パブリックサーバーと内部サーバーについては、これらの処理は、動画視聴者数が急えた場合に負荷が増えます。逆に言えば、CPUが常時最大限のパフォーマンスを発揮する必要がありません。
そこで、「バーストパフォーマンス」などと呼ばれる、負荷が急激に高くなる状況でクロック数が引き上げられるタイプのインスタンスを使います。AWSではt3シリーズ、AzureではBシリーズを使用します。

 - AWS: t3.small
https://aws.amazon.com/jp/ec2/instance-types/t3/
 - Azure: Standard_B2s
https://docs.microsoft.com/ja-jp/azure/virtual-machines/sizes-b-series-burstable

### 内部サーバー (Internal Servers)
Genvidの内部処理を実行します。代表的なものはメッセージングバスの処理で、たとえば「Aに1票という投票データが1万個届いた」という状況を、「Aに1万票というデータ1個」にするような、データのリダクション処理を実行します。

最低１台で動作し、負荷に応じてオーケストレーションされますが、利用するサービス（タスク）によっては始めから複数台のインスタンスが必要です。
具体的にはゲーム映像と演者の映像をミキシングするGenvid Studioや、モニタリング環境であるTICK stackを使用する場合は、それぞれはじめからインスタンスを用意しておきます。

### パブリックサーバー　(Public Servers)
Twitchなどの動画視聴ウェブサイトと接続し、データのやり取りを行うサーバーです。

> ライブ配信クライアントに関連するサービスを処理します。多大な負荷に対応するため、一般的にインターナルワーカーのインスタンスよりもパブリックワーカーのインスタンスを多く実行する必要があります。パブリックワーカーは、パブリック向けのオープンポートを持つ、唯一のサーバーです。
https://genvidtech.com/doc/ja/SDK-1.35.0/broadcasting_guide/cloud_aws/clusters.html

これらのパブリックサーバーにはサブドメインを用意して、外部からアクセス可能にします。
AzureではAzure App Serviceのカスタムドメインからドメインを用意できます。

### 監視サーバー (Supervisor Servers)
サービスの監視を行います。１台で実行できますが、本番環境では安全性のため３台が推奨されています。

> サーバーで実行する主要タスク:
> 設定用 High-Available Key-Value ストア
> トークン、パスワード、証明書、API key などのシークレットを厳重に制御する 安全な Key-Value ストア (Vault の使用 を参照)
> DNS および HTTP API による 登録サービス
> さまざまなワーカーインスタンスのヘルスの 監視とレポートのサービス
> さまざまなサービスを調整し、ダウン時に再起動する スケジューラサービス
https://www.genvidtech.com/doc/ja/SDK-1.35.0/broadcasting_guide/cloud_aws/clusters.html

# まとめ
Genvidシステムの構築には、「ゲームを動かすGPUつきWindowsサーバー」「動画をエンコードするための高負荷対応サーバー」「各サービスを処理するためのバースト機能付きサーバー」の3種類のインスタンスを使用します。

カメラ切替可能な放送を行うなら、そのカメラは何台かによって、GPUつきWindowsサーバーとエンコードサーバーの台数が決まります。これらの台数は固定です。
その他のサーバーは配信に何人が参加したかによって流動的に変化します。基本的にはGenvidの内部で利用しているオーケストレーション機能が自動的に処理しますが、費用予測のためにも各サーバーがどのタイミングで増えていくか把握しておくとよいでしょう。