2017-05-09 18 views
0

ユーザーが直面するコンポーネントを持つNatural Language Processingアプリケーションを開発しようとしています。ユーザーはAPIを介してモデルを呼び出し、結果を戻すことができます。 モデルはTheanoでKerasを使用して事前に訓練されています。 GPUを使用してトレーニングをスピードアップします。しかし、GPUを使用することで予測は大幅にスピードアップします。現在、2つのGPUを持つマシンがあります。しかし、実行時(例えば、ユーザがビットを向いている場合)には、CUDAを介してGPUを共有する複数のPythonプロセスが並列処理を高速化するようには見えないという問題があります。 libgpuarray(pygpu)、TheanoとKerasでnvidia-dockerを使用しています。 GPUはまだほとんどアイドルですが、Pythonワーカーを増やしても処理速度が向上しません。高負荷ストリームの予測時にCUDA GPUを使用する

APIの背後にあるGPUモデルを実行する際の問題を解決するには、どのような方法が適していますか?理想的には、新しいGPUを購入する前に、既存のGPUをより効率的に利用することができます。

HTTPコールごとにロックを要求するのではなく、GPUに送信する前に何らかのバッファを必要とすると思いますか?

+1

正しく理解していれば、複数の異なるカーネル/プロセスが1つのGPUで同時に実行されることがありますか? AfaikのGPUは、少なくとも、すべてのカーネルが特定の数のスレッドブロックで起動されているときに、これをうまく利用できません。 – Shadow

+1

これは実際には非常に広い質問です.CUDAの観点か、Pythonフレームワークのどこに関わっているのかを尋ねているかどうかはわかりません。 NVIDIAは、複数のプロセスがGPUに同時にアクセスする必要のあるMPIなどのユースケース向けのMPSという製品を配布しています。助けてくれますか? – talonmies

+0

私はtalonmiesが問題を指摘し、解決策を提供したと信じています。異なるプロセスからのカーネルは別々のGPUコンテキストで実行され、[別々のコンテキストからのカーネルは同時に実行されません](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#concurrent-kernel -実行)。解決策は、他のプロセスに代わってカーネルを実行する "プロキシ"プロセスを使用して、すべてが同じコンテキストを共有することです。これはまさに[MPS](https://docs.nvidia.com/deploy/pdf/CUDA_Multi_Process_Service_Overview.pdf)と同じものです。 – tera

答えて

1

これはあなたのより一般的な質問に対する答えではなく、あなたが説明したシナリオの理解に基づいた答えです。

誰かが何らかの計算タスクにGPUを使用するシステムをコーディングしている場合、GPUが提供できる完全なリソース、またはそれに近いものから恩恵を受けるために、(うまくいけば)実行を並列化する時間があります。

これは、2番目の同様のタスクを追加すると(パラレルでも)、それらのタスクを完了するための合計時間は、連続して完了するまでの時間と似ている必要があることを意味します。第2のタスクが恩恵を受けるために、GPUリソ​​ースが十分に活用されていない。実際には、たとえ両方とも何とかL2キャッシュを多用し、一緒に走っているときにそれをスラッシュすると、両方のタスクが遅くなる場合もあります。この場合には、第2のリンクは、プレゼンテーション公式ドキュメントですnvprof profilerまたはそのnvvp frontend(最初のリンクを使用して - あなたは、パフォーマンスを向上させたい時に任意の割合で

は、行うには良いことは、あなたのアプリケーションのプロファイリングであります)。

関連する問題