Django と Scikit-learn に関連するメモリ リークをどのように診断して修正しますか?
私は、scikit-learn を使用して実装されたいくつかのテキスト分類子をトレーニングする Django 管理コマンドに取り組んでいます。私が知っているすべてのトリックを使用して、Django のメモリ リークをプラグします。
- DEBUG=False の設定
- クエリセットの反復には .iterator() を使用します
- .defer([columns]) を使用して、巨大な列の値が不必要にロードされるのを防ぎます。
- MyModel.objects.update() を定期的に呼び出して、キャッシュされたクエリセットをクリアします。
- gc.collect() を手動で呼び出して、ガベージ コレクションを高速化します。
これらの手法により、過去に実行時間の長い Django プロセスで発生したメモリ リークの問題はすべて解決されました。ただし、scikit-learn で大規模なメモリ リークがまだ発生しているため、Django に問題がない可能性があります。
私のプロセスは基本的に次のようになります。
tmp_debug = settings.DEBUG
settings.DEBUG = False
try:
documents = Document.objects.all().defer('text')
for document in documents.iterator():
classifier = Pipeline([
('vectorizer', HashingVectorizer(ngram_range=(1,4))),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC())),
])
x_train = document.training_vector
y_train = document.classification_index
classifier.fit(x_train, y_train)
obj, _ = SavedClassifier.objects.get_or_create(document=document)
_, fn = tempfile.mkstemp()
joblib.dump(classifier, fn, compress=9)
obj.classifier = b64encode(open(fn, 'rb').read())
os.remove(fn)
obj.save()
Document.objects.update()
gc.collect()
finally:
settings.DEBUG = tmp_debug
各文書オブジェクトには、複数ページのテキストが含まれています (「テキスト」フィールド内)。約 50 のドキュメント レコードがあり、5 つのドキュメントを解析した後、スクリプトは約 4 GB のメモリを消費しており、時間の経過とともに着実に増加しています。
ドキュメントごとにスクリプトを 1 回実行する以外に、このメモリ リークを診断して修正する方法はありますか?