1

TL;DR: メモリを消費せずに Theano 関数により多くのデータを渡すにはどうすればよいですか?

私が抱えている問題は、Theano を使用して GPU で ML アルゴリズムをトレーニングすると、GPU が最終的にメモリ不足になることです。データセットが大きすぎてメモリに完全に読み込むことができないため、チュートリアルから少し離れました (これはビデオ アルゴリズムの問​​題でもあるはずですよね?)。そのため、インデックスの入力と更新スキームを使用するのではなく、Theano ndarrays を直接機能させます。

私が言いたいことの例を挙げましょう。Theano の Logistic Regression チュートリアルでは、次の行に沿って何かを行うように指示されています。

train_model = theano.function(
    inputs=[index],
    outputs=cost,
    updates=updates,
    givens={
        x: train_set_x[index * batch_size: (index + 1) * batch_size],
        y: train_set_y[index * batch_size: (index + 1) * batch_size]
    }
)

これにはtest_set_xtest_set_yをメモリにロードする必要があり、チュートリアルでは を使用して完全なSharedVariableデータセットを保存します。

私にとっては、データセットは巨大です(数ギガバイト)。つまり、すべてを一度にメモリにロードすることはできません。したがって、データを直接取得するように変更しました。

train_model = theano.function(
    inputs=[input, classes], 
    outputs=cost, 
    updates=updates
)

そして、私は漠然と次のように見える何かをします:

for count, data in enumerate(extractor):
    observations, labels = data
    batch_cost = train_model(observations, labels)
    logger.debug("Generation %d: %f cost", count, batch_cost)

厄介なPythonガベージコレクションの汚れなしにGPUにデータを適切に渡す方法を根本的に誤解している可能性があると思います。(多数の) バッチの後にこれをトレーニングした後、次のようなエラーが発生するため、これはモデル内でますます多くのメモリを内部的に占有しているようです。

Error when tring to find the memory information on the GPU: initialization error
Error freeing device pointer 0x500c88000 (initialization error). Driver report 0 bytes free and 0 bytes total 
CudaNdarray_uninit: error freeing self->devdata. (self=0x10cbbd170, self->devata=0x500c88000)
Exception MemoryError: 'error freeing device pointer 0x500c88000 (initialization error)' in 'garbage collection' ignored
Fatal Python error: unexpected exception during garbage collection

メモリを消費せずに Theano 関数により多くのデータを渡すにはどうすればよいですか?

4

1 に答える 1

0

データセットがメモリに収まらない場合は、その一部を取得して、必要なたびにロードすることをお勧めします

従来のラザニアチュートリアルに見られるように、データが GPU メモリに収まらない場合は、ミニバッチと呼ばれるデータセットの一部を反復処理できます。

次に、データが RAM に収まらない場合は、必要なたびにミニバッチをロードする必要があります。これを行う最善の方法は、現在のミニバッチ (gpu の動作) を分析しているときに、別のプロセスに次のミニバッチ(CPU の動作) をロードさせることです。

AlexNetからインスピレーションを得ることができます:

于 2016-11-16T00:15:54.957 に答える