0

私はCNNモデルを持っています。このモデルを使用して写真を分類するなどのリクエストは、1 秒に 1 回行われます。

リクエストを新しい教師なしデータとして収集し、モデルのトレーニングを続けたいと思います。

私の質問は次のとおりです: トレーニング タスクを処理し、タスクを効果的に分類するにはどうすればよいですか?

なぜそれが問題になるのかを説明します。

GPU を使用し、中断することはできません。そのため、分類タスクでも GPU を使用すると、要求に間に合うように応答できなくなります。CPU を使用してタスクを分類したいのですが、theano は 1 つのプロセスで 2 つの異なる config.device をサポートしていないようです。

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

ヘルプやアドバイスをいただければ幸いです。

4

1 に答える 1

0

CPU に 1 つ、GPU に 1 つずつ、同じ CNN の 2 つの別々のコピーを構築できます。これは、古い GPU バックエンドまたは新しい GPU バックエンドのいずれかで実行できると思いますが、方法は異なります....いくつかのアイデア:

古いバックエンドで:

で Theano をロードしdevice=cpuます。推論関数をビルドしてコンパイルします。次に、 を呼び出しtheano.sandbox.cuda.use('gpu')て、推論関数の新しいコピーを作成し、その勾配を取得してトレーニング関数を作成します。これで、推論関数が CPU で実行され、トレーニングが GPU で行われるはずです。(わざとやったわけではないのですが、たまたまそうなってしまったのです!)

新しいバックエンドで:

私の知る限り、GPU については、後でではなく、インポート時に直接 Theano に通知する必要があります。この場合、THEANO_FLAGS="contexts=dev0->cuda0"あるデバイスを別のデバイスで使用することを強制しない を使用できます。次に、関数の推論バージョンを通常どおりにビルドし、トレーニング バージョンの場合は、すべての共有変数を GPU に配置します。トレーニング関数への入力変数も GPU 変数にする必要があります (例: input_var_1.transfer('dev0'))。すべての関数がコンパイルされたら、使用しているプログラムをtheano.printing.debugprint(function)見て、GPU と CPU の違いを確認します。(CPU 関数をコンパイルすると、コンテキストを推測できないという警告が表示される場合があります。私が見た限りでは、CPU に着陸します...この動作が依存しても安全かどうかはわかりません。)

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

思いついたことを聞かせてください!

于 2017-01-13T00:07:04.667 に答える