关于tokenized数据缓存的机制。让我详细解释 tokenized_path
和 cache_dir
的区别以及它们的工作原理。
基于代码分析,这两个参数有不同的作用:
cache_dir
- HuggingFace Datasets的内部缓存load_dataset()
和数据预处理过程的中间缓存文件.map()
函数时的缓存)tokenized_path
- 完整的tokenized数据集存储save_to_disk()
保存)python展开代码# 在 loader.py 中的逻辑
if data_args.tokenized_path is not None: # 如果指定了 tokenized_path
if training_args.should_save:
dataset_dict.save_to_disk(data_args.tokenized_path) # 保存完整的tokenized数据集
logger.info_rank0(f"Tokenized dataset is saved at {data_args.tokenized_path}.")
python展开代码# 检查是否已存在tokenized数据
if data_args.tokenized_path is not None:
if has_tokenized_data(data_args.tokenized_path): # 检查目录是否存在且非空
logger.warning_rank0("Loading dataset from disk will ignore other data arguments.")
tokenized_data = load_from_disk(data_args.tokenized_path) # 直接加载
dataset_module = get_dataset_module(tokenized_data)
return dataset_module # 跳过所有预处理步骤
基于代码分析,tokenized_path
中存储的是:
完全处理后的数据集:
input_ids
, attention_mask
等)labels
)数据集结构:
展开代码tokenized_path/ ├── train/ │ ├── dataset.arrow # 训练数据 │ └── dataset_info.json # 数据集元信息 ├── validation/ # 验证数据(如果有) └── dataset_dict.json # DatasetDict的配置
关键点:tokenized数据集保存的是处理后的数据,不包含原始的JSON顺序
python展开代码# 数据处理顺序
dataset = _get_merged_dataset(...) # 1. 加载原始数据
dataset = _get_preprocessed_dataset(...) # 2. tokenization处理
dataset_dict = split_dataset(...) # 3. 划分train/val,应用shuffle
dataset_dict.save_to_disk(tokenized_path) # 4. 保存最终结果
tokenized_path
tokenized_path
加载已处理数据这就是为什么你的日志显示数据预处理很快 - 如果使用了tokenized_path
,系统会直接加载已处理的数据,完全跳过tokenization阶段。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!