tokenized_path vs cache_dir
2025-08-03
LLaMA-Factory
00

目录

tokenizedpath vs cachedir 的区别
1. cache_dir - HuggingFace Datasets的内部缓存
2. tokenized_path - 完整的tokenized数据集存储
数据存储和使用流程
保存tokenized数据的流程:
加载tokenized数据的流程:
tokenized_path中存储的具体数据
与数据随机化的关系
实际使用场景
首次训练:
后续训练:
缓存的优势

关于tokenized数据缓存的机制。让我详细解释 tokenized_pathcache_dir 的区别以及它们的工作原理。

tokenized_path vs cache_dir 的区别

基于代码分析,这两个参数有不同的作用:

1. cache_dir - HuggingFace Datasets的内部缓存

  • 用途: 存储load_dataset()和数据预处理过程的中间缓存文件
  • 内容:
    • 原始数据集下载缓存
    • 数据预处理过程中的中间结果(使用HuggingFace Datasets的.map()函数时的缓存)
  • 格式: HuggingFace内部的Arrow格式缓存文件
  • 生命周期: 自动管理,用于加速重复的数据加载和预处理

2. tokenized_path - 完整的tokenized数据集存储

  • 用途: 存储完全处理好的、可直接用于训练的数据集
  • 内容: 已经tokenized的完整数据集,包含所有必要的训练字段
  • 格式: HuggingFace Datasets的标准格式(使用save_to_disk()保存)
  • 生命周期: 手动管理,可以直接加载用于训练

数据存储和使用流程

保存tokenized数据的流程:

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}.")

加载tokenized数据的流程:

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中存储的具体数据

基于代码分析,tokenized_path 中存储的是:

  1. 完全处理后的数据集

    • 已经tokenized的文本(input_ids, attention_mask等)
    • 已经处理的图片数据(对于多模态模型)
    • 训练标签(labels
    • 所有必要的训练字段
  2. 数据集结构

    展开代码
    tokenized_path/ ├── train/ │ ├── dataset.arrow # 训练数据 │ └── dataset_info.json # 数据集元信息 ├── validation/ # 验证数据(如果有) └── dataset_dict.json # DatasetDict的配置

与数据随机化的关系

关键点:tokenized数据集保存的是处理后的数据,不包含原始的JSON顺序

  • 保存时机: 在数据shuffle和split之后保存
  • 保存内容: 已经按照训练需求划分好的train/validation split
  • 加载时: 直接加载处理好的数据,训练时的shuffle由DataLoader处理
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. 保存最终结果

实际使用场景

首次训练:

  1. 从JSON文件加载原始数据
  2. 进行tokenization处理
  3. 保存到tokenized_path
  4. 开始训练

后续训练:

  1. 直接从tokenized_path加载已处理数据
  2. 跳过所有预处理步骤
  3. 立即开始训练

缓存的优势

  1. 大幅提升启动速度: 跳过耗时的tokenization过程
  2. 一致性保证: 多次训练使用完全相同的数据
  3. 多机训练友好: 可以预处理一次,在多个节点使用
  4. 存储效率: 避免重复的预处理计算

这就是为什么你的日志显示数据预处理很快 - 如果使用了tokenized_path,系统会直接加载已处理的数据,完全跳过tokenization阶段。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!