2017年 PFN夏季インターンシップのコーディング課題公開

Kosuke Nakago

2017-07-27 09:54:00

* English blog is also written here.

PFNでは毎年8、9月に学生の方を対象とした2カ月間の長期インターンシップを実施しています。

今年も2017年のPFN 夏季インターンを募集したところ多数の応募をいただき、先日無事に選考が終了しました。

PFN 2017夏季 インターン募集

それに伴い、今回PFNのインターンコーディング課題をgithub上で公開しました。

https://github.com/pfnet/intern-coding-tasks

 

続きを読む »

分散深層学習パッケージ ChainerMN 公開

秋葉 拓哉
リサーチャー

2017-05-09 06:28:29

Chainer にマルチノードでの分散学習機能を追加するパッケージ ChainerMN のベータ版を公開しました。

ChainerMN とは

ChainerMN は Chainer の追加パッケージで、Chainer を用いた学習を分散処理により高速化できます。柔軟で直感的に利用できる Chainer の利便性をそのままに、学習時間を大幅に短縮できます。1 ノード内の複数の GPU を活用することも、複数のノードを活用することもできます。既存の学習コードから数行の変更で ChainerMN を利用可能です。ChainerMN は既に社内の複数のプロジェクトで実証が行われています。

Chainer を用いた通常の学習における 1 イテレーションは下図のように Forward, Backward, Optimize の 3 つのステップからなります。

ChainerMN はこれに、下図のように、通信を行う All-Reduce のステップを挿入します。All-Reduce のステップでは通信を行い、全ワーカーが Backward で求めた勾配の平均を計算し全ワーカーに配ります。Optimize のステップでは、この平均の勾配が利用されます。全ワーカーは学習開始後は常に同じパラメータを持ちます。

下図は以前に行った大規模ベンチマークの結果です。ChainerMN で 128 GPU を利用し画像分類の学習を約 100 倍高速化することができました。詳しくはこちらの記事をご覧ください。

利用方法の概要

以下、ChainerMN の利用方法の概要を紹介します。詳しくはドキュメントをご覧ください。

セットアップ

ChainerMN をインストールする前に、CUDA-Aware MPI, NVIDIA NCCL のセットアップが必要です。

CUDA-Aware MPI

ChainerMN は MPI を利用しており、MPI は CUDA-Aware 機能が利用できる必要があります。CUDA-Aware 機能をサポートするオープンソースの MPI には Open MPI, MVAPICH などがあります。以下は Open MPI を CUDA-Aware でインストールする例です。

./configure --with-cuda
make -j4
sudo make install

複数ノードで利用する場合、InfiniBand 等の高速なインターコネクトの利用を推奨します。

NVIDIA NCCL

NCCL はノード内の GPU 間の集団通信を高速に行うためのライブラリです。こちらを参考にビルド・インストールし、環境変数を適切に設定して下さい。

ChainerMN

ChainerMN は pip よりインストールできます。

pip install chainermn

 

学習コードの変更

ChainerMN を利用した分散学習を行うためには、既存の Chainer による学習コードに変更を加える必要があります。ドキュメント内のチュートリアルでは順を追ってこの手順を説明しています。

以下では、そのうちの最も重要なステップである、コミュニケータの作成と、オプティマイザの置き換えについて説明します。

コミュニケータ

コミュニケータは以下のように作成します。

comm = chainermn.create_communicator()

通信はこのコミュニケータを通じて行います。コミュニケータからは、参加しているワーカー数や自分がその何台目か(rank と呼ばれます)などの情報を得ることができます。

オプティマイザ

ChainerMN は Chainer のオプティマイザを置き換えることによりワーカー間の通信処理を挿入します。以下は通常の Chainer のコードで Adam のオプティマイザを作成している部分です。

optimizer = chainer.optimizers.Adam()

ChainerMN では、以下のように create_multi_node_optimizer 関数を呼び出して、通信処理が追加されたオプティマイザを作成します。

optimizer = chainer.optimizers.Adam()
optimizer = chainermn.create_multi_node_optimizer(optimizer, comm)

create_multi_node_optimizer によって作成されたオプティマイザは、通信処理が追加されている以外は通常のオプティマイザと同様に扱うことができます。

実行

mpiexec または mpirun コマンドを用いて学習スクリプトを起動します。以下は localhost 内で MNIST example を 4 プロセスで起動する例です。

mpiexec -n 4 python train_mnist.py

終わりに

以上、ChainerMN の利用法を駆け足で紹介しました。かなりの部分を省略しているので、実際に利用される際にはドキュメントを見て頂ければと思います。

ChainerMN は今後、通信と計算のオーバーラップ、ワーカー間の非同期な計算、勾配の圧縮による通信効率化、耐障害性などの課題に取り組み、改善を続けていく予定です。

人工知能技術の健全な発展のために

Hiroshi Maruyama

2017-04-12 15:53:06

4月10日の日経ITproの記事「 AIベンチャーの雄が総務省の開発指針に反対する理由」で、総務省主導で推進されているAIネットワーク社会推進会議とその開発原則分科会からPFNが離脱したことを、取り上げていただきました。私とのとりとめのないインタビューを適切にまとめてくださった日経ITpro浅川記者に深く感謝いたします。また、その記事に対して、はてなブックマーク、NewsPicks、FacebookなどのSNSを通して多くのコメントを下さった方にも感謝の意を表します。ありがとうございます。離脱の理由は記事にある通りですが、総務省の方々も私達の立場を真摯に受け止めてくださっていて、実りのある議論を続けてくださっています。その上で、今後の議論を深めるために、いくつかの点について補足したいと思います。

汎用人工知能と特化型人工知能

現在、人工知能という言葉は大雑把には、

  • 汎用人工知能(「強い」人工知能とも呼ばれ、自意識・創造性などあらゆる面で人間と同等以上の知性を示す、いわゆる「人工知能」)と、
  • 特化型人工知能(ある特定のタスクで知性を示すソフトウェア、あるいはそれを組み込んだ自動機械)

のどちらかまたは両方を指す言葉として使われています(より詳細には、様々な知能の定義があり、百人いれば百通りの定義があるようです)。文脈によってどの意味であるかが明確であればよいですが、そうでないと混乱の元になります。

汎用人工知能がいずれ実現することは間違いないでしょう。汎用人工知能が社会に与えるインパクトは計り知れず、そのために私達の社会がどのように準備しておくべきか、今から議論することには大変意味があると思います。しかし、汎用人工知能が実現可能になるまでには、まだいくつもの未解決問題を解かねばなりません。過去約60年にわたる人工知能の研究において、探索、推論、知識表現など多くの技術革新がありました。最も最近のブレークスルーは深層学習です。これら様々な革新的な技術の積み重ねがあるにもかかわらず、汎用人工知能の実現は、今見えている技術の延長上には無い、というのが私達の認識です。

汎用人工知能の実現が、人工知能研究の究極のゴールだとすれば、特化型人工知能は機械をより知的にするための営みから生まれてきた技術だといえるでしょう。「より」知的という意味は、それまでは機械にできないと思われていたことができるようになる、ということです。初期の人工知能研究では、例えば手段目標分析(means-ends analysis)という探索技法が盛んに研究されました。これは数学の定理証明など「高度に知的な」問題を解くのに用いられ、当時の人工知能の成功例とされましたが、今では乗換案内における探索アルゴリズムなどに実装され、日々使われている手法です。他にもコンパイラに使われる形式言語理論、オブジェクト指向やモデリング言語に使われる概念階層など、人工知能研究から発生した手法は、現在では多くのシステムの中で道具として使われています。すなわち、特化型人工知能とは「その時代における情報技術の最先端を指す言葉」と捉えてもよいでしょう。その意味では、最近注目を浴びている深層学習も、いずれは日々のプログラミングの中で当たり前のように使われる道具になっていくでしょう。特化型人工知能とは、自動車や洗濯機などと同様、道具に過ぎないのです。

深層学習の持つポテンシャル

その一方で、PFNが注力している深層学習は情報技術の世界を大きく変えてしまうポテンシャルがあると、私達は考えています。それは、応用領域の爆発的拡大と、そもそも情報システムのあり方の革新に現れてきます。

深層学習の技術は、当初は画像認識において、高い認識精度を得たことで注目を浴びました。現在では、音声認識や機械翻訳においても広く使われるようになってきているのはご承知のとおりです。PFNでは、深層学習を特にIoTなど物理世界との接点で応用しようとしています。自動運転のための画像認識バラ積みロボットの学習深層強化学習による自動運転、同じく深層強化学習によるドローンの制御深層生成モデルによる異常検知がんの診断などは、今までPFNが深層学習の応用を試みて成功してきた分野です。また、最近話題になったものとして、線画の自動着色があります。しかし、これらは氷山の一角に過ぎません。深層学習の応用分野はこれからも爆発的に増えていくと考えています。特に、産業用機器の制御など組み込み分野では、より高い精度、より高度な制御を行うために今後は深層学習を使わないシステムは考えにくくなってくるでしょう。

深層学習は同時に、ハードウェアからシステム開発の方法論、さらには業界のエコシステムまで、情報システムそのもののあり方も変えていきます。1990年代からつい最近にいたるまで、コンピュータといえばほとんどがインテルのx86アーキテクチャに基づくものでした。一方、現在深層学習を使っている多くの企業は、GPUを使っています。PFNでも、石狩にあるさくらインターネットのデータセンターに、数百個規模のGPUクラスタからなる計算基盤を構築していただいて、これを日々使っています。しかし、私達はGPUが究極のアーキテクチャとは考えていません。これから多くのハードウェアのイノベーションが起きるでしょう。

プログラミングモデル、あるいはソフトウェアのレイヤでは、「深層学習フレームワーク」という技術が群雄割拠でしのぎを削っている段階です。PFNでもご存知の通り深層学習フレームワークChainerを開発していて、これはNVIDIA、Intel、IBMなど主要なITベンダーにサポートされていますし、世界で戦える技術だと自負しています。このようなフレームワーク、すなわち深層学習に基づくプログラミングモデルを使いこなせることが、これからのITエンジニアの必須スキルとなることでしょう。

さらに今後、

  • 深層学習を用いたシステム開発のための方法論、すなわちお客様の要求をどのように深層学習の問題として表現し、訓練データや学習環境を用意し、評価やデバッグを行い、運用するかという知識体系(今までのソフトウェア工学に代わる体系)、
  • 深層学習によって作成される学習済みモデルの知的財産の保護、
  • あるいはシステム開発や学習済みモデルをめぐる新しいビジネスのエコシステム

など、情報技術の現在の常識が、すべての局面において大きく変わっていくことでしょう。

人工知能技術の健全な発展のために

「人工知能」という言葉がひとり歩きする中で、人工知能に対する過度な期待と、その裏返しである脅威論が、多くの人々の判断を歪ませているように思います。私たちは、今の技術がどのレベルにあり、どのような発展が想定されているかを正しく理解し、その知識に基づいて社会がどうあるべきかを議論しなければなりません。

深層学習が世の中を大きく変えていく中で、私達が世界の中で競争力を失わずに、なおかつ人類社会の発展に貢献するために何ができるのか、私達人工知能技術に携わるものが、その現状と展望を正しく発信するように、戒めていきたいと思います。

 

深層強化学習による自動駐車の実装

Shiba Shintaro

2017-03-22 19:15:13

初めまして! PFN でアルバイトをさせてもらっている芝慎太朗です。普段は東京大学大学院で行動神経科学の研究をしています。僕が去年取り組んでいた、「車が自ら駐車場に向かい停止する」自動駐車プロジェクトについて報告します。まずはこちらのアニメーションをご覧ください。(アニメーションがうまく再生されない場合は画像をクリックしてください)

We implemented self-driving car that parks itself using deep reinforcement learning. The English slide is available at SlideShare!

背景

深層強化学習は、2015年から非常に注目され始めた人工知能技術であり、深層学習と強化学習を組み合わせたものです。深層強化学習によって、それまでできなかったような複雑なタスクにおいてもコンピューターが人を上回り始めました。プロ棋士を破ったことで一躍話題になった Google DeepMind による囲碁の人工知能 AlphaGo もこの技術を使っています。最近では スマッシュブラザーズにおいても威力を発揮し 話題になりました。

深層強化学習は制御タスクとの相性がよく、実際に PFN でもぶつからない車の自動運転ドローンの制御などに成功してきました。

PFN が CES 2016 で展示した自動運転(参照)では、アルゴリズムとして深層強化学習ブームの火付け役となった Deep Q Network(以下DQN)を用いています [Mnih et al., 2015]。ニューラルネットワークへの入力は、LIDAR(wikipediaによる解説)を模した近接物への距離と角度センサー、直前の行動、現在の車のスピードとステアリング(ハンドルの曲がり具合)でした。

しかし自動運転技術を現実に応用することを考えると、一般に距離センサーよりもカメラの方が安価という特徴があります。一方で、距離の計算が必要になるためカメラ画像の方が制御は難しくなると考えられます。実際、つい最近も ブラウザ上で動作するような簡単な自動運転デモ が公開されたばかりですが、これも距離センサーを使用しており、使用しているニューラルネットは3層程度の簡易なものです。
距離センサー・カメラそれぞれに得意・不得意な状況や利点・欠点があるので一概にどちらを用いるべきとは言えませんが、いずれにせよ、距離センサーに頼らずカメラ画像のみを用いて車を制御するようなアルゴリズムの研究開発は非常に重要です。

本プロジェクト

このプロジェクトでは、距離センサーではなく、車に取り付けられたカメラによる主観的な画像の入力によってend-to-endのアルゴリズムで車を制御できないか、ということに挑戦しました。具体的なタスクとして選んだのは駐車です。すなわち、車を駐車スペースに移動して停止させます。

アルゴリズムとしては DQN の改善版である Double DQN を使用しました。Double DQN は行動価値の見積もり値である Q 値の過大評価を防ぎ、ニューラルネットの発散を防ぐことで学習を安定させるという特徴があります [Hasselt et al., 2015]。詳しくは解説スライド(この投稿の最後にリンクが貼ってあります)や元論文をご覧ください。

まずは環境の定義です。今回は実機や既存のシミュレータを使用せず、簡単な車の物理シミュレータを自分で実装しました。このシミュレータはアクセル、ブレーキ、ハンドルの曲がり具合を受け取り、牽引力、空気抵抗、転がり抵抗、遠心力、制動力、コーナリング力を計算し、車の位置、速度、加速度を更新します。車や駐車スペースの大きさと、車が探索できる地面の範囲なども定義しました。次の図は、シミュレーションされた環境を上から見た俯瞰画像です。黒い長方形が駐車スペース、赤と黄色の長方形が車(黄色が前)になります。


次にエージェントへの入出力を定義します。エージェントは環境の状態を入力として受け取り、アルゴリズムにしたがって適切な行動を選択します。現実世界に例えるなら車に乗っている人に相当するでしょう。行動はアクセル、ブレーキ、ハンドルを左右に曲げることの組み合わせで全部で9種類用意しました。状態としては、環境を車から見た主観画像と、現在の車のスピードとステアリング(ハンドルの曲がり具合)を使用しました。つまり、車の現在位置や駐車スペースまでの距離を直接知ることはできません。

主観画像は、車を中心に3方向または4方向に設置されたカメラ画像を用意し、車の周りをぐるりと見渡せるようにします。次の画像はカメラが4台の場合の主観画像です。画像の大きさはニューラルネットに入力する直前で 80 x 80 に縮小します。わかりやすいように中心に先ほどと同様の俯瞰画像を載せました。


エージェントは、画像の入力に合わせて適切な行動を選択し、車を駐車スペースに導いてそこで停車することが求められます。状態がカメラ台数分の画像と、画像でないパラメータ(現在の車のスピードとステアリング)からなるため、ニューラルネットの構造を工夫して以下のようにしました。この図はカメラが3台の場合に使用されたニューラルネットワークです。図中の Convolution とは、画像を処理するための畳み込みニューラルネットを示します。


最後に報酬を定義しておきます。「車が駐車スペースに向かい、その中で停止する」、すなわち「車ができるだけ長く駐車スペースの内側にいる」ことを学習するような報酬の与え方を考えます。いろいろな設定を試しましたが、最終的に

  • 車が駐車スペースの内側にいる場合、+1
  • 車が地面の外にいる場合、-1
  • その他の場合、0.01 – 0.01 * ゴールまでの距離

というふうに設定してみました。
その他の細かい設定や、他に試した報酬の設計などは末尾のスライドをご覧ください。

結果

GeForce GTX TITAN X 上で約一週間ほど学習を回し続けた結果、冒頭で示したように、車が自動で駐車スペースに向かい停止するように学習できました。次のアニメーションは冒頭と同じもので、左が車の軌跡、右が実際にニューラルネットワークに入力された画像です。

しかしながらやはりタスクの難しさもあって、このまま学習を続けていくと車が地面をぐるぐる回り続けたり、パラメタによっては学習途中でニューラルネットの出力が発散してしまったりという場合もありました。こちらも詳細はスライドを見ていただければと思います。


考察

深層強化学習を用いて、主観画像の入力から自動駐車を学習できました。画像を入力して車を制御するのは、距離や角度のセンサーよりも一段階難しいタスクです。実は、このプロジェクトも距離などを入力にして学習させるところから始めました。距離を直接入力した場合には安定してすぐに学習できたものの、主観画像では Q 値の発散や、うねうねと動き続ける車が誕生したりとなかなか安定しませんでした。

原因として考えられることの1つに、畳み込み層で車や駐車スペースの場所がうまく検出しきれていない可能性があります。先にCNNから位置を回帰するような事前学習をおこなってその重みを初期値として使うことや、一度 CNN 部分の出力を可視化してみることも有用でしょう。

また学習を安定させるために、アルゴリズムの変更も効果的かもしれません。例えば A3C [Mnih et al., 2016] や TRPO [Schulman et al., 2016] を使ってみたり、モンテカルロ法と組み合わせた学習などは試す価値があると考えられます。

実際にはいきなり始めから主観画像を入力したわけではなく、上で少し述べたように、簡単なタスクから徐々に難しくしていました。また、報酬の設計を変更しつつ、駐車スペースの位置や車の初期設定を変えながらカリキュラム学習をしたりと細かい実験を試しています。これらの詳細が知りたい方は上記のスライドを見ていただければと思います。

まとめ

本プロジェクトの結果はまだ様々な状況で完全に対応できるものではありませんが、深層強化学習によってカメラ画像のみで自動駐車が実装できる可能性を示したものだと言えます。今後の方向性としては、学習アルゴリズムを変更して学習を安定させたいです。シミュレーションだけではなく、実機でも実現できれば非常に面白いと思います。

僕は現在も他のプロジェクトに取り組みながらアルバイトを続けています。初めからプログラミングや強化学習ができたわけではなく、自分で勉強しつつ、わからないところをメンターに教えていただきながら、大変恵まれた環境で進めることができたプロジェクトでした。学生の皆さんも興味があればアルバイトやインターンに積極的に飛び込んでいってみてはいかがでしょうか。

深層強化学習ライブラリChainerRL

Yasuhiro Fujita

2017-02-16 19:10:47

Chainerを使った深層強化学習ライブラリChainerRLを公開しました. https://github.com/pfnet/chainerrl

PFNエンジニアの藤田です.社内でChainerを使って実装していた深層強化学習アルゴリズムを”ChainerRL”というライブラリとしてまとめて公開しました.RLはReinforcement Learning(強化学習)の略です.以下のような最近の深層強化学習アルゴリズムを共通のインタフェースで使えるよう実装してまとめています.

A3CでAtari 2600のゲームをプレイするexampleや,

DDPGでヒューマノイドロボットの制御を学習するexampleなどがあります.

以下では簡単にChainerRLの使い方を説明します.

まず,強化学習を使って問題を解くには,解きたい問題(”環境”と呼びます)をしっかり定義する必要があります.環境の定義の仕方は,OpenAIが公開している強化学習ベンチマーク環境のGym(https://github.com/openai/gym)のインタフェースに従っています.Gymの環境で動かすこともできますし,インタフェースを揃えればオリジナルな環境で動かすこともできます.基本的にはresetとstepという2つのメソッドが実装されていれば十分です.

env = YourEnv()
# reset は環境をリセットして現在の観測を返す
obs = env.reset()
action = 0
# step は環境にアクションを送り,4つの値(次の観測,報酬,エピソード終端かどうか,追加情報)を返す
obs, r, done, info = env.step(action)

深層強化学習では,状態から行動を決める方策(Policy)や,状態や行動の価値を予測する価値関数(V-function,Q-function)をニューラルネットで表現し,そのパラメータを学習します.ChainerRLでは,これらは単に__call__を実装したChainerのLinkとして表現されます.

class CustomDiscreteQFunction(chainer.Chain):
    def __init__(self):
        super().__init__(l1=L.Linear(100, 50)
                         l2=L.Linear(50, 4))
    def __call__(self, x, test=False):
        h = F.relu(self.l1(x))
        h = self.l2(h)
        return chainerrl.action_value.DiscreteActionValue(h)

class CustomGaussianPolicy(chainer.Chain):
    def __init__(self):
        super().__init__(l1=L.Linear(100, 50)
                         mean=L.Linear(50, 4),
                         var=L.Linear(50, 4))
    def __call__(self, x, test=False):
        h = F.relu(self.l1(x))
        mean = self.mean(h)
        var = self.var(h)
        return chainerrl.distribution.GaussianDistribution(mean, var)

このように作ったモデルやChainerのOptimizer,アルゴリズムごとに必要な引数を渡して”エージェント”を作ります.エージェントは環境とのインタラクションを通じてデータを集めながらモデルの学習を行います.

q_func = CustomDiscreteQFunction()
optimizer = chainer.Adam()
optimizer.setup(q_func)
agent = chainerrl.agents.DQN(q_func, optimizer, ...)  # 残りの引数は省略

エージェントを作ったら,自分で学習ループを書いて動かすか,

# Training
obs = env.reset()
r = 0
done = False
for _ in range(10000):
    while not done:
        action = agent.act_and_train(obs, r)
        obs, r, done, info = env.step(action)
    agent.stop_episode_and_train(obs, r, done)
    obs = env.reset()
    r = 0
    done = False
agent.save('final_agent')

あるいはあらかじめ用意されている学習用関数に渡せば学習が行なえます.

chainerrl.experiments.train_agent_with_evaluation(
    agent, env, steps=100000, eval_frequency=10000, eval_n_runs=10,
    outdir='results')

とりあえず動かしてみるためのクイックスタートガイドを用意しました. https://github.com/pfnet/chainerrl/blob/master/examples/quickstart/quickstart.ipynb

ChainerRLはまだベータ版ですが,強化学習に興味がある方はぜひ試してもらってフィードバックをいただけるとありがたいです.ライブラリとしての使いやすさや,新しいアルゴリズムの追加など,今後も改善を続けていこうと思います.

ChainerMN による分散深層学習の性能について

秋葉 拓哉
リサーチャー

2017-02-08 11:49:16

米サンフランシスコで開催された「Deep Learning Summit 2017」にて、PFN は Chainer のマルチノードでの分散学習対応への取り組みについて発表しました。本記事では、その発表について詳しく説明していきます。

分散深層学習の重要性と現状

GPU の性能は継続的に向上していますが、より大きなデータを活用してより精度の高いモデルを実現するために、深層学習で使われるモデルのパラメータ数や計算量も増大しています。そのため、現在でも、Chainer を含む一般的なフレームワークを用いた標準的な学習では 1 週間以上かかってしまうようなユースケースが少なくありません。より大規模なデータを扱ったり、試行錯誤のイテレーションを効率化するために、複数の GPU を連携させ学習を高速化させることは重要な課題です。そこで、我々は Chainer にマルチノードでの分散学習の機能を追加するパッケージ ChainerMN を開発しています。

ChainerMN の実装方針

今回の実装はデータ並列と呼ばれるアプローチを採用しており、その中でも同期型の実装を採用しています。これは、各ワーカーがモデルのコピーを持ち、1 イテレーションのミニバッチを分割し全ワーカーで協力して勾配を計算する、というアプローチです。

実装には MPI を利用しており、ノード外の通信は MPI を通じて行うことにより、InfiniBand のような高性能なネットワークの性能を活用できます。ノード内の GPU 間の通信には NVIDIA 公式の NCCL というライブラリを利用しています。

性能測定の結果

ImageNet の画像分類データセットを使って性能を測定しました。CNN のモデルとしては ResNet-50 を使いました。実験にはさくらインターネットの高火力コンピューティングを利用しています。詳しい実験の設定については記事末尾の付録をご覧ください。

以下の性能測定の結果は、完全に公平とは言えない可能性がある事をご留意下さい。まず、性能測定を行った環境は我々が開発を行った環境でもあるため、測定環境に特に適した実装になっている可能性があります。また、他のフレームワークに関しても、性能を出すためにある程度の試行錯誤をしたものの、我々は十分な経験を持ち合わせていないため、完全に性能を出し切れているとは限りません。第三者による検証を推奨するため、比較に利用したプログラムは他フレームワークのものも含めて公開予定です。

ChainerMN の性能

下図は、GPU 数を増やしたときに学習完了にかかる時間がどのように高速化されるかを表した図です。学習完了とは同じエポック数の学習を行うこととしています。4 GPU までが同じノード内で、8 GPU 以上ではノードを跨いでいます。比較的理想的な高速化を達成しており、今回の設定では 128 GPU で 100 倍程度の高速化となりました。

下図は、横軸に実時間、縦軸に validation accuracy を描いた学習曲線です。2 度精度がジャンプするところは、学習率を 0.1 倍しているタイミングであり、ImageNet 系の学習曲線で見られる一般的な現象です。この図から、今回の設定では 128 GPU を使った場合でもちゃんと精度が上がってきていることが確認できます。

他フレームワークとの比較

下図は、128 GPU を用いる同じ設定下で各フレームワークが学習完了に要する時間です。開発チームとしても実は意外な結果だったのですが、ChainerMN が最も高速という結果になりました。この理由については次の実験と併せて考察していきます。

下図は、GPU 数を変えた時の各フレームワークのスループットを描いています。計測のイテレーション数を少なめにしてしまったのでやや不安定ですが、傾向が見て取れます。まず、1GPU の時には ChainerMN よりも MXNet, CNTK のほうが高速です。これは、MXNet, CNTK が C++ で記述されているのに対し、Chainer が Python で記述されているからだと考えられます。次に、4GPU の時を見ると、MXNet が少し出遅れます。この理由の1つとしては、CNTK と ChainerMN が NVIDIA NCCL の提供する高速な GPU 間集団通信を活用しているのに対し、MXNet は自前でノード内の通信を行っている、ということが言えると思います。一方で、ノード間通信では、CNTK よりも MXNet, ChainerMN のほうが良いスケーラビリティを示しています。結果、128 GPU では、ノード内・ノード間の両方で高速な通信を実現した ChainerMN が最も高速です。

TensorFlow の結果の解釈には注意が必要です。TensorFlow は通常の利用では十分高速なフレームワークです。上図の実験で 1 GPU の時ですら低いパフォーマンスとなってしまっているのは、1 GPU でも分散実行時と同じ設定で実行しているためです。別プロセスとして起動しているパラメータサーバとの gRPC を用いた通信に大きなオーバーヘッドが存在し、1 GPU の時ですらこのような速度になってしまっています。TensorFlow の速度については、他所でのベンチマークでも同様の結果が報告されています [1, 2]。

分散深層学習の難しさと課題について

分散深層学習の難しさの 1 つとして、スループットの向上が常にそのまま学習効率の向上になるわけではない、という点が挙げられます。例えば、データ並列のアプローチでは、GPU 数を増やすほどバッチサイズが大きくなります。しかし、ある程度以上のバッチサイズでは、バッチサイズを大きくするとモデルの学習に悪い影響があり、得られるモデルの精度が段々下がっていきます。まず、同じエポック数の学習を行う場合、イテレーション数が減ってしまうため、モデルが成熟しないことがあります。加えて、勾配の分散が小さくなることにより、性質の悪い局所解(sharp minima と呼ばれます)に進みやすくなってしまい、結果として得られるモデルの汎化性能が悪くなってしまう、という現象も知られています。

こういったことを加味せずスループットのみを報告するベンチマーク結果には意味が有りません。バッチサイズを上げたり同期頻度を下げたりすることにより、いくらでもスループットのスケーラビリティは上げることができますが、そういった設定では有用なモデルを学習させることはできません。今回も、GPU のメモリにはかなり余裕がある状況ながら、各 GPU の担当バッチサイズを小さめに抑えることで、それなりの精度のモデルを得る事ができる設定にしています。

今後について

ChainerMN は、今月中にも社内での試用を開始し、そこでのフィードバックを反映した上で、数ヶ月以内に OSS で公開予定です。

続きを読む »

2016年夏季インターンシップ開催報告

大野 健太
エンジニア

2016-10-28 18:41:49

PFI・PFNでは今年8, 9月に夏季インターンとして14名の方に来て頂き、機械学習・深層学習に関する様々なプロジェクトに取り組みました。このブログエントリでは、PFI・PFNのインターンシッププログラムの概要と、今年のインターンシップ、特に最終成果発表会についてを紹介します(写真は中間発表のポスター発表の様子です)。

2016%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%bc%e3%83%b3%e4%b8%ad%e9%96%93%e7%99%ba%e8%a1%a8

PFI・PFNのインターンプログラムについて

PFI, PFNでは、2010年からインターンシップを実施しています(PFNは2015年から)。夏季のインターンシップは毎年行っており、また毎年ではありませんが、春季にもインターンを実施しています。PFI・PFNのインターンシップの特徴として、8, 9月の2ヶ月間と比較的長期であること、インターンで行うプロジェクトのテーマに精通している社員がメンターにつき一緒にプロジェクトを進めていくこと(大抵の場合1人の学生に対してメンター2人)、インターン中の成果は論文やOSSなどの形で可能な範囲で公開できることなどが挙げられます。

準備に関しても4月から募集要項の作成を進めており、春季インターンも含めると、1年のうち半分以上はインターンに関して何らかのプロジェクトが動いていることになります。PFI・PFNがここまでインターンシップに力を入れている理由として、インターンを行った後に社員としてPFNに来ている方がメンバーとして活躍していること、社員の側もインターンで来ていただく学生の方々から最新の研究について学んでいること、インターンでのプロジェクトが学生の方の研究・学業にも直接的・間接的に役に立っているという自負があることなどが挙げられます。

選考は書類審査・コーディング審査・面接審査で実施しております(選考方法に関しては今後変更になる可能性は十分あります)。コーディング試験に関しては別のブログエントリにて、過去の選考で出題した課題を公開しておりますのでご参照ください。選考では、本人の興味・研究分野・得意な技術などを考慮し、指導できるメンターとの間でマッチングを行います。幸いなことに、PFI・PFNでのインターンを希望していただける方は多く、また、皆さん優秀な方が多いので、毎年選考には頭を悩ませています(そして、大体毎年想定以上の人数を採用してインターン期間中はてんやわんやになります)。今年の募集要項は過去のNewsをご参照ください。

今年の夏季インターンについて

PFNが事業を拡大し、人数面・設備面でキャパシティが増えたことで、今年の夏季インターンでは14人と例年以上に多くの方に参加していただきました(倍率としては例年と同等程度でした)。今年4月にオフィスを本郷三丁目から大手町に移転した時には空席がたくさんあると思っていたのですが、実際にインターンを開始したら、危うく席が足りなくなりそうになり、若干ヒヤヒヤしました。

インターンシップの募集する際に、大まかなテーマは設定していますが、具体的にどのようなテーマで行うかは採用後にインターン生とメンターとの間で議論を行い、プロジェクトの方向性を決めていきます。今年のテーマは以下の通りです。どのプロジェクトでも関しても異常検知・強化学習・深層生成モデルなどに関する最先端のテーマに取り組んでいただきました。

  • 対話における商品の営業
  • Automatically Fusing Functions on CuPy
  • Generation of 3D-avatar animation from latent representations
  • Response Summarizer: An Automatic Summarization System of Call Center Conversation
  • Imitation Learning for Autonomous Driving in TORCS
  • 3D Volumetric Data Generation with Generative Adversarial Networks
  • DQN with Differentiable Memory Architectures
  • Anomaly Detection by ADGM / LVAE
  • Multi-modal Deep Generative Model for Anomaly Detection
  • CNN based robotic grasping for randomly placed objects by human demonstration
  • Bayesian Dark Knowledge and Matrix Factorization

今年の新しい試みとして、中間発表・最終発表を従来の口頭発表形式から、ポスター形式に変更しました。また、最終発表は一般公開し、外部の方も参加していただけるようにしました。発表をポスター形式にしたことで、インターンの学生の方たちがPFI, PFN社員やお客さんと双方向の議論が出来たのはよかったのではないかと思います。最終発表会は当初2時間を予定していましたが、終了時間が過ぎても活発に議論が続いていました。最終発表会当日のポスターはリンク先のconnpassページにまとめておりますので、是非ご覧になってください(発表資料は順次追加していきます)。

今後のインターンシップに関して

PFNでは(私がPFN所属なのでこのような主語を置きます)来年以降も夏季インターンシップを実施する予定で、募集要項は4月頃に掲載する予定です。また、PFNでは、春季インターンなどの通年インターンシップやアルバイトも随時実施しております(通年でのインターンシップはまだ仕組みが整備されていないため、受け入れられる数が限定されていますが、HPへの募集要項の掲載などの準備を進めています)。PFI・PFNでのインターンシップやアルバイトに興味のある方は是非ご一報いただければと思います。

CEATEC2016に出展してきました 〜ロボット編〜

Taizan Yonetsuji

2016-10-20 16:03:19

PFNは2016年10月4-6日に千葉幕張メッセで開催されたCEATEC2016で、スマートピッキングロボットおよびバラ積みロボットの展示を行ってきました。ロボットの他にもドローンやDIMoに関する展示も一緒に行いました。こちらに関しては関連記事をご参照ください。

以下では、もう少し詳細な解説をしたいと思います。

続きを読む »

CEATEC2016に出展してきました 〜ドローン編〜

PreferredNetworks

2016-10-17 15:58:17

PFNは2016年10月4-6日に千葉幕張メッセで開催されたCEATEC2016で、深層強化学習に基づくドローン(マルチコプター)の自律飛行に関する展示を行ってきました。ドローンの他にもロボットやDIMoに関する展示も一緒に行いました。こちらに関しては関連記事をご参照ください。

ドローンスペースでは実機による自律飛行を披露しただけではなく、説明用のデモ動画を作って上映しました。以下がその動画となります。

 

以下では、この動画よりも少し踏み込んだ内容について知りたい方向けに解説したいと思います。

続きを読む »

Chainer MeetUP #03 を開催しました

preferred

2016-07-15 20:36:54

最近得居さんに雑なあだ名を付けられて、凹んでる舛岡です。

7/2(土)にChainer Meetup #03をドワンゴ様セミナールームで行いました!

今回も、アカデミックや企業で活躍されている方々にお話しして頂きました。
ドワンゴ様には前回に引き続き今回も会場をお借りしました。またニコ生の放送もお手伝い頂きました。この場を借りてお礼を申し上げます。

Chainer Meetupでの資料

Chainer, CuPy入門 @unnonounoさん


Chainer Update v1.8.0 -> v1.10.0+ @beam2dさん


シンパーセプション研究におけるChainer活用事例 @n_hidekeyさん


Chainerを使って細胞を数えてみた @samacobaさん


ヤフー音声認識サービスでのディープラーニングとGPU利用事例 Yahoo! Japan 磯部さん


NVIDIA更新情報: Tesla P100 PCIe/cuDNN 5.1 NVIDIA 井﨑さん


俺のtensorが全然flowしないのでみんなchainer使おう @hidesukeさん


深層学習ライブラリの環境問題 @yutakashinoさん


Peephole connectionsを実装してChainerのcontributorになった話 @Kotaro_Setoyamaさん


Chainerを使って白黒アニメの彩色実験をしてみた @Eiji_Kbさん

Real-Time Style Transferについて @_mayfaさん


On the benchmark of Chainer @delta2323_


ドーナツスポンサー

今回も エヌビディア合同株式会社様に、ドーナツスポンサーになって頂きました!
毎回準備していただく エヌビディア合同株式会社様、@yukofujiさんには感謝しております!

IMG_0056 - コピー IMG_0057 - コピー

当日の様子

IMG_0048 - コピーIMG_0062 - コピーIMG_0053 - コピーIMG_0058 - コピーIMG_0065 - コピー IMG_0079 - コピー

IMG_0059 - コピー IMG_0071 - コピー 受付 IMG_0084 - コピー IMG_0086 - コピー

 

1234