tkato’s blog

ブログ名は暫定。

アドテク x golang勉強会 -オレシカナイトvol.2- に参加してきました

アドテク x golang勉強会 -オレシカナイトvol.2- に参加してきました

サイバーエージェントが運営するメディアの広告部門である「MDH」のエンジニアが、新規技術に挑戦するにあたって踏んできた地雷を皆様に共有する勉強会です。前回に続き第2回目の開催となります。 今回はMDH内でのGO言語を利用した話を中心に、これまでの開発における体験や失敗についてお話しします。

cyberagent.connpass.com

最近は、組み込みシステムをC言語で書くのが辛いので、現実逃避気味にGoとかRustの勉強をしています。

Goは、プログラミング言語Goをざっと読んで、Webの記事を読んで、ちょっぴり手を動かしたレベルの初心者なのですが、今回のイベントではGoを使う現場の声を聞けるとのことで面白そうだと思い参加してきました。

以下、各セッションについてのメモ書きとコメント

1年目でgolangscalaを触った話

大江 善渡氏

  • Scalaは、プログラマの習得度によって書くコードが違う
  • Scalaは、新規導入する上では学習コストが高く、言語仕様に悩むこと多い
    • 一方Goは、習得が簡単。書き方が統一できる
  • Goは、乱用するとコードが複雑になるジェネリクス、継承、例外がない
    • 既存コードを読みやすい
    • 大規模なPJでシンプルさを保てる★

DSPGolangの屍を超えた話 (パフォーマンスチューニングとか)

片田 雄樹氏

DSPって広告配信のプラットフォーム(Demand-Side Platform)のことらしいです。プロセッサではなく…

  • 流行ってるしいいんじゃね、と採用してみたがパフォーマンスを出すのに苦労したとの話
  • ライブラリの実装によって遅いものもある
  • Goや他の人が作ったライブラリも読みやすいので、ちゃんと中身みて使うと良い
  • チューニングには、プロファイルをとるのが大事
  • プロファイラはpprofが良い
    • 対話型で、コマンド打ちながら分析できる
  • goroutine生成のオーバーヘッドが問題になるケースもある

Javascalaをやってきてgoに思うこと

森 拓真氏

Scalaをかじっていたお陰で話についていけた)

再帰で書きたいケースは、Goではどう書けばよいのだろう??

マイクロサービスのためのフレームワークgoaのご紹介

渋江 一晃氏

WebAPIは作ったことがないので、そういうもんなのか〜っていう感じで話を聞いていた
WebAPI書く人にとっては便利なのだろう

  • WebAPIは、APIドキュメントや値のバリデーションなど、IF周りの作業が色々大変
  • DSLからコード生成することで、それを簡単に
    • Goで書くDSLだった。
  • APIの設計から実装の推奨開発フローがあり、それに従うと効率よくできるよという話

確かに、以下をみてみると、APIの仕様とドキュメントを一箇所にかけていて、ここからコードが生成できるのは便利そうだなと思った

https://goa.design/learn/guide/

公式ドキュメントも日本語化されており、わかりやすい

https://goa.design/ja/

Goにおけるテスト可能な設計 - Javaとの比較

大澤 翔吾氏

アツい方だった。
本発表であったユニットテストで抱える課題は組み込み業界でも同様(より悪質かも)で、発表内容に共感できた

名言が結構あって、私も会社で使わせてもらおうと思った。

簡単なサンプルコードをJavaとGoで書いて、それぞれでテストをどう書くか比較しながら説明。
サンプルコードは、公開

https://github.com/shogo-osawa/oreshikanight-test-example-go

  • Goがシンプルさを実現するために何を犠牲にしたか
  • テストの依存性の分離をしないと、別モジュールが壊れても自モジュールが壊れて原因特定が難しくなる
  • 再現性の担保ができないテストは、誰も信用しない
  • 依存性の注入 = 外からスタブを入れられること
  • 自動生成など使って、スタブを1行くらいで書けると生産性が高い
    • 逆にできないと、テストケースが増えたときに辛い
  • Javaのリフレクションで、テストしやすい設計ができる
  • C++でもモックの実行時生成とかできるぽい、
  • Goはmockgenが使える
    • mockgenが生成したモックをファクトリ関数にいれて、依存性を注入したオブジェクトをインスタンスする
  • Goは機能が少ないぶん、ルールが多い
    • テストにおいても、設計で上手いことしないといけない
  • ユニットテストは、メンテナンスコストと網羅性のトレードオフ
    • どこをテストする?自明なところをテストするよりは、コケそうなところをテストすべき
    • メンテする価値ある?など振り返ると良い。

所感

  • Goを製品に取り入れていこう!という選択ができる環境がまず羨ましいと感じた
  • 他の人が書いたコード読みやすいとか、誰が書いてもだいたい統一されるってのは大規模開発する上でメリットでは
  • モダンな言語だと、ユニットテストも楽々かと思っていたが、意外と課題はあるようだ
    • 今回の発表の趣旨が特に課題を共有する部分にあったため、なおさらそう感じたのだと思う
  • Goは使うところを選べば、パフォーマンスを発揮できそうな言語だという印象が強くなった
    • <-> なんでもかんでもGo、というよりは。

プログラミングGoの訳者あとがきを読むと、翻訳の柴田氏は組み込みプロジェクトでGoを導入しテスト駆動で開発していたとある。 面白そう…

第26回 全脳アーキテクチャ若手の会 勉強会 「バイナリーニューラルネットとハードウェアの関係」に参加してきました

第26回 全脳アーキテクチャ若手の会 勉強会 「バイナリーニューラルネットとハードウェアの関係」に参加してきました。

wbawakate.connpass.com

当日の資料は公開されています。

www.slideshare.net

バイナリーニューラルネット(以下、BNN)は私も興味があり調べていたので、発表を聞くのが楽しみでした。

発表者は、筑波大博士過程の田尻さん。

発表は、BNNの論文を、

  1. Binary Connect
  2. Binarized Neural Network
  3. XNOR-Net

の、投稿順に比較しながら説明するスタイルでした。

私は各論文についてそれぞれ概要は知っていましたが、より情報を整理できました。発表の構成が良かったですね。
それぞれ比較すると各論文のモチベーションやアルゴリズムの違いが明確にわかりますね。
私も論文を読むときは、参考にしようと思いました。

今回の発表と既存の知識から、BNNのポイントを私なりにまとめると、

  • 学習時の特徴
    • 学習時から、重みをバイナリ化して扱う
      • 浮動小数点で学習した重みを認識時だけバイナリにするのは、順伝播によって各レイヤで誤差が蓄積するためうまくいかないらしい
    • バイナリ化した重みの勾配で、元の重みを更新
    • 更新時にクリッピング
    • 通常のNNより学習時間は長くなる傾向
      • 正則化による
      • バイナリ化などで計算量増えるため
    • Batch NormalizationをHW最適化した方法がキモ
  • 認識時の特徴
    • バイナリ化した重みのみ使う
  • その他
    • 論文によって、どこがバイナリ化されてるか異なる
      • 重み
      • 活性化関数の出力
  • メリット
    • リソース削減
      • メモリ使用量が削減できるので、重みをオンチップにし易い
    • 高速化
      • RAMにアクセスせずオンチップでデータを流せるため
      • 積和演算をバイナリ演算に置き換えられるため
    • 小規模なデータなら、普通のNNに近い精度
      • 情報量を減らすことが、正則化に繋がる
  • デメリット(課題)
    • 大規模データでは認識精度がでない
      • ImageNetで6割くらい
    • 標準で対応したフレームワークがない??

OSSで標準で対応した汎用のフレームワークあるんでしょうか?

質疑応答でも以下のようなやり取りがありましたが、

  • 実用ではBNNより固定小数点やDSP活用の方が現実的では?
    • ⇒ 二値化という概念のポテンシャルは高い
    • ⇒ 学習方法の発達などで今後見込みがあると思う

HW化する上での実用化的な手法は、他にもありそう。
ただし、クラス数を絞れたり、メモリが少ない特定のユースケースには、BNNが向きそうだと思いました。

以下、メモ

それぞれ、論文の実装のリンクを貼っておきます

Binary Connect

GitHub - MatthieuCourbariaux/BinaryConnect: Training Deep Neural Networks with binary weights during propagations

  • 重みの行列だけバイナリ化
  • 活性化関数の出力は浮動小数点のまま
  • biasも浮動小数点のまま

学習方法

  • 元々の重みをバイナリ化して、順伝播する
  • 素の浮動小数点の重みを保持しておくことが重要
  • 逆伝播時
    • バイナリ化した重みの勾配を計算
    • 更新対象は、保持しておいた素の重み
      • クリップすることで、実数重みの発散を防ぐ
    • 推論時はバイナリ化した重みだけ持てば良い
  • バイナリ化には正則化の効果がある
    • 表現力を落とし、過学習を防げる
  • 学習

Permutation-invariant MNIST

  • 回転とか拡大とか、事前の画像処理を禁止したデータセット

Binarized Neural Network

GitHub - MatthieuCourbariaux/BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1

活性もバイナリ化。これもBengioグループの論文。

  • 活性をバイナリ化は課題があったが、この論文ではそれを解決
  • 活性をバイナリ化する課題は、勾配の消失
    • ⇒ HTanhなら、バイナリ化できるし、勾配も消えない
  • 前の層からの入力は活性化関数でバイナリ化されてる
  • 順伝播の1層目は特別扱い。ここはバイナリでない8bit固定小数点。

学習

  • BinaryConnect同様、実数重みを更新

Shift-basedなBatch Normalization

  • 浮動小数点でのBatch Normalizationが遅い問題を解決
  • 分散と正規化の計算をシフト演算に置き換え
  • 論文では確率的バイナリ化でのみ使っていて、決定的バイナリ化では普通のBNを使っている
  • シフト演算にすることで、2のべき乗しか表現できないが、精度は落ちるのか?
    • ⇒論文に数値の記載はないが、精度は落ちないぽい

その他

  • 積和演算が並列のビット演算に置き換えられる。p.49の図わかりやすい
  • 論文でも、Clippingしないと精度落ちることは言っている

XNOR-Net

GitHub - allenai/XNOR-Net: ImageNet classification using binary Convolutional Neural Networks

YOLOの人の論文

  • 今までのBNNの論文は10クラス程度の小規模なデータでし か検証していない
  • 今回は、ImageNetの1000クラス認識で検証し、top-5で69.2%まで達成

バイナリ化の緩和 スケーリングがポイント

  • 普通のCNNとバイナリCNNではフィルタ後の値差が大きすぎる
  • バイナリ化を維持したまま、もとの畳込みに近づけたい
    • ⇒ スケーリングで差を埋めよう

スケーリング

  • 僅かな乗算の増加と引き換えに量子化誤差をへらした (p.59)
  • スケーリング係数は最適化問題を解いて求めるぽ
  • 素のConvと結果が変わらないようなαを求める

レイヤの順番をBianryConvに合わせて変えてるぽい

論文での評価の仕方は微妙かも?理想値だったり。

FINN

  • 要求速度から適切な並列度を計算する
  • Batch Nomalization正規化の近似が正答率向上にきいてる
  • 実験シナリオは、maxとfix
    • fixは9000FPS
  • 後続の論文あり
    • FINNはPaddingを実装していなかったので、そこを改良した

その他

発表者の田尻さんは、現在筑波大学の博士課程で衛生リモートセンシングの研究をされてるとのこと。

  • 衛生と地上の通信をせず、衛生内で画像処理をするためにFPGA実装
  • モチベーション
    • 通信の遅延を削減できる
    • 衛星は回収できないので、データさえ送ればHWを書き換えられるFPGAに利点がある

夢があっていいですね!

次回の若手の会は、7/20(たしか)に強化学習のN本ノックやってみたという内容で開催されるようです。

強化学習は、私も興味があるので参加したいです。

ブログ書こう書こうと思っていたのですが、先週はバタバタしていて書けませんでした…
今度はインプットが新しいうちにブログに書きたいです

Deep Learning Lab コミュニティ キックオフ 参加報告

Deep Learning Lab コミュニティ キックオフに参加してきました。

dllab.connpass.com

午前だけ有給取得して参加しました。
午後から仕事の予定だったので、懇親会は早々に切り上げてきました。
しかし、色々あって午後も休暇を頂いたので、気持ちが冷めないうちにブログを書きます。
各セッションの資料は公開されるのかな?

Deep Learning Labとは、

dllab.connpass.com

Deep Learning Lab(ディープラーニング・ラボ)は、ディープラーニングを中心とした先端技術の持つ可能性を、実際のビジネスへ応用するべく、技術とビジネスの両面に精通したプロフェッショナルたちが集まるコミュニティです。Microsoft AzureとChainerを、主要なプラットフォーム/フレームワークとして、ニーズに合わせた最適な技術を選択し開発した事例や、最新技術動向の情報発信を行い、ディープラーニング領域のソリューション検討を具体的に進められるように支援します。

ちなみにロゴは脳をモチーフにしていて、Deep Learning Labの頭文字であるdllが書かれてるそうです。

4つのセッションがありました。印象に残った点をまとめると、

  • DeepLearningのビジネスでの活用事例や技術動向を共有して、AIの実社会利用を推進していくとのこと
  • ChainerやDIMoがすぐ使える環境をAzureに用意するとのこと
    • 現状でも、データサイエンス仮想マシンを使えば、PythonGPU環境はすぐ整う
    • ここに、ChainerやDIMoをプリインストールする
  • 3年で5万人のAI技術者の育成を目指すとのこと
  • その他、私の感想
    • 技術動向については知ってるものが多かった
    • DIMoの中身は知らなかったので、面白かった
    • 特に、ビジネスに活かすための考え方、参考になることが多かった
    • 闇雲にDeepLearningでなく、目的に応じて使うことが大事だとあらためて思った

以下は、それぞれのセッションについて印象に残ってることをメモします。
セッション中にとったメモベースなので、誤解してる内容があればすみません。

★は、聞きながら重要と思ったところ。

Preferred Networks と Microsoft の業務提携が意味するもの

株式会社Preferred Networks
取締役 最高執行責任者 COO
長谷川順一氏
(途中からPFNのリサーチャー斉藤氏による説明)

ChainerとDIMoをMicrosoftのAzureで簡単に使えるようにするとのこと。
→ AIの普及推進のため

3年で5万人のAI人材を育成
→すごいな… そんなにいると単価が下がる??

DIMoは、異常検知アルゴルやGUIなどツール含むパッケージ
様々なPoCで使っているとのこと

DIMoによるPoCの一例としては、

  • 外観検査
    • 現状目視を自動化をしたい
  • 数値予測
    • 明日はどれくらいのエネルギー必要かの予測
  • パラメータ最適化
    • 機械のパラメータの調整
  • 他にも色々あった

DIMoパッケージ紹介

ここから、PFNリサーチャー斉藤氏にバトンタッチ
DIMoで具体的にどんなことができるかの説明。

NTT Comの再照合技術
PFNが技術協力している
カメラで正面から高画質に撮らなくても認識できるように
プレスリリースは以下。
http://www.ntt.com/about-us/press-releases/news/article/2016/20160330.html

外観検査
製品の傷あり、なしのデータで学習
学習データには、傷の場所のラベルは不要とのこと
NNの出力として、傷の有無のスコアと傷の場所が出せるそう

DIMoは、教師データ作成のアノテーションツールやGUIなどフロントエンドUIを提供している

Chainer v2では、学習時のGPUメモリが削減された
保持しなくてもいい配列を減らすことで実現。
また、Cupyを別リポジトリに移動し、DeepLearning以外のユースケースでもCupy単独で使えるように。

ChainerをWindowsで動かせるようにもしている
今もできるが、環境構築手順がめんどい(Visual C++、Cudaなどのインストール)
今後は、ビルド済みバイナリ配布など検討しているとのこと

現状でも、Azureに用意されたData Science VMGPUPython環境が整っている
しかしChainer等はプリインストールされていないとのこと。

Chainerno追加パッケージとして以下がある

  • ChainerMN
    • 理想値に限りなく近いスケールアウトを実現(Azureでも試した)
    • 予算に応じてスケール設定を変えられるようなマネージャーツールの提供も検討
      • Azure Resource Manager
  • ChainerRL
  • ChainerCV

ディープラーニング技術の最新事例と導入の課題

株式会社Ridge-i
代表取締役社長 柳原尚史氏

PFNの研究成果をフレームワーク化したものがDIMo
Ridge-iは、DIMoの導入等、検討から導入までサポート

目先の効率化や、とりあえずのAI導入は駄目
3歩先をみると、今手元に何のデータが足りないかなどわかってくる★

AIやりたい人はたくさんいるが、何を使えばいいかなどわかる人材は不足
AIという言葉は曖昧。機械学習以外も含む…

1つ1つの案件をスクラッチでやるのは非効率なのでフレームワークDIMoを使う

2フェーズでコンサルする

  • コンサルテーションフェーズ
    • 課題はなに?を分析する。
    • 解決策はDeepLearningにこだわらない。
    • DIMoを使う必要ある?他のAIでできる?など判断
    • Big Pictureを描く
  • ソリューション開発フェーズ
    • 導入支援、カスタマイズ

Semantic Segmentationか、Bounding Boxか
→車の位置を求めたいくらいなら、BBoxでじゅうぶん
→車の下に人がいるかを検出したいならSegmentationなど、用途に応じて選択

DL Shimons

  • 音楽生成。5000曲位のクラシックやジャズを学習すると作曲する
  • 作曲家らしさを良く抽出するらしく、
  • 実際のBachの曲とShimonsがBachで学習して生成した曲を人に聞かせると、
  • Shimonsの曲の方がBachらしいと感じるそうだ。

DeepLearningでしか解決できない課題はなんだろうと考える★
ルールベースでは解決できない課題
→自動彩色はまさにそのタスク

ローマの休日の自動彩色の例

  • ImageNetで学習したぽい
  • 課題は、服や車などの色に多様性がある部分はすべてセピア色になることだそう。
    →汎用化されすぎたことが問題。そこそこOverfittingさせたほうが良いことも。

一方、Overfittingさせて成功した例:昔の大相撲の映像のカラー化
https://www.youtube.com/watch?v=E0DLqV81FMg
あえて汎用化でなくOverfittingすることもビジネスによっては大切★
→学習のさせ方で工夫が必要

ここからは、実活用への技術課題について。

自動運転は複数のDeepLearning技術の組み合わせが必要★

  • 現状のモデル化
    • 障害物検知DL、行動予測DLなど
  • 行動のプランニング
    • 強化学習

1台の車だけ上手く動かすのでなく、渋滞しないように複数台を制御するための渋滞予測なども必要
→組み合わせが重要

全体像を描き、どこがクリティカルパス化を見極め、
1の矢、2の矢が失敗してもビジネスとして成り立つよねという考え方が重要★

あとは、どの技術レイヤでやるか
例えば、渋滞予測はクラウド、衝突回避はエッジ

技術の組み合わせの良い例が、NTTのリアルタイム人物監視

DL1つで解決するのではなく、ビジネスのためにどうするか
どうすれば競争優位に立てるか、などちゃんと考える★

DIMoの操作実演とSCSKが提供するプログラム

SCSK株式会社
AIビジネス推進室
課長 島田源邦氏

DIMoの説明とデモ。
ソフト屋の目線では、この発表が面白かったです。

DIMoを使えば複雑なコーディング不要でDeepLearningシステムを組める
→とはいえ、現状は設定ファイルとしてBQLやJSONを書いたり、CUI操作も一部ありそう

DIMoは、大きく3つのモジュールから構成。
各モジュールは独立したDockerのコンテナで動くっぽい説明。
各コンテナのOSはUbuntuだが、今後はWindowsもサポート予定

3つのモジュールの説明

  • Hawk
    • 学習用映像にラベリングして教師データを作成するツール
    • 領域指定やラベルの指定などをGUIで効率的にできる
    • 管理者によるアノテーションの承認などの機能もある
    • データを一元的に管理するための機能なども
  • Scouter
    • 実装済みモデルに対する学習と、それを使った推論を行う
    • SensorBee, Chainerが乗っているコンテナがこれ
    • RAM 32GB以上 GPU必要などの仮想マシンの要件がある
    • コーディング不要
    • ユーザーは、パラメータファイルの設定と、簡単なスクリプトで処理フローを記述
  • Kanohi(かのひー)
    • 認識結果の可視化ツール
    • 位置や属性の統計情報を、フロアマップ上にオーバレイするとか

ここからはデモ。
今回はAWSで動かしてるそう。

  • Hawk
    • データのアップロードすると、動画のフレームを自動で切り出してくれる
    • 検出:DnDでBBoxを指定してアノテーションを付ける
    • 認識:BBoxのクラスを指定
    • 同じ画像を複数人で作業してマージできる
    • ポイントは多数決できること。教師データの品質が上がる
    • アノテーションJsonとして保存される
  • Scouter
    • 車載カメラの映像で認識のデモ
    • 学習の設定ファイルはJSONで、epochなどハイパーパラメータの設定や、データセットのパスを指定
    • 学習はCUIでコマンドを叩いてる様子
    • 処理フローはBQLで指定
      • 入力データ、使用モデル、出力先などを定義する
    • ブラウザで、検出・認識結果がストリーム映像で見れる
      • 動きがカクカクしていたが、回線の都合とのこと
  • Kanohi
    • Scouterで認識した結果が、フロアの地図上にマッピングされたり
    • リアルタイムトラッキングやヒートマップ表示など

SCSKはDIMo研修プログラムを提供

トレーニング展開のご紹介

日本マイクロソフト株式会社
廣野淳平氏

P40/P100のGPUが夏までにはAzureでも使えるようになる★

VMのセットアップの時間で課金されるのが嫌だという開発者の声
→データサイエンス仮想マシンを提供

Azure Batch??

SQL Server 2017のストアドプロシージャでR,Pythonが動く
→Chainerも動く!
お客様のデータはRDB上にあるので、その上でDeepLearningできたら、
便利だし、DBからデータを出さないのでセキュア★

PFN x MS 認定トレーニング

  • AI凄いぞと世間が騒いでる割には、使える人材が不足。
  • AIの実利用を空想で終わらせないために、人材育成が必要

今まではエンジニア向けや初歩のトレーニングが多かった
今、マーケットの課題は、MNISTなどの基礎はできるがその先は…という感じ。

今回のトレーニングは、3種類のオーディエンス向けに作成

  • ビジネス経営企画
  • エンジニア
  • アカデミック

MSにラボ環境があるので、これからはハンズオンをどしどしやっていきたい

講師とコンテンツがボトルネック
機械学習を理解していて、かつ教えるのが上手い人が少ない★

Deep Learning Labのご紹介

日本マイクロソフト株式会社
新井浩之氏

connpassのロゴは、脳をモチーフにしてるらしい。頭文字dll

DLの技術だけでなく、ビジネスの両面に精通したプロが情報発信するコミュニテイにしていく★
生の情報を持つSIerの話や実例が聞けるようにする

また、「こんなプロジェクトやりたい」に対してマッチングできる場にも

今後は定期的に勉強会などやっていく
懇親会も活用してね

その他

懇親会では、参加者の方から面白い話が聞けました。
外に出ると、やっぱりモチベーションアップに繋がりますね。

次回のイベントは7/25にあるとのことで、早速申し込みました。 平日ですが、また有給取って行こうと思います。

dllab.connpass.com

私としては、エッジ側でDeepLearningをどう実装していくかに興味があるので、
そうした内容を今後取り上げてくれると嬉しいかな。

イベントの1時間ほど前に東京駅に着いたので、皇居外苑のベンチで読書してました。 爽やかに晴れていたので、とても気持ちよかったです。 良い息抜きになりました。

BNN-PYNQを理解する(3) ハードウェア概要・実装

BNN-PYNQのハードウェアの概要・実装、ソフトウェアのシーケンスなど更新しました。 (追記5/21 上記の更新したつもりができていませんでした。本日更新しました)

https://tkat0.github.io/study-BNN-PYNQ/

論文とアクセラレータ側の実装を読みつつ、概要から順にまとめているところです。

以下、アクセラレータの実装を読んで、C++のテンプレートの使い方が面白いなと感じたので記事にしました。*1

BNN-PYNQのハードウェア実装について

BNN-PYNQのアクセラレータのコアであるMVTU*2の実装を見るとわかりますが、C++のテンプレートで定数を記述してます。

BNN-PYNQ/matrixvector.h at master · Xilinx/BNN-PYNQ · GitHub

最初実装を見たとき、普通の引数で変数を渡せばいいじゃん、と思っていたのですが、これは高位合成したHWの性能を出すために必要なんですね。

高位合成で性能を出すためには、挙動がコンパイル時に静的に決まるような書き方をすることがポイント

C++のテンプレートを使えば、関数呼び出し毎に定数を変えられる(定数の異なる関数を生成できる)

C++のテンプレートを上手く使うと、ハードウェア化したときに性能がでるC++コードを簡単に記述できて便利だと思いました。

高位合成の実装をするときは、こんな感じで使い分ければよいかな?

  • コンパイル時に決定できる定数(ノード数など)
    • 関数呼び出し毎に変えたいパラメータ
      • →テンプレート定数
    • 関数呼び出し毎に同じパラメータ
      • →定数(const)
  • コンパイル時に決定できない変数(バッチサイズなど)
    • →引数で変数を渡す

ただし、Vivado 2017.1では可変長のループでも最適化されるようになったとの噂。 もしかして、今後は上記のような実装を意識しなくても効率的な実装ができるのかな?

FPGAの部屋 Vivado 2017.1 の新機能1(概要)

*1:私はC++新人研修以来書いたことがないので、ごくごく当たり前の話かも

*2:行列とベクトルの積和演算器

BNN-PYNQを理解する(2) ソフトウェア全体像

今回は、BNN-PYNQのソフトウェアの構成をざっくり図にしてみました。

f:id:tkat0:20170504161200p:plain

詳細は、以下にて。

https://tkat0.github.io/study-BNN-PYNQ/

BNN-PYNQについては、今後は上記でまとめていきたいと思います。

理由としては、

  • ブログより単一のサイトとしてまとまっていた方が後から読みやすい
  • 文書の構成管理をしたい
  • オフラインでも作業できる (結構 移動時間が多いのです…)

などなど

とりあえず、手軽に初められるSphinxで書いてGitHub Pagesで公開してみました。

BNN-PYNQを理解する(1) FAQ

3月以降、仕事が激しくなり、余暇もほとんど仕事に関わる分野の勉強に当てていました。 以下の5/20のイベント出席に向けて、DeepLearning x FPGAの勉強を再開しました。

「PYNQ祭り」延長戦 : FPGAディープラーニング実践懇親会 - connpass

まずは、手近な勉強材料としてBNN-PYNQのソースを解析してみました。 勉強した内容は、ブログに何回かに分けて書きたいと思います。

尚、BNN-PYNQのソースコードは5/2時点で最新のものを使いました。

GitHub - Xilinx/BNN-PYNQ at a86e0863418ce4161ed61b69ba89ec1481014362

初回は、自分も含めて多くの人が気になりそうな話題について、ざっくりFAQ形式で書きたいと思います。

BNN-PYNQってなに?

ホビーFPGAボード"PYNQ(ピンク)“で動作するNeuralNetworkのシステム。 行列演算などをハードウェア化することで、DeepLearningアルゴリズムを、CPUより高速化(アクセラレーション)する試みが、至る所で行われています。これもその一種。

推論に関しては、Pythonのアプリケーション層、Cのドライバ、高位合成用の実装まで、全コード公開されているためDeepLearningのアルゴリズムFPGAで動かすことを学ぶには良い素材です。

アプリケーションは、例えば以下。

BNN-PYNQ/Cifar10.ipynb at master · Xilinx/BNN-PYNQ · GitHub

BNN-PYNQは同じNeuralNetworkをCPUとFPGAそれぞれで動かせるようになっていて、「CPUよりFPGA化したほうがこんなに速いよ」という内容が上記でも確認できます。

BNN-PYNQは、以下のような工夫をして高速化しています。 詳細は論文*1に記載があります。

  • 演算精度のバイナリ化(0,1)
    • メモリの使用量、転送量を削減
    • ビット演算器を活用した高速化
  • 演算の並列化

学習も推論もFPGAでやるの?

No。学習はPCで行い推論をFPGAで実行する仕組み。

PCのDeepLeraningフレームワークで学習したモデルを、BNN-PYNQ用のデータフォーマットに変換するスクリプトは付属しています。 現時点でTheanoで学習したパラメータの変換に対応しているようです。 サンプルは、Lasagne(Theanoをバックエンドにできる)で記述されています。

データフォーマットの変換だけなので、ちょいとスクリプトを書けば、TensorFlowやChainerなどとも連携できるはずです。(今度のイベント向けにやってみようかな)

認識精度は?

付属の学習済みモデルに関する認識率は、ここに記載があります。

BNN-PYNQ/bnn/src/training at master · Xilinx/BNN-PYNQ · GitHub

バイナリ化しない場合に比べて、GPUでの学習時間がすこし長い印象がありますが、どうなんでしょうか?

PCで動く任意のモデルをFPGA化できるの?

No。現状はLFCとCNVと呼ばれる2種類のモデルに対応してます。 例えばLSTMなど含むモデルは動かせません。

ただし、BNN-PYNQが対応しているレイヤーで構成されるモデルであれば、FPGAのリソースに乗る範囲でレイヤーを組み替えて任意のモデルは作れると思います。

BNN-PYNQでは、バイナリ化したConvolutionやFullyConnectedレイヤーのハードウェアを使います。 そのため、PC側もそれに合わせてバイナリ化したレイヤーを定義して学習しないと、学習した重みをFPGAに乗せられません。 通常のPC側のフレームワークだとfloat(32bit)で計算する部品がほとんどです。 そのため、BNN-PYNQでは、PCのフレームワーク用にもバイナリ化したレイヤーを定義して、それを用いてモデルを作り、学習しています*2

もし、ConvolutionやFullyConnected以外を使いたい場合は、ハード側にそのレイヤーを実装するか、そのレイヤーをソフト処理するかだと思います。 しかし、ソフト処理は現実的ではないと思います。BNN-PYNQは推論開始後、最期のレイヤが計算完了するまで制御がCPUに戻らない仕組みです。そのため、途中の一部のレイヤだけソフト処理にするのはBNN-PYNQのコアの修正が必要で、できたとしても速度が遅くなると思います。 そのため、追加したいレイヤーのCPUよりも高効率なハードウェアアルゴリズムを考えて、それを高位合成なりでハード化するのが面白いんじゃないでしょうか??

任意のデータで既存のモデル(LFCとCNV)を再学習できるの?

Yes

CNV, LFCは それぞれ学習データのフォーマットが決まっているので、それに従い作成したデータなら学習可能です。

任意のタスクにBNN-PYNQを応用する場合は、まずは既存のネットワーク(LFC,CNV)を使うところから考えるのが良さそうですね。

CPUとアクセラレータ間のデータ転送のタイミングは?

データのコピーが性能上のボトルネックになるので、どのタイミングでコピーしているかは重要です。 ソースを見ると、以下のタイミングでコピーが発生しているようです。

  1. モデル初期化時に、全レイヤーのパラメータをCPUからアクセラレータへコピー
  2. 推論開始時に、入力画像データを、CPUからアクセラレータへコピー
  3. 推論終了時に、推論結果をアクセラレータからCPUへコピー

推論中は、アクセラレータとメモリ内で閉じて演算しているようです。

最期に

今回は書けなかったのですが、ソフト側のソースはざっくり読みました。

以下のような流れでPythonからアクセラレータを叩いています。 モデル依存のC実装は薄くて、コアライブラリ(共通部)が厚いかんじ。

  1. Pythonのラッパーから、CFFIを使ってモデルのCライブラリを叩く
  2. モデルのCライブラリは、コアライブラリを叩いて、パラメータの設定や推論の実行を命令する
  3. コアライブラリは、アクセラレータのドライバを叩いて、アクセラレータ用のバッファ管理やレジスタ制御を行う

アプリからハードまで、ほんとに勉強になりますね…

次回はソフト側の記事を書きたいと思います。

*1:https://arxiv.org/abs/1612.07119

*2:元祖 Binarized Neural Networksの論文の実装をベースにしてるぽいですね

BNN-PYNQをリビルドする

本日3/7、XilinxがPYNQで動くBinarized Neural Network (BNN)の実装を公開しました。 DeepLearnigのアルゴリズムFPGAにオフロードしたい人にとっては、とても良い勉強材料になると思います。

リポジトリ公開当初は、Pythonで共有ライブラリをキックする部分とビルド済みの共有ライブラリしか公開されておらず、ドライバとアクセラレータのソースは非公開でした。

github.com

中身を詳しく追う前に、とりあえずビルドしてみました。

ビルド環境

  • Ubuntu14.04
  • SDSoC 2016.1

ビルド用のスクリプトが付属しているので、それを実行するだけでできました。 SDSoCそのものは使いません。付属のVivadoとVivado HLSを使います。 最初Windowsで試してみましたが、うまくいかず…*1

ビルド手順(ハードウェア)

以下に記載があります

BNN-PYNQ/README.md at master · Xilinx/BNN-PYNQ · GitHub

ハードウェアのビルドは「Hardware design rebuilt」に記載がある通り。

環境変数XILINX_BNN_ROOTは/BNN_PYNQ/bnn/src/network/では動かなかった。/BNN_PYNQ/bnn/src/が正しそう。*2

BNNのアーキテクチャはCNVとLFCがあります。 今回LFCを試したところ、実行開始から10分程度でbitstream生成まで終わりました。

./make-hw.sh lfc-pynq pynq a

f:id:tkat0:20170307231518j:plain

f:id:tkat0:20170307231514j:plain

ビルド手順(ソフトウェア)

Pythonとハードウェアの間にあるCのドライバのビルド方法。こちらは、PYNQ上でビルドする必要があるようです。上記READMEの「Quick Start」に記載ありますね。

その他

自前で書いていたBNNはビルドに少なくとも20分はかかる上、性能もソフトより遅かったので、BNN-PYNQのコードが公開されたことは勉強する上で非常に嬉しい。ソースを見ていると、hls_streamがデータフローの基本になっているよう。

*1:今回Git Bashをつかってスクリプトを叩いた。ちゃんと環境構築すればWindowsでもできるかも?

*2:追記(03/10):公式に修正されたようですね