尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Data-Juicer 分布式文档级去重算子 ray_document_deduplicator 深度解析

Data-Juicer 分布式文档级去重算子 ray_document_deduplicator 深度解析 人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载本篇文章以 Data-Juicer 仓库中ray_document_deduplicator算子的官方文档为骨架结合其源码实现、单元测试与真实配置示例系统讲解该算子的工作原理MD5 精确匹配、大小写与非字母字符归一化、两种去重后端ray_actor / redis、全部配置参数、效果演示以及基于 Ray 的分布式执行机制。读完本文你将能够理解该算子的内部实现细节掌握在 YAML 配置文件或 Python 代码中正确使用它的方法并了解其与其他文档级去重算子如 document_deduplicator、ray_bts_minhash_deduplicator的适用场景差异。算子概述什么是文档级精确去重ray_document_deduplicator是 Data-Juicer 中一个类型为deduplicator、标签为cpu / text的去重算子官方文档给出的定义是Deduplicates samples at the document level using exact matching in Ray distributed mode. 在 Ray 分布式模式下使用精确匹配在文档级别去重样本。其核心思路非常直接为每个文档的文本内容计算一个哈希值然后基于哈希值的精确匹配把完全相同的重复文档过滤掉。与基于 SimHash-LSH 或 MinHash 的近重复检测不同这里使用的是MD5 哈希精确匹配因此它只会删除文本完全一致或经过归一化处理后完全一致的文档不会把语义相似但表述不同的文档误判为重复。从算子索引文档 Operators.md 可以看到该算子在算子列表中的登记信息为ray_document_deduplicator | Text CPU Beta即它是一个面向文本Text、运行在 CPU 上的 Beta 级算子。在 Data-Juicer 的去重算子家族中该算子与document_deduplicator单机文档去重、ray_bts_minhash_deduplicator基于 MinHash LSH 的分布式近似去重形成互补关系前者适合在海量数据上做精确去重后者适合做近似去重这一点在 config_all.yaml 的算子配置区中有明确注释the simple document deduplicator that can run on multi-nodes using md5 hashing exact matching method。工作原理从文本到 MD5 哈希的三步流水线该算子的哈希计算逻辑全部集中在源码 ray_document_deduplicator.py 的calculate_hash方法中第 59-69 行整体流程如下空文本检查若样本中不存在text_key指定的字段或该字段内容为空则直接返回常量EMPTY_HASH_VALUE EMPTY定义于 ray_basic_deduplicator.py 第 109 行。这意味着所有空文档会被归入同一个哈希桶从而互相去重。可选归一化若lowercaseTrue先将文本整体转为小写text.lower()若ignore_non_characterTrue再使用预编译的正则\s|\d|[{re.escape(string.punctuation)}]移除所有空白字符、数字和标点符号源码第 55-57 行。注意该正则中的字符类[...]在regex库注意不是标准re而是支持 Unicode 语义的regex包下匹配的是字母类字符之外的内容因此中文等非英文字母文字也能正确处理。MD5 计算对归一化后的文本去除首尾空白text.strip()按 UTF-8 编码后计算hashlib.md5(...).hexdigest()得到 32 位十六进制哈希串作为去重键。整个算子在类层级上继承自RayBasicDeduplicator而RayBasicDeduplicator本身是Filter的子类见 base_op.py 中的class Filter(OP)。尽管它承担的是去重职责但实现上采用了 Filter 的先计算统计量、再按布尔值过滤两阶段模式compute_stats_single计算出哈希并写入HashKeys.is_unique其值为__dj__is_unique定义于 constant.py 第 446 行随后process_single直接返回该布尔字段作为该样本是否保留的依据见 ray_basic_deduplicator.py 第 150-159 行。参数配置详解官方文档提供的参数表如下本节结合源码逐项展开说明参数名类型默认值说明backendstrray_actor去重后端取值为ray_actor或redisredis_addressstrredis://localhost:6379Redis 服务地址dedup_set_numint / strauto去重集合 actor 的数量auto表示取 CPU 数的一半lowercaseboolFalse是否在哈希前将样本文本转为小写ignore_non_characterboolFalse是否忽略非字母字符含空白、数字、标点args—额外位置参数kwargs—额外关键字参数backend去重后端的选型backend参数在RayBasicDeduplicator.__init__ray_basic_deduplicator.py 第 131-139 行中被解析为两种具体后端类ray_actor默认ActorBackend。在 Ray 集群中创建dedup_set_num个常驻 Actor每个 Actor 内部维护一个DedupSet一个 Pythonset存储已见过的哈希值。DedupSet.is_unique(key)的语义是若key尚不在集合中则加入并返回True否则返回False第 15-24 行。Actor 采用懒初始化策略——首次使用时才创建便于让 Ray 集群完成扩容后再占用资源第 46-79 行。redisRedisBackend。通过redis.from_url(redis_address)连接 Redis并在初始化时执行flushdb(0)清空库 0第 87-98 行去重判断使用SETNXset if not exists原子命令setnx(md5_value, 1)返回1表示首次出现返回0表示重复。源码中对此保留了一个 TODO 注释需要增加 barrier 确保flushdb在算子被调用前完成以避免并发初始化时误清数据。传入其他值会抛出ValueError: Unknown backend: ...。选择建议默认的ray_actor后端完全基于 Ray 内部状态无需额外部署基础设施redis后端则适合希望在 Ray 集群之外共享去重状态、或与既有 Redis 基础设施打通的场景。dedup_set_num去重集的并行度控制dedup_set_num支持整数或字符串auto默认。当为auto时实际数量在首次使用时通过max(1, int(ray.cluster_resources().get(CPU, 1) / 2))动态计算第 62-69 行即集群可用 CPU 数的一半至少为 1。多个去重集 Actor 之间的哈希分布采用取模策略int.from_bytes(md5_value.encode(), byteorderlittle) % MERSENNE_PRIME % self.dedup_set_num第 83 行其中MERSENNE_PRIME (1 61) - 1第 12 行。即先把 MD5 串按小端字节序转为大整数模梅森素数后再次模去重集数量从而将哈希均匀散列到各个 Actor降低单点集合大小、提升并发吞吐。lowercase 与 ignore_non_character去重粒度的调节旋钮这两个参数共同决定什么样的文本算重复两者均为False默认只有逐字节完全相同的文本才会被去重。如官方效果演示所示Today is Sunday...与Today is sunday...因大小写不同被视为不同文档。lowercaseTrue先转小写再哈希大小写差异不再影响去重判断适合英文语料清洗重复。ignore_non_characterTrue进一步剥离空白、数字、标点使hello, world!与hello world这类仅在标点/空白上有差异的文本也能被识别为重复对中文语料同样有效regex库对字母类字符的 Unicode 语义支持是前提。效果演示英语与中文去重实例官方文档附带的两个效果演示均来自单元测试 test_ray_document_deduplicator.py以下按测试用例逐一还原。test_english_deduplication英语去重算子配置RayDocumentDeduplicator(lowercaseFalse, ignore_non_characterFalse)。输入 5 条样本样本文本1Today is Sunday and its a happy day!2Do you need a cup of coffee?3Today is sunday and its a happy day!4This paper proposed a novel method on LLM pretraining.5This paper proposed a novel method on LLM pretraining.输出保留 4 条样本 1、2、3、4样本 5 被移除。解释由于默认不做任何归一化样本 4 与样本 5 文本完全相同因此移除其一而样本 1 与样本 3 只是大小写不同Sundayvssunday在lowercaseFalse下哈希不同都被保留。这恰好印证了精确匹配 可选归一化的设计去重严格程度完全由参数控制。test_chinese_deduplication中文去重算子配置同样为RayDocumentDeduplicator(lowercaseFalse, ignore_non_characterFalse)。输入 5 条样本其中样本 3 与样本 4 文本完全相同第九届会议 2003年7月28日至8月8日 牙买加金斯敦 为来自发展中国家的法律和技术委员会以及财务委员会成员 参加委员会会议支付费用的方式 1.样本 5 与样本 3/4 高度相似但第二行多了时间前缀。输出保留 4 条样本 3 与 4 中移除一条样本 5 因存在细微差异时间而被保留。这个用例有两个值得注意的细节中文文本无需特殊处理即可正确参与 MD5 去重因为哈希作用于原始 UTF-8 字节相似但不等同的文档样本 5在精确匹配模式下会被完整保留这是精确去重与近重复检测MinHash/SimHash的本质区别。跨 Ray Block 去重与状态持久化单元测试中还有几个官方文档未展开但值得关注的行为验证test_ray_actor_backend_deduplicates_across_blocks将 8 条完全相同文本的样本分散到多个 Ray Block 中最终只保留 1 条证明去重状态跨 Block 共享而非分块局部去重test_ray_actor_execution_mode_still_shares_dedup_sets即便以ray_execution_modeactor执行去重集依旧共享test_repeated_execution_keeps_materialized_dedup_result与test_stats_export_does_not_consume_dedup_state_before_filter验证重复执行与统计导出不会提前消耗/破坏去重状态。这些测试共同说明了该算子在分布式环境下状态一致性的保障方式也解释了为何选择常驻 Actor 持有去重集合这一设计。在 Data-Juicer 中实际使用方式一YAML 配置推荐Data-Juicer 的算子通过配置文件声明式编排。参考 config_all.yaml 第 1259-1263 行给出的完整示例可直接在配置文件的process列表中加入process: - ray_document_deduplicator: # 可在多节点上运行的 MD5 精确匹配文档去重 backend: ray_actor # 去重后端ray_actor 或 redis redis_address: redis://localhost:6379 # Redis 服务地址redis 后端时使用 lowercase: false # 是否在哈希前将文本转为小写 ignore_non_character: false # 是否忽略非字母字符空白、数字、标点如需更激进地清洗英文重复文档可调整为lowercase: true、ignore_non_character: true若数据量极大可显式设置dedup_set_num: 16以提升去重并行度注意其默认auto已按 CPU/2 自适应。方式二Python API 直接调用参考测试用例 test_ray_document_deduplicator.py 中的用法在 Ray 模式下构造算子并处理数据集from data_juicer.ops.deduplicator.ray_document_deduplicator import \ RayDocumentDeduplicator op RayDocumentDeduplicator( backendray_actor, dedup_set_num1, lowercaseFalse, ignore_non_characterFalse, batch_size1, num_proc2, auto_op_parallelismFalse, ) dataset.process([op]) # dataset 为 RayDataset注意该算子继承自RayBasicDeduplicator其_supported_exec_modes (ray, ray_partitioned)因此必须运行在 Ray 模式下使用RayDataset或 Ray 执行器无法在普通单机default模式下运行。这与单机版 document_deduplicator 形成对应单机版走Deduplicator基类的compute_hash → process流程而本算子走 Filter 的 stats/filter 两阶段流程。运行前提需要可用的 Ray 集群本地ray.init()或远程集群均可redis后端需要额外安装并启动 Redis 服务且保证算子初始化时flushdb(0)不会误清线上数据该算子仅依赖 CPU 资源适合与同样标注cpu标签的算子混排使用。总结何时选择该算子ray_document_deduplicator的定位是面向大规模分布式数据的文档级精确去重需要多节点横向扩展时选它而非单机版document_deduplicator需要完全精确地剔除重复文档如网页抓取、爬虫语料中的整页重复时选它而非会产生误判的近似去重document_simhash_deduplicator、ray_bts_minhash_deduplicator等需要把大小写差异标点/空白差异也视为重复时通过lowercase与ignore_non_character两个参数即可在精确匹配的框架内灵活调节粒度需要跨 Ray 集群共享去重状态、或与既有基础设施打通时可切换redis后端。其去重键的生成逻辑文本 → 可选归一化 → MD5简单、确定、可复现配合 Ray Actor 的常驻集合与梅森素数取模散列能够在保证状态一致性的前提下获得良好的并行吞吐。若你需要进一步了解它与其他分布式去重算子如基于 BTS 与 MinHash LSH 的ray_bts_minhash_deduplicator的取舍可继续阅读 config_all.yaml 中的去重算子配置区并结合 Operators.md 的算子总览选择适合你数据形态的方案。延伸阅读算子总览 | 源码实现 | 基础去重基类 | 单元测试 | 全局配置示例赞分享人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载相关推荐Data-Juicer Ray 分布式 C 加速 MinHash LSH 去重算子 ray_bts_minhash_cpp_deduplicator 深度解析Data Juicer Ray 分布式 C 加速 MinHash LSH 去重算子 ray_bts_minhash_cpp_deduplicator 深度解人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 文本 SimHash 文档级去重算子全解析document_simhash_deduplicator 原理与实战Data Juicer 文本 SimHash 文档级去重算子全解析document_simhash_deduplicator 原理与实战 本篇技术指南深入讲解人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 的 Ray 分布式图像去重算子 ray_image_deduplicator 实战指南Data Juicer 的 Ray 分布式图像去重算子 ray_image_deduplicator 实战指南 ray_image_deduplicator 是人工智能大模型数据工程数据清洗数据增强数据质检上一篇从安装到车载投屏Salt Player 本地音乐播放器使用指南下一篇Graylog Web 前端 Wizard 向导组件完整指南受控/非受控模式与多步骤表单编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表