【发布时间】:2015-04-05 06:17:11
【问题描述】:
我目前正在尝试在 UMBC Webbase Corpus 上训练一组 Word2Vec 向量(400 个文件中大约 30GB 的文本)。
即使在 100 GB 以上的机器上,我也经常遇到内存不足的情况。我在应用程序本身中运行 Spark。我尝试稍微调整一下,但我无法对超过 10 GB 的文本数据执行此操作。我的实现的明显瓶颈是先前计算的 RDD 的联合,即内存不足异常的来源。
也许你有经验想出比这更节省内存的实现:
object SparkJobs {
val conf = new SparkConf()
.setAppName("TestApp")
.setMaster("local[*]")
.set("spark.executor.memory", "100g")
.set("spark.rdd.compress", "true")
val sc = new SparkContext(conf)
def trainBasedOnWebBaseFiles(path: String): Unit = {
val folder: File = new File(path)
val files: ParSeq[File] = folder.listFiles(new TxtFileFilter).toIndexedSeq.par
var i = 0;
val props = new Properties();
props.setProperty("annotators", "tokenize, ssplit");
props.setProperty("nthreads","2")
val pipeline = new StanfordCoreNLP(props);
//preprocess files parallel
val training_data_raw: ParSeq[RDD[Seq[String]]] = files.map(file => {
//preprocess line of file
println(file.getName() +"-" + file.getTotalSpace())
val rdd_lines: Iterator[Option[Seq[String]]] = for (line <- Source.fromFile(file,"utf-8").getLines) yield {
//performs some preprocessing like tokenization, stop word filtering etc.
processWebBaseLine(pipeline, line)
}
val filtered_rdd_lines = rdd_lines.filter(line => line.isDefined).map(line => line.get).toList
println(s"File $i done")
i = i + 1
sc.parallelize(filtered_rdd_lines).persist(StorageLevel.MEMORY_ONLY_SER)
})
val rdd_file = sc.union(training_data_raw.seq)
val starttime = System.currentTimeMillis()
println("Start Training")
val word2vec = new Word2Vec()
word2vec.setVectorSize(100)
val model: Word2VecModel = word2vec.fit(rdd_file)
println("Training time: " + (System.currentTimeMillis() - starttime))
ModelUtil.storeWord2VecModel(model, Config.WORD2VEC_MODEL_PATH)
}}
}
【问题讨论】:
-
文件中的 30GB 数据...肯定会导致超过 100GB 的 Java 对象...这样做以便一次只有一个文件在内存中...处理它...然后加载下一个。
-
另外...不要这样做 ->
StorageLevel.MEMORY_ONLY_SER -
我需要立即处理它们,因为在模型拟合步骤中所有数据都需要存在
-
我相信你可以多次训练模型。嗯......这取决于你的实施。
-
尝试在任何地方使用
StorageLevel.MEMORY_AND_DISK...可能会有所帮助。它肯定会慢很多倍......但会起作用。
标签: scala nlp apache-spark bigdata word2vec