GPGPU はもともと名前も知っていたし、なんか使えるらしいレベルで知っていた。ただ個々数年で機械学習系で人気がでてきたことで、色々便利になっているという印象はあったが、機械学習系も興味ないかったので無視してた。

最近になって重い腰を上げて GPGPU を調べているまだどんなことができるのか、何が嬉しいのかを知ろうとしているレベル。

いろいろ調べたので、せっかくなので調べ始めた経緯などもふくめて書いてみた。

Erlang/OTP C 拡張のリスク

自分は Erlang/OTP で製品を書いているが、 Erlang/OTP の最大の弱みとして計算処理が弱いというのがある。計算処理が弱いというのは何かしらの変換処理などを行う場合は外部のツールまたは、C 拡張 (NIF) を利用したりして処理を刷る必要がある。

ただ NIF はメリットが少ない。ビルドがその C 拡張に引っ張られることもあるが、スケールする部分のボトルネックになるパターンもある。さらには NIF に引っ張られて Erlang VM がクラッシュする可能性もある。

安定性を目的として Erlang/OTP を使っているにも関わらず、NIF によって足を引っ張られるのは受け入れがたい。そのため今まで自社プロダクトでは NIF を一切使ってきていない。

数倍早くなる程度で NIF を使うリスクが高すぎると感じていたからだ。

Erlang/OTP から見た GPGPU の魅力

自分にとっての GPGPU は Erlang/OTP が苦手とする部分を補ってくれる何かに今現在見えている。

例えば自分がここ数年関わっているのがリアルタイムな映像配信システムだが、一切変換や合成といった仕組みには手を出していない。

手を出していない理由としては Erlang/OTP が苦手とする分野だからだ。そしてそれを NIF を利用して CPU リソースを使った仕組みを導入したとしても結局 CPU リソースを奪ってしまうため、すぐに限界が来る。

そのため最近は FFmpeg との連携を強めてきた。FFmepg にデータを渡して変換はそちらで行うというものだ。ただここは FFmpeg のサポートは行わないし、自前で頑張ってもらうという顧客に負担をかける仕組みになってしまう。

ただ、 Erlang/OTP は計算処理は無理なので、手が出せないでいた。

そこで数年前に社員に教えてもらったのが FFmpeg の GPU を利用した映像変換処理だ。FFmpeg には GPU を利用して高速化する仕組みが入っているらしい。

ただ、まずは自社製品開発に集中するということで気にはしていたが、手を出さずにいた。

自社製品がポツポツ売れてきたことにより、色々考える時間が持てるようになった。また、他社との差別化も考える必要が出てきた時に、目をつけたのが GPU を利用した仕組みだった。

Erlang/OTP の課題を GPU でなんとかできないか

自分の使いみちとして Erlang/OTP には課題が2つあった。それが暗号処理と動画変換。両方共処理が遅いことから NIF が必須になる。

さらに NIF を使っても結局 CPU 処理に依存することから、劇的な変更が生まれるとは思えなかった。そこで GPU を使うことでうまくいかないだろうかと考えた。

暗号処理編

Erlang/OTP は計算処理が遅いので実は暗号処理も遅い。そのため NIF を利用し OpenSSL または LibreSSL を利用している。

ただ、それでも遅いので、最近は AES-NI を使う仕組みが Erlang/OTP に入ったりした。ただ、この AES-NI は CPU によって色々差がある。

そこ、もしかして GPGPU を使って暗号化処理の部分をオフロードできたりしないのだろうか?なんて事を考えた。

調べてみると色々論文やサンプルコードは出てくるのだが結論としては AES-NI のほうが圧倒的に早いというものだった。 GPU に処理を依頼するにはどうしてもデータを渡す部分がボトルネックになってしまうようだった。

素晴らしい結果で GPGPU でやるべきみたいな話がなかったことから、一旦は諦めることにした。

映像変換編

リアルタイムな映像処理の弱点として大規模な映像配信をすることができないというのが挙げられる。

さら特定のメーカーの端末は固定したコーデックにしか対応していない事もあり、現実的には大規模配信をするには HLS を利用するしかない。特に国内では。

そうなるとその特定のコーデックを利用するためには必ず変換をする必要が出てくる。変換をしない仕組みは作ったが、特定のメーカーで視聴できないため役に立たない。

ここで必要になってくるのが変換処理だ。通常変換処理をサーバで行うには CPU を利用する、ただ変換処理は CPU を食うためコストパフォーマンスが悪い。

そこで GPGPU を利用できないかと考えた。

ここ数年でだと AWS や GCP では GPU インスタンスが追加されたことで、気軽に GPU が載っているサーバを用意することができるようになった。

これは Erlang/OTP と GPGPU の環境をおもったより簡単に作れるようになってきた。変換が不要であれば GPU マシンは不要になる。

さらに FFmpeg を使えば変換は可能だ。あくまで 1 台でキレイに完結したい人だけの需要になる。この需要が大きいのかというとかなり狭い需要なのだが、GPGPU を使ったオフロードは自分には技術的な興味という視点でとても興味深く見えた。

そこで GPGPU で動画変換を調べたところ、NVIDIA が出している SDK を利用するのが現実的という事がわかった。

これを使うことで GPGPU での VP8 や VP8 のデコードにも対応しており、H.264 や H.265 が吐き出せることもわかった。

実際クラウドが用意している GPU インスタンスは全て NVIDIA 前提になっていることもあり、選択肢はこれしかないという状況だ。

今後

まだ、色々調査している段階ということもあり、自社の製品に GPGPU による変換機能が搭載されるのは来年以降になるだろう。

リアルタイムな配信の世界に GPGPU を持ち込むことで CPU リソースを利用しない会議映像の合成も実現が可能になるのかもしれない。

GPGPU をよりうまく使うことでリアルタイムな映像の合成などもできるのかもしれない。これはまだ全然調べていないので妄想でしかない。

Erlang/OTP と GPGPU という双方特化型の仕組みを組み合わせることで何か尖ったものを実現したいと考えている。何かやるなら面白い方がいい。

おまけ

YOLO

実は機械学習には興味はなかったのだが、この YOLO というリアルタイムなオブジェクト判定の仕組みを知った事で少し興味を持ち始めた。

これを Erlang/OTP と組み合わせることでリアルタイムに流れてくる映像の判定処理をサーバで行うことができたりしないだろうかなんて考えたりしていた。

ただ、この辺はもっとエッジでやってほしいというのもある。サーバはあくまで配信と変換をやるべきで判定までやるのは小規模までだろう。

http://idein.jp

この動画を見てからはサーバで判定をするのは時代遅れに感じてしまっている。

Erlang/OTP と CUDA

http://www.erlang-factory.com/upload/presentations/356/KevinSmith.pdf

https://github.com/kevsmith/pteracuda

実は 7 年前に Erlang と CUDA を組み合わせたというプレゼンがある。ただこの時はまだ色々枯れてなかったし、GPU サーバというのも一般的ではなかった。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store