OLMo 数据集构建手把手一行文本如何变成不吃内存的训练数据【免费下载链接】OLMoModeling, training, eval, and inference code for OLMo项目地址: https://gitcode.com/GitHub_Trending/ol/OLMo说你在手上有几百 GB 的原始网页文本一训练就爆内存。OLMo 数据集构建要解决的正是这个头疼事先把文本变成整数再把整数装进 .npy 内存映射文件训练时模型直接从磁盘按需读取。跟着一行文本从 .json.gz 里出发经过 OLMo 令牌化一路看它变成 .npy 里的一行数据。 一行文本去哪儿OLMo 数据集构建全景图整条管线只有三步比想象的短。令牌化把文本拆成一行整数内存映射把整数写进 .npy最后由 MemMapDataset 切成定长块喂给模型。全景就一行原始文本.json.gz→ OLMo 令牌化文本变整数→ 内存映射整数落盘→ .npy随机访问的 LLM 训练数据这三站分别落在三处代码数据集准备脚本 干第一、二站MemMapDataset 负责最后一站的切块。一行文本怎么变三次身OLMo 令牌化与 memmap 逐站看第一站数据接入把文本装进标准箱原始文本放进 .json.gz一行一个文档每行 JSON 里必须有个叫 text 的字段。这么做是因为统一入口格式下游管线只要逐行读 text 字段就行就像快递先装进标准箱、快递员才能一扫而过。字段名 text 就是约定空行读取时会被自动跳过。第二站令牌化把文本切成编号词卡做什么tokenizer 把每个文档切成 token转成一行整数 ID每个文档末尾再补一个 EOS。为什么要变成整数因为模型只认数字不认句子。令牌化就是把句子拆成一张张词卡、每张卡编上号模型的任务是从这些号里猜下一张卡。值得记的关键参数--tokenizer默认用 allenai/eleuther-ai-gpt-neox-20b-pii-special 这个令牌化模型它决定了词表和 ID 映射。第三站内存映射把整数写进可翻的 .npy做什么把整数序列写进 .npy 内存映射文件单个文件超过上限就自动切成多个 part 文件。为什么这样就不爆内存训练时操作系统只把需要的片段从磁盘读进内存像翻书一样只翻到要用的那一页所以几百 GB 的 .npy 也不会撑爆 RAM。值得记的关键参数--max-tokens默认 5 亿 tokenuint16 下约 1GB控制单个 .npy 最大装多少。生成的 .npy 就是一串纯整数随时可以只取一小段来调试import numpy as np mm np.memmap(memmap/0_00000.npy, moder, dtypeuint16) print(mm[1000:1024]) # 只从磁盘读这 24 个 token️ 脏数据怎么拦住OLMo memmap 校验与重复过滤数据进训练烤箱前有两道关卡。第一道是生成后校验加--validate它会重新令牌化原始文本把总 token 数和文档数跟 .npy 对一遍对得上才可信相当于发货前数一遍箱子。第二道是重复序列过滤instance_filter 配置会扫描每个训练块发现短序列重复次数超过上限默认重复 32 次就丢掉防止模型学会复读同一行的捷径。两道关一个查数量、一个查质量任一不过就别发货。 抄走就能跑OLMo memmap 生成命令与训练启动连贯的四步第一步是你自己备好 .json.gz一行一个文档、字段名 text剩下三步用一组命令就能走通。# 令牌化 内存映射 校验一次做完 python scripts/prepare_memmap_dataset.py data/*.json.gz -o ./memmap \ --workers 4 --dtype uint16 --validate # 把 .npy 路径写进 train.yaml 的 data 段见下然后启动训练 python scripts/train.py --config train.yamlyaml 的 data 段写三行就接上了data: paths: ./memmap/*.npy memmap_dtype: uint16 num_workers: 4第一行指向所有生成的 .npy第二行确认存储类型一致第三行控制并行读取的进程数。训练不够快先调啥参数速查表参数作用默认值调优建议tokenizer决定文本切成哪些整数 IDallenai/eleuther-ai-gpt-neox-20b-pii-special与目标模型词表对齐dtype.npy 里每个 token 的存储类型uint16比 uint32 省一半空间词表超 65535 再换 uint32max-tokens单个 .npy 的 token 上限5 亿约 1GB切小一点文件更多、更易并行workers并行令牌化进程数1设到物理核数太高会吃 RAMchunk_size每个训练块的 token 数1024对齐模型 max_sequence_lengthinstance_filter重复序列过滤器关闭网页数据建议开默认重复 32 次即丢❓ FAQLLM 训练数据常见疑问.npy 几百 GB读的时候会不会成 I/O 瓶颈不会整块进内存操作系统按需换页即可。真嫌慢就把 data 段的 num_workers 和 prefetch_factor 调大让多个进程并行读、预取下一批。内存到底占多少大约是 chunk_size × batch × dtype 字节再加上模型本身而不是整个数据集的体积。.npy 躺在磁盘上OS 只翻你要用的那几页数据再大也不爆 RAM。数据类型怎么选词表小于 65535 就用 uint16比 uint32 省一半空间词表更大就换 uint32。默认 uint16官方退火配置里也能见到 uint32 的实例。我自己的数据怎么办已经是 .json.gz每行一个 text就直接喂给脚本。别的格式就写一个实现 PyTorch Dataset 接口的类用 custom_dataset 挂进去——自定义数据集接口 的 build_custom_dataset 会按配置动态导入你的类只是不保证确定性。一句话记住 OLMo 数据集构建怎么个流程把文本变整数、把整数装进 .npy、把质量交给校验和过滤两道关就是 OLMo 数据集构建的全部。想看源码就从这几处入手数据集准备脚本、内存映射数据集实现、自定义数据集配置示例。【免费下载链接】OLMoModeling, training, eval, and inference code for OLMo项目地址: https://gitcode.com/GitHub_Trending/ol/OLMo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考