ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Angel 分布式 Word2Vec(Spark On Angel SkipGram 负采样)算法详解与实战指南

Angel 分布式 Word2Vec(Spark On Angel SkipGram 负采样)算法详解与实战指南 人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载导读本文基于 Angel 开源仓库的 SONASpark On Angel实现系统讲解基于负采样优化的 SkipGram Word2Vec 算法在 Angel 参数服务器上的设计与运行。你将掌握U/V 双矩阵在 PS 上的存储与拉取/推送原理、算法 IO 参数与训练参数的完整配置、Angel PS 与 Spark 的资源估算方法以及如何在 YARN 集群上提交真实的 Word2Vec 训练任务并学会排查10 分钟任务挂掉等典型故障。1. 算法介绍负采样 SkipGram 与参数服务器架构Word2Vec 是 NLP 领域最著名的算法之一它从文本语料中学习每个单词或节点的稠密向量表示embedding并把这种表示作为下游 NLP 算法如文本分类、序列模型、图嵌入的输入。在 docs/algo/sona/word2vec_sona.md 对应的 SONA 实现中Angel 提供的是基于负采样Negative Sampling优化的 SkipGram 模型并且可以支撑10 亿节点 × 1000 维量级的超大模型。1.1 SkipGram 与负采样SkipGram 的基本思想是给定中心词src node预测其窗口内的上下文词dst node从而让语义相近的词在向量空间中彼此靠近。为避免输出层在整个词表上做 softmax 的巨大开销本实现采用负采样策略——对每个 (src, dst) 正样本对额外随机抽取若干个负样本训练目标退化为正样本对 (src, dst) 的 sigmoid 打分尽量高负样本对 (src, neg) 的 sigmoid 打分尽量低。1.2 U、V 双矩阵放在 Angel PS 上从源码 Word2VecModel.scala 可以看到本实现将模型组织为一张名为embedding的 PS 矩阵矩阵中同时存放**输入向量U与上下文向量V**两类表示每个节点对应两个维度为embeddingDim的向量。矩阵行类型默认使用T_ANY_INTKEY_SPARSE未开启 hash 分区时使用T_ANY_INTKEY_DENSE节点 ID 即矩阵的行索引。整个训练流程是典型的 PS 异步计算模式PullSpark executor 根据当前 batch 数据从 PS 拉取 src 节点、dst 节点以及负采样节点的 embedding 向量本地计算梯度executor 在本地完成点积、sigmoid 损失与梯度计算见optimizeOneBatch中dot/doGrad/adjust三阶段源码见 Word2VecModel.scalaPush将需要更新的 input 向量与 output 向量梯度推回 PS由 PS 完成模型更新。因此模型本身U/V 矩阵始终驻留在 Angel PS 上Spark 端只负责批量数据的组织与梯度计算这正是该实现能够支撑超大规模 embedding 的关键。2. 运行算法 IO 参数详解2.1 input随机游走产出的句子input是 HDFS 路径存放随机游走产出的 sentences。每行是一条 sentence词之间用空白符或逗号分隔。文档示例以数字 id 为例0 1 3 5 9 2 1 5 1 7 3 1 4 2 8 3 2 5 1 3 4 1 2 9 4值得注意的是输入数据可以是非数字字符串。此时可以开启remapping:true使用组件自带的重编码功能把字符串映射为连续整数 ID详见 3.2 节。2.2 output结果保存路径与分隔符output为结果保存的 HDFS 路径。最终的 embedding 结果保存路径为output/CP_x其中x代表第 x 轮epoch。从源码 Word2VecModel.scala 可以看到保存时使用TextLINEModelOutputFormat输出 input embedding若开启saveContextEmbedding则额外用TextLINEModelContextEmbOutputFormat输出output/CP_x/contextEmbedding。结果文件的格式分隔符可通过以下两个配置项指定支持 space、comma、tab、bar、colon 等默认是 colon即冒号:spark.hadoop.angel.line.keyvalue.sep(可支持space、comma、tab、bar、colon等默认是colon) spark.hadoop.angel.line.feature.sep(可支持space、comma、tab、bar、colon等默认是colon)keyvalue.sep用于分隔节点 id 与向量即 key 与 valuefeature.sep用于分隔向量内部的各个特征分量。源码 Word2VecModel.scala 中两个配置项的取值映射为配置取值实际分隔符space空格comma逗号,tab制表符\tcolon冒号:keyvalue.sep 默认值bar竖线\|2.3 saveContextEmbedding是否保存 context embedding训练时选择是否保存 context embedding。保存该 embedding 后可以将其作为后续增量训练的初始化向量。对应源码参数为Word2VecParam.saveContextEmbedding见 Word2VecParam.scala默认在示例程序中为false。2.4 增量训练extraInputEmbeddingPath 与 extraContextEmbeddingPath从外部加载预训练好的节点 input / context embedding 向量用于初始化模型进而实现增量训练。数据格式默认为节点id:embedding向量(向量用空格分隔)例如123:0.1 0.2 0.1表示节点 123 的 3 维向量。分隔符同样通过 2.2 节的两个配置项指定此处keyvalue.sep默认 colon、feature.sep默认 space与文档保持一致源码中feature.sep的默认值为space见 Word2VecModel.scala。从示例程序 Word2vecExample.scala 可以看到若两个路径任一非空则先做一次randomInitialize随机初始化再通过extraInitialize把外部向量批量写入 PS每 5000 行一批通过LINEAdjustPSF 完成更新两者均为空时直接randomInitialize随机初始化。2.5 nodeTypePath异构 SkipGram 的节点类型nodeTypePath是跑异构 skip-gram时需要的节点类型路径典型场景是 metapath 游走的结果。数据格式为节点id 分隔符 类型idNodeId 与 TypeId 之间用空白或逗号分隔。启用后负采样不再是全词表均匀采样而是同类型节点内采样negativeSampleWithType源码见 Word2VecModel.scala节点类型被存为独立的nodeTypePS 向量T_INT_SPARSE类型。2.6 saveModelInterval 与 checkpointIntervalsaveModelInterval每隔多少个 epoch 保存一次模型checkpointInterval每隔多少个 epoch 写一次 checkpoint。从源码 Word2VecModel.scala 可以看出两者的差异checkpoint 走psMatrix.checkpoint(epoch)PS 内部快照用于快速恢复save 走save(modelPath, epoch, ...)输出CP_x格式的落盘模型。二者都在满足epoch % interval 0且epoch numEpoch时触发。参数默认值在 Word2VecParam.scala 中为Int.MaxValue即默认不触发示例程序里分别默认为 2 和 5。3. 算法参数详解参数含义与取值建议embeddingembedding 向量维度即 U/V 向量的维度示例默认 32negative负采样个数即每个 (src, dst) 正样本对配套的负样本数示例默认 5window训练窗口大小取中心词前 window 与后 window 范围内的词作为上下文示例默认 10epoch总迭代轮数示例默认 5stepSize学习率很影响算法结果太高容易导致模型跑飞结果量级异常发现结果量级太大时应调低示例默认 0.01batchSize每个 mini batch 包含的训练句数。由于实现按 batch 取句子训练不宜设得过大一般 100 以内示例默认 50psPartitionNum模型分区个数。最好是 PS 个数的整数倍使每个 PS 承载分区数相等、负载均衡数据量大时推荐 500 以上示例默认 10dataPartitionNum输入数据 partition 数一般设为 spark executor 个数 × executor core 数的 3–4 倍示例默认 100remapping是否对节点重新编码true/false。Word2Vec 目前只支持节点 ID 落在连续的整数空间int 范围内最好在运行前完成 ID 映射置 true 时程序先做一次 ID 映射并输出映射文件示例默认 false3.1 参数校验与默认值源码佐证示例程序 Word2vecExample.scala 给出的默认值与文档对齐embedding:32、window:10、negative:5、epoch:5、stepSize:0.1、batchSize:50、psPartitionNum:10、dataPartitionNum:100。而 Word2VecParam.scala 对每个 setter 都有合法性校验require例如partitionNum、windowSize、embeddingDim、negSample、learningRate、decayRate、batchSize、logStep、numEpoch均要求 0maxIndex要求0 maxIndex Int.MaxValueminIndex要求0 minIndex Int.MaxValueorder仅允许 1 或 2本实现按 SkipGram 使用 2。另外示例程序中还有decayRate学习率衰减率默认 0.5、logStep每多少 batch 打印一次日志默认 1024、minCount低于该词频的词被过滤默认 0、storageLevelRDD 缓存级别默认 MEMORY_ONLY、dataCheckpoint是否对训练 RDD 做 checkpoint等补充参数。3.2 remapping 的内部流程当remapping:true时程序调用Word2VecUtils.corpusStringToInt源码见 Word2VecUtils.scala先统计全量词频并过滤minCount以下的词再对剩余字符串按词频序zipWithIndex编码为从 1 开始的连续整数同时输出一份output/mapping映射文件格式新id:原字符串。训练结束后映射文件也会落盘见 Word2vecExample.scala方便将 embedding 结果还原回原始字符串。4. 资源配置建议4.1 Angel PS 个数与内存为保证 Angel 不挂掉需要配置约模型大小 2 倍的内存。Word2Vec 模型大小计算公式为节点数 × Embedding特征维度 × 2 × 4 Byte乘 2 是因为每个节点同时维护 U、V 两个向量乘 4 Byte 是 float 的字节数。文档给出的算例1kw 节点1000 万、100 维时模型大小约为 8G此时配置instances4、memory4g合计约 16G即模型 2 倍就差不多了。另外Word2Vec 算法的瓶颈主要在通信因此 PS 的数量最好与 worker 数量对等PS 与 worker 的数量比最好不要低于 1:3这样 PS 的通信压力不会太大。4.2 Spark 资源配置num-executors × executor-memory是 executors 的总配置内存最好能存下 2 倍的输入数据若内存紧张1 倍也可以接受但训练会相对慢一些。文档算例100 亿边即 100 亿 token 级别的游走句子约 160G 大小20g × 2020 个 executor、每个 20g的配置足够。5. 任务提交示例进入 Angel 环境 bin 目录按以下方式提交任务文档示例YARN cluster 模式inputhdfs://my-hdfs/data outputhdfs://my-hdfs/model source ./spark-on-angel-env.sh $SPARK_HOME/bin/spark-submit \ --master yarn-cluster\ --conf spark.ps.instances1 \ --conf spark.ps.cores1 \ --conf spark.ps.jars$SONA_ANGEL_JARS \ --conf spark.ps.memory10g \ --jars $SONA_SPARK_JARS \ --driver-memory 5g \ --num-executors 1 \ --executor-cores 4 \ --executor-memory 10g \ --class com.tencent.angel.spark.examples.cluster.Word2vecExample \ ../lib/spark-on-angel-examples-3.3.0.jar \ input:$input output:$output embedding:32 negative:5 epoch:10 stepSize:0.01 batchSize:50 psPartitionNum:10 remapping:false window:5其中spark.ps.instances / spark.ps.cores / spark.ps.memory / spark.ps.jars是Angel PS侧的资源配置spark.ps.jars$SONA_ANGEL_JARS指定 PS 所需的 Angel jar 包--driver-memory / --num-executors / --executor-cores / --executor-memory是Spark侧的资源配置--jars $SONA_SPARK_JARS把 Spark On Angel 相关 jar 提供给 executor命令行末尾以key:value形式传入算法参数与 2、3 节对应。spark-on-angel-env.sh见 spark-on-angel/bin/spark-on-angel-env.sh会基于SPARK_HOME、ANGEL_HOME、ANGEL_HDFS_HOME、ANGEL_VERSION四个环境变量自动拼接SONA_ANGEL_JARS与SONA_SPARK_JARS。运行前需确认Hadoop 与 Spark 环境就绪、已解压 angel bin 包并上传到 HDFS、上述四个变量已正确设置。5.1 本地调试方式仓库还提供了本地模式示例 Word2vecExample.scala通过spark.ps.modelLOCAL、spark.ps.instances1在本地起一个 PS 进程可直接用data/text8/text8.split.head数据跑通流程适合在提交 YARN 前做小规模验证。6. 常见问题与排查6.1 任务在约 10 分钟时挂掉很可能的原因是 Angel PS 申请不到资源由于 Word2Vec 基于 Spark On Angel 开发实际涉及 Spark 与 Angel 两个系统它们向 YARN 申请资源是相互独立的Spark 任务拉起后由 Spark 向 YARN 提交 Angel 任务若 Angel 未能在给定时间内申请到资源就会报超时错误导致任务挂掉。解决方案确认资源池有足够的资源空闲容器满足spark.ps.instances与内存需求调大超时时间添加 spark confspark.hadoop.angel.am.appstate.timeout.msxxx该配置默认值为600000即10 分钟与上述故障时间点吻合。6.2 如何估算需要配置多少 Angel 资源参考 4.1 节按节点数 × embedding维度 × 2 × 4 Byte估算模型大小再预留约 2 倍内存同时保证 PS 数量与 worker 数量比不低于 1:3 以缓解通信瓶颈。7. 源码阅读指引若希望进一步深入本实现推荐按以下路径阅读仓库源码算法主体与训练循环Word2VecModel.scalatrain/optimizeOneBatch/dot/doGrad/adjust/negativeSample/negativeSampleWithType参数定义与校验Word2VecParam.scala语料编码与统计工具Word2VecUtils.scala集群 / 本地提交示例cluster/Word2vecExample.scala、local/Word2vecExample.scala模型落盘格式TextLINEModelOutputFormat与TextLINEModelContextEmbOutputFormat位于 line 目录运行环境脚本spark-on-angel/bin/spark-on-angel-env.shWord2Vec 产出的节点/词向量可继续作为图算法如 metapath 异构游走、node2vec或下游 NLP 模型的输入与本仓库中 LINE、DeepWalk、Node2Vec 等 SONA 算法配套使用共同构成大规模图表示学习的技术栈。赞分享人工智能机器学习分布式训练图计算后端【免费下载链接】angelA Flexible and Powerful Parameter Server for large-scale machine learning项目地址https://gitcode.com/gh_mirrors/an/angel点击查看免费下载相关推荐Angel 图算法系列Spark on Angel 上的 Node2Vec 游走采样实现与实战Angel 图算法系列Spark on Angel 上的 Node2Vec 游走采样实现与实战 本文基于 Angel 开源仓库的 docs/algo/sona人工智能机器学习分布式训练图计算后端HANP 社区发现算法在 Angel 上的 Spark on Angel 实战指南HANP 社区发现算法在 Angel 上的 Spark on Angel 实战指南 HANPHop Attenuation Node Preference人工智能机器学习分布式训练图计算后端Angel 上的 COPRA 重叠社区发现算法Spark On Angel 实战指南Angel 上的 COPRA 重叠社区发现算法Spark On Angel 实战指南 COPRACommunity Overlap PRopagation人工智能机器学习分布式训练图计算后端上一篇tinyvector高级功能即将到来的元数据过滤与SQL查询能力详解下一篇如何使用Hammer.js打造无障碍交互体验完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表