tkato’s blog

ブログ名は暫定。

NNablaでDQN書いてる(途中)

Sonyが公開したDLフレームワーク「NNabla」で何か書いてみようかと思い、Mnih et al., 2015のDQN(Deep Q-Network)を実装してみた。

ソースは以下。 ただし、現在学習中で結果を見れていないため、ソースにはバグがあるかも。

github.com

NNablaは初めて使うフレームワークのため、精度がでない原因がNNablaの使い方が間違いか、ハイパーパラメータの調整が足りないのか切り分けられないと困ると思った。 そこで、まずは他のフレームワークの実装をみて、ハイパーパラメータ等を参考にすることにした。 今回は以下を参考にしたが、非常にわかりやすい解説&コードでした。

DQNをKerasとTensorFlowとOpenAI Gymで実装する

この記事では、現状書いたところまでで気がついたことなどを書く。

今後は、まず普通のDQNで動くことを確認後、BinaryなDQNで実験してみたい。

実装

特にNNablaで実装する上でしていて気になったことなどを記載する

Target Networkのパラメータの更新

# update target network
if step % Config.TARGET_NET_UPDATE_INTERVAL == 0:
    # copy parameter from dqn to target
    with nn.parameter_scope("dqn"):
        src = nn.get_parameters()
    with nn.parameter_scope("target"):
        dst = nn.get_parameters()
    for (s_key, s_val), (d_key, d_val) in zip(src.items(), dst.items()):
        # Variable#d method is reference
        d_val.d = s_val.d.copy()
  • NNablaでは、NNのパラメータはすべてグローバルに管理。区別するために名前空間を使う仕組み。
  • with nn.parameter_scope('<name>')で、このコンテキストではnameの階層に属するパラメータだけ扱えるようになる
  • Variable#dで、Variableがもつnumpyのndarrayに直接アクセスできる

順伝播処理

# inference
image.d = state
q.forward()
action = np.argmax(q.d)

プレースホルダーであるVariableへの値のセットと、ネットワークの順伝播実行が命令として別れているのが、少し慣れなかった。 (たしか、プレースホルダーに値をセットせずにforwardした場合、ときたまSEGVしたような…)

その他

  • Replay Memoryのサイズを大きくしすぎるとメモリ確保できずに強制修了するので注意
    • システムモニターをみてすぐに気がつけてよかった
  • 学習環境はDockerのコンテナで作ってる。そのため、gymのGUIが表示できなかった (できる?)
    • GUIで動いてるの見たいので、GUI環境でgymを動かして、コンテナと通信するのGUIとラッパーを書いてる
  • ドキュメントで、Functionの一覧が把握しづらいなと感じた

まだ慣れていないことと、学習状況の可視化やデバッグがTensorFlowとかに比べてまだプアなので、積極的にこのライブラリを使うモチベーションがなければ、TensorFlowとかのほうが使うのが良いかも?

私の場合は、面白半分、BNNを動かしたい、組み込み用途への期待、でこのライブラリを今後もWatchしていきたいと思ってる。

環境構築

環境構築していて気になったことを記載する

NVIDIA-Docker

今回、初めてNVIDIA-Dockerを使ったところ非常に便利だった。

GPU環境構築の問題として、DLフレームワークによって対応するCUDA ToolkitやcuDNNのバージョンがまちまちなので環境が共存できなかったりする。

NVIDIA-Dockerを使えば、ホストにはGPUドライバだけインストールし、CUDAとcuDNNは各コンテナにインストールできるので、コンテナ毎に異なるバージョンが使える。

NVIDIA-Dockerのベースイメージは、様々なCUDAとcuDNNのバージョンの組み合わせがあり、以下で確認できる。

今回、NNabla用には、 nvidia/cuda:8.0-cudnn6-runtime-ubuntu16.04を利用した*1

https://hub.docker.com/r/nvidia/cuda/

Hydrogen

JupyterなどとAtomをつないで、Atomをリッチな開発環境にできる。

変数のWatchなどもできてよかったので、今後も使ってこう。

*1:元々CUDA8とcuDNN5がインストールしてある環境にNNablaとCUDA拡張を入れたところ、たぶんcuDNN6の共有ライブラリがないみたいな実行時エラーが出た

MacでNNabla使うためにDockerの設定した

macでNNablaを使った開発したいが、公式にはMacは現在対応中の様子。
ここ数年はmacで手軽にLinux環境導入する手段としてDockerが流行ってるらしく、またNNabla公式もDockerfileを公開している。 そのため、今回はDockerを使ってNNablaの環境構築してみる。

以下で公開されている公式のDockerfile(develop-ubuntu16.04)に加筆して、Jupyter Notebookが使えるようにした。

https://github.com/sony/nnabla/tree/master/docker

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y --no-install-recommends \
    ccache \
    clang-format-3.8 \
    cmake \
    curl \
    g++ \
    make \
    python-dev \
    python-pip \
    python-setuptools \
    unzip

RUN curl -L https://github.com/google/protobuf/releases/download/v3.1.0/protoc-3.1.0-linux-x86_64.zip -o /tmp/protoc-3.1.0-linux-x86_64.zip \
    && cd /usr/local \
    && unzip /tmp/protoc-3.1.0-linux-x86_64.zip \
    && chmod 755 /usr/local/bin/protoc \
    && rm -f /tmp/protoc-3.1.0-linux-x86_64.zip readme.txt

ADD python/setup_requirements.txt /tmp/deps/
RUN pip install -U -r /tmp/deps/setup_requirements.txt
ADD python/requirements.txt /tmp/deps/
RUN pip install -U -r /tmp/deps/requirements.txt
ADD python/test_requirements.txt /tmp/deps/
RUN pip install -U -r /tmp/deps/test_requirements.txt

# tkato ADD
RUN pip install -U jupyter
RUN pip install -U nnabla

VOLUME /notebooks
WORKDIR /notebooks

EXPOSE 8888

CMD ["jupyter", "notebook", "--no-browser", "--allow-root", "--ip=*", "--NotebookApp.password='sha1:XXXX'"]

jupyterの公式のDockerfileなどを読むと、設定は別ファイルに書いたりしてるようだが、面倒だったので上記のように書いた。

Jupyterのpasswordは、暗号化してDockerfileに記述する。 平文からSHA-1に変換する方法は、以下の投稿の(2-B)を参考にさせていただいた。

qiita.com

上記のDockerfileは、NNablaのに直接加筆した dockerのビルドスクリプトも提供されたのでそれを使って以下のようにビルドした

./docker-build develop-ubuntu16.04

また、コンテナの起動用には以下のスクリプトを作成し実行した。

docker run --name nbla -v /Volumes/share/nnabla-tutor:/notebooks -p 8888:8888 --rm nbla:develop-ubuntu16.04

これで、localhost:8888でNNablaが使えるJupyter Notebookが起動する。
保存したノート類は、ホストからアクセスでき、コンテナを消してもちゃんと残る。

Dockerについて

以前も、開発環境としてDockerを使おうとしたことはあったが、ちょっと試して面倒になって消してしまっていた。
しかし、以下の点に注意して運用すれば今回はうまくいきそう。

  • まずDockerfileに書くもの、永続化するものを決める
    • 永続化するのは/notebooksなどコード
    • Pythonパッケージの追加などの環境の変更は、Dockerfileに記載して都度ビルド
  • コンテナ内は必要最低限の環境
    • 永続化すしたコードはホストからもいじれるので、例えばgitはホスト側に入ってればコンテナには不要
  • エイリアスシェルスクリプト書いて、1コマンドでコンテナを立ち上げられるようにして、使うに当たっての心理的な壁をなくす
    • 今回はdocker-rm-none-imagesとかalias定義して便利だった
  • docker run --rmでコンテナ終了時に削除
    • コンテナは使い捨て前提にすることで、オペレーションが単純になった
    • パフォーマンスも気にならない

これでとりあえずは不自由なく開発できるようになったはず。
Dockerを道具として使いこなせるようになりたい。

RustのLT会! Rust入門者の集い #3 に行ってきました

Rust LT会

Rustを初めて知って、興味を持ったのは今年の4月くらいだろうか??
Rustドキュメントを読んだところ、組み込みシステムでも十分使えそうだし、今現場で感じる課題を解決できそうな技術要素を沢山含んでるなあと思ったのでせこせこ調べてます。
まだあまり手を動かせていなくて、公式のドキュメントやオライリーの書籍をパラパラみている程度。

そんなこんなで、Rust入門者向けのイベントがあると知り行ってきました。

rust.connpass.com

コンピューターサイエンスの教養が豊かな人ばかりで、刺激が多かったです。

以下、各LTを聞いてたときのメモ。
内容が薄いのは、私が話についていけなかったから…

ドッグさん

こういう本を実装しながら勉強すれば良いのか

  • Rustで遅延評価を実装してみる
    • マクロで囲むと遅延評価される、キャッシュされるようにした
  • 純粋関数型データ構造の本をRustで実装★

サンクのデータ構造は、Memo or NotYet 計算済みならMemoを使い、そうでなければ計算

キーワード:moveキャプチャ、borrow_mut、Derefトレイト

Hashさん

  • Rustのasmを読んで見る
  • 公式が提供するWebのIDEで、asmも見れる
  • releaseビルドすると、asmを追えないくらい最適化されるので、debugビルドが良い
  • asmが元のソースの何行目かが出力できる

RxRust?

mozamimyさん

  • Brain F**k(BF)をRustで実装
  • BFは、言語を学ぶ上で良い題材

syu_creamさん

  • マルチスレッドからで、1つのVectorにpushする例をC++とRustで比較
  • C++のコンテナはスレッドセーフでないので、ロックが必要
    • C++11以降はthreadやmutexが標準搭載らしい
  • Rustだと、C++と同じコードではまずコンパイル通らない★
  • mutexが必要。追加して初めてコンパイル通る
  • ただ、Rustでもデッドロックは起こる。注意は必要

shunji_konishiさん

  • CODEPREPというサービスを提供している
  • Webベースの、言語やフレームワークのTutorialなど
  • コードを穴埋めして動かしながら学べる
  • Rustの教材も3つある
  • コンパイルエラーが起こることを確認し、その解説、という感じの教材

moppさん

自作OSから入門するRust

Rustでデザパタ書いた人

  • OSをCで書いてるけど、つらい
    • 名前空間、エラー処理、無名関数、抽象化など機能不足
  • RustのSafeに触れると、今までのCが以下にunsafeかわかる
  • C経験者がいきなりRustを学習するのはハードルが高い
    • すごいHaskell本が参考になる
    • Rustの標準ライブラリを読むことも勉強になる

アメミヤさん

  • RustをProductionに導入した話
  • ログ収集デーモンを作った
  • Rustはパフォーマンス凄い
  • コンパイラかしこいので、バグを踏むことが少ない
  • どうしてもgolangと比較される
  • Rustでも、クロスビルド&静的リンクでバイナリ配布も簡単

今後

やっぱりコードを書かないと駄目だなと感じたのでコードを書きたい

ドッグさんやmoppiさんのようにデータ構造やデザインパターンをRustで書いてみるのが勉強になりそうだけど、自分にはもう少し簡単かつモチベーションが上がる課題の方が良さそう。
どう勉強してくと良いかから考えねば。たぶん色々手を広げすぎなんだろうな…

SonyのDNNフレームワーク"NNabla"を調べてみた

SonyがNNablaというDeepLearningフレームワークを公開しました*1
興味があったので、ドキュメントとソースを読みながら、全体を眺めてみました。
よく見ると標準でBinaryConnectのサポートやBinary Neural Network(BNN)のサンプルがあったり、興味深いです。

NNablaのコンセプト

公式サイトに記載のあるコア・コンセプトのようなもの

https://nnabla.org/

  • Write less do more
    • コードを直感的に短く書ける
  • Dynamic computation graph support
    • ChainerやPytorchのような動的なモデル構築
  • Run anywhere
    • 色々なプラットフォームで動くように開発
  • Device ready
    • ライブラリのコアはC++11で書かれているので、組み込み機器にも乗せられる
  • Easy to add a new function
    • 少ないコーディングで機能追加できるよう、うまいこと設計してる
  • Multi-target device acceleration as plugin

NNablaを使っているプロダクト

NNablaは、ソニーグループのプロダクトでも使われていると記載がある

Xperia EarとDPT-RP1は、想像だけどデバイス側でNNablaが動いてるんだろうな。
すでに組み込み製品でも実用的に動いているなら、ライブラリを導入する側として安心。
そしてDPT-RP1ほしい…

ドキュメントとTutorial

ドキュメントが丁寧な印象。大企業っぽい(?)

特に入門向けのTutorialやサンプルコードは以下

その他、まとめきれなかったこと

眠いのでまた後日ブログ書きますが、特に印象に残ったことは以下。

  • Binary Neural Networkの部品を標準でサポートしてるってアツい
  • VariableやFunctionなど、概念がChainerに似ていて私はとっつきやすい
    • 記述量少ないけど、抽象化されすぎてなくて適度な印象
  • ドキュメントが丁寧な印象
  • コアはC++11で書かれていて、CythonでラップしてPython APIを提供している
    • C++APIも直接使える(まだドキュメントはないけど)
    • あとでコア実装読もう。
  • DataIterator
  • 静的 or 動的なモデル構築両方に対応
    • 基本静的で、動的に構築する場合は、Auto-forward modeを有効にするっぽい。
    • グローバルな状態を管理して、ごにょごにょしてる
  • 名前空間
  • LoggerモジュールやMonitorモジュールが地味に嬉しい。Utility系もそこそこ充実
  • Extensions
  • パラメータなどグローバルに状態をもつものをいるので、注意

今後

やってみたいこと、しらべたいこと

アドテク 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時間ほど前に東京駅に着いたので、皇居外苑のベンチで読書してました。 爽やかに晴れていたので、とても気持ちよかったです。 良い息抜きになりました。