本文只说明 LLM Offline Indexed Dataset(.idx/.bin)的应用场景,不依赖现有训练 YAML。 内容分为两部分:
.idx/.bin
不测试 VLM、图片或视频数据。转测以命令能否正常结束、数据能否读取、训练能否持续运行和 loss 是否正常等 应用侧可观测结果为准,不把内部索引或 Dataset 实现细节作为验收项。
测试人员不需要分析 position ID、attention mask 或 loss mask 等内部 Tensor;涉及这些开关的用例,只验收 训练能否正常启动和持续运行,以及 loss 是否为有限值。
统一验收标准:
ERROR
Traceback
NaN
Inf
转换工具支持 JSON、JSONL 文件、目录或 glob 输入,并根据 --json-keys 读取文本字段。
--json-keys
示例 JSONL:
{"text": "first training document"} {"text": "second training document"}
转换结果分为两类:
--pack-to-seq-len
--pack-to-seq-len <seq_length>
seq_length + 1
Non-packed 模式只进行 tokenization,不在离线阶段补齐或切成定长训练记录。
python -m hyper_parallel.auto_models.components.datasets.tools.offline_preparation \ --dataset-name-or-path /path/to/train.jsonl \ --json-keys text \ --output-prefix /path/to/indexed/train \ --tokenizer-name-or-path /path/to/tokenizer \ --tokenizer-use-fast true \ --workers 8 \ --append-eod true
不要设置 --pack-to-seq-len。
输出:
/path/to/indexed/train_text_document.bin /path/to/indexed/train_text_document.idx
Packed 模式用于提前生成与模型训练长度匹配的定长记录。假设训练的 seq_length=2048:
seq_length=2048
python -m hyper_parallel.auto_models.components.datasets.tools.offline_preparation \ --dataset-name-or-path /path/to/train.jsonl \ --json-keys text \ --output-prefix /path/to/indexed/train_packed \ --tokenizer-name-or-path /path/to/tokenizer \ --tokenizer-use-fast true \ --workers 8 \ --append-eod true \ --pack-to-seq-len 2048
每条输出记录包含 2049 个 token:
2049 token ├── input_ids = text[:-1] # 2048 └── labels = text[1:] # 2048
输入结束时不足 2049 个 token 的尾部会被丢弃,不写入 PAD。
--append-eod true 会在每个非空文档末尾追加 tokenizer 定义的 EOS/EOD token。
--append-eod true
vocab_size
eod_token_id
eos_token_id
sep_token_id
--append-eod false
先检查两个文件均存在且非空:
test -s /path/to/indexed/train_text_document.bin test -s /path/to/indexed/train_text_document.idx
再读取元数据和少量样本:
python -m hyper_parallel.auto_models.components.datasets.tools.read_indexed_dataset \ --path /path/to/indexed/train_text_document \ --tokenizer /path/to/tokenizer \ --num-samples 3
Non-packed 数据应满足:
append-eod
Packed 数据应满足:
min_length = max_length = seq_length + 1
例如 seq_length=2048 时,所有记录长度必须为 2049。
.bin/.idx
seq_length
append-eod=true/false
一个 Dataset prefix 对应两个文件:
<prefix>.bin <prefix>.idx
配置中的 dataset.data_path 填 prefix,不带 .bin 或 .idx 后缀。
dataset.data_path
.bin
.idx
文件: /data/train_text_document.bin /data/train_text_document.idx 配置: dataset.data_path: /data/train_text_document
如果不了解数据的制作方式,先使用读取工具查看长度:
python -m hyper_parallel.auto_models.components.datasets.tools.read_indexed_dataset \ --path /data/train_text_document \ --tokenizer /path/to/tokenizer \ --num-samples 3
根据检查结果选择模式:
is_dataset_from_mr
false
true
dataset: model_assets: tokenizer: _target_: hyper_parallel.auto_models.components.datasets.llm.build_tokenizer.AutoTokenizer.from_pretrained pretrained_model_name_or_path: /path/to/tokenizer tokenizer_type: hf use_fast: true local_files_only: true _target_: hyper_parallel.auto_models.components.datasets.llm.build_indexed_text_dataset data_path: /data/train_text_document data_config: seq_length: 2048 split: "1, 0, 0" is_dataset_from_mr: false labels_are_shifted: true
Indexed Dataset 返回的 labels 已经是与 logits 对齐的 next-token labels,因此必须配置 labels_are_shifted: true,避免模型或 loss 再次 shift。未列出的 Dataset 参数使用默认值。转测只检查训练至少 连续完成 3 个 step,无异常且 loss 正常。
labels
labels_are_shifted: true
dataset: model_assets: tokenizer: _target_: hyper_parallel.auto_models.components.datasets.llm.build_tokenizer.AutoTokenizer.from_pretrained pretrained_model_name_or_path: /path/to/tokenizer tokenizer_type: hf use_fast: true local_files_only: true _target_: hyper_parallel.auto_models.components.datasets.llm.build_indexed_text_dataset data_path: /data/train_packed_text_document data_config: seq_length: 2048 split: "1, 0, 0" is_dataset_from_mr: true labels_are_shifted: true
Packed Indexed Dataset 同样已经生成 next-token labels,必须配置 labels_are_shifted: true。未列出的 Dataset 参数使用默认值。已有 Packed 数据的记录长度必须为 2049;转测只检查训练至少连续完成 3 个 step,无异常且 loss 正常。
如果没有可加载的 Hugging Face tokenizer,但明确知道数据使用的词表和 EOD ID,可以使用 pretokenized:
pretokenized
dataset: model_assets: tokenizer: _target_: hyper_parallel.auto_models.components.datasets.llm.build_tokenizer.AutoTokenizer.from_pretrained pretrained_model_name_or_path: /path/to/stable/tokenizer-identity tokenizer_type: pretokenized vocab_size: 32000 eod_token_id: 2
pretrained_model_name_or_path
检查命令:
python -m hyper_parallel.auto_models.components.datasets.tools.read_indexed_dataset \ --path /data/train_text_document \ --tokenizer-type pretokenized \ --vocab-size 32000 \ --eod-token-id 2 \ --num-samples 3
两种模式都使用 Indexed 数据源:
dataloader: _target_: hyper_parallel.auto_models.components.datasets.FixedBatchDataLoader collate_fn: _target_: hyper_parallel.auto_models.components.datasets.build_indexed_collate_fn get_batch: _target_: hyper_parallel.auto_models.components.datasets.ParallelBatch source_type: indexed
未列出的 DataLoader 参数使用默认值。
dataset: data_config: reset_position_ids: false reset_attention_mask: false eod_mask_loss: false
reset_position_ids=true
reset_attention_mask=true
eod_mask_loss=true
data_path
is_dataset_from_mr: false
is_dataset_from_mr: true
global_batch_size
micro_batch_size * dp_world_size
reset_position_ids
reset_attention_mask
eod_mask_loss
更多数据结构说明见 Indexed Dataset 使用教程。
Offline IDX/BIN 使用与转测说明
本文只说明 LLM Offline Indexed Dataset(
.idx/.bin)的应用场景,不依赖现有训练 YAML。内容分为两部分:
不测试 VLM、图片或视频数据。转测以命令能否正常结束、数据能否读取、训练能否持续运行和 loss 是否正常等
应用侧可观测结果为准,不把内部索引或 Dataset 实现细节作为验收项。
测试人员不需要分析 position ID、attention mask 或 loss mask 等内部 Tensor;涉及这些开关的用例,只验收
训练能否正常启动和持续运行,以及 loss 是否为有限值。
统一验收标准:
ERROR或Traceback。NaN或Inf。一、使用转换工具生成 IDX/BIN
1. 适用场景
转换工具支持 JSON、JSONL 文件、目录或 glob 输入,并根据
--json-keys读取文本字段。示例 JSONL:
{"text": "first training document"} {"text": "second training document"}转换结果分为两类:
--pack-to-seq-len--pack-to-seq-len <seq_length>seq_length + 12. 生成 Non-packed 数据
Non-packed 模式只进行 tokenization,不在离线阶段补齐或切成定长训练记录。
python -m hyper_parallel.auto_models.components.datasets.tools.offline_preparation \ --dataset-name-or-path /path/to/train.jsonl \ --json-keys text \ --output-prefix /path/to/indexed/train \ --tokenizer-name-or-path /path/to/tokenizer \ --tokenizer-use-fast true \ --workers 8 \ --append-eod true不要设置
--pack-to-seq-len。输出:
3. 生成 Packed/pre-cut 数据
Packed 模式用于提前生成与模型训练长度匹配的定长记录。假设训练的
seq_length=2048:python -m hyper_parallel.auto_models.components.datasets.tools.offline_preparation \ --dataset-name-or-path /path/to/train.jsonl \ --json-keys text \ --output-prefix /path/to/indexed/train_packed \ --tokenizer-name-or-path /path/to/tokenizer \ --tokenizer-use-fast true \ --workers 8 \ --append-eod true \ --pack-to-seq-len 2048每条输出记录包含 2049 个 token:
输入结束时不足 2049 个 token 的尾部会被丢弃,不写入 PAD。
4. EOD 选项
--append-eod true会在每个非空文档末尾追加 tokenizer 定义的 EOS/EOD token。vocab_size和eod_token_id。eos_token_id或sep_token_id,否则追加 EOD 会失败。--append-eod false,但记录中将没有可用于文档边界处理的 EOD。5. 检查转换结果
先检查两个文件均存在且非空:
test -s /path/to/indexed/train_text_document.bin test -s /path/to/indexed/train_text_document.idx再读取元数据和少量样本:
Non-packed 数据应满足:
append-eod时,非空文档末尾包含正确的 EOD ID。Packed 数据应满足:
例如
seq_length=2048时,所有记录长度必须为 2049。6. 转换工具限制
--json-keys一致,字段值应为可 tokenization 的文本。.bin/.idx必须来自同一次转换。--pack-to-seq-len必须大于 0,并与后续训练的seq_length一致。7. 转换工具转测场景
--json-keys进行转换append-eod=true/false后接入训练二、拿到 IDX/BIN 后接入训练
1. 确认文件和 Dataset prefix
一个 Dataset prefix 对应两个文件:
配置中的
dataset.data_path填 prefix,不带.bin或.idx后缀。如果不了解数据的制作方式,先使用读取工具查看长度:
根据检查结果选择模式:
is_dataset_from_mrfalsetrueseq_length + 12. Non-packed 数据配置示例
dataset: model_assets: tokenizer: _target_: hyper_parallel.auto_models.components.datasets.llm.build_tokenizer.AutoTokenizer.from_pretrained pretrained_model_name_or_path: /path/to/tokenizer tokenizer_type: hf use_fast: true local_files_only: true _target_: hyper_parallel.auto_models.components.datasets.llm.build_indexed_text_dataset data_path: /data/train_text_document data_config: seq_length: 2048 split: "1, 0, 0" is_dataset_from_mr: false labels_are_shifted: trueIndexed Dataset 返回的
labels已经是与 logits 对齐的 next-token labels,因此必须配置labels_are_shifted: true,避免模型或 loss 再次 shift。未列出的 Dataset 参数使用默认值。转测只检查训练至少连续完成 3 个 step,无异常且 loss 正常。
3. Packed/pre-cut 数据配置示例
dataset: model_assets: tokenizer: _target_: hyper_parallel.auto_models.components.datasets.llm.build_tokenizer.AutoTokenizer.from_pretrained pretrained_model_name_or_path: /path/to/tokenizer tokenizer_type: hf use_fast: true local_files_only: true _target_: hyper_parallel.auto_models.components.datasets.llm.build_indexed_text_dataset data_path: /data/train_packed_text_document data_config: seq_length: 2048 split: "1, 0, 0" is_dataset_from_mr: true labels_are_shifted: truePacked Indexed Dataset 同样已经生成 next-token labels,必须配置
labels_are_shifted: true。未列出的 Dataset参数使用默认值。已有 Packed 数据的记录长度必须为 2049;转测只检查训练至少连续完成 3 个 step,无异常且
loss 正常。
4. 只有 token 元数据时
如果没有可加载的 Hugging Face tokenizer,但明确知道数据使用的词表和 EOD ID,可以使用
pretokenized:dataset: model_assets: tokenizer: _target_: hyper_parallel.auto_models.components.datasets.llm.build_tokenizer.AutoTokenizer.from_pretrained pretrained_model_name_or_path: /path/to/stable/tokenizer-identity tokenizer_type: pretokenized vocab_size: 32000 eod_token_id: 2vocab_size和eod_token_id必须与数据制作阶段完全一致。pretrained_model_name_or_path使用稳定、可区分该 tokenizer 的身份路径。检查命令:
5. DataLoader 配置示例
两种模式都使用 Indexed 数据源:
dataloader: _target_: hyper_parallel.auto_models.components.datasets.FixedBatchDataLoader collate_fn: _target_: hyper_parallel.auto_models.components.datasets.build_indexed_collate_fn get_batch: _target_: hyper_parallel.auto_models.components.datasets.ParallelBatch source_type: indexed未列出的 DataLoader 参数使用默认值。
6. EOD 训练选项
dataset: data_config: reset_position_ids: false reset_attention_mask: false eod_mask_loss: falsereset_position_ids=true:EOD 后 position ID 从 0 重新开始。reset_attention_mask=true:EOD 后的 token 不再关注前一个文档。eod_mask_loss=true:EOD 对应位置不参与 loss。false:token 流按连续序列训练。7. 已有 IDX/BIN 的使用限制
.bin/.idx必须成对存在,data_path必须填写 prefix。seq_length必须与训练配置一致。vocab_size必须大于数据中的最大 token ID。is_dataset_from_mr: false。is_dataset_from_mr: true,且不允许 PAD。labels_are_shifted: true。global_batch_size必须能被micro_batch_size * dp_world_size整除。8. 已有 IDX/BIN 转测场景
reset_position_ids、reset_attention_mask、eod_mask_loss更多数据结构说明见 Indexed Dataset 使用教程。