見出し画像

OpenCLとTensorFlow LiteとPixel 6と自動車

こんにちにんにん、どうも、営業終了大魔王です。

最近、開発でOpenCLに関わることがあったので、今回はそのことについて書きたいと思います。

と言っても直接OpenCLを使ったわけではなく、OpenCLを使っているライブラリを使っているライブラリをREALITY導入する開発をしました。具体的には、OpenCLを使っているTensorFlow Liteを使っているある外部のライブラリをREALITYに導入する開発です。

OpenCL is 何

Wikipediaより

OpenCL(オープンシーエル、英: Open Computing Language)は、マルチコアCPUやGPU、Cellプロセッサ、DSPなどによる異種混在の計算資源(ヘテロジニアス環境、ヘテロジニアス・コンピューティング、英: Heterogeneous)を利用した並列コンピューティングのためのクロスプラットフォームなAPIである。主な用途は科学技術計算や画像処理に代表される高性能計算のためのアプリケーションソフトウェアの高速化(ハードウェアアクセラレーション)であり、シミュレーション可視化に用いるリアルタイム3次元コンピュータグラフィックスAPIとの連携も拡張機能として標準化されている。スーパーコンピュータやサーバ、ワークステーションやパーソナルコンピュータのほか、携帯機器などでの利用も想定されており、組み込みシステム向けに必要条件を下げたOpenCL Embedded Profileが存在する。

英語版だと

OpenCL (Open Computing Language) is a framework for writing programs that execute across heterogeneous platforms consisting of central processing units (CPUs), graphics processing units (GPUs), digital signal processors (DSPs), field-programmable gate arrays (FPGAs) and other processors or hardware accelerators. OpenCL specifies programming languages (based on C99, C++14 and C++17) for programming these devices and application programming interfaces (APIs) to control the platform and execute programs on the compute devices. OpenCL provides a standard interface for parallel computing using task- and data-based parallelism.
OpenCL is an open standard maintained by the non-profit technology consortium Khronos Group. Conformant implementations are available from Altera, AMD, Apple (OpenCL along with OpenGL is deprecated for Apple hardware, in favor of Metal 2), ARM, Creative, IBM, Imagination, Intel, Nvidia, Qualcomm, Samsung, Vivante, Xilinx, and ZiiLABS.

噛み砕いて言うといろんな端末で高速に計算するための枠組みといったところでしょうか。

TensorFlow Lite

TensorFlow LiteはモバイルデバイスなどでTensorFlowモデルを元に作成されたTensorFlow Lite モデルを使って推論を行うことができます。

イメージで言うとめちゃくちゃ高性能なパソコンでAIが勉強をして...

画像1

その成果を比較的高性能ではないスマホなどでも発揮させることができる感じです。

画像2

このTensorFlow Liteが高速化のためにOpenCLを使うわけです。ところが、このOpenCLは必ずしも全てのAndroid端末で動くわけではなく、そのような端末ではCPUで動作します。

Pixelと自動車

今回の開発で導入しようとしているライブラリは既存で使っているライブラリの上位互換として導入を進めました。しかし、検証の結果、OpenCLが動作しない端末では必ずしも既存のライブラリと比べてパフォーマンスが上回るとは言えないことがわかったため、OpenCLが動作しそうなら新しいライブラリを、そうでなければ従来のライブラリを使うという方針になりました。

なのでやることとしては、OpenCLの対応に分岐するコード書けば良いのですが、そのために書いた下記のコードだと何故かPixel 4では端末のSoCの Qualcomm Snapdragon 855 がOpenCLに対応しているのにもかかわらず正しく判定ができないことがありました。

private fun canLoadOpenCL(): Boolean {
       try {
           System.loadLibrary("OpenCL")
       } catch (e: UnsatisfiedLinkError) {
           return false // Pixel 4でもUnsatisfiedLinkErrorになってしまう
       }
       return true
   }

Pixel 4上で /system/vendor/lib64/libOpenCL.so というパスにはファイルが存在するのですが...謎です。

しかしながら、TensorFlow Liteのリポジトリのデモアプリでは、Pixel 4でOpenCLが正常に動作しているように見えます。分岐条件としては このように なっていました。 

#ifdef __ANDROID__
 // Pixel phone or auto?
 libopencl = dlopen("libOpenCL-pixel.so", RTLD_NOW | RTLD_LOCAL);
 if (!libopencl) {
   libopencl = dlopen("libOpenCL-car.so", RTLD_NOW | RTLD_LOCAL);
 }
 if (libopencl) {
   typedef void (*enableOpenCL_t)();
   enableOpenCL_t enableOpenCL =
       reinterpret_cast<enableOpenCL_t>(dlsym(libopencl, "enableOpenCL"));
   enableOpenCL();
   LoadOpenCLFunctions(libopencl, true);
   return absl::OkStatus();
 }
#endif

どうやらPixelシリーズ端末とauto(おそらく自動車向けAndroid?)では特別なOpenCLのバリエーションが存在するようです。REALITYでも同じ条件で対応することにしました。(運転中にREALITYを使うことは日本の法律では禁止されていると思いますが)うまく動くことを祈ります。

さて、もうすぐ発売されるらしいPixelシリーズ最新の Pixel 6では独自プロセッサである「Tensor」が搭載されているそうですね。このあたりが正常に動作するのかドキドキしています!

まとめ

いかがでしたか? 

今回はOpenCLとTensorFlow LiteとPixel シリーズの動作について調査してみました。

高速化の多種端末への対応が大変なことがわかりました!

REALITYでは一緒に多端末対応をしていく仲間を募集しています!

最後までご覧下さりありがとうございました。