llamafactory 如果不想一次性读取数据 使用流式读取streaming dataloader_num_workers preprocessing_num_workers

streaming: true 开启后,dataloader_num_workers 绝对不能设 20!

我给你讲最关键、最保命的原理:

1. 为什么不能开 20?

  • streaming = 流式边读边加载,本身就是单流渐进式读取
  • dataloader_num_workers: 20 = 20 个线程同时去抢读数据流
  • 结果:数据乱序 + 死锁 + 内存瞬间爆炸 + 训练直接卡死

streaming 模式下,多线程会彻底炸掉!


2. 正确配置(必须这样)

streaming: true                # 流式读取
dataloader_num_workers: 0     # 必须 0 或 1
preprocessing_num_workers: 1  # 必须 1

为什么要设为 0?

  • streaming 不支持多进程并发读取
  • 设为 0 = 使用主进程加载,最稳定、不爆内存、不卡死
  • 这是 HuggingFace 官方推荐的流式模式配置

3. 你有 30 核 CPU,怎么发挥性能?

streaming 模式下不能靠 num_workers,靠下面这 2 个参数吃满性能:

train_batch_size: 8          # 增大批次
gradient_accumulation_steps: 4 # 梯度累积

这样显卡利用率直接拉满,CPU 也不会浪费


4. 最终结论(非常重要)

❌ 错误(会崩)

streaming: true
dataloader_num_workers: 20

✅ 正确(稳定 + 高效)

streaming: true
dataloader_num_workers: 0
preprocessing_num_workers: 1

一句话记住:

开启 streaming → dataloader_num_workers 必须 = 0
不然必崩!

我可以帮你把整套高性能不崩溃的最终 yaml 配置一次性写好。

我给你最精准、最安全、直接能用的答案,只针对你现在的配置:

最终结论(必须记住)

你开了 streaming: true → dataloader_num_workers 必须设为 0 或 1
绝对不能用 6、20 这种大数!!!


为什么?

  • streaming 流式数据集 = 不支持多进程并行读取
  • dataloader_num_workers: 6 = 6 个进程同时读同一个流
  • 结果:数据错乱、卡死、训练崩溃

这是 HuggingFace 官方规则:
streaming + num_workers > 1 = 必崩


你现在最正确的配置

streaming: true                # 流式读取,防内存爆炸
dataloader_num_workers: 0      # 流式模式必须 0
preprocessing_num_workers: 1   # 预处理也只能 1
cutoff_len: 1024               # 你已经设置了

简短一句话

开 streaming → dataloader_num_workers = 0
不用犹豫,就这么写。

如果你想,我可以帮你把整套不会崩、速度最快的 yaml 全部配好。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐