# Summary # Cues # Notes 下面这句话的本意是: > **在最后“写盘”这一步,不要自己手撸 `open()/write()` 或乱拼文件名,而是把清洗‑去重后的数据流交给 DataTrove 或 NeMo Curator 里的 Writer/DocumentDataset 来“保存”成分片的 JSONL/Parquet 数据集。** --- ## 为什么要用专用库来“保存”? * **自动分片**:给定目标大小(常见 256 MB~1 GB),库会把数据均匀切成 shard,例如 `web_00000.jsonl.zst`、`web_00001.jsonl.zst`。 * **并发安全**:多进程 / 集群同时写时,库会用占位符或模板(`${rank}`)避免文件覆写冲突。 * **压缩与远程存储**:内置 gzip、zstd 以及 fsspec 适配的 S3/GCS/OSS 路径,写完直接在对象存储里就绪。 * **元数据一致性**:Writer 会把每条记录的 `id、lang、domain…` 一并写入,方便后续训练或统计。 --- ## DataTrove 的做法 ```python from datatrove.pipeline import Pipeline from datatrove.readers import WetReader from datatrove.writers import JsonlWriter, ParquetWriter from datatrove.filters import FastTextLangFilter, LengthFilter from datatrove.executors import LocalPipelineExecutor pipeline = Pipeline( WetReader("commoncrawl/2024-26/*.wet.gz"), FastTextLangFilter(keep_langs=["en"]), LengthFilter(min_chars=200), # ⬇️ 最终保存:每个 shard ≈256 MB、zstd 压缩 JsonlWriter( "cc_en_clean/", shardsize=256 << 20, compression="zstd", output_filename="cc_en_${rank}.jsonl.zst" ) ) LocalPipelineExecutor(num_tasks=16).run(pipeline) ``` DataTrove 把保存这一环抽象成 **Writer** 模块;官方文档在 *“Saving data”* 部分强调了用 Writer 写 JSONL/Parquet 而不是自己保存 citeturn7view0L74-L76。 --- ## NeMo Curator 的做法 ```python import nemo_curator as nc from nemo_curator.datasets import DocumentDataset ds = (DocumentDataset .read_wet("commoncrawl/2024-26/*.wet.gz") .filter(nc.FasttextLangFilter("en")) .filter(nc.LengthFilter(min_chars=200)) .dedup(nc.SemanticDedup(threshold=0.88))) # ⬇️ 保存为分片 Parquet;支持本地或 S3 ds.to_parquet("cc_en_clean/", shardsize="256MB", compression="zstd") ``` NeMo Curator 用 `DocumentDataset.to_json()` / `to_parquet()` 一行完成写盘;其官方文档说明 `DocumentDataset` **“supports reading and writing to sharded jsonl and parquet files…本地或 S3”** citeturn11view0L25-L27。 --- ## 放到 CS336 Lab4 管线里怎么用? 1. **Extract → Filter → Dedup** 之后,把文档流交给 DataTrove Writer 或 NeMo Curator `to_*()`。 2. 指定 `shardsize` 和 `compression`,输出目录就是你在交作业脚本里要填的 `$DATA_DIR`。 3. 评分脚本会用固定 tokenizer 逐个 shard 读入训练小模型,因此分片命名需稳定(示例用 `cc_en_${rank}.jsonl.zst`)。 --- ## 选择建议 | 场景 | 推荐 | | --- | --- | | **CPU/GPU 都可、需要快速上手** | **DataTrove**:API 简单、依赖少,Ray/Slurm/本地都能跑。| | **有多张 GPU、已装 RAPIDS/Dask、想全流程 GPU 加速** | **NeMo Curator**:Filter、PCA PII 检测、去重都能走 GPU,省时。| | **需要和 NVIDIA Megatron/NIM 生态整合** | NeMo Curator 更顺手(同家族)。| > 简单记住:**DataTrove = Hugging Face 流式 Writer;NeMo Curator = NVIDIA GPU‑加速 Writer。** > 在 Lab4 把“保存”这步交给它们,就能省掉不少并发、命名、分片的坑。祝你跑分愉快!