2016-10-21 6 views
4

現在、私は、NLPに基づいてテキストデータを分析して視覚化するシステムを開発しています。単独インタラクティブビジュアライゼーションを処理セロリメッセージキューとAWSラムダタスク処理

バックエンド(パイソン+フラスコ+ AWS EC2)が分析を処理し、バックフロントエンドに結果を供給するためにAPIを使用して(FLASK + D3 + Herokuの)アプリ。

現在、プロトタイプでの解析は基本的なPython関数です。これは、大きなファイルでは解析が長くなり、結果としてフロントエンドへのAPIデータブリッジ時に要求タイムアウトが発生することを意味します。また、多くのファイルの分析は、リニアブロッキングキューで行われます。

このプロトタイプを拡張するには、Analysis(text)関数をバックグラウンドタスクに変更して、それ以上の実行をブロックせず、関数が完了したらコールバックを実行できるようにする必要があります。入力テキストはAWS S3からフェッチされ、出力はAWS S3にも格納されることを目指して比較的大きなJSON形式になっているため、APIブリッジはフロントエンドアプリケーションのすべてのグラフのデータを含むこのJSONを単に取得します。 (私は、永続的なデータを格納するための大きなリレーショナルデータベース構造を作成するよりも、S3のほうがやや簡単です。)

私はCeleryで簡単な例を示していますが、紙の上でスケーリングの点でより良い解決策のように見えるラムダ...

Analysis(text)関数は、あらかじめ構築されたモデルと比較的一般的なNLP Pythonパッケージの関数を使用します。プロトタイプをスケーリングする経験が不足しているので、このシナリオではどのソリューションが最も適しているかについての経験と判断をお願いしたいと思います。

ありがとうございます。

答えて

0

私は個人的な経験を共有したいと思います。私は重労働をAWS Lambdaに移しました。私はROIがかなり良いと認めなければなりません。たとえば、私の仕事の1つは、顧客のために毎月のステートメントを生成して、それを顧客にメールすることでした。各ステートメントのデータはJinjaテンプレートに入力され、ステートメントのHTMLが表示されました。 Weasyprintを使って、HTMLをPdfファイルに変換しました。そして、それらのpdfステートメントを郵送することが最後のステップでした。私はpdfファイルを直接作成するための様々なオプションを研究しましたが、私にとっては実現不可能でした。

つまり、規模が小さいとき、すなわち顧客数が少ないときには、セロリは素晴らしかった。しかし、この作業では、CPU使用率が高くなっていることがわかりました。私は、セロリの作業員がタスクを拾い集めて実行する、各顧客のためにこのタスクをセロリキューに追加します。

しかし、スケールが高くなると、セロリは堅牢な選択肢にはなりませんでした。 CPU使用率はかなり高かった(セロリを責めるわけではないが、それは私が観察したものである)。セロリはまだ良いですが。しかし、これを理解してください。セロリではスケーリングの問題に直面することができます。垂直方向のスケーリングはあなたを助けないかもしれません。したがって、バックエンドが成長するにつれて水平方向にスケーラビリティが必要なため、セロリから優れたパフォーマンスを得ることができます。待ち行列に待っているタスクが多く、従業員の数が限られている場合、自然に多くのタスクを待つ必要があります。

私の場合、このCPU集約型タスクをAWS Lambdaに移しました。そこで、私は顧客のステートメントデータから文Pdfを生成する関数をデプロイし、その後に郵送しました。直ちに、AWS Lambdaはスケーリングの問題を解決しました。第二に、これは日々の仕事ではなく、より多くの期間の仕事だったので、毎日セロリを実行する必要はありませんでした。ラムダは必要なときに起動しますが、使用していないときは実行しません。さらに、この機能はNodeJSにありました.Npmパッケージが見つかったので、私がPythonで持っていたソリューションをより効率的にすることができました。だからラムダは、さまざまなプログラミング言語の利点を得ることができるので有利ですが、コアは変わらないかもしれません。また、私は個人的にはラムダがかなり安いと思っています。フリー層は毎月多くの計算時間を提供します(GB秒)。また、Lambdaが所属するサーバーは、利用可能な場合に最新のセキュリティーパッチに更新されます。ご覧のように、私のメンテナンスコストは大幅に下がりました。

必要に応じてAWSラムダスケール。さらに、リアルタイムのストリーム処理や大量のデータ処理タスクや、非常にCPU集約的なタスクの実行など、優れたユースケースとして役立ちます。

関連する問題