【问题标题】:Word2vec training using gensim starts swapping after 100K sentences使用 gensim 的 Word2vec 训练在 10 万个句子后开始交换
【发布时间】:2015-09-12 18:20:00
【问题描述】:

我正在尝试使用大约 170K 行的文件训练 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 的机器(比如我的)上是预期的,我应该获得更多 RAM 或以更小的部分训练模型吗? 或 我的设置是否配置不正确(或者我的代码效率低下)?

提前谢谢你。

【问题讨论】:

    标签: python numpy blas gensim word2vec


    【解决方案1】:

    作为首要原则,如果您的预算和机器可以管理它,您应该始终获得更多 RAM。它节省了很多时间和麻烦。

    其次,不清楚您的意思是在超过 10 万个句子的数据集上,训练在遇到前 10 万个句子后开始减慢,还是您的意思是使用任何超过 10 万个句子的数据集都会出现减慢。我怀疑是后者,因为...

    Word2Vec 内存使用是词汇量(令牌计数)的函数,而不是用于训练的数据总量。因此,您可能希望使用更大的min_count,以减少跟踪的单词数,以限制训练期间的 RAM 使用量。 (模型未跟踪的单词会在训练过程中被静默删除,就好像它们不存在一样——而对稀有单词这样做并没有太大的伤害,有时甚至会有所帮助,因为可以让其他单词彼此靠近。)

    最后,您可能希望避免在构造函数中提供语料库语句(它会自动扫描和训练),而是在模型构建后自己显式调用 build_vocab()train() 步骤,以检查状态/大小建模并根据需要调整参数。

    特别是,在最新版本的gensim中,您还可以将build_vocab(corpus)步骤向上拆分为三个步骤scan_vocab(corpus)scale_vocab(...)finalize_vocab()

    可以使用dry_run=True 参数调用scale_vocab(...) 步骤,该参数可以预览在尝试min_countsample 参数的不同值后您的词汇量、二次采样语料库和预期的内存使用量有多大。当您发现似乎可以管理的值时,您可以使用这些选择的参数调用scale_vocab(...),而不使用dry_run,将它们应用于您的模型(然后finalize_vocab() 来初始化大型数组)。

    【讨论】:

      【解决方案2】:

      我的设置是否配置不正确(或者我的代码是 效率低下)?

      1) 一般来说,我会说不。但是,鉴于您只有少量 RAM,我会使用较少数量的工人。它会减慢训练速度,但也许你可以通过这种方式避免交换。

      2) 您可以尝试词干提取或更好的方法:词形还原。您将减少单词的数量,例如,单数和复数形式将被视为同一个单词

      3) 但是,我认为 4 GB 的 RAM 可能是您的主要问题(除了您的操作系统,您可能只有 1-2 GB 可供进程/线程实际使用。我真的会考虑投资例如,现在您可以以 64 GB

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-04
        • 2019-02-07
        • 1970-01-01
        • 2022-01-03
        • 2021-10-22
        • 2019-09-05
        • 2020-12-24
        相关资源
        最近更新 更多