web-dev-qa-db-fra.com

MemoryError: impossible d'allouer un tableau avec la forme et le type de données float32 lors de l'utilisation de Word2vec dans python

J'essaie de former le modèle Word2vec à partir de données texte Wikipedia, pour cela j'utilise le code suivant.

import logging
import os.path
import sys
import multiprocessing

from gensim.corpora import  WikiCorpus
from gensim.models import Word2Vec
from gensim.models.Word2vec import LineSentence


if __name__ == '__main__':
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # check and process input arguments

    if len(sys.argv) < 3:
        print (globals()['__doc__'])
        sys.exit(1)
    inp, outp = sys.argv[1:3]

    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())

    # trim unneeded model memory = use (much) less RAM
    model.init_sims(replace=True)

    model.save(outp)

Mais après 20 minutes de fonctionnement du programme, je reçois l'erreur suivante

Message d'erreur

1
suraj

Idéalement, vous devriez coller le texte de votre erreur dans votre question, plutôt qu'une capture d'écran. Cependant, je vois les deux lignes clés:

<TIMESTAMP> : INFO : estimated required memory for 2372206 words and 400 dimensions: 8777162200 bytes
...
MemoryError: unable to allocate array with shape (2372206, 400) and data type float32

Après avoir effectué un passage sur votre corpus, le modèle a appris combien de mots uniques survivront, ce qui indique la taille d'un modèle qui doit être allouée: un prenant environ 8777162200 bytes (environ 8,8 Go). Mais, lorsque vous essayez d'allouer le tableau de vecteurs requis, vous obtenez un MemoryError, ce qui indique qu'il n'y a pas assez de mémoire adressable par ordinateur (RAM) disponible.

Tu peux soit:

  1. courir là où il y a plus de mémoire, peut-être en ajoutant RAM à votre système existant; ou
  2. réduire la quantité de mémoire requise, principalement en réduisant soit le nombre de vecteurs Word uniques que vous souhaitez former, soit leur taille dimensionnelle.

Vous pouvez réduire le nombre de mots en augmentant la valeur par défaut min_count=5 paramètre à quelque chose comme min_count=10 ou min_count=20 ou min_count=50. (Vous n'avez probablement pas besoin de plus de 2 millions de vecteurs de mots - de nombreux résultats intéressants sont possibles avec juste un vocabulaire de quelques dizaines de milliers de mots.)

Vous pouvez également définir un max_final_vocab valeur, pour spécifier un nombre exact de mots uniques à conserver. Par exemple, max_final_vocab=500000 ne conserverait que les 500 000 mots les plus fréquents, ignorant le reste.

Réduire le size permettra également d'économiser de la mémoire. Un paramètre de size=300 est populaire pour les vecteurs Word et réduirait d'un quart les besoins en mémoire.

Ensemble, en utilisant size=300, max_final_vocab=500000 devrait réduire la mémoire requise à moins de 2 Go.

3
gojomo