Azure VM NVv4 で NodeCG によるオンライン配信をやった際のポイント
NodeCG を使えば、RTA in Japan のようなリッチな配信レイアウトを作成し、Youtube 等でライブ配信を行うことができます。
NodeCG の概要について話をするのは大変なので公式のドキュメントをご覧いただくか、メンテナの一人である Hoishin さんが書いた『ライブ配信レイアウトを作るNode.jsのフレームワーク』をご覧ください。
今回は Zoom で行われている社内イベントを NodeCG と Azure VM NVv4 を使ってリッチ化した際のポイントについてお話しします。
Azure VM NVv4 とは
Azure VM NVv4 とは Microsoft Azure の GPU を搭載した VM シリーズの一つです。搭載している GPU は AMD Radeon Instinct MI25 です。
リッチなオンライン配信をする上で GPU は必須です。なぜなら、カメラの映像、キャプチャボードの映像、動画ファイル、静止画ファイル、テキストなどなどを合成する際に膨大な計算量が発生するためです。Intel CPU に内蔵されている GPU でもある程度の配信には耐えられます。ただし、外付け GPU、いわゆるディスクリート GPU の方が大抵は高性能なため安定感があります。
NVv4 は GPU を搭載している VM の中で、最も低コストで始められるシリーズです。他のシリーズは最低スペックでも料金がかなり高いものが多く、使うかどうかはお財布と相談になります。
Azure の東京リージョンで使うことのできる NVv4 シリーズは NV4as_v4 と NV8as_v4 の 2 つです。搭載される vCPU やメモリ等の基本情報は Microsoft の公式ドキュメント『NVv4 シリーズ』をご覧ください。
NVv4 VM の基本セットアップ
今回セットアップした際の構成は以下の通りです。
リージョン/東日本
イメージ/Windows 10 Pro
サイズ/Standard_NV8as_v4 (8 vcpu 数、28 GiB のメモリ)
OSディスクの種類/Standard SSD
現状、公式から配布されているドライバが Windows 用のものだけであり、使用できるオペレーティングシステムは ほぼ Windows 系列のみになります。(ただし、イメージの選択肢には Ubuntu 等も現れます。)
Windows 10 Pro を使うにはライセンスが必要です。今回は Microsoft 365 E3 を使用しました。
VM を作成、起動したら以下のセットアップを行います。
1. Windows に日本語言語パックを追加(英語で運用できるなら不要ですが、今回は配信上に日本語の文字列もあったため念のため追加)
2. Windows のタイムゾーン設定を「大阪、札幌、東京」に変更(今回は配信レイアウトがタイムゾーンに依存する作りにしていたため設定)
3. AMD Radeon GPU を動かすための Microsoft 公式ドライバを Web サイトからダウンロードしてインストール
重要なポイントは GPU ドライバのインストールです。ドライバは VM を起動しただけでは入っていません。そして、これをインストールしないと後で使用する OBS のブラウザソースで GPU アクセラレーションによる高速化を行うことができません。
公式ドキュメントの Verify driver installation にもある通り、インストールに成功すると Windows のデバイス マネージャーに「Radeon Instinct M125 MxGPU」という行が追加されます。
これで基本的なセットアップは完了です。
OBS のインストール
次に映像合成と Zoom へ映像を供給するために使用する OBS をインストールします。インストーラを公式サイトからダウンロードしてインストールします。社内イベントで使用したバージョンは 27.1.2 でした。
次に AMD Radeon GPU をブラウザソースから使えるように少し細工をします。
まずは OBS のショートカットを作成します。作成したショートカットはデスクトップなどに置きます。
次にショートカットのプロパティを開き " --ignore-gpu-blacklist" というパラメータを追加します。
この設定を行った上で OBS の詳細設定からハードウェアアクセラレーションの設定にチェックを入れてください。
少なくとも OBS 27.1.2 の段階では、引数に設定を追加しないとブラウザソースが真っ黒になり、なにも映りませんでした。
OBS のブラウザソースは CEF (Chromium Embedded Framework) を使用しており、Windows 版の OBS 27.1 に搭載されているものは Chromium 75 相当と、少し古い状態です。現在このバージョンアップ作業が進められています。(該当のディスカッション)
私の方で Chromium 75 と最新の Chromium を、この VM 上で比較したところ、やはり前者の方は "--ignore-gpu-blacklist" 無しに GPU を使うことはできず、後者の方はなにも設定せずとも GPU を使うことができました。なお、GPU の使用可否は chrome://gpu から確認しました。
他にも NodeCG のバンドルから必要なコントロールが行えるように OBS WebSocket をインストールしています。
NodeCG のセットアップ
今回は NodeCG もこの VM 上で動かすことにしました。セットアップの流れは以下の通りです。
1. Node.js を Windows インストーラーからインストール(使用したバージョンは 16)
2. Git を Windows インストーラーからインストール
3. NodeCG のコードをクローンして npm install
4. 自作の配信レイアウトのコードをクローンして NodeCG の bundles に入れる
5. 配信レイアウトをビルド
6. NodeCG を起動
7. OBS 側でブラウザソースを追加し NodeCG の URL (例. http://localhost:9090/bundles/foo/graphics/bar.html) を設定
こちらについては特殊なことはやっていません。
なお、別の企画では NodeCG を動作させる VM を低価格の Linux VM に変更し、Docker で動作させる方式に変更しています。これはレイアウト担当(NodeCG)と配信担当(OBS)を分離することで、配信担当を Azure からオンプレミスにいつでも移せるようにするためです。
あとは Zoom をインストールして、OBS の仮想カメラを Zoom の第2カメラの共有で取り込めば OK です。
VM の性能について
まだしっかりとしたベンチマークテストを行ったわけではありませんが、あまり性能は高くないなぁ、というのが正直な感想です。
少なくとも GeForce RTX 3060 を搭載しているデスクトップ PC よりは性能がかなり落ちました。これは Windows タスクマネージャーの GPU 使用率から確認しています。
ある配信用のレイアウトでは、RTA 3060 を搭載している PC で GPU 使用率が 20 - 30 % のところ、Standard_NV4as_v4 (GPU 1/8) の方は 80 - 90% ほど、Standard_NV8as_v4 (GPU 1/4) の方は 50 - 60% ほどでした。
なお、社内イベントでは Zoom ミーティングを使用しており、Youtube Live のような高い FPS や画質を参加者に対して配信できるわけではありません。そのため OBS の映像合成にも高い品質は必要無く、性能面については一応足りていました。
GPU の機能をクラウドかオンプレミスか、どこに持つかは用途、配信品質、コストを考え、性能を検証した上で決めたほうがよさそうです。例えば非常に長期間配信する類のイベントであれば、配信機材の固定や冷却を考えなくてもいいクラウドに軍配が上がるかもしれません。
まとめ
NodeCG を使った配信を Azure VM で行ったときのポイントについて説明しました。NodeCG 自体についてのポイントもまた別の記事で書きたいと思います。