Alpaca技術ブログ

AIと超高速データストレージを駆使して新しいトレーディングを創る

Docker-in-Dockerによる「Cluster as a Service」を目指して - キャピタリコの裏側

Alpacaの北山です。

ついにリリースしたキャピタリコ(https://www.capitalico.com/)ですが、これから「キャピタリコの裏側(バックエンド)」というテーマで各エンジニアに話を聞きつつ、情報を皆様と共有していきたいと思います。

そういえば、何人かの人に「キャピタリコのアプリ名がカタカナになったね」と言われたのですが、Capitalicoのスペルを覚えるのはなかなか難しいので、日本語ではすこし語感がかわいいカタカナ表記になりました。

さて、最初はまずキャピタリコの開発環境・プロダクション環境を支えるDocker-in-Dockerについて説明します。こちらは、おおまかな内容を先日Cloud daysで僕が発表した資料がありますので、まずはこちらを御覧ください。

www.slideshare.net

上記資料では主に開発環境についてまとめましたが、説明しきれなかったこのシステム構成の狙いについて説明したいと思います。

f:id:gamella:20160314144119p:plain

上記は発表資料の20Pの画像ですが、我々のプロダクション構成を端的に説明しています。AlpacaがDocker-in-Dockerで目指すのはズバリ「Cluster as a Service」です。最終的には「キャピタリコが動作するクラスタがほしい」と言ったらすぐにそれが任意のサイズで手に入る、という世界です。非同期学習をGPU上で走らせ、裏でトレーディングアルゴを走らせる仕組みが協調分散、ちょっとした高可用性の実験をしたい、それをそのまま本番で走らせたい、等々わがままの限りを尽くした各開発者のニーズに即座に対応できるインフラを模索したところ、この方向に至っているというわけです。

AlpacaではDocker-in-Dockerを主に以下の2つの用途に利用しています。

  • 一つのハイスペックGPUベアメタルサーバでそれぞれが他の人を気にすることなくディープラーニングを実行可能なDockerを利用可能とするため、各ログインユーザーにそれぞれ一つのDockerデーモンを割り当てる。なお、Dockerデーモン上で走るDockerデーモンはmakeで制御していますので、詳しくは資料をお読みください。

  • プロダクション環境において、上記のDockerデーモン上で動作するDockerデーモンがホストが異なっていてもそのままの構成でクラスターを組み、開発環境とほぼ同じ条件でプロダクション環境でも動作する。

このdocker-in-dockerはホスト上で動作する単一のDockerデーモン上で、それぞれのDockerデーモンをコンテナとしてdocker runで起動するのですが、その起動スクリプトは以下のとおりです。

# launch a docker daemon docker run \
  -v ${{DOCKER_ROOT}}/sock:/sock \
  -v ${{DOCKER_ROOT}}/lib/docker:/var/lib/docker \
  -v /usr/local/cuda-7.5:/usr/local/cuda-7.5 \ ← cuda も使えるように!
      {workdirs} \ ← 作業用ボリュームをマップ
  --privileged \
  --pid=host 
  --name {name} \
  -d docker:1.10-dind docker daemon \ ← 既にイメージが用意されている
  -H unix:///sock/docker.sock \
  -s aufs ← パフォーマンスのために大切

Alpacaでは、上のスクリプトで起動したDockerデーモンをBoxと呼んでおり、Box制御スクリプトを用意して、この複数のコンテナが協調動作するDockerデーモン自体を仮想環境的に使い捨てできるようにしています。

このBoxを利用する上で重要なのは、Box内のコンテナ同士のプライベートネットワーク構成を同一にすることです。

開発環境とプロダクション環境の違いを意識する必要のないよう、異なるマシン上で動くコンテナ同士のシームレスな通信を実現するには、コンテナ同士のL3接続性が必須となります。

この用途にdocker network(overlay network)を利用すると、クラスターを構成するetcdまたはconsul がDockerの外に必要となってしまい、我々のBox同士がそのままクラスターを組むという思想には合致しません。FlannelはL2 over L3を実現しますがが、Docker in Dockerで動作しているデーモンには届きません。なので、われわれはこれをSoft LayerのPortable IP Rangeを枯れた技術であるpipework(https://github.com/jpetazzo/pipework)でコンテナに割り当てることで実現しています。

このようにDockerデーモンがそのままクラスター可能であることで、「Cluster as a Service」を目指しています。

さて、次回は、弊社CTO原田が米国で開催するGTCで発表した資料をブログでも説明したいとおもいます。

S6309 - Capitalico - Chart Pattern Matching in Financial Trading Using RNN

Hitoshi Harada CTO, Alpaca

Discretionary trading by technical analysis and momentum strategy in the financial market has been difficult to automate by quant-style rigid conditional programming as it involves a lot of fuzziness and subtleties of human perception. Our application, Capitalico, analyzes the financial time-series data and trader's behavior to solve this problem using the RNN/LSTM. In this talk, we'll introduce the problem and our approach, and detail pitfalls and practices, such as how we choose networks and parameters to achieve the best accuracy and performance with deep learning using GPUs. As we borrowed great ideas from past deep learning applications, we'll help you understand how we converted those ideas to our solution and how to apply deep learning to your problem.

Level: Intermediate

Type: Talk

Tags: Finance; Deep Learning & Artificial Intelligence

このようなシステムで動作するキャピタリコですが、AlpacaではDockerを徹底活用してシステムをスケールさせたいDevOpsエンジニアを大募集中ですが、もしご興味ありましたら、Wantedlyから是非ご応募ください!

www.wantedly.com