HCIグループの発足、UISTおよびISS 2018での論文発表・デモ実施のお知らせ

Fabrice Matulic

2018-10-15 08:56:12

新たにHCI グループが発足しました

PFNでは最先端のAI技術を駆使して「インテリジェントな」次世代システムとサービスの実現を目指しています。しかし、システムの本質的な部分の開発や運用を担うのは依然として人間であるため、人間とマシンの対話を考える事は非常に重要です。ヒューマンコンピュータインタラクション(HCI)のアプローチは、人間とマシンの隔たりを埋め、機械学習においても人間の介入を要する複雑なプロセスの改善に大きく貢献します。この度PFNでは、「humans-in-the-loop(人間参加型)」の考えを採り入れながら、ユーザー中心のAI設計を推し進めるべく、新たにHCI専門のグループを立ち上げました。

HCIチームが探求する研究は大まかに以下の3分野です。

  • 機械学習のためのHCI: 機械学習には複雑で面倒なプロセスがあり、人間の関与が必要な部分がありますが、HCIの手法を利用する事でこれらの作業を容易にします(例えば、データ収集、ラベル付け、前処理、オーグメンテーション、ニューラルネットワークエンジニアリング、デプロイメントやマネージメントなど)
  • HCIのための機械学習: 深層学習を使って既存のインタラクション手法を強化したり、新たなインタラクション手法を実現します(例えば、高度なジェスチャー認識、行動認識、マルチモーダル入力、センサーフュージョン、身体的インタラクション、AIと人間のコラボレーション、インタラクティブなコンテンツを作成する生成モデルなど)
  • ヒューマンロボットインタラクション(HRI): 未来の賢いロボットとユーザーが、効果的かつ直感的に、さらには楽しくコミュニケーションやインタラクションできる事を目指します。

また、HCIグループの外部コンサルタントとして、HCIとHRI分野で豊富な経験をお持ちである東京大学の五十嵐健夫教授からアドバイスをいただく事になりました。五十嵐教授は、研究科学技術振興機構(JST)の戦略的創造研究推進事業(CREST)として、「機械学習のためのHCI」の研究にも取り組まれています。まさに私たちが注力する研究分野であり、今後の長期的な共同研究から実りある成果が生まれる事を大いに期待しています。

今年のUIST ISSで論文発表とデモを行います

HCIグループはまだ正式に立ち上げて間もないグループですが、すでに本格的な研究活動に着手し、直近の研究成果を二本の論文にまとめています。これらは今週開催されるUISTと来月開催のISSで個別に発表する予定です。

一つ目はウォータールー大学でDrini Cami氏とDan Vogel教授との共同研究ですが、タブレット画面に文字を書く際のスタイラスペンの握り方を変える事で様々な機能を呼び出すシステムです。本手法では機械学習を活用し、タッチ入力の生データにもとづいて、ユーザーの手が画面に触れた際の握り方を検知します。これにより、面倒で扱いにくいUIウィジットに頼らず、文字を書いている方の手でペンのモードを素早く変える事が可能です。詳しくは以下の動画をご覧ください。

UISTでは論文発表に加えてDrini Cami 氏が本手法のデモを行います。

二つ目の研究は、昨年12月のコミックマーケットに出展したPaintsChainerに用いたプロジェクションマッピングシステム(論文ではColourAIzeと呼んでいます)で、紙に描いた線画に自動で色を付けます。コミケに行けなかった方のために具体的に説明すると、PaintsChainerが自動的に判断した着色イメージを、線画に重ねるように投影して着色します。その結果、アナログとデジタルが融合した興味深い作品が出来上がります。Web版PaintsChainerと同様に、ヒントとなる色を指定してお好みの自動着色に仕上げる機能もサポートしており、任意の箇所をペンでなぞるだけで本機能が使用可能です。

最初にご紹介したペンの異なる持ち方の研究と同様、11月に東京で開催されるISSでは論文発表とデモの両方を行います。ご自身の線画やマンガにAIが自動着色する楽しい体験をしてみたい方は、カンファレンス期間中にぜひ私たちのデモにお越しください!

最後に、私たちは優秀なHCIリサーチャーを募集しています。前述の研究分野で貢献できる方は、弊社ウェブサイトの採用ページで募集要項をご確認いただき、ぜひご応募ください!お待ちしております。

[BoF] How to choose programming language for product/in-house software development

kashihara
エンジニア

2018-08-24 15:35:26

Preferred Networksでエンジニアをしている柏原です。PFN Dayでは “How to choose programming language for product/in-house software development” という題でBoFのセッションを開きました。PFN Dayとはトビアスのブログエントリ「[PFN Day] BoF session: How to Improve Sharing of Software Components and Best Practices」にもあるように、社内向けの技術カンファレンスです。

ソフトウェア開発において、プログラミング言語は開発環境をはじめとして、開発チームやサポート体制などに大きな影響を与えます。 PFNの中でもたくさんのプログラミング言語が使われていると思います。 今回は社内で何が使われているかという現状については言及せず、社外にリリースする製品/社内製品を開発することを想定して、どうやってプログラミング言語を選択するか、どのような要素がプログラミング言語の選択に影響を与えるのか議論したいと考えました。

まず、参加メンバーのバックグラウンドを共有するため、どういったソフトウェア開発・プログラミング言語の経験があるか自己紹介をしました。 その後、過去にどのような点を重視してプログラミング言語を選んだのか、プログラミング言語を選ぶときの重要な点についての項目を議論の中であげていきました。

結論としては必要としているものを正しく選ぶ、ということになりますが、以下の優先順位がプログラミング言語の決定に大きく依存しているということになりました。

  • Priority 1: Real world restrictions (E.g. frameworks, platforms)
  • Priority 2: Real world needs (E.g. stability, production readiness, concurrency, distributed computed)
  • Priority 3: Real world benefits (E.g. productivity factors)

1番目のrestrictionsでは、実行環境(OS、モバイル端末、組込)や、目的を実現するためのフレームワークが優先されます。 近年ではたくさんのプログラミング言語が増えてきたとはいえ、その言語が利用できるかは環境に大きく依存します。

2番目は、ソフトウェアで求められている機能・非機能要件を満たすことが、当然ながらソフトウェアの開発で求められます。 プログラミング言語やランタイム環境は、適材適所であるべきといえるでしょう。 ソフトウェアの安定性が求められるのはもちろんのこと、近年ではCPUのマルチコア環境を活かすことも必要とされてきています。 プログラミング言語の機能や特性によって、ソフトウェアの要求を実現できるというのはとても心強いです。

3番前は、プログラマーがプログラミングするにあたって、あると嬉しい部分です。 例えば、テキストエディタやIDEによる、プログラミング言語を書くことをサポートする機能(プラグイン)があげられます。

BoFを開催する前は極端な意見に偏るかもしれないと少し不安でしたが、最終的には現実的な結論に落ち着いたと思います。 その他、興味深いトピックとして、ソフトウェアの正しさを検証するものとして、モデル検査やHDLのSystemVerilog(言語)といったものも話題にあがりました。 80分と長いような短い時間の議論でしたが、興味深い会話ができたと思います。BoFのメモがもし公開されたら、そちらも是非ご覧ください。

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

楠本充
エンジニア

2018-07-18 11:32:38

PFN 2018夏季インターンシップの選考で用いたコーディング課題を github 上で公開しました。

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

PFN の楠本です。PFN では毎年8,9月前後に2ヶ月間の長期インターンシップを行っています。コーディング課題はその選考で応募者のプログラミング能力や問題解決能力を見るために出題させて頂いているものです。PFN のインターンシップでは機械学習をはじめとする幅広い分野で応募を行っているため、今年は「機械学習・数理」「バックエンド」「フロントエンド」「プロセッサ/コンパイラ」「Chainer」の5種類のコーディング課題を用意し、応募者の希望するテーマに応じてこのうちのいずれかを解いていただく形にしていました。

今年は去年を大きく上回る数の応募を国内外双方からいただくことができました。それに伴い、インターン生の受け入れ人数も去年よりもさらに拡充する形になりました。

今年の問題は以下のような構成になっています。

  • 機械学習・数理課題: ニューラルネットワークの敵対的入力(Adversarial Example)のアルゴリズムを実装し、性能を報告するためのレポートを記す課題。
  • バックエンド課題: 与えられたログファイルを分析するツールを作る課題。
  • フロントエンド課題: セミナー発表のような動画に対して、発表内容のアノテーションを行うウェブサービスのプロトタイプを作る課題。
  • プロセッサ/コンパイラ課題: 行列積コードの最適化と、行列積回路の設計を行う課題。
  • Chainer 課題: モデルの学習を行うコードを Chainer で実装する課題。

コーディング課題では毎年、出題者が趣向を凝らした問題を作成しています。これらの課題が、興味のある分野を実践的に学ぶための練習問題になれば幸いです。

私は今年の機械学習・数理課題の出題に携わりました。少し余談になりますが、課題を作る際に意識していたことについて書きたいと思います。他の課題ではまた話が違ってくるかもしれませんが、共通しているところもありそうです。

  • 前提知識があまり無くても解けるようにする: PFN では幅広い分野の方々を募集しています。そのため、機械学習そのものの経験や知識が無くても課題を一通り解けるように問題を設定したり、問題文を記述するようにしています。また、特定の知識を持っている人が有利になりすぎるということがあまりないようにも配慮しているつもりです。
  • 実際の研究に近いような設定にする: 深層学習のような分野の研究では「何か良いテーマを見つけて手法を考える → 実装する → 出てきた結果をまとめ、考察を与える」という過程を繰り返しますが、このうち「実装して考察する」という流れを短期間で一通り辿れるような設定にしています。大学の授業の課題のような感じに近いかもしれません。
  • できるだけ興味深いテーマを問う: 機械学習・深層学習の分野では日々研究が進んで面白い結果が次々に出ているので、それに少しでも触れられるような課題を設定しているつもりです。今回の課題である Fast Gradient Signed Method という手法は、シンプルな手法でありながらランダムよりも遥かに強い攻撃手法であるという点で興味深いものだったと思います。
  • 時間が掛かりすぎないようにする: 学業に支障が出ると良くないので、実力が十分あれば1~2日程度で終わるような分量にすることを目標にしています。

提出されたコードは様々な観点から評価するようにしています。単に実装されたコードが正しいのかどうかだけではなく、コードが読みやすいものになっているか、単体テストなどの検証のためのコードが適切に書かれているか、他人がコードの追試をしやすいようになっているか、といった要素も考慮するようにしています。
実験ではコードを書いて動かしたら終わりではなく、手法がどの程度うまくいったのかを評価し、なぜそのような結果になったのかを考察するのが重要になります。特に、複数人で一つの課題に取り組む際にはそれら(評価・考察)を他のチームメンバーに共有することも大事になるでしょう。レポートでは結果の評価と考察ができているかを評価するようにしています。

これらの課題を見て PFN に興味を持っていただけた方は、ぜひ来年のインターンシップへ応募することを検討していただければ幸いです。また、PFN ではフルタイムの採用も通年で行っておりますので、こちらもご検討をよろしくお願いします。

分散深層学習を支える技術:AllReduceアルゴリズム

kfukuda

2018-07-10 11:49:43

本記事は、2017年インターンシップを経て現在はアルバイトとして勤務されている上野さんによる寄稿です

数式が正しく表示されない場合は、こちらのリンクから再読込をお試しください。


みなさんはじめまして。Preferred Networksの2017夏季インターンに参加し、現在アルバイトをしている上野裕一郎です。普段は東京工業大学でHigh-Performance Computingに関する研究を行っており、分散・並列計算に興味があります。

今回は、分散深層学習を行う際に使用されるAllReduceという通信パターンについて調査・実装・評価を行いましたので、それについてご説明いたします。

分散深層学習とは

現在、ディープニューラルネットワークを用いた学習には長い時間がかかることが知られています。そして、様々な種類のモデルや、大量のデータを組み合わせて学習を試すためには、学習にかかる時間を短縮する必要があります。そのために、多数のプロセスに分散して計算を行うことで、学習にかかる時間を短縮することを目的とするのが分散深層学習です。分散深層学習の詳細については、Preferred ResearchのChainerMN 公開に関する記事[1] をご参照ください。

弊社では、深層学習の研究開発や関連技術の迅速な実用化のために、スーパーコンピュータ MN-1 を運用しています。これは、民間企業のプライベートな計算環境としては国内最大級で、NVIDIA(R)製 Tesla(R) P100 GPUを1,024基、Mellanox(R) InfiniBand FDRを搭載しています。これを用いて、ImageNetの画像分類データセットを利用したResNet-50の学習を15分で完了することができました[2]。

しかし、このような多数のGPUを用いて効率的に計算を行うのは多くの困難が伴います。そのうちの1つとして、データ並列型分散深層学習において、GPU同士の通信にかかる時間がボトルネックとなっていることが挙げられます。

分散深層学習では、どのような通信が発生し、なぜ時間がかかるのか、もう少し詳しくご説明します。

分散深層学習におけるAllReduceの重要性

データ並列型分散深層学習では、異なるデータでモデルのパラメータでの損失関数の勾配を求めたあと、プロセス間で勾配の平均を求め、求めた平均を得られた勾配とみなして、モデルに適用を行います。この勾配の平均を求める操作として、多対多の通信を行う集団通信アルゴリズム:AllReduceが用いられています。

このとき、最もよく用いられているのが、NVIDIA社が提供しているNCCL[3] (NVIDIA Collective Communications Library)です。NCCLは、並列・高性能計算の分野の標準であるMPIと比較して、圧倒的に高速な通信を実現しています。前述のImageNet15分実験においても、NCCLが実現する高速通信は、記録の達成には不可欠なものでした。現在、ChainerMNでデータ並列型分散深層学習を実行するにあたっては、NCCLは必須のライブラリとなっています。

さて、NCCLの高い性能の秘密はどこにあるのか、社内でも多くのリサーチャーやエンジニアが興味を持ちました。今回は、実験的にAllReduce通信プログラムを作成し、最適化することによって、NCCLの性能にどこまで迫れるかを試してみました。

AllReduceのアルゴリズム

では、分散深層学習のスループットに大きな影響を与えるAllReduceについて詳しく見ていきます。
AllReduceとは、すべてのプロセスが持っている配列データを集約(Reduce)したうえで、すべてのプロセスがその結果を等しく取得する操作です。まず、総プロセス数を \(P\), そして、それぞれのプロセスには\(1\)から\(P\)までの番号\(p\)がついているとします。そして、各プロセス\(p\)が長さ\(N\)の配列\(A_{p}\)を持っているとしましょう。さらに、プロセスpが持つi番目のデータを \(A_{p,i}\) とします。このとき、最終的に得られる配列を \(B\)とすると、

$$ B_{i}~~=~~A_{1,i}~~Op~~A_{2,i}~~Op~~…~~Op~~A_{P,i} $$

となります。ここで、\(Op\) は2項演算子で、SUM(合計)、MAX/MIN(最大値/最小値)などがよく用いられます。つまり、ここでいう集約(Reduce)とは、配列の要素 \(A_{p,i}\) を、\(p=1,…,P\)までの全プロセスにわたって \(Op\)を用いて畳み込み計算することになります。分散深層学習においては損失関数の勾配の平均が必要であるため、勾配の要素ごとにSUMを用いて合計を計算します。以降では、集約操作に用いる演算はSUMだと仮定します。図1に、\(P=4\), \(N=4\)のAllReduceを実行する模式図を示しています。

図1. AllReduceの模式図

このようなAllReduce処理を実装する方法として、複数の方法が考えられます。

例えば、最も単純な方法として、代表となるプロセスを1つ決め、そこに全ての配列を集め、そのプロセスが全てのReductionを行い、計算結果を全プロセスに配布する、というアルゴリズムを考えることができます。しかし、このアルゴリズムは、プロセス数が増えると代表プロセスの通信量、Reduceの計算量、メモリ使用量がそれに比例して増え、処理量に不均衡があります。

このようにプロセス間の処理量に不均衡が存在しないよう、うまく通信や計算を全てのプロセスに分散させたアルゴリズムが提案されています。代表的なものとして以下のものが挙げられます。

  • Ring-AllReduce
  • Rabenseifnerのアルゴリズム[4]

本稿では、Ring-AllReduceアルゴリズムについて紹介します。NCCLも、Ring-AllReduceを用いて実装されています[5]。

Ring-AllReduce

まず、総プロセス数を\(P\), そして、それぞれのプロセスには\(1\)から\(P\)までの番号がついているとします。そして、各プロセスが図2のようにリングを構成するとしましょう。

図2. リングの構成例

ここで、プロセスpに着目して処理の流れを見ていきます。

まず、プロセスpは、自分の配列をP個に分割し、この分割された配列のp個目をチャンク[p]と表記するとします。そして、プロセスpは、チャンク[p]を次のプロセスp+1に送信します。この時、同時にプロセスp-1はチャンク[p-1]の送信を行っているので、プロセスpはこれを受信することができます(図3)。

図3. 各プロセスpがチャンク[p]を送信する

そして、プロセスpは、受信したチャンクに自分のチャンク[p-1]を足し込み(Reduceし)、計算結果を次のプロセスに転送します(図4)。

図4. 各プロセスがReduce後のチャンク[p-1]を送信する

これをP-1ステップ繰り返すことで、それぞれのプロセスが、Reduce済みのチャンクを1つ手に入れることができます(図5)。

図5. P-1ステップの繰り返しが終了し、Reduce済みのチャンクを1つ手に入れる

言い換えれば、各々のプロセスが、リングの上をまわるチャンクに、自分のチャンクを少しずつ足しこんでいきます。そして、チャンクがリングに沿って全プロセスを1度ずつ訪問した時点で、そのチャンクは、全てのプロセスのチャンクの集約の結果になっています。つまり、最終的には、それぞれのプロセスが、チャンクごとの集約の結果を1つ保持していることになります。

そして、それぞれのプロセスが持つ集約済みチャンクを、さらにリング上で一周回すことで、全てのプロセスが集約済みチャンクを全て取得でき、AllReduceが完了したことになります。

では、このアルゴリズムの通信量を、先程挙げた単純なアルゴリズムと比較してみましょう。

単純なアルゴリズムの場合、代表プロセスが受信するデータの量は、代表プロセスでない全てのプロセスからデータを受信する必要があるので、\((P-1) * N\)となります。その後、代表プロセスでない全てのプロセスにデータを送信する必要があります。これは、Pに対して代表プロセスの受信量が比例しています。

対して、Ring-AllReduceにおける1プロセスあたりの送信(受信)したデータの量は、以下のように求めることができます。最初に、P個に分割した配列をReduceしながらP-1回送信しました。そして、全プロセスにそのReduce済みチャンクを配布するために、P-1回送信しました。よって、1プロセスあたりの送信量はこの合計である \(2(P-1)/P * N\)となり、1プロセスあたりの送信量はPに関して定数であることが分かりました。

よって、2つのアルゴリズムを比べると、Ring-AllReduceは代表プロセスに集中していた送信・受信量を各プロセスにうまく分散させたアルゴリズムになっていることが分かります。このような特徴から、多くのAllReduceの実装でRing-AllReduceアルゴリズムが用いられています。

実装と最適化

Ring-AllReduceのアルゴリズムそのものは、GPU対GPUの通信を行う送受信関数を用いれば、簡単に実装することができます。Baidu社によるbaidu-allreduce[6]は、MPIのライブラリ上で実装済みの MPI_Send, MPI_Recv関数を用いてこれを実現しています。

今回は、MPIではなく、InfiniBandを直接扱うことができるInfiniBand Verbsを用いて実装し、より進んだ最適化を試みました。まず、InfiniBand、GPU、CPUのそれぞれのハードウェアリソースのアイドル時間を可能な限り削減して性能を引き出すために、アルゴリズムの処理をRegistration, Send, Reduction, Receive, Deregistrationなどのステージに分割し、パイプライン化を行っています。ここで、Registration, Deregistrationは、メモリ領域をDMAを用いて転送する際に必要な前処理、後処理を表しています。これらは、MPIを用いて実装すると、 分割してパイプラインに組み込むことができません。
さらに、配列を分割したものであるチャンクを、パイプラインの粒度をより細かくするために更に分割しました。また、メモリ確保は低速であることが知られているので、メモリプールを導入してコストを隠蔽しています。

性能評価

本稿で実装したプロトタイプ(PFN-Proto)の性能を、他の既存実装(詳細は付録に記載)と比較しました。比較対象を、スーパーコンピュータで広く用いられている通信ライブラリであるOpen MPI[7]、Baidu社によるbaidu-allreduce[6]、NVIDIA社によるNCCL[3]です。

なお、今回の我々のプロトタイプ実装は、ノード間通信に焦点を当てて開発しており、ノード内でのGPU間のDMA通信や共有メモリを使った通信最適化は実装されていません。実験では、1ノードに1プロセスを実行する条件でのみ測定しています。また、Open MPIについては、最新シリーズであるバージョン3.xではGPU Directに関係するバグがあり、弊社内ではまだ導入していないため、2.1.3を測定対象としています。

総プロセス数を8として、1ノードに1プロセスを起動することとし、256MBの配列のAllReduceをそれぞれ10回ずつ実行して測定を行いました。実験環境は、MN-1を用いています。実験環境の詳細は付録「実験環境」をご参照ください。図6に性能評価の結果を示します。

図6. AllReduceの実行時間の評価

この棒グラフは実行時間を示しており、低いほうが良い結果を示します。各棒は、それぞれのライブラリの10回の実行時間の中央値、エラーバーは実行時間の95%信頼区間を表しています。各実装の名前の意味、バージョンなどは、付録「比較対象ソフトウェア」をご参照ください。

まず、実行時間の中央値について見てみましょう。一番右側に示されているPFN-Protoが、最も高い性能を示しています。これは、ompi, ompi-cuda, Baidu, NCCLと比較して、それぞれ約82%, 286%, 28%, 1.6% 高速となっています。なお、グラフ上には示されていませんが、10回試行中の最速は、baidu-allreduceで0.097 [s] となりました。

次に、実行時間の分布について見てみましょう。中央値を基準にした実行時間の最大値と最小値は、PFN-Protoが +/-3%、NCCLが+/- 6%以内に収まっています。一方、baidu-allreduceは最大値が中央値の7.5倍という大きな数字となりました。これは、初回実行時に大幅に時間がかかるためです。なお、初回の試行を除いた最大値も中央値の+9.6%となっており、依然としてNCCLおよびPFN-Protoよりもばらつきが大きいことがわかります。

MPI、およびMPIをベースにした実装でこのように性能にばらつきが出る原因としては、MPIが内部で行っているメモリ領域の扱い方に関連していると推測しています。MPIは、InfiniBandによる送受信に必要となるメモリ領域の確保とRegistrationなどを抽象化したインターフェイスを提供しています。これにより、Ring-AllReduceの実装から、それらの発生タイミングを精密に制御することができないため、性能にばらつきが出ると考えられます。

関連研究

今回は、分散深層学習の中のAllReduce操作の高速化についてご説明しました。それ以外にも、分散深層学習の通信部分を高速化する方法として様々なものが考えられています。例えば、

  • 勾配の送受信を1イテレーション遅延させて、Forward, Backwardと通信をオーバーラップする方法(例:ChainerMNにおけるDouble Buffering[8])
  • データの浮動小数点精度を下げることによって通信量を削減する方法(例:ChainerMNにおけるFP16通信[8])
  • 勾配の値の重要度によって送受信するデータを間引いて通信量を削減する方法[9]

などがあります。特に、InfiniBandを持たないような環境(例えばAWS)では、このようなテクニックを用いることで学習を高速化することができます。

まとめ

本記事では、分散深層学習を支える技術である、AllReduceという通信パターン、特にRing-AllReduceという通信アルゴリズムについて説明しました。

そして、このアルゴリズムを実装し、今回の実験環境・実験条件では、NCCLと同等の性能まで最適化することができました。そのためには、InfiniBand Verbsを使用し、徹底的なパイプライン化を行うことが必要であったことが分かりました。これにより、高いハードウェアの性能と並行性を十分に活用することができました。これからも、より高速で、高い信頼性を持つ通信にはどのようなアルゴリズムやチューニングが最適か、調査・開発を進めていきたいと考えています。

ただし、今回の実装は、社内のクラスタを使用して開発・最適化しており、社内のクラスタのみに最適化された実装になっている可能性があります。それに対してNCCLは、幅広い環境で安定して利用できる高速な集団通信ライブラリであり、依然として、NVIDIA製GPUを用いて分散深層学習を行うためには、NCCLを使用するべきであると考えています。

謝辞

最後に、インターンの頃からメンターの方々やチームの方々には手厚いサポートをしていただきながら、大量の計算資源のもとでプロジェクトを進めることができており、非常に貴重な経験をさせていただいています。本当にありがとうございます。


おまけ:メンターより

上野さんのインターンシップメンターを務めています、PFN 大規模分散計算チームの福田(@keisukefukuda) です。今回は、NCCLの高い通信性能はどのように実現されているのだろうか?という疑問からスタートした実験的なプロジェクトでしたが、上野さんの高い技術力によってNCCLに近い性能を出すことに成功しました。

PFNでは、機械学習/深層学習そのものの研究だけでなく、ソフトウェアからハードウェアまで、広い分野で研究開発を進めています。

HPC・高性能計算に興味を持っている学生の皆さんは、ぜひ来年のPFNインターンシップへの応募をご検討ください(このブログ記事の公開時点では、残念ながら2018年の夏季インターンの募集は終わってしまいました)。

また、もちろん中途・新卒の人材募集も通年で行っています。興味のある方はぜひご検討ください!PFNの人材募集のページはこちら https://www.preferred-networks.jp/ja/jobs です。

参考文献

[1] 分散深層学習パッケージ ChainerMN 公開
[2] Akiba, et al., “Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes”
[3] NVIDIA Collective Communications Library
[4] Rabenseifner, “Optimization of Collective Reduction Operations”, ICCS 2004
[5] Jeaugey, “Optimized Inter-GPU Collective Operations with NCCL”, GTC 2017
[6] baidu-allreduce
[7] Open MPI
[8] ChainerMNのクラウド環境向け新機能とAWSにおける性能評価
[9] Tsuzuku, et al., “Variance-based Gradient Compression for Efficient Distributed Deep Learning”, In Proceedings of ICLR 2018 (Workshop Track)

付録

比較対象ソフトウェア

Implementation Version Note
MPI (ompi) Open MPI 2.1.3 CPUメモリからCPUメモリへの転送
(他の実装はすべてGPUメモリからGPUメモリへの転送)
CUDA-aware MPI Open MPI 2.1.3
baidu-allreduce (baidu) A customized version of baidu-allreduce, based on commit ID 73c7b7f https://github.com/keisukefukuda/baidu-allreduce
NCCL 2.2.13

実験環境

  • Intel(R) Xeon(R) CPU E5-2667 x 2
  • Mellanox(R) ConnectX(R)-3 InfiniBand FDR (56Gbps) x 2
  • NVIDIA(R) Tesla(R) P100 GPU (with NVIDIA Driver Version 375.20)

Emergence of Locomotion Behaviors in Rich Environment の追試

Manabu Nishiura

2018-06-29 10:48:38

1.内容紹介

はじめまして。PFNでSummer Internship 2017に続き、アルバイトをしている東京大学の西浦です。現在は駒場2キャンパスの先端研で神経科学・循環器系の数理モデルの研究をしています。

さて、2017年の春頃、DeepMindから”Emergence of Locomotion Behaviours in Rich Environments”[1]という論文が公開され、その動画が話題になりました。しかし、この論文では公開されている情報が限られており(深層学習分野でよくあることなのですが)、実験環境の設定、ネットワークの構成や学習に必要なパラメータで不明なものが多く、論文の結果を再現するためには不明な部分を推定するために多くの組み合わせを試す必要がありました。そのため、このような実験の再現は深層学習の実践的な知識と学習のための大規模なリソースが必要とされ、個人で行うのはなかなか難しいと思います。今回はその論文をChainer FamilyのひとつであるChainerRLを利用して再実装し追試を行い、その結果として様々な知見が得られましたのでご報告させていただきます。

Emergence of Locomotion Behaviors in Rich Environmentsの元動画

2.元論文の概要

強化学習のパラダイムは、原理的には単純な報酬のみから複雑な振る舞いを学習することができるようになっています。しかし実際は、意図した振る舞いを学習させるためには、報酬関数を慎重にチューニングすることが一般的です。この論文では、報酬はなるべく直感的な構成で固定してしまい、学習に使う環境(タスク)を様々な種類用意して、エピソードごとにランダムにその環境を変更するというアプローチが採用されています。これにより、様々な環境に対してロバストで、複雑な行動を獲得させようということをモチベーションに実験が行われています。

アルゴリズムとしては、方策勾配法(Policy Gradient)をベースにして、現在の方策に近い方策へと徐々に更新していくProximal Policy Optimization(PPO)[3]を用いています。PPOは論文公開当時では一番性能の良い強化学習のアルゴリズムだったのでそれが採用されていて、論文には同じく性能のよいTrust Reigion Policy Optimization(TRPO)[4]との比較もされています。

3.アルゴリズム、実験手法の解説

前提知識

まず強化学習のフレームワークについて説明します。強化学習では環境とエージェントというのがあり、エージェントが環境に対して行動をし、環境はそれを受けてエージェントに対して観測と報酬を返すという枠組みになっています。エージェントは、報酬に基づいて行動を決定するためのルール「方策(Policy)」を学習していきます。この論文では、ロボットなど連続値の行動を扱いやすい方策勾配法を採用しています。方策勾配法ではActor-Criticモデルという、エージェントをActor(行動器)とCritic(評価器)でモデル化し、例えばそれぞれをニューラルネットワークで表現します。また、エージェントがActor-Criticモデルだと、例えば、Actorのネットワークを決定しているパラメータが方策に該当します。Criticは、現在の方策の元である状態がどれだけの価値を持つかを表す価値関数(ある状態以降の報酬の期待値に割引率をかけたものが一般的)でモデル化されます。

 

実験環境としては、物理エンジンのMuJoCo [2]と強化学習のフレームワークであるOpenAI Gym [5]を用いています。代表的なものとしては、Planar walker(またはWalker2d)と呼ばれる二次元平面内でエージェントに二足歩行を行わせるモデルが挙げられます。Planar walkerの場合、それぞれのエージェントは各関節を曲げるトルクにより行動を表現することになります。また、エージェントが環境から受けとる観測は、大きく内部状態と外部状態に分けられ、各関節の角度、角速度、位置、接触、トルクセンサ情報などを内部情報、地形の高さ情報を外部情報として受け取っています。報酬はPlanar walkerの場合だと以下のように設計されており、基本的には前に進むと報酬がもらえ、それに加えて姿勢のペナルティー(負の報酬)などが含まれています[1]。

Planar walker [4]

今回追試したアプローチでは、方策を決定するネットワークは内部状態と外部状態を別々に処理して最後に合わせて処理して、行動の次元個分、平均と分散の組を指定した正規分布を確率的方策としてを出力する構成になっています。

アルゴリズム

ここで、追試で使ったTRPOとPPOの二つのアルゴリズムについて解説します。まず、ベースになっている方策勾配法は、目的関数(原則としては現在の方策による期待値を用いる)を方策のパラメータに関して微分し、得られた勾配方向にパラメータを更新する方法です。目的関数を計算するために、現在の方策で行動して、その系列データを貯めること(一般化方策反復)を行います。しかし、方策の更新には慎重になる必要があり、一度方策が劣化してしまうと、それから後に得られるサンプル系列も悪化してしまい、持ち直すのが難しくなるという問題があります。

そこでTRPOは、方策の更新に制限をかけながら更新していきます。具体的には、KLダイバージェンスを使って信頼領域(trust region)を定義して、その信頼領域を超えないように、制約条件つきの最適化問題を解くことにより方策のパラメータを更新します。これにより方策の分布として大きな変化を抑制することができて、方策の大きな劣化を防ぐことができます。TRPOが二回微分を計算するので、計算量が多いことを踏まえ、PPOはTRPOの制約条件を目的関数に含めて非厳密化することで、TRPOより単純で軽い計算量でそれなりの性能を発揮するアルゴリズムになっています。

具体的には、方策を \(T * N\) time steps走らせて(Nはスレッドの数)集めた \(s_t\) ,\(a_t\), \(r_t\) を用いて \(A_t\)(アドバンテージ)を計算し、\(L^{CLIP} \)を前の方策と新しい方策の比率を \(\pm \epsilon\) 内にクリップして勾配方向にパラメータを更新していきます。方策のネットワークと価値関数のネットワークでパラメータを共有する(最後の出力層のみそれぞれのパラメータを使う)なら、方策と価値関数のネットワークを独立に更新できないので、目的関数に価値関数の誤差項を加え、探索の幅を増やしたければ、エントロピーボーナスを加えることもあります。(最終的な目的関数は \(L^{CLIP+VF+S} \))ここで登場するアドバンテージとは、収益(報酬の期待値)からベースラインを引いたもので、勾配の推定値の分散を減らすためのテクニックです。それぞれの計算式を以下に示します[3]。

元論文ではPPOをさらに分散版にしたものを使っています。追試としては、PPOで方策ネットワークと状態価値関数にLSTMを含んだものと、TRPOを用いましたが、1スレッドの場合では、TRPOの方がかなり性能がよかったです。したがって、以下の結果は全てChainerRLのTRPOで学習させた結果となります。

実験手法

追試としては2通りの環境で訓練しました。一つ目は元論文の動画に近い3種類のタスクがある環境で、もう一つは地形の凸凹の状態がランダムに変わるものです。

元論文に近い環境では、Planar Walkerを①箱を飛び越えるタスク、②穴を飛び越えるタスク、③浮いている板を避けるタスクの3種類の環境で順番に訓練した後、3種類の環境(タスク)がランダムにエピソードごとに切り替わる環境で訓練します。

地形の凸凹の状態がランダムに変わる環境では、エピソードごとにすべての地形が変わる中で訓練します。

4.結果

学習し始めのエピソードごとにランダムに地形が変わる中で試行錯誤している様子

学習後歩いている動画

こちらでは、学習初期段階からランダムに地形を変更していたためか、とにかく脚を高く上げて、どんな障害物でも越えられるような動きになってしまったようです。

動画に示した歩行行動を獲得するまでの学習曲線を上に示します。10,000ステップごとに10エピソード走らせて評価を行なっており、青のrewardは10エピソードの平均累積報酬で、上下の灰色の線は10エピソード内での最小値最大値になっています。200万ステップほどで収束していることが分かります。

 

元論文に近い環境で学習後歩いている様子

障害物によって頭を下げたり、ジャンプする高さが変わったり、動きが変わっていることが見て取れます。一つ目と二つ目の動画ではPlanar walkerの関節の減速比のパラメータが違っていて、このような微妙な差でも獲得される動きに違いが出てしまいます。

 動画に示した歩行行動を獲得するまでの学習曲線を上に示します。歩く動作は120万ステップほど、穴を飛び越える動作は800万ステップほど、浮いている板を避ける動作は400万ステップほどで学習が収束していることが分かります。

タスクによって報酬の平均がそこまで変動していないものもあり、歩く動作を獲得した状態から箱を飛び越える動作の獲得にはそれほど学習が必要ではないが、箱を飛び越える動作を獲得した状態から穴を飛び越える動作を獲得するのと、箱を飛び越える動作を獲得した状態から浮いている板を避ける動作を獲得するためにはかなり学習が必要であることが分かります。

元論文では適切に実験設定が考えられていて、カリキュラムラーニングになっていたために、タスクに応じて行動をうまく切り替えられるようになっていましたが、ただ単に地形やタスクをランダムに変えるだけでは、どんな環境にも対応するような方策を獲得してしまうようです。

5.考察

問題点の一つに、初期条件を注意深く設定しないと意図した学習結果になりづらいという問題があります。今回の場合も初期の状態変数の分散や、地面とMuJoCoのモデル(Planar walkerなど)との高さ方向の相対的な位置は学習の様子をみながら調整することが必要でした。具体的に注意した点としては以下のような点が挙げられます。

  • ある程度初期状態に分散がないと、分散の範囲で実現できる行動になってしまう。(逆に分散が大きすぎても学習がうまく進まないことがある)
  • 環境をリセットした時に何ステップ分フレームをスキップしてから指令を出し始めるか、によって獲得されるモーションが変わってくる。(例えばMuJoCo環境内で、完全に地に足が着いてから指令値を出すようにした、など)
  • 歩行を獲得させる場合、学習の過程で最初に獲得されるのはその場に立っているという方策なので、初期位置の周辺はなるべく平らな方がよさそう。

その他にも、下記の記事[6]に現状の深層強化学習の課題はよくまとまっているので、ぜひ読んでいただきたいです。(方策を更新していくために特定のアルゴリズムを採用しても、報酬関数、方策を表現するネットワークのパラメータなどは自分で任意に決定する必要があり、設定する報酬によって獲得される方策がかなり変わってしまうという問題など。)

 

失敗例の動画

けんけんを獲得している動画(初期化した時の相対的な高さの問題で、片足を前に出す方策を獲得できなかった例、初期状態の分散はうまくいった例と同じ)

6.PFNインターンの感想

ある仮説を検証するのに、「ある実験系でやってみて上手く行かなければもっと単純化した系でやってみる。」という、研究の基礎的なプロセスの体験ができたのはとてもよかったです。また、ロボティクス関係の様々な研究を知ることができ、そこで研究している人たちとの繋がりができたのは一番大きな収穫だったかもしれません。最後に、情報交換の重要性も強く意識することができました。有名なライブラリやパッケージの使い方(インストールで苦戦するものなど)や、こういう手法を試したけどいまいちだった、ハイパーパラメータの情報など、公開されていなけど実験をしていく中では欠かせない情報などを共有できる環境が、とてもありがたいなと感じました。

元論文の情報が結構少なく、なかなか学習が進まず進捗が出ずに精神的に辛い時期もありましたが、様々な方に積極的に相談するようになってからは比較的スムーズに乗り切ることができたように思います。最後になりましたが、ご指導いただいてるメンターの皆様をはじめ、社員の方々に感謝を表して報告を終わらせていただきたいと思います。

参考文献

[1] “Emergence of Locomotion Behaviours in Rich Environment” https://arxiv.org/abs/1707.02286v2

[2] MuJoCo advanced physics simulation http://mujoco.org/

[3] “Proximal Policy Optimization Algorithms” https://arxiv.org/abs/1707.06347

[4] “Trust Reigion Policy Optimization” https://arxiv.org/abs/1502.05477v5

[5] OpenAI Gym https://gym.openai.com/docs/

[6] “Deep Reinforcement Learning Doesn’t Work Yet” https://www.alexirpan.com/2018/02/14/rl-hard.html

 

DNN推論用ライブラリ「Menoh」リリースについて

Shintarou Okada
エンジニア

2018-06-21 11:41:46

Python以外も使いたくないですか?  特にDeepLearning界隈で.

Menoh開発者の岡田です.この記事ではMenohの紹介と開発に至った動機について説明します.

Menohのレポジトリ: https://github.com/pfnet-research/menoh

Menoh(メノウ)は学習済みのDNNモデルをONNX形式から読み込んで動作させる推論専用のライブラリです.実装はC++で書きましたが,C言語のインターフェースを持たせて,他の言語用からもその機能を呼び出しやすくしてあります.リリース時点でC++版ラッパーとC#版ラッパー,Haskell版ラッパーがあり,Ruby版ラッパーとNodeJS版ラッパー,Java(JVM)版ラッパーが開発中です.バックエンドにはIntelの開発しているMKL-DNNを採用し,GPUが無くてもIntel CPUが使える環境で高速にモデルの推論が可能になっています.Menohを使えばChainerで学習したモデルをPython以外の言語で実装したアプリケーションに瞬時にデプロイすることが可能です.

ところでなぜDeepLearning界隈で覇権を握ったのがPythonであって,Rubyじゃなかったんでしょう? Rは? Perlは? C++は? プログラミング言語は数多くありますが,どの言語も今のPythonのように広くDL用学習フレームワークを記述するために利用される可能性はありました(もちろん言語ごとに用途の向き不向きがあって,可能性の大小はあったにせよ).我々の宇宙ではPythonが覇権を握りましたが,どこか別の宇宙ではLispが覇権を握ることもきっとあったでしょう.とは言え,我々は我々の宇宙に生きるしかなく,今日そのディープなんとかを実装するには甘美な()や{}やbeginendから離れて空虚なインデントでブロックを記述する必要があります.このことについて,なんと悲しいことかと手放しに言い切れれば良かったんですが,皆さんご存知の通り,Pythonは良い言語です.

そう,Pythonは良い言語です.豊富なライブラリ,特にNumpyが使えること,動的型付けであること,GC機能が搭載されていること――どれもがDNNを実装したり学習させたりするコードを試行錯誤しながら書くという作業をやりやすくしてくれます.もちろんChainerはPythonで記述されており,改造・拡張しやすいDNN学習フレームワークとなっています.ChainerはそのDefine-by-Runという魔法によってすばらしく使いやすい.このDefine-by-Runをもっと別の言語で実装することも出来たと思いますが,コードはより複雑に,その作業はもっと苦痛の伴うものになっていたでしょう.明らかにChainerの使い勝手の良さの一端はPythonという言語そのものが担っています.

我々にとって,DNNについて研究する作業というのは地獄ではありません.Pythonの使い勝手の良さに裏打ちされたChainerがあるからです.手軽にDNNモデルを記述して学習を回せる.素晴らしいことです.地獄なのは学習したDNNモデルをデプロイする作業です.

地獄というのは言いすぎかもしれません.Pythonがデプロイ先の環境で使えるならChainerをそのまま使えばよく,首尾貫徹して苦痛はどこにも(少なくともデプロイ作業には)ありません.でもPythonが使えない環境はどうでしょうか.研究室の外に出ると,セキュリティや計算資源的な問題などでPythonが使えない環境や,分野によっては別の言語が覇権を握っていてPythonではそこにある資産を利用できない状況というのは山ほどあります(例えば,Web界隈では今でもRubyに根強い人気があります).現在でもDLフレームワークの中には設計がデプロイまで意識されたものや,Pythonを使わずにCやC++などでDNNを記述できるものもありますが,大掛かりだったり,あまりに実装が剥き身すぎて使いづらかったりします.現状はDNNの学習については広く知見が行き渡っているのと比べて,まだまだDNNのデプロイについては発展途上であると言えます.

ただ学習したモデルを自分のアプリケーションに組み込みたいだけなのにそれがなかなか難しい.

以上が私がMenohの開発を始めた動機です.

MenohはPFNが社内で定められた20%ルールの下でのプロジェクトの成果です.20%ルールとは「PFNメンバーは公式にアサインされたタスクとは別に20%の時間を各自の好きなタスクやプロジェクトに充てても良い」というもので,Menohプロジェクト以外にも様々な個人やチームのプロジェクトや勉強会が進行しています.

MenohはChainer Advent Calendar 2017で開発した「Instant」というライブラリが元になっています.20%の時間を使って,Instantの機能を拡充していく中で,設計の助言をしてくれたり,他の言語のラッパーを書いてくれたりするメンバーが現れて,そうした自発的に協力してくれたメンバー達のお陰でInstantはMenohに名前を変えて実験的なプロダクトとしてpfn-researchにてリリースするに至りました.これからも20%の時間を使って開発は継続していく予定なので,ぜひ利用してもらって,バグや要望等あればどんどんIssueに投げていただければと思います.

Preferred Networks における研究活動

秋葉 拓哉
リサーチャー

2018-06-08 14:36:39

こんにちは、新しく執行役員兼 Chief Research Strategist に就任した秋葉です。就任の挨拶を兼ねて、PFN における研究活動に関する考えを共有したいと思います。

PFN における研究とは何か?

何が研究であり何が研究でないかという境界を引くのは非常に難しく、またそれを積極的に行う意味もありません。研究とは「研ぎ澄まし究めること」を語義とし、一般に、物事について深く調査・考察を行い事実を解明したり発明を行ったりすることを指します。

PFN では挑戦的であり不確実性の高いプロジェクトが大部分を占めており、ほぼ全てのプロジェクトが少なからず研究的側面を伴います。深層学習関連のコア技術の研究開発は勿論、その応用に関してもデータやタスクに応じた適切な手法の選択や非自明な工夫がなければ上手くいかないことが殆どです。また、ロボティクス、コンピュータビジョン、自然言語処理等のような多分野の技術を組み合わせることにより新たに出てくる課題もあります。それに加えて、クラスタの設計やそのリソース管理、及びディープラーニングフレームワークに関しても、深層学習特有の要求を満たし、便利かつ高性能にするために、多くのことを考え試行錯誤をしています。

そのような中でも、特に研究的側面を強く持つプロジェクトには、以下のようなものがあります。

  • 論文となるような学術的研究
  • デモンストレーションの制作と展示
  • コンペティションへの参加
  • 社会での未解決問題の解決

このような分野でも、既に素晴らしい成果が出ています。論文に関しては、ICML, CVPR, ACL, CHI など、幅広い分野のトップ会議に論文が継続的に採択されるようになりました。また、数が増えているだけでなく、ICRA’18 にて論文が Best Paper Award on Human-Robot Interaction を受賞したり、ICLR’18 にて論文が Oral に選ばれたりと、世界的に極めて高い注目を集める論文を出すことに成功しています。デモンストレーションとしては、CEATEC 2016 や ICRA 2017 等で制作したものを展示しました。コンペティションとしても、Amazon Picking Challenge 2016 や IPAB 創薬コンテスト等で優れた成果を残しています。

PFN はなぜ研究をするのか?

PFN のような企業で、今すぐ直接お金に結びつかないような研究をする意味はあるのでしょうか?例えば、論文を書こうと思えば貴重な業務の時間をごっそりと使ってしまうことになるし、それを出版すれば社外の人たちに技術を教えてしまうことになります。こう考えると、学術的研究や論文執筆は、会社にとってマイナスの活動のようにすら見えます。

実際には、PFN においてそのような研究活動は極めて重要視されており、今後もなお重点的に強化を行っていく予定です。コンピュータや AI 分野のビジネスでは、しばしば「Winner takes all」といったことが言われます。このような領域では、ビジネスに国境がなく、中途半端では生き残ることはできません。世界でトップクラスの技術を持ちリードを保ち続ける必要があります。従って、我々は、研究活動を通じ技術力を中心とした競争力を持ち続けることがビジネス上で極めて重要だと考えています。また、現実的には、優れた特許ポートフォリオを構築するといったことも重要です。

また、「よそから出てくる論文の実用化に注力する方が効率的ではないのか?」という疑問もよく聞きます。しかし、論文が出てきて我々の目に止まるタイミングでは、世界のトップは必ずもっと進んでしまっています。そして、論文を読んで得られる情報はかなり限られており、試行錯誤したり著者に問い合わせながら再現に成功したり、他のデータセットへの適用を通じて論文に書かれていない手法のネガティブな性質について把握したりするのには、さらにかなりの時間がかかります。パーソナルコンピュータの父として知られるアラン・ケイの「未来を予測する最善の方法は、それを発明することだ」という言葉は、実際にいくつかの分野で世界をリードしたりトップに迫ったりといった成果を出すことができている我々にとって、大きな実感があります。

更に、単に社内で研究を行うことだけでなく、成果をコミュニティに発表し還元することも重要視しています。一つには国内外でのプレゼンスを得るという目的もあります。それに加えて、我々の発表した技術に基づいた研究や我々の発表に触発された研究が社外でも行われることにより、トータルで考えて我々に必要な技術の発展が加速されると考えています。そのため、OSS としてソフトウェアを公開したり、研究に使ったコードやデータなども積極的に公開しています。また、アカデミックなコミュニティへ貢献するため、学会や論文誌の査読も業務で行えるようにしています。

どのような研究を推進していくのか?

深層学習を中心として、コンピュータビジョン、自然言語処理、音声認識、ロボティクス、コンパイラ、分散処理、専用ハードウェア、バイオインフォマティクス、ケモインフォマティクスといった、幅広い分野での研究を行っており、これを以下のような理念に基づき強化していきます。

正しくクレイジーに

全ての研究は現在だけでなく未来を見据えて行われるべきです。研究の価値も、今の常識だけで判断するべきではありません。「そんな計算が重い方法は実用的じゃないよ」といったことや「今はそんな処理したい人いないよ」といったことは、必ずしもネガティブではありません。例えば、我々は昨年、1024 台の GPU を用いた分散処理により画像認識モデルを高速に学習するというプロジェクトを成功させ、世界的に大きな注目を集めました。達成した速度が常識外れだっただけでなく、1024 台の GPU を一度に使うと言った実験の規模自体も常識外れでした。1024 台の GPU を使って日常的な学習を行うといったことは現実的ではないかもしれません。それでは、このような研究の価値は無いのでしょうか?

計算機は未だに速くなり続けています。特に、深層学習に関しては、専用チップの開発も盛んです。OpenAI の調査によれば、深層学習の大規模なトレーニングで使われる計算力は、3.5 ヶ月で倍という急速なペースで上がっています。今は馬鹿げた計算力に見えるそのような設定も、数年のうちに当たり前のように使える状況が来る可能性は高いでしょう。未来を見据え、そのような状況では何が起こるのかといったことを知り、そこでの課題を解決したり新たにできることを模索したりといったことに早く乗り出すことは、非常に重要だと考えています。1024 台の GPU を用いた上述の実験はその第一歩であり、プライベートスーパーコンピュータと並列分散計算チームを持つ強みを活かしながら、大規模な実験を促進し、このような規模での実験を当たり前のように感じられるぐらいの環境を作りたいと考えています。

世界とグラウンディングする

全ての研究は何らかの意味で世界の最先端を目指すべきです。技術力は、世界的にリードを持つことにより大きな価値に繋がります。社内だけでなく、積極的に外を向き、論文が世界的に高く評価されたり、世界的なコンペティションで高い順位を取ったり、注目を集め講演に呼ばれたり、といったことを目指すべきだと考えています。実際には、全ての研究プロジェクトで世界をリードするようなことは難しいかもしれません。しかし、世界トップをしっかり意識し目指すことで、自分たちの相対的な位置を知ることができます。

また、世界的なコミュニティに食い込むことも非常に重要です。社外の世界トップを走る人たちと知り合いになり、無視できない存在だと認識してもらうことで、有益な情報の交換ができます。そのためにも、外部発表を推奨しており、貢献をしたメンバーの顔がしっかり外に出るようにしています。

積極的に展開する

全ての研究は小さく閉じこもることなく積極的な展開を目指すべきです。例えば、研究を論文にすることは非常に重要なマイルストーンですが、それは完成ではありませんし、それだけを目標にするべきではありません。深層学習では共通の技術が異なる応用分野を跨がり力を発揮することがあります。PFN には幅広い分野に取り組む人がいるという利点を活かし、研究のスコープを狭く捉えず、人を巻き込み、幅広い展開を目指してほしいです。また、新たなソフトウェアを開発したり社内のソフトウェアにフィードバックしたりして人が利用できる形にすることも可能であれば検討するべきです。社内での実務に成果を還元できれば素晴らしいでしょう。トップ会議への論文採択数は重要視していますが、一方で、論文の本数や論文が採択された会議のランクのみから研究開発活動を評価することはしないつもりです。

もちろん、全てを自分でやる必要はありません。世界のトップレベルに食い込んでいくためには、自分の能力的な強みとモチベーションを存分に発揮することが必要です。従って、自分が持っていない能力は積極的に人に頼ることも検討するべきです。これは技術領域のみでなく、研究のまとめ方に関してもです。せっかく面白い研究開発をやっていても、論文執筆の経験を持たないためどうやって論文にしていいか分からなかったり、誤解が原因で学会投稿で過小評価され採択に繋がらないこともあります。論文の執筆方法や徹底したサーベイ、正しい比較実験の仕方などについて、基礎研究で活躍してきた研究のベテランが社内に多く存在することを活かしていけるようにしたいと考えています。

PFN で研究開発をする魅力は?

リサーチャー・エンジニアとして PFN における研究開発に携わる良さとは何でしょう?

最も魅力的な点の 1 つは、PFN の対象とする深層学習を中心とした技術領域の特徴として、個人及び組織的な卓越した技術力が、本当に必要とされており、非常に重要であるということです。個人としても組織としても技術力の差が成果に反映されやすいという意味で、高い技術力を持つことが高い価値に直接的につながります。個人として高い技術力を持つこと、そしてチームとしてさらなる力を発揮することが非常に高く評価されます。これは、技術力に自信を持つ人や、技術力の向上にモチベーションを持つ人に、とても良いことであると感じます。

取り組み方が非常にフレキシブルな点も魅力だと考えています。100% の時間をピュアな基礎研究に費やすメンバーも今では複数人いてチームも構成しており、増強していく予定です。一方で、実務的な課題にも触れながら研究活動を行っているメンバーも多数います。また、アカデミアとの共同研究も積極的に行われていますし、社会人博士としてパートタイムで大学院に通い専門性を磨くメンバーもいます。

研究開発活動を促進するための社内制度にも気を使っています。会社がメンバーを信頼して大きな裁量を与え、足りない社内制度や資産があればフレキシブルに対応するなど、新しいチャレンジを積極的に支援しています。例えば、20% ルールにより、全てのメンバーは 20% までの時間を自分の裁量で使うことができます。これにより、誰でも思いついたアイディアをすぐに試すことができます。強いモチベーションやユニークなアイディアを持つ取り組みがボトムアップに出てくることを期待しています。

PFN が取り組む深層学習を中心とした技術領域では、アルゴリズムからソフトウェアフレームワーク、研究支援ミドルウェア、そしてハードウェアまで、その全てが重要になってきます。深層学習、強化学習、コンピュータビジョン、自然言語処理、バイオインフォマティクス、高性能計算、分散システム、ネットワーク、ロボティクス、シミュレーション、データ解析、最適化、異常検知といったような幅広い専門を持つ人が社内の近い位置にいて、気軽に情報交換ができる点もとても魅力的だと思います。分からない事柄について教えてもらったり、実務上出てくる問題を交換したり、一緒に研究に取り組んだりすることができます。

終わりに

最後に、少し個人的な抱負を書かせてください。今回、執行役員兼 Chief Research Strategist という身に余る大役を頂戴しました。能力面でもそれ以外でも心から尊敬できるメンバー達が素晴らしいチームとなり活躍しているこの会社で、私なんかにこのような大役が務まるのかという不安もあり、引き受けていいものか迷いました。

私は前職ではアカデミアでの研究者でしたが、企業での研究にも学生時代から興味を持ち、海外の企業研究所でのインターンにも複数回参加していました。その中で一度、インターン期間中にレイオフが起こり、自分のメンターも含めてその研究所に所属していた全研究者が解雇になるという様子を目の当たりにしたことがあります。企業での研究を意義あるものに保つ難しさを実感しました。

そのような経験を踏まえて考えても、私は PFN は企業として研究活動をするべきだと思います。それを健全な状態に保ち価値に繋げるのは決して簡単なことではないと思いますが、そのような部分にもし私の色々な場所での経験や考えを活かして貢献できるのであれば、それは非常に刺激的かつ意義のあることだと感じ、新たなポジションで頑張ってみることにしました。

また、研究とエンジニアリング、深層学習と分散計算など、複数面の得意分野を融合させることのできる自分の強みや、勝ちにこだわり戦略を練り遂行できる自分の強みを、今後はより広範囲で活かしていければと考えています。

PFN では、このような研究開発活動に興味を持ち一緒に取り組んでくれるメンバーをリサーチャー・エンジニアとして募集しています

オープンソースの深層学習フレームワーク Chainer アマゾン ウェブ サービスが公式にサポート

Shingo Omura

2018-06-01 12:02:14

深層学習フレームワークの Chainer は、アマゾン ウェブ サービス(AWS) の協力により、多数の AWS アプリケーションで利用できるようになりました。Chainerは、ニューラルネットワークを簡単に扱える Pythonのフレームワークですが、AWSと組み合わせる事で、マルチ GPU やマルチサーバーにおける Chainer の並外れたスケーリング能力を最大限活用できます。Chainer の非常に優れたスケーリング能力については、ImageNet-1K を利用した ResNet50 の学習を、それまで最速とされた Facebook の記録より4倍速い15分で完了した事により実証済みです。

Chainer のマルチ GPU とマルチサーバーのスケーリングにより、必要時に必要量の計算資源を提供するというクラウドの利点を有効活用できます。Chainer の比類なき並列計算能力と AWS のオンデマンド型クラウド資源を併用すれば、費用を最小限に抑えながら、ハードウェアの制約がある環境下と比べて、非常に短時間で複雑な深層学習モデルの学習が可能になります。

Chainer は、AWS 深層学習 AMI(AMI)ですでに利用可能となっていますが、Chainerが最新の CloudFormation スクリプトをリリースした事により、一度に複数のChainer AMIを容易にデプロイできるようになりました。また、ChainerはAWS上で32 GPUまでのスケーリング効率95%を達成する事を確認済みで、これはニューラルネットワークの学習を最大30倍高速化できる事を意味します。

データの前処理やハイパーパラメータの調整、ならびにニューラルネットワークのデプロイといった作業の簡素化を目的として、Chainer は Amazon SageMaker でもサポートされるようになりました。Amazon SageMaker は、開発者やデータサイエンティストが、機械学習モデルをあらゆる規模で、迅速かつ簡単に構築、トレーニング、デプロイできるようにする完全マネージド型プラットフォームです。SageMaker で Chainer を使用すれば、SageMaker が持つデプロイ上の利点に加え、並列化により速度が向上します。

上記に加えて、Chainer は AWS Greengrass でもサポートされるようになりました。AWS Greengrass は、接続されたデバイスでローカルのコンピューティング、メッセージング、データキャッシュ、同期、ML 推論機能を安全な方法で実行できるようにするソフトウェアです。Amazon SageMaker と組み合わせる事で、SageMaker でのモデル学習時や、AWS Greengrass でIoTデバイスへ直接デプロイする際に、Chainer の利便性とスピードを活用できます。

Chainer チームは AWS による今回のリリースを大変うれしく思うと同時に、進化し続ける深層学習技術のさらなる発展に貢献する事を目指します。

AWS CloudFormationを使ったChainerMNの実行

Shingo Omura

2018-06-01 11:58:13

※本記事はChainer Blogの日本語訳です。

AWS CloudFormationInfrastructure As Code の実践を助けてくれるAWSサービスで、幅広いAWSリソースを、宣言的に設定ファイルに記述し、その設定ファイルから、AWS上のインフラストラクチャを自動的に生成したり、再生成できます。それによってAWS上のインフラストラクチャを手作業を自動化できます。

分散深層学習向けのインフラストラクチャの構築の作業負荷も大幅に軽減できます。EC2インスタンスを起動したり、必要なライブラリをインストール・設定したり、計算/通信性能の最適化設定を行ったりする作業を軽減できます。特に、ChainerMNにおいては、MPIクラスタを構築することが必要です。AWS CloudFormationはこの構築作業を自動化することができます。

本日、Chainer/ChainermNがプリインストールされたAMIChainerMN向けのクラスタを自動的に構築するためのCloudFormationテンプレートを公開しました。

この記事では、これらの利用方法とともに、自動構築されたクラスタ上でのChainerMNの実行方法について説明します。

 

Chainer AMI

Chainer AMI には Chainer/CuPy/ChainerMN, ChianerCV, ChainerRLといったChainerライブラリ群と CUDA-aware OpenMPI ライブラリがプリインストールされていいます。そのため、このイメージを利用すればGPUを搭載したAWS EC2 インスタンス上で簡単に高速に深層学習が実行できます。このイメージはAWS Deep Learning Base AMIを基にビルドされています。

Chainer AMIの最新バージョンは0.1.0で、同梱されているライブラリ群のバージョンは次のとおりです:

  • OpenMPI 2.1.3
    • CUDA 9向けにのみビルドされています
  • Chainerライブラリ群 (python, python3 両方の環境にインストールされています)
    • CuPy 4.1.0
    • Chainer 4.1.0
    • ChainerMN 1.3.0
    • ChainerCV 0.9.0
    • ChainerRL 0.3.0

 

CloudFormation Template For ChainerMN

このテンプレートは Chainer AMI を使って ChainerMN クラスタを自動的にAWS上に構築します。構築されるインフラストラクチャの概要は下記のとおりです。

  • クラスタが配置される VPC と Subnet (既存のVPC/Subnetを設定可能)
  • MPIプロセス起動時に利用するephemeralなssh鍵をクラスタ内で共有するための S3 バケット
  • クラスタが配置されるプレイスメントグループ(ネットワークスループット/レイテンシを最適化するため)
  • ChainerMNクラスタ
    • 1 台の マスター EC2 インスタンス
    • N (>=0) 台のワーカーインスタンス(AutoScalingGroup経由で起動されます)
    • MPIジョブ実行用の chainer ユーザ
    • MPIジョブ実行用の hostfile
  • (オプション) Amazon Elastic Filesystem (既存のFilesystemを設定可能)
    • このファイルシステムは各インスタンスに自動的にマウントされれます
  • 各種Security Group および IAM Role

Chaainer CFNの最新バージョンは0.1.0です。詳細なリソース定義についてはリリースされているテンプレートを参照してください。

先日公開した ChainerMN 1.3.0のブログで述べられている通り(英語)ChainerMN 1.3.0 の新機能である、ダブルバッファリング、 半精度浮動小数点数による All-Reduce を使えば、Infinibandが利用できないAWSであっても、ほぼ線形のスケーラビリティを期待できます。

 

CloudFromationテンプレート を使った ChainerMNクラスタ構築

ここでは、CloudFromationテンプレートを使ってChainerMNクラスタを構築する方法をstep-by-stepで説明します。

まず、下記のリンクから CloudFormationのページを開いて「次へ」をクリックしてください。

launch stack

「詳細の指定」画面では、スタック名、VPC/Subnet、クラスタ、EFSといった各種設定を入力できます。下記は 4 台の p3.16xlargeインスタンス(8 NVIDIA Tesla V100 GPUs/インスタンス) によって構成される ChainerMNクラスタを構築する設定例です(VPC, Subnet, EFS等はすべて新規作成)。

最後の確認画面では、Capabilities セクションにある、IAM Roleに関する同意をチェックする必要があります。この CloudFormation テンプレートではクラスタ内インスタンスに割り当てるためのIAM Roleを作成するためです。

しばらして、CloudFormationスタックの状態が CREATE_COMPLETE に遷移したら、クラスタは構築完了です。 スタックの出力セクションの ClusterMasterPublicDNS にマスターインスタンスの Public DNS が表示されます。

 

構築済みクラスタでのChainerMN ジョブ実行

クラスタ内インスタンスには、CloudFormationテンプレートのパラメータに設定したキーペアでログインが可能です。

ssh -i keypair.pem ubuntu@ec2-ww-xxx-yy-zzz.compute-1.amazonaws.com

クラスタ内のインスタンスは前述の [Chainer AMI][ChainerAMI] をつかって起動しているので、必要なライブラリ群はすべてインストール済みです。あとは、自身の学習用のコードとデータをダウンロードするだけです。

# switch user to chainer
ubuntu@ip-ww-xxx-yy-zzz$ sudo su chainer

# download ChainerMN's train_mnist.py into EFS
chainer@ip-ww-xxx-yy-zzz$ wget \
  https://raw.githubusercontent.com/chainer/chainermn/v1.3.0/examples/mnist/train_mnist.py \
  -O /efs/train_mnist.py

これで実行準備完了です。mpiexecコマンドを使ってChainerMNをつかったMNISTの例を実行できます。

# 4インスタンス上で合計32プロセス(-nオプション)を起動(8 プロセス/インスタンス(-N オプション))
chainer@ip-ww-xxx-yy-zzz$ mpiexec -n 32 -N 8 python /efs/train_mnist.py -g
...(you will see ssh warning here)
==========================================
Num process (COMM_WORLD): 32
Using GPUs
Using hierarchical communicator
Num unit: 1000
Num Minibatch-size: 100
Num epoch: 20
==========================================
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 0.795527 0.316611 0.765263 0.907536 4.47915
...
19 0.00540187 0.0658256 0.999474 0.979351 14.7716
20 0.00463723 0.0668939 0.998889 0.978882 15.2248

# 注意: 上記実行例は2回めの実行例です。(初回実行時はサンプルデータのダウンロードが行われます)

 

 

ChainerMNのクラウド環境向け新機能とAWSにおける性能評価

Shuji Suzuki

2018-05-25 17:00:23

※この記事はChainer Blogの抄訳です

Chainer にマルチノードでの分散学習機能を追加するパッケージであるChainerMN に、ネットワークスループットが低いシステム向けの以下の2つの機能をv1.2.0とv1.3.0で追加しました。

  • Double bufferingによる通信時間の隠ぺい機能
  • 半精度浮動小数点数(FP16)によるAll-Reduce機能

ChainerMNは高速なネットワークを持つスーパーコンピュータやMicrosoft Azureのようなシステムを想定して開発してきたため、高速なネットワークのない環境では高い並列性能を達成するのが難しいという問題がありました。しかし、これらの機能を使うことで、GTC2018で発表したようにAmazon Web Services (AWS)のような一般的なシステムでもChainerMNによって高い並列性能を達成することができるようになりました。

 

背景

データ並列による分散深層学習においては、学習時間のうちノード毎に計算したgradientの和を計算するAll-Reduceにかかる時間が支配的になります。以前、我々が実施した1024 GPUを利用した大規模な学習では、スーパーコンピュータでも利用される高速なインターコネクトであるInfiniBandと高速なAll-Reduceを実現可能なNVIDIA Collective Communications Library (NCCL)を利用することで解決しました [1]。一方、AWSのような一般的なシステムはInfiniBandのような高速なインターコネクトがないため、通信に時間がかかってしまいます。この結果、ノード数を増やしても学習が速くならない場合がありました。これらを解決するためにChainerMN v1.2.0, v1.3.0でdouble bufferingによる通信時間の隠ぺい機能とFP16によるAll-Reduce機能の2つを追加しました。

 

Double bufferingによる通信時間の隠ぺい機能

この機能は、計算(foward, backward, optimize)と通信(All-Reduce)をオーバーラップすることで通信にかかる時間を隠ぺいし、全体の計算時間を短縮する機能です。通常のChainerMNの場合、1イテレーションは下図のように forward, backward, All-Reduce, optimize の 4 つのステップからなります。

一方、double bufferingによる通信時間の隠ぺい機能を使うと以下のように計算の部分と 通信の部分をオーバーラップすることができます。

この際、optimizeには一つ前のイテレーションのgradientを利用して行います。これにより、精度に影響がでる可能性が考えられます。しかし、後ほど示す実験の通り、ImageNetの学習の場合、実際はほとんど精度を低下させずに学習を行うことができます。

この機能は以下のようにマルチノード用のoptimizerを作成していた部分で、double_buffering=Trueとするだけで使用できます。

optimizer = chainermn.create_multi_node_optimizer(optimizer, comm, double_buffering=True)

現在、この機能はpure_ncclのcommunicatorにのみ対応しています。

FP16によるAll-Reduce機能

v1.2.0のChainerMNはFP32のAll-Reduceにのみ対応していましたが、v1.3.0ではFP16にも対応しました。これにより、FP16のモデルでもChainerMNを利用して分散学習を実行することができるようになりました。All-ReduceにFP16を用いた場合、FP32のときと比較して、通信量が半分になるため、All-Reduceの大幅な時間短縮を期待できます。

また、計算においてFP32を使っていても、All-ReduceだけはFP16を利用し、All-Reduceにかかる時間を短縮するということも同時にできるようになりました。これは我々が1024 GPUを利用したImageNetの学習で利用したテクニックです[1]。

FP16のモデルの場合は特に変更を加えなくても、FP16のAll-Reduceが利用されます。また、計算とAll-Reduceで違うデータタイプを使用したい場合は、以下のようにcommunicatorを作成する際に、allreduce_grad_dtype='float16'とすることで利用することができます。

comm = chainermn.create_communicator('pure_nccl', allreduce_grad_dtype='float16')

この機能も現在はpure_ncclのcommunicatorにのみ対応しています。

実験結果

2つの新機能により、高い並列性能を得られることを示すために、ImageNet の画像分類データセットを使って性能を測定しました。CNN のモデルとしては ResNet-50 を使いました。実験には、低速なネットワークとしてPFNのスーパーコンピュータであるMN-1の10 Gb Ethernetと、AWSを利用しています。詳しい実験の設定については記事末尾の付録をご覧ください。

10Gb Ethernetによる評価

下記の図では、MN-1を利用し、InfiniBand FDRと10 Gb Ethernetを使った場合、さらに10 Gb Ethernet上で2つの新機能を使った場合の3通りで、GPU 数を増やしたときのスループットを示しています。

この図に示す通り、10 Gb Ethernetを使った場合、GPU数が増えても性能が上がっていないことがわかります。一方、新機能を使った場合は、線形に性能向上が得られており、理想的な高速化が達成できています。また、下記の表に32GPUを使って90 epochまでの学習を5回実行した際の平均validation accuracyと平均学習時間を示します。

Validation Accuracy (%) 学習時間 (hour)
InfiniBand FDR 76.4 6.96
10 Gb Ethernet 76.4 21.3
10 Gb Ethernet + Double Buffering
+ FP16 Allreduce
75.8 7.71

精度に関しては、2つの新機能を使ってもほとんど影響が出ていないことがわかります。また、学習時間については10 Gb Ethernetと2つの新機能を使った場合には、InfiniBand FDRを使った場合に比べて11%しか計算時間が増加しませんでした。このことから、2つの新機能を使うことで、InfiniBand のような高速なネットワークを利用しなくても、精度を維持したまま高い並列性能を得られることがわかりました。

AWSによる評価

AWSの検証ではp3.16xlargeを利用しました。このインスタンスは最新のGPUであるV100を8個搭載しています。このインスタンスを利用してGPU 数を増やしたときのスループットを以下の図に示します。

どれだけ並列性能がでているかの指標として並列化効率が良く用いられます。今回の実験の場合、基準となるスループットを\(t_0\)、基準から\(n\)倍のGPUを使用したときのスループットを\(t\)とすると、並列化効率\(e\)は以下のように計算できます。
$$e = t/(t_0*n)$$
この並列化効率が1(100%)に近いほど高い並列性能を達成していることを示しています。

この実験においては、8GPUを基準とした32GPUを利用した場合の並列化効率は96%となり、新機能を使うことにより高い並列化性能を達成できることがわかります。

今後の展望

今後、ChainerMNは多くの学習モデルにおいてデータ並列では実現できない多様なモデルの並列化に対応するために、モデル並列をはじめとした機能や、耐障害性を向上するための機能を追加していく予定です。また、我々のチームではChainerMNの開発だけでなく, ChainerとCuPyを含めた高速化、P100を1024機搭載したMN-1やV100を512機搭載した次のクラスタを全台使うような大規模実験に関する研究開発を行っています。このような分野に興味のある方のご応募お待ちしております。

付録

性能測定の詳細について

実験設定

データセット:ImageNet-1k
モデル:ResNet-50 (入力画像サイズ 224×224)

スループット測定時の設定

バッチサイズ:64
学習率:固定
Data augmentation:Goyal et al. [2]と同じ手法を利用
最適化:Momentum SGD (momentum=0.9)
Weight decay: 0.0001
測定回数:400イテレーション

90エポックまで学習させたときの設定

バッチサイズ:30エポックまで各 GPU が 64、その後、128
学習率:5エポックまでGradual warmup、30 エポックのとき0.2 倍、60エポック、80エポックで0.1倍
Data augmentation:Goyal et al. [2]と同じ手法を利用
最適化:Momentum SGD (momentum=0.9)
Weight decay: 0.0001
エポック数:90 エポック
この設定は基本的にGoyal et al. [2]をベースに、Smith et al. [3]のテクニックを利用した設定になっています。

10Gb Ethernetによる検証に使用した実験環境

実験環境
最大4ノード、計 32 GPUs
ノード
GPU: 8 * NVIDIA Tesla P100 GPUs
CPU: 2 * Intel Xeon E5-2667 processors (3.20 GHz, 8 cores)
ネットワーク: InfiniBand FDR
学習データの保存先:ローカルディスク

AWSによる検証に使用した実験環境

実験環境
最大4ノード、計 32 GPUs
ノード(p3.16xlarge)
GPU: 8 * NVIDIA Tesla V100 GPUs
CPU: 64 vCPUs
ネットワーク: 25 Gbps のネットワーク
学習データの保存先:RAM disk

References

[1] Akiba, T., et al. Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes. CoRR, abs/1711.04325, 2017.
[2] Goyal, P., et al. Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour. CoRR, abs/1706.02677, 2017.
[3] Smith, S. L., et al. Don’t Decay the Learning Rate, Increase the Batch Size. CoRR, abs/1711.00489, 2017.

12345...