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回めの実行例です。(初回実行時はサンプルデータのダウンロードが行われます)