Blog

2019.01.25

Research

Chainerモデルのさらなる高速化、デプロイの簡便化、可搬性の向上に向けた実験的な取り組みについて

Shinichiro Hamaji

Engineer

PFN のエンジニアの浜地です。入社以来取り組んできた実験的なプロジェクト Chainer-compiler を github で公開しました。まだ実運用に投入していける段階では無いですが、面白いものになってきているのではないかと思うので、紹介させてもらいたいと思います。

https://github.com/pfnet-research/chainer-compiler

昨年末、 PFN は ChainerX をベータリリースしました。 ChainerX は Chainer の使いやすさを維持しつつ、 Python で実装されていた部分を C++ 実装で置き換え、以下の3つを実現するものでした。

  • モデルの実行を高速化する
  • Python の無い環境でもデプロイ可能にする
  • CPU/GPU以外への移植を容易にする

Chainer-compiler プロジェクトは ChainerX を利用して、上記の ChainerX の目標をさらに押し進めるツールチェインを開発しています。現状、以下のようなコンポーネントからなります。

  1. Python 構文木を解釈して、計算グラフを、拡張された ONNX フォーマットとして取り出す
  2. 拡張 ONNX で表現された計算グラフを変換して、高速化や自動微分をし、コード生成をする
  3. ChainerX の C++ 部分を用いて、生成されたコードを実行する

想定している使い方の例をいくつか紹介すると

  • オペレーションが逐次実行される Chainer/CuPy/ChainerX の計算モデルと違って、いったん複数のオペレーションからなる計算グラフが作られるので、オペレーションをまたいだ命令融合や、データフォーマットの事前変換などの最適化ができる
  • 上記の1,2を事前に実行して、3の部分だけをデプロイ環境で実行することによって Python の無い環境でのデプロイが手軽にできる
  • 2のコード生成部のターゲットを追加することによって、特に静的グラフを前提としたモデル実行系や用途特化チップ(例えば MN-Core)での実行をサポートしていける
  • 2,3の部分のみを使うことによって、 ONNX-chainer や他の ONNX 生成系で作られた ONNX モデルを実行する。また、これに限らず、他のツールとの連携は、色々な組み合わせが考えられると考えています

などがあります。上記以外にも、色々と実験的なことをやっていきたいと考えています。

深層学習用コンパイラは、他の深層学習の領域同様、競争が激化していて、とても面白い領域だと思います。深層学習用コンパイラとひとことで言っても、用途や目標によって色々なものがあるのですが、 chainer-compiler プロジェクトでは Chainer のフレキシビリティをなるべく損なわない形でモデルをコンパイルすることを、重要な目標の一つとして考えています。そのため、次元が固定されていない tensor や Python の条件分岐・ループ、 Python のリストなども表現できるようにしています。多くの深層学習コンパイラは最適化に集中していて次元が静的であることを前提にしているものが多いので、この点は少しユニークな点になりえるのではないかと思っています。

この投稿では、 Chainer モデルをコンパイル・実行する実験的なプロジェクトについて紹介しました。結構広い領域について、色々とやりたいことがあって、楽しく作業しています。こういう作業に興味がある方は、ぜひ PFN への応募をご検討ください。この投稿では説明しきれなかった点も多くあります。技術的な話でも採用の話でも、なんでも疑問点がある方はご連絡いただければ、と思います。

最後に、 chainer-compiler プロジェクトに協力して下さっている全ての方々に感謝します。特に、「Chainer を使った Python コードを ONNX に変換する」というテーマに取り組んでもらった、インターンの佐藤さんの多大な貢献に感謝します。

  • Twitter
  • Facebook