プロパティ2つとtoString()関数のみのシンプルなクラスです。クラスに対応付けられるデータの永続化に用いるためのインターフェイスを定義します。つの操作を定義しています。通常のアプリケーションであればここでデータベースなどを利用した実装をするかと思いますが、今回はシンプルにインメモリのオブジェクトを用いています。@injectable()デコレータをつけています。}}src/Logger.tsこちらはロガー用のシンプルなインターフェイスです。void;}src/LoggerImpl.tsロガーの実装です。流すだけにしています。こちらも@injectable()デコレータをつけています。}}src/App.tsメインのクラスを定義します。インターフェイスを実装したインスタンスを用いて)ログされるようにしています。対応するユーザーのデータを取得できるようにしています。@inject()デコレータによって、userRepositoryにUserRepositoryのインスタンスが、loggerにLoggerのインスタンスが注入されるようになっています。コンテナを作成し、使用するオブジェクトをバインドします。container;src/index.ts実際に実行させてみるコードです。実際に実行させてみると、以下のようになり、うまくいっていることがわかります。}inversifyJS、直感的でわかりやすいですね。補足DIコンテナへのオブジェクトの登録において、簡単のために文字列を用いましたが、Symbolを利用することが推奨されています。何が嬉しいのかオブジェクト指向的なプログラミングをする際、インターフェイス等を用いて「実装は抽象に依存させる」こと、そして「できるだけ抽象への依存を増やす」ことが大切です。することでオブジェクト同士が疎結合になり、テストもしやすく、各オブジェクトの実装の変更が簡単な設計になります。今回のAppクラスはLoggerとUserRepositoryという抽象(インターフェイス)に依存をしていました。LoggerImplという実装はLoggerという抽象に依存し、UserRepositoryImplという実装はUserRepositoryという抽象に依存していました。このことにより、AppクラスはLoggerの実装やUserRepositoryの実装と切り離されていました(疎結合)。実際、UserRepositoryに関して、(今回や、テスト時のために)単純なオブジェクトを用いた実装を用意しても、MySQLを用いた実装を用意しても、Appクラスのコードは全く変わらないことがわかると思います。このように、インターフェイスを用いて依存の方向を制御するとソフトウェアの構成がいい感じにはなるのですが、オブジェクトの作成・その受け渡しが結構面倒になります。logger);程度で済んだりもしますが、オブジェクトの数が増え、依存性も複雑になってくるとかなりしんどくなってくるはずです。それの面倒を見てくれるのが、inversifyJSのようなDIフレームワーク、DIコンテナというわけです。#02でLTをさせていただいたので、その時の内容をここにもまとめておきます。スライドはこちらです。KazushiKitayawww.slideshare.netディープラーニングで価格予測モデルを作る「ディープラーニングで金融商品の価格予測モデルを作る」という場合に、いろいろなアーキテクチャ、ハイパーパラメータ、データで学習したいいろいろな学習済みモデル、データ、ハイパーパラメータでバックテストをしたい複数のモデルを組み合わせて一つのモデルを作る、すなわちアンサンブルをしたいといったことがしたくなります。当たり前ながらディープラーニングの学習にはには時間がかかります。アーキテクチャ5種類、ハイパーパラメータ5種類、データ5種類だけでも、組み合わせによって125通りのモデルができます。それぞれに1時間かかっていたら5日間かかります。バックテストにおいても、組み合わせが増えるとバカにならない時間がかかります。クラウドを使っていいい感じにディープラーニングしよう!というのが、今回のトピックです。クラウドでディープラーニングをするとクラウドの特徴として「独立した処理については、一つずつ動かしても、一気に動かしても、かかるコストは同じ」ということがあげられます。この特徴は、今考えている問題と非常に相性がいいです。さきほどの例、つまり1時間かかる処理が125個ある例、では、5日間ではなく、1時間ですべての処理が終わらせることができます。「様々な種類のマシンを利用できる」というのもクラウドの大きな利点です。GPUが載っているのも多数あります。今回のような処理は、ユーザーを待たせているわけではないため「すぐに結果が必要」でないこともあります。そのため、「需要の低い時間に安い価格でインスタンスを借りて計算する」ということも可能になります。AWSでいうスポットインスタンス、GCPでいうプリエンプティブインスタンスです。このおかげで思ったよりコストがかさまなかったりします。ちなみに自分たちはAWSのスポットインスタンスを用いることで、p2.xlargeというインスタンスを70%オフくらいで使うことができています。考えなくてはいけないこともちろんいいことだけではなく、考えなくてはならないこともあります。1つ目が「処理実行の管理をしないといけない」ということです。いくつかのインスタンスを立ち上げ、いい感じに分散させて処理を実行する必要があります。スポットインスタンスを用いる場合には考えることが増えます。ローカルで実験するのに比べると、とても手間がかかります。2つ目が「実行結果が分散されてしまう」ということです。それぞれの処理の結果は複数のインスタンスに散らばっている状態になるので、それをどうにかして一箇所に集めることが必要になります。ローカルで実験するよりは手間がかかります。その上で、実際どうやっているか上にあげたようなことを考え「実際にこんな感じでクラウドで価格予測モデルを作っているよ」という話をします。実際どうやっているか1まず、学習のためのDockerコンテナを作成します。実行コマンドのコマンドライン引数によって、アーキテクチャ、データ、ハイパーパラメータを指定できるようにします。学習が終わったら、生成されたモデルをS3などのクラウドストレージに、パラメータなどをデータベースに保存するようにしています。していろいろなマシンで実行された学習の結果が一箇所に集まるようにします。Dockerを用いることでDockerでもGPUを活用できます。Batchというサービスを用いています。このサービスは、ジョブのキューを用意してくれます。ジョブというのは、Dockerイメージと実行コマンドの組み合わせです。Batchがうまいことインスタンスを立ち上げ、そのジョブを実行してくれるというわけです。スポットインスタンスも簡単に利用できるようになっています。実際どうやっているか3バックテストも学習と同様です。Dockeイメージを用意し、コマンドライン引数によってテストしたいモデルや使いたいデータなどを指定するようにします。実行が終了した際に結果をクラウドストレージやデータベースに保存するようにしています。Batchを用いているのも同様です。実際どうやっているか4AWSのコンソールやCLIのみでこれらの操作すべてをやるのは厳しく、また機能的にも足りないところが出てくるので、機能を拡張し、そしてGUIも用意しています。実行済みバックテストの詳細を表示といった機能をもたせています。これのおかげで、スマホからでも学習・バックテストを回したり、それらの結果を確認できたりもします。おわりにクラウドを使うとディープラーニングが快適にできます。クラウドプロバイダはディープラーニングに役立つサービスをたくさん提供しているので利用すべきです。おまけ本当に相場を学習して勝てているのかの見定めは難しいです。「4回の大きい価格変動を当てる」モデルは16個に一個くらいはできてしまいます。探索空間が膨大に増えますが、複数モデルのアンサンブルもしています。以下のようにwinstonのloggerを用意したとします。],});そして以下のような文を実行します。happened');結果は想像の通り、以下のようになります。happened","level":"info"}しかし、以下の場合はどうでしょう。happened'));このような出力になり、スタックの内容やエラーメッセージは表示されません。{"level":"error"}解決策そこで、loggerの定義を拡張して以下のようにします。loggerに渡されたオブジェクト(iとしています)がErrorオブジェクトのインスタンスだった場合に、i.messageの内容をログ出力のmessageとして設定するようにしています。]});さきほどと同じ文を実行すると以下のような出力となり、うまくいっていることがわかります。happened"}stackなど、Errorオブジェクトの他のプロパティに関しても、同じようにして追加することができるはずです。おまけwinstonのloggerは、オブジェクトを渡されたとき、列挙可能なプロパティ(とそれに対応する値)のみをログに含めるようです。Errorオブジェクトのmessageプロパティややstackプロパティは列挙可能ではないので、このようなことになっているみたいです。執筆時のwinstonのバージョンは3.2.1です。(1)リンクホームページfeedレビューのまとめスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。