使用gensim的Word2vec培训在100K句子后开始交换

Fel*_*ida 10 python numpy blas gensim word2vec

我正在尝试使用大约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)
Run Code Online (Sandbox Code Playgroud)

事情是,事情真正快速达到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
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是在一台没有大量可用内存(如我的)的机器上预期的,我应该获得更多内存或以更小的部分训练模型?或者看起来我的设置配置不正确(或者我的代码效率低下)?

先感谢您.

小智 2

看起来我的设置配置不正确(或者我的代码效率低下)?

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

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

3)但是,我认为 4 GB RAM 可能是您的主要问题(除了您的操作系统之外,您可能只有 1-2 GB 可以实际供进程/线程使用。我真的会考虑投资更多 RAM . 例如,现在您可以以 < 100 美元的价格购买优质的 16 GB RAM 套件,但是,如果您有钱投资购买合适的 RAM 来执行常见的 ML/“数据科学”任务,我建议您使用 > 64 GB