2019年12月10日火曜日

ARM搭載FPGAボードでHDMI->VNCサーバーを動かした話

この記事はさくらインターネット Advent Calendar 2019 の 6日目です。

こんにちわ。さくらインターネット在籍の @hasegaw です。今年も Advent Calendar に参加……していたのですが体調不良により投稿が大幅に遅れました😫

今回は、2019年4月に開催されたAI・人工知能EXPO さくらインターネットブースで展示したデモンストレーションの構築時に使ったトリック(?)を紹介します。


弊社ブース@AI人工知能EXPO 2019


今回展示したデモ


デモ制作の背景

2019年は、さくらインターネットとしてもこれまでより大きなブースを作ることになり、立ち寄られた方に楽しんでもらえる「インタラクティブなデモ」をしよう、ということになりました。

以前の展示会でのデモは私が制作していたのですが、時間の都合もあり、今回のデモの実装は Pegara 社にお願いしました。


データセンター内で映像デモを構築

高火力コンピューティングのノードを展示会場で稼働させることにしたのですが、その場での推論結果を大型ディスプレイに表示するには、 Tesla V100 では役不足です(同モデルにはビデオ出力がない)。サーバー用の組み込みビデオプロセッサでは、ビデオの出力性能が貧弱で、今回のデモのようなインタラクティブな描画には向きません。このため、 Tesla の代わりに Quadro RTX 5000 を搭載し、同ボードから映像を出すことにしました。

実質的に「Quadro RTX 5000 を搭載したデュアルプロセッサのワークステーション」ですが、非常に大きなマシンなので、搬出・搬入も一苦労します。このため、最初から最後までデータセンター内でマシン(予備機を含めて2台)のセットアップを済ませておき、データセンターからビックサイトの展示会場まで直送することにしました。

ただ、会場でデモ中に映像が途切れるようなことがあってはテンションだだ下がりです。このため、データセンターに置いたまま、デモの動作が途切れないかを確認するための手段が必要でした。

通常のサーバーであれば、 BMC のリモートコンソール機能が有効ですが、後から Quadro RTX 5000 ビデオカードを増設した場合には、そのような便利機能は使えません。

IP-KVM 装置でも倉庫に転がっていればよかったのですが、そもそもホスティング事業が主なビジネスともいえる弊社の場合、KVM切り替え機すらほとんど見かけません。このため、 Quadro から出力された映像をリモートから確認するというイレギュラーな要件に適したオモチャを適当に見繕う必要がありました。


データセンター内のHDMI映像を観測するためにどうするか


いちばん最初に思いつくのは HDMI キャプチャデバイスなどをサーバラック内に仕込む方法です。ただ、この方法では別途 PC 等を用意する必要があり、面倒です。このため、今回は ARM 搭載 FPGA ボードを利用することにしました。

FPGA と言っても、今回利用した PYNQ-Z1 ボードでは、用意されているイメージを microSD カードに書きこむだけで、 HDMI ポートからの DVI-D 信号キャプチャーが可能です。

プログラマブルロジックに Xilinx の AXI Video DMA IP がインプリメントされているので、このレジスタを自分でARMコア側から叩いてやれば、DVI-D から1フレームを読み取るのは割と簡単です。

以前、実験的に「PYNQ-Z1にDVI-Dで入力された映像がが映るVNCサーバ」を試作していたため、それを使いました(使ってみたかったw)

DVI-D信号が映る謎なVNCサーバー

4-in-1 HDMI マルチビューアの利用

今回、会期中にマシン障害が発生した場合の対策として本番機と予備機の2台を準備しました。この2台のマシンの出力を同時にモニタリングするために複数映像を同時表示できるHDMIマルチビューアを利用しました。

この装置を介しておくとマシンの再起動中などにも常に 1080p60 の信号が出続ける特徴があり、長期間にわたるビデオキャプチャのトラブルを防ぐ上でも有効です。

今回使用した 4-in-1 マルチビューアはシリアルコンソール操作により表示内容の切り替えも可能ですので、両方の画面を出力したり、片方の画面をフルスクリーン表示したり、と遠隔操作することも可能です。


データセンターに設置

全体像
データセンターから送られてきたサーバーの映像
(Ubuntu 16.04と、BIOSのPOST画面が映っている)

これでリモートからVNC経由でデータセンター内の画面を表示できるようになりました。この仕組みは1ヶ月以上無事に動き続け、でデモの開発はほぼリモートで行われ、実際にマシンの前で作業を行ったのは搬出前の動作確認(1日)のみで済みました。


最適化の余地

コードを見られるとすぐわかるのですが、非常に雑な実装でフレームバッファのコピーを繰り返しています。

PYNQのbitstreamに含まれているビデオキャプチャはOpenCVで用いられる1pxあたり24bit BGR順フォーマットに合わせられており、libvncserverが求める1pxあたり32bit RGB順のピクセルフォーマットとは異なっています。このため、今回のコードではOpenCVをcvtColor関数を用いてソフトウェアでフォーマット変換していますが、ちゃんと性能を出したければ PL 側で libvncserver が要求するビデオフォーマットに変換した状態で DMA コントローラに食わることでゼロコピー化も可能でしょう。

以前から事情が変わっていなければOpenCVをNEON命令を利用するように再コンパイルするだけでも上記の色変換処理の速度はあがるのですが、PYNQ-Z1のメモリ帯域幅は細いのので PL からビデオのピクセルデータを受け取る時点で工夫するのが理想です。

また、フレームバッファのなかで変化した範囲を libvncserver に渡せれば画面の差分転送が可能になるので、そこまでやりきれば、一般的なデスクトップ画面などを転送する場合にパフォーマンスが高いものが作れるのではないかと思っています。

VNCは、変更があった領域のみを転送することが可能なプロトコルですので、各種パフォーマンスのチューニングをしていけば今後で活用余地が見いだせるのではないかと思っています。


別の実装方法

今回使用したVNCサーバーは、まだホントに画面が映るだけで差分転送をしていないので画面全体を毎回再転送するため非効率でした。正直なところ、性能だけを考えれば、入力フレームをMotion JPEG にエンコードしてストリーミングする実装を使ったほうが良かったと思います。

別のハードウェアを使う方法として Raspberry Pi シリーズは H.264 エンコーダを持っているので、映像のストリーム送信の用途には向いています。CSI-2 カメラインターフェイスにHDMI to CSI変換モジュールを取り付けるとHDMI映像をキャプチャできます。私がこの作業を行ったときはまだ OpenMomoなどが利用できる状況にはなかったのですが、今時だとH.264+WebRTCなどもアリですね。

 手元でも Raspberry Pi 4 + B101 ボードで色々試しています。

まとめ

映像デモマシンをデータセンター内に設置して開発するために、今回は手持ちの ARM+FPGA ボードでこしらえた「受信したDVI-D映像を表示できるVNCサーバー」を使ってみました。
HDMI映像をIP経由でストリーミングできる手段は増えてきていますが、こんな方法もあるということで参考になれば幸いです。


この記事はさくらインターネット Advent Calendar 2019 の 6日目でした。7日目の記事もお楽しみに。


過去に参加した Advent Calendar まとめ




2019年9月25日水曜日

iOSのAPNプロファイルをダウンロードして再インストールの時に備える

現在、メインの携帯電話キャリアとして IIJmio を使用していますが、地味に手間なのが APN の設定です。

APNプロファイルをダウンロードすればよいのですが、例えば海外出張から戻ってきて、現地の SIM カードから国内の SIM カードに戻すと、 APN プロファイルの設定やダウンロードが必要になります。ダウンロードするには LTE 通信ができるか、 WiFi アクセスポイントにたどり着かないといけません。すると、移動中にさくっと APN 設定を復元できなかったりします。

ここでは、 iOS 系のデバイス(iPhone や iPad)で、オフラインのまま APN プロファイルを再インストールできる方法を紹介します。インターネットに接続できない状態で APN プロファイルをインストールできるよう、内蔵フラッシュ領域にコピーを置いておき、必要時にはあらかじめダウンロード済みの APN プロファイルをロードします。

Safari で IIJmio APN プロファイルのダウンロードページを開きます。
https://www.iijmio.jp/hdd/devices/config.jsp


Cellular Payload 版の APN プロファイルの画像を長押しして、ポップアップを開き、リンク先のファイルをダウンロード を選択します。



Files アプリを起動し、ダウンロード済みファイルを確認すると iijmio-celluar ファイルが確認できます。



ただし、このダウンロード先フォルダは iCloud 上となっており、いざというときにアクセスできないかもしれません。

画面右上の Select をクリックし、プロファイル ファイルを選択状態にして、画面下部からフォルダアイコンをタップしてプロファイルの移動画面を出します。そしてローカルストレージにコピーしましょう(このiPhone内もしくはiPad内)。まだ大事なAPNプロファイルを保存するのに適したフォルダを持っていなければ、この機会に作るとよいでしょう。私は hasegaw/private のなかにとりあえず保存しておくことにしました。



Files から、今回ローカルストレージに保存した APN プロファイルをクリックすることによって、プロファイルをインストールできます。クリックしたプロファイルは IIJmio サイトからダウンロードした場合と同様に Settings からプロファイルのインストールを別途許可する必要があります。


また iCloud 上にこのようなファイルを集めておけば、まとめてプロファイルを復旧するときにまとめてインストールできて便利です。たとえば、オレオレ証明書の pfx ファイルなどを置いておくと便利ですよ。

ガガーン・・・!

2019年6月26日水曜日

iPhone XでGoogle Fiをアクティベートしてみた

アメリカ出張中にBestBuyでGoogle Fi SIMを普通に買うことができたので、買って契約してみました。
Google Fi は日本ではほとんど知られていないと思いますが、 Google が米国で提供する携帯電話サービスです。だいたいのサービスの特徴として
  • 20ドルで1電話回線(通話、Text、データ)を利用可能。10USD/1GB利用、ただし80USD/月で課金打ち止め
  • 15GBぐらいまでは使える
  • 世界170カ国ぐらいで、上記価格でLTEデータ通信が使えるので海外行きには便利
  • 日本に持ってきているとUSの番号にかかってきた電話がローミングで受けられる?
といった感じになっています。詳しくは https://fi.google.com を見てみてください。


今まではどうしていたか

これまでは個人的にアメリカと連絡をとったりするときのために SkypeIn 番号をとっていました。はじめての海外がユタだったことから愛着もあり 1-801-****-**** の番号を押さえていました。

また、 iPad Pro の Apple SIM で 150日間で10GB程度使える $10 のプランこれまで3-4回契約してきました。だいたいの場合はこれで困らないのですが、以下のパターンでちょっと手間だなーというのがありました。
  • カーナビゲーションに iPhone を使うときに毎回 iPad Pro 経由でテザリングを有効にしないといけないのが地味に面倒
  • Apple SIM から T-Mobile 契約をアクティベートできずにハマったことがある。LTEがある前提でいったら宿泊先の情報をUS到着後に確認せねばならず、LTEなしで別のホテルで泣きついてWiFiを借りるという苦労を去年テキサス州でしました。SIMアクティベートに苦労した詳細は IIJmio SIM カードが入った iPad Pro (2017) 10.5インチモデルで Apple SIM を使おうとして苦労した話 にまとめてあります。
  • 結局、毎回 iPhone X 用に SIM が欲しいという状態になり、そのたびに AT&T や Verizon に駆け込み

Google Fi  SIM を BestBuy で普通に発見

ちょっと目立たないところではありましたが、  Google Fi の SIM が BestBuy の携帯電話売り場に普通に売られて居ることに気づいて、とりあえず二枚買ってみました。一枚おおよそ10ドルしますが、10ドル分のデポジットがあるので実質タダになります(申し込みをした場合は無料で宅配で送ってもらえるものを店頭で値付けしているが、その分はデポジットになるという仕組みです)。もしかしたらSIMを使わずに放置したら有効期限切れになってしまうかもしれませんが、まあ男の子のおもちゃ的要素も強いので、そのときは、まあ、それでいいでしょう(その場でプリペイドカードを activate している感じなどはないので、たぶん大丈夫だとは思います)

なお BestBuy での店頭売りがはじまったのは 2019年3月頃からのようです。


アクティベートに必要なもの

翌日、早速契約してみることにします。事前に調べていたこともあり、だいたい必要なのはこんな感じだということがわかっていました。
  • SIM カードを手元に準備する必要がある
  • Google US のアカウントでないとサインアップできないらしい?
  • US 内の住所が必要
  • 課金用クレジットカードも US みたいな話をみかける
SIMカードは Google Fi の Web サイトから郵送を申し込むと1週間以上かかるそうでホテル宿泊者にはつらいですが、 BestBuy で小売りがはじまったことで一気にハードルが下がりました。

Google のアメリカのアカウントは作ればいいだけです。  Google Fi 申し込み時だけ在住国をアメリカに変更すればいいという話も見かけるのですが、何か面倒がおきて普段使いの Google アカウントに影響が出る場合を嫌って、今回は新しく Google US アカウントを独立したかたちで取り直しました。

US 内の住所は持っていませんが、「滞在先ホテルの住所を使う(嘘はついていない)」「勤務先会社のブランチオフィスの住所を使う」「知り合いの家の住所を借りる」「コワーキングオフィスの住所を借りる」といった手があるかと思います。残念ながらいまは雇用関係にある会社で直接米国内にブランチをもっていないので、関連会社の住所とか借りちゃおうかといろいろ悪巧みの考えたのですが、最終的にはホテル住所を入れ、アパート名として「The North Side Inn Guest」という要領で登録して、無事に開通までこぎ着けました。すべて正直で、嘘は一切ついていません。

最後の課金用クレジットカードでUS発行のものを用意する方法は思いつかなかったのですが、Webサイトで前例を調べていたら、US国内で買えるVISAなどのプリペイドカードに現金をチャージするという方法があるそうです。たとえば50ドルをスーパーマーケットなどで支払うとVISAのクレジットカードとしてプリペイド分だけ使えるカードを発行してもらえます。
この手を使おうかなと思ったのですが、カードに残高を追加する refill が日本国内からできないであろうことを考え、とりあえず自分が持っているカードでダメ元で試すことにします。


Google USアカウントを作成する

まずは US 内で Google アカウントを作成します。 Google アカウントの作成自体は特に普通のことですし細かくは書きません。


Google Fi に加入する

米国内のホテルの WiFi を使って https://fi.google.com/signup から申し込みを進めていきます。今回は端末を購入せずに Apple Store で購入済みの iPhone X と手元に準備した SIM カードを使用します。その条件で画面を遷移していくと 1回線20USD+データ10USD/1GB/mo.のプランが表示されます。

サービスアドレス(サービスを受けるメインの住所、おそらく緊急車両などを呼ぶ場合のベースエリアになる)の入力があったので、宿泊中のホテルの住所などをベースで入力します。(スタバWiFiなどで自宅住所のZIPコードをきかれたりしますが、とりあえずホテルのものを入れておくと通過できたりしますね)

課金先は、日本で発行された Delta American Express Gold を使っているので、こちらでの支払いという形にしたらあっさりと契約できました。


Google Fi アプリを入手する

Google Fi は日本でサービスされていないので、 Apple のアカウントが日本在住になっていると Google Fi アプリが iPhone X 上の App Store で見つけられません。このため、一時的に普段使いの Apple アカウントを US に変更することにしました。

Apple サイトにログインし個人情報を変更します。先と同じ要領でホテル住所でアカウントを作成しました。ここで請求先クレジットカードを登録するように求められるのですが、単に None (なし)のみを選択して先に進みます。ここでは、 Google が許してくれた日本のクレジットカードは通りませんでした。また、一度でもカード番号などを入れ始めてしまうと None を選択してもカード番号が不正といったエラーメッセージが出て咲きに進めなくなってしまいました。

Apple アカウントが US ベースになってから iPhone X の App Store が US の App Store ベースになると、 Google Fi アプリが検索で出てくるようになりますので、インストールします。

ここまでが終わったら、 Apple アカウントの設定をまた日本に戻しておきます。


Google Fi SIM をアカウントに追加する

続いて SIM を使えるようにしていきます。購入済みの SIM をスロットに差し込み、先ほど  iPhone X にダウンロードした Google Fi アプリで SIM をアクティベーションします。SIMパッケージに付属のワンタイムキー入力、またAPN設定などを済ませると、端末を再起動し次第サービスが利用できるようになりますという旨のメッセージが表示されます。


おつかれさまでした

上記で、割とあっけなく Google Fi の SIM を開通させることができました。


どう使うつもり?

海外出張に出たときに、米国のほか Google Fi のサービスエリアであれば、空港に降り立った瞬間から音声、LTEデータが使える回線を手元に持つことができるのは十分なメリットあると思っています。

現地のAT&Tマンスリープランと比べて同じぐらいかちょっと高いぐらいの利用料ですが、データ通信が少なければ割安になりそうですし、データ通信は基本的に iPad Pro で利用できるプランでテザリングすれば Google Fi での通信量を抑えられ、Fi に課金されないので、USの電話番号とLTEデータ通信が iPhone X から利用できるというメリットが発生します。

Google Fi のLTEデータが高いと思うのなら、SIMを入手するまでの予備回線として利用するのもありかもしれません(まあ、それならAT&TとかのSIMカードを事前購入してアクティベートだけしろよという話はありそうですが)。

また米国内で取得したSIMを日本にもってきても、サービス的にはユーザがSIMを持って海外旅行した状態になります。米国電話番号に対する音声通話もローミングされる認識ですし、ある意味 SkypeIn みたいなものを SIM として持った状態になります。しかも多分 Text はできる。

また、日本で利用する場合、日本のMVNOと比べれば割高ではありますが、最大月80ドルで15GB以上通信できる非常用SIMとしても利用できます。

月20ドルを1年間寝かせても年間240ドルですし、激安とは思わないものの、SkypeIn番号を取得するのだけに月13ドルかかっているぐらいなら Google Fi を契約し続けても正直月7ドルぐらいしかランニングコストは変わりません。このため、 Google Fi はアクティブな状態で Skype In は解約することにしました。


eSIM じゃダメなの?

私が持っている iPhone X が eSIM 対応だったら eSIM で考えたかもしれません。ただ普通の SIM として持っていると、帰国後に自宅で余っているLTE端末などにさして電話を受けるといったことも可能なので、物理 SIM がいいかなーという思いはあります。


おわりに

正直身構えた割にあっけなく開通した Google Fi ですが、しばらく使って(?)みようと思います。飽きたりコスパ悪いなと思ったら解約するかもしれませんが。