Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,429 views

Published on

Alpacaが開発に利用しているmakeとdockerを活用した開発環境を説明します。

Published in: Engineering

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

  1. 1. 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 info@alpacadb.com
  2. 2. Empowering Professionals With AI Technology
  3. 3. • 「Capitalico」 (キャピタリコ)というAIがトレーダーの意思決定をサ ポートするサービスを開発しております: https://www.capitalico.com/ • 昨年10月からwebバージョンをクローズドβを展開し、それらのフィー ドバックを取り入れたiPhoneアプリを2月下旬にパブリックβ版として リリース予定。 • 僕は主にWeb/アプリのフロントエンド全般の開発を担当 Alpacaについて 3
  4. 4. Entry Point What Technical Traders Are Looking For 4
  5. 5. • IBM様より、Alpacaの活用事例をSoftlayer meetupにおいて10分間話して いただけないかという打診があった。 • 10分間ということ、日頃お世話になっておりSoftlayer様のイベントとい うこともあり、気楽に快諾。この時はエンジニアの勉強会だと思って いた。 • 内容もSoftlayerのGPUを活用しているエンジニアが興味を持ってくれる ように、Dockerのマニアックな内容に特化して調整!これは絶対受け る! どうして話すことになったのか 5
  6. 6. • ガチのビジネスイベントでした!ロゴ入りケーキとかこういうイベント で初めて見たよ! 蓋を開けてみると 6
  7. 7. • 最初の乾杯後、ユーザーからのお祝いという形で、トークがスタート。 • しかし、中身はDockerのマニアックな内容。やってしまった感がありました が、その後に安田様より、Dockerの勉強会(今度はガチな奴)で話してくれない かという依頼を受けました。 • まさに捨てる神あれば拾う神あり。 • というわけで本日の内容は、以下のようになっております。 • どのようにAlpacaはSoftlayer x Dockerを活用してDeep Learning開発環境を 用意したか(Softlayer meetupと同内容、15分) • Make x DockerによるAlpacaの開発環境(10分) • Dockerによるクラスタリング構想(10分) • 質疑応答など 発表後のおはなし 7
  8. 8. • どのようにAlpacaはSoftlayer x Dockerを活用 してDeep Learning開発環境を用意したか (Softlayer meetupと同内容、15分) • Make x DockerによるAlpacaの開発環境(10分) • Dockerによるクラスタリング構想(10分) Agenda 8
  9. 9. 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開発環境を安価にスケー ルする形で提供するかが課題
  10. 10. • 最初2015/08まではAWSのg2.2xlargeを用いて各人がスポットインスタ ンスを用いて開発。しかし、突如発生したg2インスタンスのスポット インスタンスの高騰。 • 時間7ドル!朝起きるとスポットインスタンスが死んでる。 • このままだとサーバ代金で破産するので、早速代替手段の検討を開 始! History 10
  11. 11. • 2015/09 SoftLayer様のソリューションを知 る • GPU Tesla K80を2台追加したGPUサーバを 月額契約で利用可能! • 他に話していた事業者様だとGPUサーバ は先方のハードウェアの減価償却のため の年間契約になっていた。進歩の激しい GPU業界で年間契約はきつい。1年後に5 倍の性能のGPUとかが平気ででる • 高機能・高速なGPUサーバ一台を全員で 徹底活用しよう! History 11
  12. 12. • AlpacaではDockerを開発にも実運用にも徹底活用しているので、一台の サーバに全員がログインしてDockerをそれぞれ走らせるノウハウが必 要。調査したところ、以下の課題を解決する必要がある。 • 異なるユーザーが同一の名前を持つコンテナが同じサーバ上でrunし ても問題ないようにする。 • 他のユーザーのコンテナ同士でネットワークのポートがバッティング しても問題ないようにする • つまり、他のユーザーを全く気にせず1ホスト上で複数のDockerデーモン を走らせ、かつ、各Dockerデーモン内のネットワークのポートをそれぞ れ衝突しないようにすればよい! Problems 12
  13. 13. • 次のMake x Dockerのシステムでも説明していますが、Alpacaでは原則枯 れた技術を徹底的に使い倒す方針。 • このような目的でオーケストレーションツールを新規に導入しない • DockerコマンドとMakeでできることを徹底的に考える • 何が解決できればよいのか? • Dockerはdocker0というインターフェイスがコンテナとその外とのネッ トワークを接続するためのブリッジになっている • 通常であればDocker初回起動時に自動的に作成 • しかし複数デーモンの場合、Dockerは自動でブリッジを作ってくれな これを分ける必要がある。 Alpaca Development Rule 13
  14. 14. • いろいろと調査した結果 「net=container」というモードを発見! • 起動するコンテナを他のコンテナのネッ トワーク名前空間に置くことができるモー ド • ネットワーク用のコンテナを一つ起動し て他の関連するコンテナをすべてこの中 に放り込むことで、ホスト側を汚さずに 今までのnet=hostのようなままの構成で 運用 • これで何個でもコマンド一発で、副作用 なしでDockerデーモンを作れる! Alpaca Development Rule 14
  15. 15. • かなり混みいった話なので、コードや具体的な手順はブログ記事に記載 • http://blog-jp.alpaca.ai/entry/2015/10/28/095009 • 「Netコンテナを使って1ホスト上で複数のDockerデーモンを走らせ る」を見ていただければ。「Alpaca ブログ」で検索してもOK。 • これにより一つのDockerデーモンを完全なバーチャルマシンのように扱 うことができるようになる • 外部向けのネットコンテナ以外は-net=hostで走らせることで特に環境変 数によるDockerリンクの仕組みも気にすることなく、普通にネットワー クを利用すればNetコンテナの中に閉じ込めて他のプロセスとも自由に 通信可能 How To Run 15
  16. 16. • 最終的には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
  17. 17. • どのようにAlpacaはSoftlayer x Dockerを活用 してDeep Learning開発環境を用意したか (Softlayer meetupと同内容、15分) • Make x DockerによるAlpacaの開発環境(10分) • Dockerによるクラスタリング構想(10分) Agenda 17
  18. 18. • Alpacaでは原則枯れた技術を徹底的に使い倒す方針。 • Dockerは完全に枯れてるとは言えないが、最新版は十分に安定しており、 Alpacaにとってはあまりにも有用なので採用せざるを得ない。 • 科学計算なPythonとGPU周りでは、(コミュニティが頑張っていますが)まだま だ開発環境のメンテナンスが難しいしスムーズさに掛ける • 開発環境による、動いた・動いていない。テストが通った、通らない、挙動が 違うはスタートアップのスピード感において死活問題。 • DockerならDockerfileで管理できる。CircleCIでテストできる! • ついでにDockerデーモンを分離すればキャッシュやポートのバッティング問題 もない • しかし他の箇所ではブラックボックスなツールや枯れていないシステムを採用で きない • だから誰でも知っているMakeとDockerで開発環境を作る! Alpaca Development Rule 18
  19. 19. • ピュアなコンテナが欲しいのではなく、早いコマンドラインベースの仮想化ツールが欲し い • ソースコードはコンテナにいれずに、-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
  20. 20. • Makeがなぜ必要なのか • コマンドのディレクトリに対する再帰的な 実行 • 共通設定ファイルの管理: Makefile.common • ディレクトリ構成 • dockerfilesというディレクトリにそれぞれの Dockerfileとそれを制御するMakefileを設置 • トップディレクトリで特定コマンドを打つ とMakeによりdockerfiles内のディレクトリ に再帰的にMakeファイルのコマンドが実行 されシステム全体の挙動が変更される 構成 20
  21. 21. • サポートされている開発用コマンド • 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
  22. 22. • サポートされているDockerコンテナ用コマンド • make build: Dockerfileに変更があるコンテナをビルドする • make pull: DockerHubから最新のコンテナを取得する • make push: DockerHubにコンテナをプッシュする • これらのコマンド群により、新しく開発者が入っても、リポジトリをgit cloneして、Dockerデーモンを新規に起動し、以下のコマンドを実行する だけで開発環境が整う(およそ5分程度)。 • make pull • make run • make resetdb Make Features 22
  23. 23. • Alpacaの開発フローは簡単に云うと以下: • Githubのfeatureブランチで案件を開発。実装が完了したらPR。 • コードレビュー後、CircleCIのテストが完了したらマージしてOK。 • Dockerによるスムーズな開発には、CircleCIの徹底活用がポイント! • 都度CircleCIではmake pullが実行され、DockerHubから最新版を取得 • DockerHubの最新とコミット内容のDockerfileのタグ名に違いがあった 場合、コンテナの更新があったと判断され、CircleCI上で自動的に make build/docker pushが行われ、DockerHubにそのタグのコンテナが 自動的にプッシュ • 都度開発者はmake pullを行えば、他の人の変更も考慮した最新の開発 環境が取得可能な状態が自動的にキープされる Circleci 23
  24. 24. • 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
  25. 25. Uitest Sample Code 25 • 以下の様なコードでUIのテストを記述可能。 • これくらい簡単にUIのテストを環境非依存で実行できるとUIテストに 対する考え方が変わる • フロントエンドエンジニアは、Unittestと同じようにとりあえず UITESTを通しておくかという気楽な感覚になる。
  26. 26. • どのようにAlpacaはSoftlayer x Dockerを活用 してDeep Learning開発環境を用意したか (Softlayer meetupと同内容、15分) • Make x DockerによるAlpacaの開発環境(10分) • Dockerによるクラスタリング構想(10分) Agenda 26
  27. 27. Box Clustring 27 • ここからはまだ構想段階ですが、 • Alpacaではここまで培ったDockerのノウハウを駆使して、システムの 永遠の課題である複数ノードによる冗長性の問題に挑むつもりです。 • そもそも将来的には金融システムにつなぐ想定なので、堅牢性・冗長 性は必須課題。 • Dockerデーモンをそもそも一つの物理的なノードと同等と定義して、そ のDockerデーモン同士がクラスタリングを組む。 • 我々はこのノードとして振る舞うDockerデーモンをBOXと呼んでいま す • すでにBoxをコマンド経由で作成・コントロールできることは検証済 み
  28. 28. Server(Physical Design) 28 • etcdによるクラスタリング • また、それぞれのBoxがDockerデーモンである。ネットワークはlocalhostとRemote IP を区別なく扱えるようにする。
  29. 29. Server(Redis) 29 • Box間のRedisのデータはRedis Clusterにより冗長化される。
  30. 30. Server(Db) 30 • DB間のデータはPostgreSQLのpgpoolにより冗長化される。
  31. 31. Conclusion 31 • Boxクラスタリングの主な目的は冗長化 • アプリケーション単体のスケールアウトではなく、システム全体がス トレージも含めて冗長化されることが狙い。 • Boxクラスタリングの何が嬉しいのか • これまでの分散システムの永遠の課題であった、分散ノードの開発環 境のデバッグ、整備がDockerデーモンを複数個立てることと同等とな る。開発・テスト工数の圧倒的な削減。 • これにより、ローカルテストと分散ノードの等価性がかなり保証され るので、makeコマンドでDockerデーモンを操作することで、分散ノー ドの追加・障害テスト・分散効率のチェックがすべてmake x Dockerの ローカルなコマンドで実行可能となる。
  32. 32. In Future 32 • 2月下旬の正式リリースまでにAlpacaではこのシステムをプロダクション 環境に投入する予定です。 • こちらは現状は工数的な関係でお約束できませんが、本発表のMake x DockerによるBoxクラスタリングのシステムをきちんとまとめてオープ ンソースにしたいと思っています。
  33. 33. Recruiting 33 • Alpacaでは「金融 × Deep Learningに挑戦したいエンジニア・サイエン ティスト募集中!」です。詳細は「Alpaca ブログ」で検索してください: http://blog-jp.alpaca.ai/ • 機械学習エンジニア • バックエンド・ミドルウェアエンジニア • クオンツデータサイエンティスト • Deep Learningを用いてリアルな問題解決にチャレンジしたい学生イン ターン

×