使用IterableDataset.map()遇挂起,添加num_proc触发类型错误求助
问题原因与解决方案
错误原因
你加载数据集时设置了streaming=True,得到的是IterableDataset类型,而该类型的map()方法不支持num_proc参数——多进程并行处理仅对非流式的常规Dataset类生效。
解决方案
方案1:关闭流式加载(推荐,若数据集内存可容纳)
如果你的数据集大小在内存允许范围内,直接移除streaming=True参数,加载为常规Dataset后即可正常使用num_proc进行多进程加速:
print("Loading dataset...") # 移除streaming=True,加载为可并行处理的常规Dataset dataset = load_dataset("json", data_files={"train": train_file, "eval": eval_file}) train_dataset = dataset["train"] eval_dataset = dataset["eval"]
之后原map()调用中的num_proc参数就能正常工作,解决程序挂起的性能问题。
方案2:优化流式数据集的处理逻辑
若数据集过大无法全量加载到内存,可通过以下方式提升流式处理效率:
- 使用Fast Tokenizer:确保初始化tokenizer时开启
use_fast=True,Fast版本的tokenizer比普通实现速度快数倍。 - 调大
batch_size:适当增大map()的batch_size参数,减少批次处理的额外开销。 - 精简
pretrain_tokenize_function:移除函数内的冗余计算、不必要的对象初始化或IO操作,压缩单批次处理时间。
方案3:手动实现多进程流式处理(进阶)
如果必须保留流式加载且需要多进程,可借助Python的multiprocessing库手动实现并行处理逻辑,但该方式复杂度较高,仅推荐在上述方案无法满足需求时尝试。
内容的提问来源于stack exchange,提问作者SarahK
相关产品推荐
相关产品推荐

