3

Django と Scikit-learn に関連するメモリ リークをどのように診断して修正しますか?

私は、scikit-learn を使用して実装されたいくつかのテキスト分類子をトレーニングする Django 管理コマンドに取り組んでいます。私が知っているすべてのトリックを使用して、Django のメモリ リークをプラグします。

  1. DEBUG=False の設定
  2. クエリセットの反復には .iterator() を使用します
  3. .defer([columns]) を使用して、巨大な列の値が不必要にロードされるのを防ぎます。
  4. MyModel.objects.update() を定期的に呼び出して、キャッシュされたクエリセットをクリアします。
  5. 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 回実行する以外に、このメモリ リークを診断して修正する方法はありますか?

4

0 に答える 0