ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

NN論文を肴に酒を飲む会 #10 新年会!

新しい Google オフィスで行われたTFUGイベントに参加してきました。

tfug-tokyo.connpass.com

今回はエッジということで期待いっぱいで参加しました。全体の感想としてはいろんなエッジがあるなと、人の数だけエッジがあるそんな勉強会でした。

ShuntaroOhnoさん 「A Little Is Enough: Circumventing Defenses For Distributed Learning」

分散学習を行うときに、学習結果をおかしくしようとする悪い奴がいたときの話。単純に変な勾配を返すだけでも平均を取ってしまうと十分学習の邪魔になるから始まり、じゃどうやって検知するのか、検知されないようにするにはどうするかという掛け合いがおもしろかったです。学習の結果を特定の方向に誘導することもできます。単純に学習の収束を遅くするだけでも、十分脅威とのこと。 元々はビットコイン関係からのネタだそうですが、今後空いているPCで分散学習みたいな事が実現されると一気に脅威が増しそうです。未来の犯罪の可能性を感じました。

発表資料はこちら。

www.slideshare.net

ShuntaroOhnoさんは、後の発表で隅っこのデータについて質問していて、データの偏りが見逃せない人なんだろうなって思いました。

Chibadaiさん 「クラウドとエッジと動画」

TFUG(TensorFlow Users Group)なのにAWSの話題?でざわつきましたが、IoTっぽいネタでした。AWSのIoT、AIっぽいサービスは情報が無く、非常に苦労したとのこと。最初のユーザーはそういうものですよね。僕自身がGDGとかGoogle系のイベントにしかいかないので、AWSの話はとても新鮮でした。

「だいたいすべてがボトルネック」が良かったです。

MasaoTaketani さん 「MIXED PRECISION TRAINING」

かなり真面目に浮動小数点のフォーマットの説明がありました。精度の低いフォーマットで学習する時に、小さい値がアンダーフローしてしまいます。そのために、勾配計算の元になる誤差の計算からスケール(定数倍)させて勾配を計算し、重みの更新時に元に戻す処理をして精度を保っているらしい。こういう面倒くさい事をしても、メモリ使用量が減って学習も早くなるらしいです。

計算精度を落とすことで、推論の精度が上がる所は突っ込みがありました。単純な識別ならよくあるんですが、物体検出まで推論の精度が上がっていてそっちは不思議でした。正則化の効果があるらしいのですが、それにも突っ込みが入ってました。

Yuji Tokudaさん 「量子化どこまでできる?」

量子化をするフレームワークの現状についてというテーマでした。Post-TrainingとAware Trainingの違いを初めて知りました。Aware Trainingがそんなに大したことをしていない事に驚きました。先の発表のように、勾配の計算からもっと面倒なことをやっているのかなと勝手に思ってました。量子化時に画像を流して量子化のパラメータを決めるのは他のDSP向けのコンバータでもやってますね。TFLiteを使うときにAware Trainingを設定しないとエラーになるのは単に出力フォーマットだけの問題の気がしてきた。ちゃんと勉強しないと。

発表資料はこちら

speakerdeck.com

最後に

今回もとても面白いイベントありがとうございました。全体を通して気になったのは、2016年ころってエッジで使うCNNってVGG16ベース一色で、その後MobileNetへ移行の雰囲気があったのですが、最近はResNetが良く使われている気がします。Yuji Tokudaさんが少し言及してましたが、MobileNetと他の最適化手法の組み合わせが上手く行かないかも。これは時間取って試してみたいところです。

TFUG KANSAI TF2.0ハンズオン 開催されました

1月18日(土)、Chatwork株式会社様オフィスにてTFUG イベントを開催しました。

tfug-kansai.connpass.com

僕は家族にインフルエンザが出たので当日は参加できず、GDG Kyotoの皆さんにお願いする形になってしまいました。残念。

講師は有山圭二さん、チューターにGDGのMasahiko Adachiさんをお呼びしました。参加できていないので資料からの感想ですが、TensorFlowの説明だけで無く、MNISTの説明、ニューラルネットワークの基礎、one-hotやsoftmaxといった数学の話など、かなり基本的な所から丁寧に説明があります。特に3次元にプロットされた勾配は、数カ所局所解のようなものもあり、すごく分かりやすいです。後半はNNのレイヤーや活性化関数を追加していき、学習率の説明など押さえるところが押さえられています。最後にCIFAR-10を使ったCNNまで。

難易度は高いですが、下手な有料セミナーよりも実践的ですごい内容です。最後までいけなかった人もいたと聞きましたが、そこはチューターに行けずすいませんという気持ちです。

参加された方のtogetterまとめです。

togetter.com

一人でやると何かあるとTFUG勢全滅という事が身にしみて分かったので、今年はオーガナイザーを増やしたいところです。今回のイベントは下記の皆様の力で実現できました。

  • 会場提供 Chatwork株式会社様
  • 講師 有山圭二さん
  • チューター GDE Masahiko Adachiさん
  • 運営協力  Google Developer Group 京都の皆さん

ありがとうございました。

FPGAX(FPGAエクストリーム・コンピューティング)#12

fpgax.connpass.com

東工大で開催されたFPGAX勉強会へ行ってきました。

会場は大きく、人も多く大盛況でした。イベント開催に向けて動いていただいた皆様、ありがとうございました。久しぶりに会う方も多く、近況を聞いたり挨拶したりができなかったのが残念。

「ElixirでFPGAを設計する」高瀬 英希さん(京都大学/JSTさきがけ)

ElixirはErlangとRubyの子供。Erlangの書きにくいところを書きやすくしてくれる。今の完成度だと数値のListのみが扱えるので、綺麗な書き方で数値計算ができるとうれしい感じ。Listがどこまでできるか微妙なのですが、グラフをListで表せばグラフ処理ができるとうれしい。

当日はZenは受けない雰囲気。FF4のコカトリスは隠れキャラだし単体にしか効果が無いのでは。そこが会場のリアクションが薄かった理由だと思った。

春から使ってみたい。

「シミュレーテッド分岐アルゴリズムのアクセラレータとその応用」辰村 光介さん(東芝 研究開発センター)

東芝さんのスパコン的な取り組みの紹介。背景からFPGAの実装まで。 歴史的なIsing Problemの説明と量子コンピューターの説明が面白かったです。

SB(Simulated Bifurcation)は、SAベースでは無く全結合の問題が解ける。グラフで目的変数の最小化が見えるのが面白い。Adiabaticサーチ -> Ergodic サーチ。

円→ドル、ドル→円の交換を行うと必ず損をする。そこに、他の国の通貨を混ぜて複雑な交換をすると、利益が出る瞬間がある。そこをリアルタイムで見つける話がすごかったです。これで開発費が回収できていたらもっと面白かった。

離散最適化の並列化に興味を持っていたので面白く聞けました。春から勉強したい

「柔軟な資源割当てを可能とするFPGAクラスタシステムとそのネットワーク」佐野 健太郎さん(理化学研究所 計算科学研究センター)

前半が理研とスパコンのお話でFPGAクラスターのアーキテクチャのお話。 プロセッサとFPGA間にバスを接続し、loosely couloed clustersを構築するお話。結局CPU→FPGAにボトルネックが増えそうなので、計算のアルゴリズムによってどれが最適なのかは分からない気がしました。

全然規模が違うのですが、1枚の基板にFPGAを17個並べる(4x4の真ん中にもう一つ)ボードを設計したのを思い出しました。懐かしい。

神戸の理研にあそびに行きたい

LT

時間の関係で途中までしか見れませんでした。

ROS+FPGAを使ったロボット開発(京大、新田さん)

関西でもFPGAXやりたい。

FPGAとGPUの性能比較ベンチマークをやってみた時にそこそこ苦労した話(安藤潤、ザイリンクスジャパン)

こういう情報が簡単にWebで見つかるようになって欲しい。やっぱりZenは受けない。

FPGAを使ったAIエッジコンテストのお知らせ+α(nkhrさん)

nkhrさんの正体はnakahara先生だった。ΩΩΩ<な、なんだってー

Google Colaboratoryで始めるFPGA開発入門(aster_ismさん)

トイレ開発は衛生面注意しましょう

この後、NNgenの公開イベントがあったもよう。春から頑張りたい。

数理最適化: Optimization Night #1

15日に行われた数理最適化の勉強会に行ってきました。 会場はブレインパッド様の部屋をお借りしました。いつもありがとうございます。

動画はこちらから見ることができます。素晴らしい。

www.youtube.com

技術書典を支える最適化技術

sfujiwaraさんの発表です。

発表資料はこちらで見れます。

speakerdeck.com

技術書典というイベントでのブースの配置を最適化する話です。最適化の余地を残すところと、ハイパーパラメータの調整はやりたくないのバランスを取るところが面白そうでした。

ブースの分類にRubyと機械学習の両方タグがあった場合、Rubyの島に入れるのか、機械学習の島にいれるのか自動で判別するのが難しい問題。会場から上がったRubyの方が愛を感じるからRubyでしょに対して、sfujiwaraさんがそれが人間の判断じゃんと返したところが面白かったです。愛をどう特徴量に落とすのかがキモですね。一つは、タグの希少度だと思います。Rubyと自作キーボードだと、どっちに愛があるのか難しいですね。

技術書典はまだ行ったことがないので次は行ってみたいですね。

「カルチョビット」で選手のトレーニングメニューを最適化してみた。

mas_yamamotoさんの発表です。

発表資料はこちらです。

www.slideshare.net

ゲームのトレーニングを最適化しようというお題でした。いくつもの組み合わせを見ると最適化したくなってしまうのは職業病ではと若干心配になりました。

面白かったのは、手持ちのカードだけで最適化してしまうと上手く行かないところがある所です。次に引くカードの予測が入っていないため、目先の最適化だけで進めると後で要らないカードが残ってしまう。一方で未来のカードは何が来るのか分からないので最適化に使えない。これは、次に来るカードの確率も入れて最適化するしか無いなと思いました。

Google OR Tools で数理最適化に入門する

杉山さんの発表です。

発表資料はこちらです。

speakerdeck.com

ツールを選ぶ選択肢としてpipでインストールできるとうれしい、本日二回目の話題でした。pipうれしいですね。MiniZincという制約ソルバーは少し触った事があったので、デモ自体はふーんという感じで聞いてました。どの最適化ツールもそれなりに面倒ですね。数理最適化が仕事の人ならともかく、たまにツールとして使いたいってときに、もっと簡単なのがあっても良いと思います。

制約条件を英語で書いたら勝手に制約条件にしてくれる技術(多分Deep Learningでできるよ)に期待します。

その他

最適化問題の良い本を教えてもらいました。

ナース・スケジューリング (シリーズ:最適化モデリング)

https://www.amazon.co.jp/dp/4764905582www.amazon.co.jp

そういえば、Veritakの開発者がこういう最適化をやっていると聞きました。

https://nurse-scheduling-software.com/profile2.pdf

僕のお勧めは、離散最適化で良ければCorseraのこのコースです。

www.coursera.org

すごく面白かったので、次回か次々回には発表したいですね。 発表ネタはあるのですが、日本ディープラーニング協会のE資格の勉強が結構大変・・・

ONNXの最適化まとめ

ONNXの最適化を一通り試してみたのでまとめ。

サポートしている最適化一覧の取得

サポートしている最適化は、get_available_passesで取得できます。

from onnx import optimizer
all_passes = optimizer.get_available_passes()

大きく分けると、このように分類できます。

  • 意味のないOpの削除 (eliminate_deadend等)
  • 2つのOpのfusion (fuse_matmul_add_bias_into_gemm等)
  • Convへのfusion (fuse_add_bias_into_conv等)
  • その他

convへのfuseは全く動かず、バージョンアップ待ちです。

最適化の結果

Qiitaにそれぞれまとめました。

nop

nopは最適化のパスとして指定できますが、何も最適化しません。他の最適化のテンプレートです。

lift_lexical_references

これは上手く試すことができませんでした。Loopや条件分岐で階層的になってしまっているグラフをフラットにするようですが、動かすことができませんでした。バージョンアップ時に試してみたいです。

split最適化

これが唯一面白かった最適化です。

グラフの中で毎回計算しないといけない所と、一度だけ計算すればよい所を別のグラフに分離します。

このグラフで考えます。

f:id:natsutan:20191002095626p:plain

左上のAddが定数のみの足し算です。グラフの計算を実行する時に毎回計算する必要が無い部分です。真ん中のAddは、入力Xによって結果が変わるので毎回計算必要です。これを、split最適化を行ってグラフを分離すると以下の2つになります。

f:id:natsutan:20191002095652p:plainf:id:natsutan:20191002095704p:plain

左が一度だけ計算すればよいグラフ、右が(その結果も使って)推論時に毎回計算するグラフになります。

コンパイラでよくある定数の畳込み(定数伝播)を実現するための最適化です。ONNXの場合実行時の計算精度がわからないのでホスト(最適化の実行環境)で畳込んでしまうのではなく、畳み込みの計算をonnx runtime側に計算させる意図があるのかなと思いました。

最後に

ONNXの勉強も兼ねて順番にやってみましたが途中で飽きてしまいました。最後のsplit最適化が面白くてよかったです。

グラフの最適化はどのフレームワークでもやるので、個別のフレーワークでそれぞれ書かずにONNXでやるのは合理的なきがしましたが、この程度ならそれぞれ書いてもよいですね。操作のためのAPIは、もう一個上のレイヤー欲しい。

Qiitaは書けば書くほど、誰もいいねしていない記事ですら検索の上にくるので、微妙な気持ちになりました。検索ページの3ページ目くらいで出てくれれば良いんですが、そういうのは難しいのかな。今回、Qiitaとはてなに同じような記事を書いたのも、SEO力の比較をしたかったというのがあります。どうなることやら。

TFUG KANSAI Meetup 2019

土曜日に久しぶりのTFUG KANSAIのイベントを行いました。

https://tfug-kansai.connpass.com/event/146442/

会場は、株式会社SANSAN様の透明感あふれるオフィスをお借りしました。ありがとうございます。 参加者はほぼ予定通りで、会場の椅子がぴったり埋まりました。TFUG KANSAIの傾向として年配の方の参加が多く、質問はそれなりに突っ込んだもの、ハッシュタグがほとんど使われません。これはTFUG KANSAI開始時からずっと同じ傾向です。今回も質問は活発に行われ、最後ちょっと時間足りない感(もっと質問や議論がやりたそうな雰囲気)で終わるのも、これはこれでよいと思っています。ちょっと物足りなかった人は、ブログで気になったことを書いてもらったり、別の勉強会や次のTFUGで話題にしてもらったらと思います。

今回もすごくおもしろかったので、また次回企画しています。

機械学習の解釈について

一年前からずっと勉強していたことをまとめて発表できました。 https://www.slideshare.net/minorunatsutani/interpretable-ml

資料の最後にあるお勧めテキストです。興味ある方はぜひ読んでみて下さい。

・Interpretable Machine Learning https://christophm.github.io/interpretable-ml-book/

・機械学習モデルの判断根拠の説明 https://www.slideshare.net/SatoshiHara3/ss-126157179?fbclid=IwAR1H4Ert-_XpcoL-Vy3W_MvtSI7DjFmS3M0ldHgm1k3Y-1Ob-uiXWsSE8Q4

・AIプログラマになれる本 https://www.amazon.co.jp/dp/4296102052

TensorFlow 2.0rc overview 新村さん

@tf.functionにまつわる奇怪な挙動についての説明がわかりやすかったです。 TenserFlowの中でユーザーからは見えない状態を持ってしまっていて、同じ関数でも呼び出すタイミングで挙動が変わります。保存やExport周りでいっぱいトラブルありそうな感じがひしひしと感じます。グラフ(ニューラルネットワーク)を記述しているつもりが書いた順番に実行されちゃうのも、そこからくるトラブルもありそうです。

とりあえず素人はKeras使っておけばよさそう。

コンパイラ好きとしては、とても興味深いお話でした。

TensorFlow 2.0へ移行した話 有山さん

タイトルは間違いで移行しようとしたお話でした。こちらも2.0では苦労がいっぱいのようです。Googleさんは、量子化とかエッジ向けの機能も2.0対応をしっかりサポートしてほしいです。

スマホUIがおしゃれで、あの技術がうち(弊社)にも欲しいなと感じました。

発表内容の本筋とは外れますが、Tensorflowのよくわからん挙動について気楽に回答もらえる場は欲しいと思います。ただ、TFLite周りだとissueに何か見つければラッキーという状況はあんまり変わらない気がしますね。僕もONNXでそんな感じの時があります。

素人はまだ1.x系を使った方がよさそうでした。

M5StickVではじめる軽量モデルの実世界への応用 ミクミンP/Kazuhiro Sasao(@ksasao)さん

発表資料です。 https://www.slideshare.net/ksasao/20190928-m5stickv-tfug

M5StickVは初めて見ましたが小さいのにRISC-Vも入って機能がいっぱいでした。どうせお前らカメラ付いていたら物体検出するでしょ、ってのはまさにその通りで、いろいろ遊びでやる事にはAPIがそろっていて驚きました。

MoblieNetを特徴量抽出機として使い、別のアルゴリズムにつなげる話が面白かったです。こういう選択肢が増えると、低コストなハードの可能性が広がります。もっと精進せねばと思いました。

QRコードをかざしてM5StickVを制御するのが、僕的には謎技術で一度試してみたいところ。

最後に

オーガナイザー募集しています。 もし興味ある方がいらっしゃればご連絡ください。

AutoML Vison 物体検出 edge版のニューラルネットワークを見てみた

はじめに

natsutan.hatenablog.com

あれから時間も経ちだいぶ傷も癒えたので、また思い切って自腹でAutoML回してみました。会社のお金で回せる環境にあるのですが、実際にエッジAIやってるメンバーが忙しくて興味本位でお願いできず。ただ、そんなに費用かからなかったと報告を聞いています。ちなみに会社のお金でAutoMLで1回学習するために決裁書上げてもらいました。(パワポで資料を作って役員にお願いしたりしましたが、それはまた別のお話)

速度優先でやった所無料枠に収まり、精度優先にすると数時間かけても終わらなかったので途中でキャンセルしました。月が変わってボーナスが見えたら精度優先でもやってみたいです。

前回からの変更点

まず、物体検出もEdge向けにtfliteを出せるようになりました。デプロイ(有料)に関しても、勢いでチェック入れるようなUIではなくなりました。

f:id:natsutan:20190923123358p:plain
automl_train

UIの大きな変更点としては、注意点も含めて日本語になりました。分かりやすくなりましたね。

計算に使うコンピューティング時間に制限をつけられるようになりました。これで安心です。 早めにトレーニングが終わった時はそれ以上追加トレーニングができなかったです。これは前回がどうだったのかは良く覚えていません。

データセット

VOC2012を使いました。会社でAutoML回したメンバーより、データ数を少なくすると早く終わって費用が安くなると聞いていたので少しデータを減らしました。

f:id:natsutan:20190923123652p:plain
dataset

クラスは3つで、bottleが1266枚、personが2503枚、tvmonitorが1129枚の、合計4592枚です。personだけオリジナルのデータから数を減らしました。

学習結果

速度優先で学習すると、5時間程度で学習が終わりました。

f:id:natsutan:20190923123725p:plain
automl

結果はmAPが0.328と非常に残念な結果になりました。0.5を超えていればなんとかやりくりできそうですが、0.3程度だと実用上厳しそうです。早期終了した場合は追加学習ができないようで、これ以上速度優先で精度を上げるためにはデータを変える必要がありそうです。

f:id:natsutan:20190923123807p:plain

クラス別ですとtvmonitorはそこそこいってますが、personもbottleも全然駄目でした。

f:id:natsutan:20190923123825p:plain

ちなみに前回やったエッジ向けじゃ無い方の学習結果(低レイテンシー)では、personももっと良い値でした。

画像が足りないのか、エッジ向けで精度が落ちてしまうのか気になるところです。 次はpersonだけでも全データ使ってやってみたいですね。精度優先もやりたいですが、誰かスポンサーになって欲しいです。

個人的にはVOCのpersonは、personっていうより顔じゃね?とか一枚全部人みたいなデータもあるので、もうちょっと人を見つけに行くデータセットだと上手く行くかも知れません。AutoMLで物体検出するときのデータセットはこういうのが良いよとかノウハウが出てくると使いやすくなりますね。例えば、小さい物から大きい物までまんべんなく、物体の場所は問わない、とかそういうのありそうです。

学習後のモデル

前回と同じやり方で、学習後のモデルを可視化しました。

natsutan.hatenablog.com

予想以上に複雑なニューラルネットワークが出力されました。

https://raw.githubusercontent.com/natsutan/cocytus/master/doc/edge_od.png

入力が192x192という非常に小さいサイズになっていたので、このサイズ前提のデータセットにするともう少し精度上がるのでは無いでしょうか。あと、8bit量子化しないで、32bitの浮動小数点のままのtiny-yoloの方が速そうな感じはします。時間があれば比べてみたいですね。