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 に必要なものを取得できます。たとえば、トレーニング ステップを実行するときは、もちろん、新しい値を推論ネットワーク パラメーターにコピーするだけです。
思いついたことを聞かせてください!