Lei*_* Li 2 machine-learning apache-spark word2vec
我想在我的 Spark 集群上训练关于 10G 新闻语料库的 word2vec 模型。下面是我的spark集群的配置?
但是我发现使用 Spark Mllib 训练 Word2vec 并没有充分利用集群的资源。例如: ubuntu中top命令的图片
如上图所示,一个worker只使用了100%的cpu,其他三个worker没有使用(所以不贴他们的图片),刚才我是如何训练一个关于2G新闻语料的word2vec模型,大约需要6h ,所以我想知道如何更有效地训练模型?提前谢谢大家:)
UPDATE1:以下命令是我在 spark-shell 中使用的
spark-shell \
--master spark://ip:7077 \
--executor-memory 70G \
--driver-memory 70G \
--conf spark.akka.frameSize=2000 \
--conf spark.driver.maxResultSize=0 \
--conf spark.default.parallelism=180
//import related packages
import org.apache.spark._
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.feature.{Word2Vec, Word2VecModel}
//read about 10G newsdata corpus
val newsdata = sc.textFile("hdfs://ip:9000/user/bd/newsdata/*",600).map(line => line.split(" ").toSeq)
//Configure word2vec parameters
val word2vec = new Word2Vec()
word2vec.setMinCount(10)
word2vec.setNumIterations(10)
word2vec.setVectorSize(200)
//train the model
val model = word2vec.fit(newsdata)更新2:
我已经训练了大约 24 小时的模型,但它没有完成。集群是这样运行的:一个worker只使用了100%的cpu,其他三个worker没有像以前那样使用。
小智 5
在训练 Word2Vec 模型时,我在 Python 中遇到了类似的问题。在此处查看 word2vec 的 PySpark 文档,内容如下:
setNumIterations(numIterations)设置迭代次数(默认值:1),该次数应小于或等于分区数。1.2.0 版中的新功能。
setNumPartitions(numPartitions)设置分区数(默认值:1)。使用较小的数字以提高准确性。1.2.0 版中的新功能。
我的 word2vec 模型停止挂起,当我增加模型使用的分区数时,Spark 不再耗尽内存,以便 numIterations <= numPartitions
我建议你设置word2vec.setNumIterations(1)或word2vec.setNumPartitions(10)。