2016-07-22 9 views
0

私はCNNモデルを持っています。画像を分類するなど、このモデルを使用する要求は1秒に1回です。機械学習のためにtheanoを使用して1つのプロセスでマルチタスクを処理する方法は?

新しい未修理データとしてリクエストを収集し、自分のモデルを訓練していきたいと思います。

私の質問は次のとおりです。どのようにして訓練タスクを処理し、タスクを賢明に分類できますか?

それが問題になる理由を、私は説明します:

をすべてのトレーニングステップは、GPUと中断可能ではないを使用して、少なくともsevery秒、長い時間がかかります。だから、自分の分類タスクでGPUも使用されていると、時間内に要求に応答できません。私はCPUを使用してタスクを分類したいと思いますが、theanoは2つの異なるconfig.deviceを1つのプロセスでサポートしていないようです。

私のメモリが限られており、theanoのコストが高すぎるため、マルチプロセスは受け入れられません。

何か助けやアドバイスをいただければ幸いです。

答えて

0

同じCNNの2つのコピーをCPUに1つ、GPUに1つ作成できます。私はいくつかのアイデア....これは古いGPUのバックエンドか、新しいのいずれかの下ではなく、さまざまな方法で行うことができると思う:

古いバックエンドの下で:device=cpu

ロードTheano。推論関数を構築し、コンパイルします。その後、theano.sandbox.cuda.use('gpu')に電話し、推論関数の新しいコピーを作成し、その勾配を取ってトレーニング機能を作成します。これで、推論関数がCPU上で実行され、トレーニングはGPU上で行われます。 (私は目的でこれをやったことがないが、私はそれが事故に私に起こる持っていた!)

を新しいバックエンドの下で:

私の知る限りでは、あなたはインポート右ときの任意のGPUについてTheanoを伝える必要があります、後ではありません。この場合、THEANO_FLAGS="contexts=dev0->cuda0"を使用できますが、1つのデバイスを強制的に別のデバイスに使用することはありません。その後、通常のようにあなたの関数の推論バージョンを構築し、トレーニングバージョンでは、再びGPUにすべての共有変数を入れて、あなたのトレーニング関数への入力変数もGPU変数(例えばinput_var_1.transfer('dev0'))でなければなりません。すべての機能がコンパイルされたら、theano.printing.debugprint(function)を使ってプログラムを見て、GPUとCPUの違いを確認してください。 (CPU関数をコンパイルすると、コンテキストを推論できないという警告が表示される可能性があります。これまで見た限りでは、CPU上にあります。この動作が頼りになるかどうかわかりません)

どちらの場合でも、これはGPUベースの関数に依存しますが、CPUに何も返されません(出力変数がGPUであることを確認してください)。これにより、トレーニング関数を推論関数と同時に実行できるようになり、後で必要なものをCPUに取り込みます。たとえば、トレーニングのステップを踏むときは、新しい値をあなたの推論ネットワークパラメータにコピーするだけです。

あなたの思いつきを聞かせてください!

関連する問題