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_x
とtest_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 関数により多くのデータを渡すにはどうすればよいですか?