10

約 170K 行のファイルを使用して、1 行に 1 文ずつ、word2vec モデルをトレーニングしようとしています。

「文」には辞書の単語ではなく任意の文字列が含まれているため、特別な使用例を表している可能性があると思います。各文 (行) には約 100 の単語があり、各「単語」には約 20 文字があり、文字"/"や数字も含まれています。

トレーニング コードは非常に単純です。

# as shown in http://rare-technologies.com/word2vec-tutorial/
import gensim, logging, os

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname

    def __iter__(self):
        for fname in os.listdir(self.dirname):
            for line in open(os.path.join(self.dirname, fname)):
                yield line.split()

current_dir = os.path.dirname(os.path.realpath(__file__))

# each line represents a full chess match
input_dir = current_dir+"/../fen_output"
output_file = current_dir+"/../learned_vectors/output.model.bin"

sentences = MySentences(input_dir)

model = gensim.models.Word2Vec(sentences,workers=8)

つまり、100K センテンスまでは非常に高速に動作します (RAM は着実に増加します) が、その後 RAM が不足し、PC がスワップを開始したことがわかり、トレーニングが停止します。利用可能な RAM は多くなく、約 4GB しかなく、word2vecスワップを開始する前にすべて使い果たしています。

OpenBLAS が numpy に正しくリンクされていると思います。これが次のことnumpy.show_config()を示しています。

blas_info:
  libraries = ['blas']
  library_dirs = ['/usr/lib']
  language = f77
lapack_info:
  libraries = ['lapack']
  library_dirs = ['/usr/lib']
  language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
  libraries = ['openblas']
  library_dirs = ['/usr/lib']
  language = f77
openblas_info:
  libraries = ['openblas']
  library_dirs = ['/usr/lib']
  language = f77
lapack_opt_info:
  libraries = ['lapack', 'blas']
  library_dirs = ['/usr/lib']
  language = f77
  define_macros = [('NO_ATLAS_INFO', 1)]
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
atlas_3_10_threads_info:
  NOT AVAILABLE
atlas_info:
  NOT AVAILABLE
atlas_3_10_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

私の質問は、これは (私のような) 利用可能な RAM があまりないマシンで予想されることですか? または、セットアップが正しく構成されていないように見えますか (またはコードが非効率的ですか)?

前もって感謝します。

4

2 に答える 2

3

最初の原則として、予算とマシンがそれを管理できる場合は、常により多くの RAM を取得する必要があります。時間と手間を大幅に節約できます。

第 2 に、100K を超えるセンテンスのデータセットでは、最初の 100K センテンスに遭遇した後にトレーニングが遅くなり始めるという意味なのか、それとも 100K センテンスを超えるデータセットを使用するとスローダウンが発生するという意味なのかが不明です。後者だと思うので...

Word2Vec のメモリ使用量は語彙サイズ (トークン数) の関数であり、トレーニングに使用されるデータの総量ではありません。したがって、より大きな を使用してmin_count、追跡される単語数を減らし、トレーニング中の RAM 使用量を制限することができます。(モデルによって追跡されていない単語は、トレーニング中にそこにないかのように静かに削除されます。まれな単語に対してそれを行うことは、他の単語を互いに近づけることで、それほど害はなく、時には役立つことさえあります。)

最後に、コンストラクター (自動的にスキャンとトレーニングを行う) でコーパス センテンスを提供することを避け、代わりに、モデルの構築後に明示的にbuild_vocab()andtrain()ステップを自分で呼び出して、モデルの状態/サイズを調べ、必要に応じてパラメーターを調整することをお勧めします。

特に、gensim の最新バージョンでは、ステップアップを、、および のbuild_vocab(corpus)3 つのステップに分割することもできます。scan_vocab(corpus)scale_vocab(...)finalize_vocab()

このscale_vocab(...)ステップは、およびパラメータdry_run=Trueのさまざまな値を試した後に語彙、サブサンプリングされたコーパス、および予想されるメモリ使用量がどのくらい大きくなるかをプレビューするパラメータを使用して呼び出すことができます。扱いやすいと思われる値を見つけたら、選択したパラメーターを指定してを呼び出すことができます。min_countsamplescale_vocab(...)dry_runfinalize_vocab()

于 2015-09-30T01:42:53.530 に答える
2

セットアップが適切に構成されていないように見えますか (またはコードが非効率的ですか)?

1) 一般的に、私はノーと言うでしょう。ただし、RAM の量が少ないことを考えると、使用するワーカーの数は少なくなります。トレーニングが遅くなりますが、この方法でスワップを回避できるかもしれません。

2) ステミングまたはそれ以上のレンマタイゼーションを試すことができます。たとえば、単数形と複数形が同じ単語としてカウントされるため、単語の数が減ります。

3) ただし、4 GB の RAM がおそらくここでの主な問題だと思います (OS を除けば、プロセス/スレッドで実際に使用できるのはおそらく 1 ~ 2 GB だけです。より多くの RAM に投資することを本当に考えます)たとえば、最近では 16 GB の RAM キットを 100 ドル未満で入手できますが、一般的な ML/「データ サイエンス」タスク用に十分な RAM に投資するお金がある場合は、64 GB 以上をお勧めします。

于 2015-07-25T07:20:06.353 に答える