make x dockerで作るalpaca流開発環境

33
make x dockerで作る Alpaca流開発環境 TOMOYA KITAYAMA Head of Japan R&D http://alpaca.ai [email protected]

Upload: tomoya-kitayama

Post on 21-Apr-2017

2.236 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: make x dockerで作るAlpaca流開発環境

make x dockerで作るAlpaca流開発環境

T O M O Y A K I T A Y A M A Head of Japan R&D

http://alpaca.ai [email protected]

Page 2: make x dockerで作るAlpaca流開発環境

Empower ing Profess ionals With AI Technolog y

Page 3: make x dockerで作るAlpaca流開発環境

• 「Capitalico」 (キャピタリコ)というAIがトレーダーの意思決定をサポートするサービスを開発しております: https://www.capitalico.com/

• 昨年10月からwebバージョンをクローズドβを展開し、それらのフィードバックを取り入れたiPhoneアプリを2月下旬にパブリックβ版としてリリース予定。

• 僕は主にWeb/アプリのフロントエンド全般の開発を担当

Alpacaについて 3

Page 4: make x dockerで作るAlpaca流開発環境

Entry Point

What Technical Traders Are Looking For 4

Page 5: make x dockerで作るAlpaca流開発環境

• IBM様より、Alpacaの活用事例をSoftlayer meetupにおいて10分間話していただけないかという打診があった。

• 10分間ということ、日頃お世話になっておりSoftlayer様のイベントということもあり、気楽に快諾。この時はエンジニアの勉強会だと思っていた。

• 内容もSoftlayerのGPUを活用しているエンジニアが興味を持ってくれるように、Dockerのマニアックな内容に特化して調整!これは絶対受ける!

どうして話すことになったのか 5

Page 6: make x dockerで作るAlpaca流開発環境

• ガチのビジネスイベントでした!ロゴ入りケーキとかこういうイベントで初めて見たよ!

蓋を開けてみると 6

Page 7: make x dockerで作るAlpaca流開発環境

• 最初の乾杯後、ユーザーからのお祝いという形で、トークがスタート。

• しかし、中身はDockerのマニアックな内容。やってしまった感がありましたが、その後に安田様より、Dockerの勉強会(今度はガチな奴)で話してくれないかという依頼を受けました。

• まさに捨てる神あれば拾う神あり。

• というわけで本日の内容は、以下のようになっております。 • どのようにAlpacaはSoftlayer x Dockerを活用してDeep Learning開発環境を用意したか(Softlayer meetupと同内容、15分)

• Make x DockerによるAlpacaの開発環境(10分)

• Dockerによるクラスタリング構想(10分) • 質疑応答など

発表後のおはなし 7

Page 8: make x dockerで作るAlpaca流開発環境

•どのようにAlpacaはSoftlayer x Dockerを活用してDeep Learning開発環境を用意したか(Softlayer meetupと同内容、15分)

• Make x DockerによるAlpacaの開発環境(10分)

• Dockerによるクラスタリング構想(10分)

Agenda 8

Page 9: make x dockerで作るAlpaca流開発環境

Input

LSTM

LSTM

LSTM

LSTM

Fully Connected

Output

Fully Connected

Input

LSTM

LSTM

LSTM

LSTM

Fully Connected

Output

Fully Connected

Input

LSTM

LSTM

LSTM

LSTM

Fully Connected

Output

Fully Connected

Time

Experiments Deep Learning Based Approach 9

• Alpacaの開発するCapitalicoはDeep Learningの認識機を個人向けにカスタマイズして作成する

• よって、システム開発時にもモデル構築、動作時にもGPU

が必要 • エンジニア全員にどのように

GPU開発環境を安価にスケールする形で提供するかが課題

Page 10: make x dockerで作るAlpaca流開発環境

• 最初2015/08まではAWSのg2.2xlargeを用いて各人がスポットインスタンスを用いて開発。しかし、突如発生したg2インスタンスのスポットインスタンスの高騰。

• 時間7ドル!朝起きるとスポットインスタンスが死んでる。 • このままだとサーバ代金で破産するので、早速代替手段の検討を開始!

Histor y 10

Page 11: make x dockerで作るAlpaca流開発環境

• 2015/09 SoftLayer様のソリューションを知る

• GPU Tesla K80を2台追加したGPUサーバを月額契約で利用可能!

• 他に話していた事業者様だとGPUサーバは先方のハードウェアの減価償却のための年間契約になっていた。進歩の激しいGPU業界で年間契約はきつい。1年後に5

倍の性能のGPUとかが平気ででる

• 高機能・高速なGPUサーバ一台を全員で徹底活用しよう!

Histor y 11

Page 12: make x dockerで作るAlpaca流開発環境

• AlpacaではDockerを開発にも実運用にも徹底活用しているので、一台のサーバに全員がログインしてDockerをそれぞれ走らせるノウハウが必要。調査したところ、以下の課題を解決する必要がある。

• 異なるユーザーが同一の名前を持つコンテナが同じサーバ上でrunしても問題ないようにする。

• 他のユーザーのコンテナ同士でネットワークのポートがバッティングしても問題ないようにする

• つまり、他のユーザーを全く気にせず1ホスト上で複数のDockerデーモンを走らせ、かつ、各Dockerデーモン内のネットワークのポートをそれぞれ衝突しないようにすればよい!

Problems 12

Page 13: make x dockerで作るAlpaca流開発環境

• 次のMake x Dockerのシステムでも説明していますが、Alpacaでは原則枯れた技術を徹底的に使い倒す方針。

• このような目的でオーケストレーションツールを新規に導入しない • DockerコマンドとMakeでできることを徹底的に考える

• 何が解決できればよいのか? • Dockerはdocker0というインターフェイスがコンテナとその外とのネットワークを接続するためのブリッジになっている

• 通常であればDocker初回起動時に自動的に作成

• しかし複数デーモンの場合、Dockerは自動でブリッジを作ってくれなこれを分ける必要がある。

Alpaca Development Rule 13

Page 14: make x dockerで作るAlpaca流開発環境

• いろいろと調査した結果

「net=container」というモードを発見! • 起動するコンテナを他のコンテナのネットワーク名前空間に置くことができるモード

• ネットワーク用のコンテナを一つ起動して他の関連するコンテナをすべてこの中に放り込むことで、ホスト側を汚さずに今までのnet=hostのようなままの構成で運用

• これで何個でもコマンド一発で、副作用なしでDockerデーモンを作れる!

Alpaca Development Rule 14

Page 15: make x dockerで作るAlpaca流開発環境

• かなり混みいった話なので、コードや具体的な手順はブログ記事に記載 • http://blog-jp.alpaca.ai/entry/2015/10/28/095009 • 「Netコンテナを使って1ホスト上で複数のDockerデーモンを走らせる」を見ていただければ。「Alpaca ブログ」で検索してもOK。

• これにより一つのDockerデーモンを完全なバーチャルマシンのように扱うことができるようになる

• 外部向けのネットコンテナ以外は-net=hostで走らせることで特に環境変数によるDockerリンクの仕組みも気にすることなく、普通にネットワークを利用すればNetコンテナの中に閉じ込めて他のプロセスとも自由に通信可能

How To Run 15

Page 16: make x dockerで作るAlpaca流開発環境

• 最終的にはSoftLayer様のインスタンス一つで、Dockerデーモンを複数走らせることで、エンジニア7人がログインしてGPUを活用して開発可能な環境を整えることができました!

• もしAWS g2.2xlargeを利用し続けていたら

• 月額だいたい$1000 x 7 • GPU GRID K520 4GB Memory(およそ4GBが一つのタスクに必要なので、同時に一つしかDLのタスクができない)

• SoftLayerに切り替えたことで

• 7人でK80を利用して$1350

• GPU K80 24GB Memory(同時に6個のDLタスクを実行可能)

• さらにもしエンジニア数が増えても追加の$500でGPU K80を同一サーバに最大4つまで追加可能!ベンチャーにとってクイックにスケールする開発環境は超重要。

How To Run 16

Page 17: make x dockerで作るAlpaca流開発環境

•どのようにAlpacaはSoftlayer x Dockerを活用してDeep Learning開発環境を用意したか(Softlayer meetupと同内容、15分)

• Make x DockerによるAlpacaの開発環境(10分)

• Dockerによるクラスタリング構想(10分)

Agenda 17

Page 18: make x dockerで作るAlpaca流開発環境

• Alpacaでは原則枯れた技術を徹底的に使い倒す方針。

• Dockerは完全に枯れてるとは言えないが、最新版は十分に安定しており、Alpacaにとってはあまりにも有用なので採用せざるを得ない。

• 科学計算なPythonとGPU周りでは、(コミュニティが頑張っていますが)まだまだ開発環境のメンテナンスが難しいしスムーズさに掛ける

• 開発環境による、動いた・動いていない。テストが通った、通らない、挙動が違うはスタートアップのスピード感において死活問題。

• DockerならDockerfileで管理できる。CircleCIでテストできる!

• ついでにDockerデーモンを分離すればキャッシュやポートのバッティング問題もない

• しかし他の箇所ではブラックボックスなツールや枯れていないシステムを採用できない

• だから誰でも知っているMakeとDockerで開発環境を作る!

Alpaca Development Rule 18

Page 19: make x dockerで作るAlpaca流開発環境

• ピュアなコンテナが欲しいのではなく、早いコマンドラインベースの仮想化ツールが欲しい

• ソースコードはコンテナにいれずに、-v $(CURDIR)/../..:/projectのようにgitリポジトリの特定ディレクトリを/projectにマウントする。

• TIPS: コンテナにソースコードが入らないので、DockerHubもPublic設定でpushできる • ネットワークは説明したとおりネットワークコンテナで外部向けはすべて制御する。

• —net=container:$(NET_CONTAINER)でネットワーク制御コンテナを指定

• ネットワークコンテナ以外は-net=hostで動いており、コンテナ内部で動的にネットワークを書き換え可能。しかしポートの衝突は心配する必要がない!

• Docker以外のツールを採用するリスクは避ける

• Kubernetes(読み方: クーベルネイテス) →(少なくともv0.8頃は)全く使えなかった!

• Docker Machine → 触ってみたがバグが多すぎて使うのを止めた

• Docker Compose/Swarm → 未評価だが、これまでのツールの経験上もうDocker単体でやりきるほうが安全と判断

How To Use Docker In Alpaca 19

Page 20: make x dockerで作るAlpaca流開発環境

• Makeがなぜ必要なのか • コマンドのディレクトリに対する再帰的な実行

• 共通設定ファイルの管理: Makefile.common • ディレクトリ構成

• dockerfilesというディレクトリにそれぞれのDockerfileとそれを制御するMakefileを設置

• トップディレクトリで特定コマンドを打つとMakeによりdockerfiles内のディレクトリに再帰的にMakeファイルのコマンドが実行されシステム全体の挙動が変更される

構成 20

Page 21: make x dockerで作るAlpaca流開発環境

• サポートされている開発用コマンド • make run: システムの全コンテナをrunする。DB/Redis/nginxなどの各システムもこれで起動する

• make rm: システムの全コンテナをrmする。

• make unittest: テスト用のコンフィギュレーションでコンテナがrunされ、unittestを実施する。DBのテスト用の設定でrunされるなど、Mock

しなくてもそのままテスト可能。 • make uitest: テスト用コンフィギュレーションでコンテナがrunされ、

uitestを実施する。

• make resetdb/initdb/dumpdb/loaddb/migrate: DBのリセット、初期化、ダンプ、ロード、DBのスキーマを最新状態にアップグレード

Make Features 21

Page 22: make x dockerで作るAlpaca流開発環境

• サポートされているDockerコンテナ用コマンド

• make build: Dockerfileに変更があるコンテナをビルドする

• make pull: DockerHubから最新のコンテナを取得する

• make push: DockerHubにコンテナをプッシュする

• これらのコマンド群により、新しく開発者が入っても、リポジトリをgit

cloneして、Dockerデーモンを新規に起動し、以下のコマンドを実行するだけで開発環境が整う(およそ5分程度)。

• make pull • make run • make resetdb

Make Features 22

Page 23: make x dockerで作るAlpaca流開発環境

• Alpacaの開発フローは簡単に云うと以下:

• Githubのfeatureブランチで案件を開発。実装が完了したらPR。

• コードレビュー後、CircleCIのテストが完了したらマージしてOK。

• Dockerによるスムーズな開発には、CircleCIの徹底活用がポイント!

• 都度CircleCIではmake pullが実行され、DockerHubから最新版を取得

• DockerHubの最新とコミット内容のDockerfileのタグ名に違いがあった場合、コンテナの更新があったと判断され、CircleCI上で自動的にmake build/docker pushが行われ、DockerHubにそのタグのコンテナが自動的にプッシュ

• 都度開発者はmake pullを行えば、他の人の変更も考慮した最新の開発環境が取得可能な状態が自動的にキープされる

Circ leci 23

Page 24: make x dockerで作るAlpaca流開発環境

• UIのテストはNightmareJSを利用。

• JSの簡単なコードで超高速にUITESTを実施可能。UITEST用のコンテナを整備。Docker化したことで、UITESTをローカルでもサーバでもCircleCIでも環境非依存で実施可能になる。

• ハマりどころはNightmareJSが現状Electronに依存しているので、Docker内でElectron

が立ち上がるバーチャルなビデオ出力環境を用意して上げる必要がある点です。 • 詳細はブログで: http://blog-jp.alpaca.ai/entry/2015/10/31/102649

Uitest 24

FROM node:0.12

RUN apt-get update -y RUN apt-get install -y xvfb x11-xkb-utils xfonts-100dpi xfonts-75dpi \ xfonts-scalable xfonts-cyrillic x11-apps clang libdbus-1-dev \ libgtk2.0-dev libnotify-dev libgnome-keyring-dev libgconf2-dev \ libasound2-dev libcap-dev libcups2-dev libxtst-dev libxss1 \ libnss3-dev gcc-multilib g++-multilib

Page 25: make x dockerで作るAlpaca流開発環境

Uitest Sample Code 25

• 以下の様なコードでUIのテストを記述可能。

• これくらい簡単にUIのテストを環境非依存で実行できるとUIテストに対する考え方が変わる

• フロントエンドエンジニアは、Unittestと同じようにとりあえずUITESTを通しておくかという気楽な感覚になる。

Page 26: make x dockerで作るAlpaca流開発環境

•どのようにAlpacaはSoftlayer x Dockerを活用してDeep Learning開発環境を用意したか(Softlayer meetupと同内容、15分)

• Make x DockerによるAlpacaの開発環境(10分)

• Dockerによるクラスタリング構想(10分)

Agenda 26

Page 27: make x dockerで作るAlpaca流開発環境

Box Clustr ing 27

• ここからはまだ構想段階ですが、 • Alpacaではここまで培ったDockerのノウハウを駆使して、システムの永遠の課題である複数ノードによる冗長性の問題に挑むつもりです。

• そもそも将来的には金融システムにつなぐ想定なので、堅牢性・冗長性は必須課題。

• Dockerデーモンをそもそも一つの物理的なノードと同等と定義して、そのDockerデーモン同士がクラスタリングを組む。

• 我々はこのノードとして振る舞うDockerデーモンをBOXと呼んでいます

• すでにBoxをコマンド経由で作成・コントロールできることは検証済み

Page 28: make x dockerで作るAlpaca流開発環境

Ser ver(Physical Design) 28

• etcdによるクラスタリング

• また、それぞれのBoxがDockerデーモンである。ネットワークはlocalhostとRemote IP

を区別なく扱えるようにする。

Page 29: make x dockerで作るAlpaca流開発環境

Ser ver(Redis) 29

• Box間のRedisのデータはRedis Clusterにより冗長化される。

Page 30: make x dockerで作るAlpaca流開発環境

Ser ver(Db) 30

• DB間のデータはPostgreSQLのpgpoolにより冗長化される。

Page 31: make x dockerで作るAlpaca流開発環境

Conclusion 31

• Boxクラスタリングの主な目的は冗長化 • アプリケーション単体のスケールアウトではなく、システム全体がストレージも含めて冗長化されることが狙い。

• Boxクラスタリングの何が嬉しいのか • これまでの分散システムの永遠の課題であった、分散ノードの開発環境のデバッグ、整備がDockerデーモンを複数個立てることと同等となる。開発・テスト工数の圧倒的な削減。

• これにより、ローカルテストと分散ノードの等価性がかなり保証されるので、makeコマンドでDockerデーモンを操作することで、分散ノードの追加・障害テスト・分散効率のチェックがすべてmake x Dockerのローカルなコマンドで実行可能となる。

Page 32: make x dockerで作るAlpaca流開発環境

In Future 32

• 2月下旬の正式リリースまでにAlpacaではこのシステムをプロダクション環境に投入する予定です。

• こちらは現状は工数的な関係でお約束できませんが、本発表のMake x

DockerによるBoxクラスタリングのシステムをきちんとまとめてオープンソースにしたいと思っています。

Page 33: make x dockerで作るAlpaca流開発環境

Recruit ing 33

• Alpacaでは「金融 × Deep Learningに挑戦したいエンジニア・サイエンティスト募集中!」です。詳細は「Alpaca ブログ」で検索してください:

http://blog-jp.alpaca.ai/

• 機械学習エンジニア • バックエンド・ミドルウェアエンジニア • クオンツデータサイエンティスト • Deep Learningを用いてリアルな問題解決にチャレンジしたい学生インターン