黎夕旧梦696 2025-11-26 17:50 采纳率: 25%
浏览 4

llama factory

再llama factory用两个以上的数据集训练同时训练一个模型时,出现一下问题,如何解决?



Converting format of dataset (num_proc=16):   0%|          | 0/786 [00:00<?, ? examples/s]
Converting format of dataset (num_proc=16):   0%|          | 1/786 [00:47<10:15:44, 47.06s/ examples]
Converting format of dataset (num_proc=16):  12%|█▏        | 98/786 [00:47<03:57,  2.90 examples/s]
Converting format of dataset (num_proc=16):  25%|██▍       | 196/786 [00:48<01:26,  6.81 examples/s]
Converting format of dataset (num_proc=16):  31%|███       | 245/786 [00:49<00:57,  9.44 examples/s]
Converting format of dataset (num_proc=16):  37%|███▋      | 294/786 [00:49<00:38, 12.83 examples/s]
Converting format of dataset (num_proc=16):  44%|████▎     | 343/786 [00:49<00:24, 17.90 examples/s]
Converting format of dataset (num_proc=16):  56%|█████▌    | 441/786 [00:50<00:11, 29.83 examples/s]
Converting format of dataset (num_proc=16):  62%|██████▏   | 491/786 [00:51<00:09, 32.67 examples/s]
Converting format of dataset (num_proc=16):  69%|██████▊   | 540/786 [00:52<00:06, 40.75 examples/s]
Converting format of dataset (num_proc=16):  81%|████████  | 638/786 [00:52<00:02, 65.63 examples/s]
Converting format of dataset (num_proc=16): 100%|██████████| 786/786 [00:52<00:00, 117.02 examples/s]
Converting format of dataset (num_proc=16): 100%|██████████| 786/786 [00:57<00:00, 13.66 examples/s]

Converting format of dataset (num_proc=16):   0%|          | 0/2531 [00:00<?, ? examples/s]
Converting format of dataset (num_proc=16):   0%|          | 1/2531 [00:47<33:37:10, 47.84s/ examples]
Converting format of dataset (num_proc=16):   6%|▋         | 159/2531 [00:48<08:23,  4.71 examples/s]
Converting format of dataset (num_proc=16):  14%|█▍        | 365/2531 [00:49<02:49, 12.81 examples/s]
Converting format of dataset (num_proc=16):  19%|█▉        | 492/2531 [00:49<01:42, 19.81 examples/s]
Converting format of dataset (num_proc=16):  25%|██▌       | 635/2531 [00:49<01:02, 30.38 examples/s]
Converting format of dataset (num_proc=16):  31%|███▏      | 793/2531 [00:51<00:41, 41.60 examples/s]
Converting format of dataset (num_proc=16):  42%|████▏     | 1067/2531 [00:51<00:18, 78.42 examples/s]
Converting format of dataset (num_proc=16):  48%|████▊     | 1219/2531 [00:52<00:13, 96.85 examples/s]
Converting format of dataset (num_proc=16):  52%|█████▏    | 1324/2531 [00:52<00:11, 104.01 examples/s]
Converting format of dataset (num_proc=16):  56%|█████▋    | 1424/2531 [00:52<00:08, 130.16 examples/s]
Converting format of dataset (num_proc=16):  62%|██████▏   | 1562/2531 [00:53<00:06, 153.01 examples/s]
Converting format of dataset (num_proc=16):  66%|██████▌   | 1671/2531 [00:53<00:04, 189.70 examples/s]
Converting format of dataset (num_proc=16):  72%|███████▏  | 1830/2531 [00:53<00:02, 240.28 examples/s]
Converting format of dataset (num_proc=16):  79%|███████▉  | 2001/2531 [00:54<00:01, 293.85 examples/s]
Converting format of dataset (num_proc=16):  88%|████████▊ | 2215/2531 [00:54<00:00, 320.85 examples/s]
Converting format of dataset (num_proc=16): 100%|██████████| 2531/2531 [00:55<00:00, 462.87 examples/s]
Converting format of dataset (num_proc=16): 100%|██████████| 2531/2531 [01:01<00:00, 41.12 examples/s]

Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [00:00<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [00:55<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:00<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:01<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:02<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:02<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:02<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:03<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:04<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:04<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:05<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:05<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:05<?, ? examples/s]
Running tokenizer on dataset (num_proc=16):   0%|          | 0/3317 [01:07<?, ? examples/s]
multiprocess.pool.RemoteTraceback:
"""
Traceback (most recent call last):
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\multiprocess\pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\utils\py_utils.py", line 586, in _write_generator_to_queue
    for i, result in enumerate(func(**kwargs)):
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\arrow_dataset.py", line 3674, in _map_single
    for i, batch in iter_outputs(shard_iterable):
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\arrow_dataset.py", line 3624, in iter_outputs
    yield i, apply_function(example, i, offset=offset)
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\arrow_dataset.py", line 3547, in apply_function
    processed_inputs = function(*fn_args, *additional_args, **fn_kwargs)
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\data\processor\supervised.py", line 99, in preprocess_dataset
    input_ids, labels = self._encode_data_example(
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\data\processor\supervised.py", line 43, in _encode_data_example
    messages = self.template.mm_plugin.process_messages(prompt + response, images, videos, audios, self.processor)
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\data\mm_plugin.py", line 1521, in process_messages
    self._validate_messages(messages, images, videos, audios)
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\data\mm_plugin.py", line 215, in _validate_messages
    raise ValueError(
ValueError: The number of images does not match the number of <image> tokens in [{'content': '这是什么植物病虫害?', 'role': 'user'}, {'content': '西芹-瓢虫幼虫', 'role': 'assistant'}].
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\Scripts\llamafactory-cli.exe\__main__.py", line 6, in <module>
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\cli.py", line 24, in main
    launcher.launch()
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\launcher.py", line 157, in launch
    run_exp()
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\train\tuner.py", line 132, in run_exp
    _training_function(config={"args": args, "callbacks": callbacks})
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\train\tuner.py", line 93, in _training_function
    run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks)
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\train\sft\workflow.py", line 51, in run_sft
    dataset_module = get_dataset(template, model_args, data_args, training_args, stage="sft", **tokenizer_module)
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\data\loader.py", line 314, in get_dataset
    dataset = _get_preprocessed_dataset(
  File "C:\Users\Administrator\Documents\llama_factory\LLaMA-Factory\src\llamafactory\data\loader.py", line 255, in _get_preprocessed_dataset
    dataset = dataset.map(
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\arrow_dataset.py", line 560, in wrapper
    out: Union["Dataset", "DatasetDict"] = func(self, *args, **kwargs)
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\arrow_dataset.py", line 3309, in map
    for rank, done, content in iflatmap_unordered(
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\utils\py_utils.py", line 626, in iflatmap_unordered
    [async_result.get(timeout=0.05) for async_result in async_results]
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\datasets\utils\py_utils.py", line 626, in <listcomp>
    [async_result.get(timeout=0.05) for async_result in async_results]
  File "C:\Users\Administrator\Documents\conda\envs\llama_factory\lib\site-packages\multiprocess\pool.py", line 774, in get
    raise self._value
ValueError: The number of images does not match the number of <image> tokens in [{'content': '这是什么植物病虫害?', 'role': 'user'}, {'content': '西芹-瓢虫幼虫', 'role': 'assistant'}].
  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-11-26 18:00
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    从你提供的日志信息来看,你在使用 Llama Factory 训练模型时,尝试同时加载两个数据集进行训练。然而,在处理过程中出现了明显的性能问题,特别是在 Running tokenizer on dataset 阶段,进度几乎停滞,这表明存在资源瓶颈或配置不当的问题。


    🚨 问题分析

    1. 数据集过大:两个数据集的总样本数为 786 + 2531 = 3317,这在训练中是一个较大的数据量。
    2. 多进程处理(num_proc=16):虽然设置了 num_proc=16 来加速数据预处理,但实际运行效率非常低,甚至卡住。
    3. 内存和 CPU 资源不足:由于同时加载两个数据集并进行 tokenization,可能导致系统资源耗尽,从而导致处理缓慢或卡顿。
    4. tokenizer 没有正确并行化:尽管设置 num_proc=16,但可能没有充分利用多核 CPU 或 GPU 的能力。

    ✅ 解决方案

    1. 优化数据集加载方式

    重点:不要一次性加载两个数据集,而是按顺序加载或分批处理。

    • 解决方案
      • 使用 Dataset 对象逐个加载数据集,而不是同时加载。
      • 在训练时使用 ConcatDatasetChainDataset 来合并数据集。
    from torch.utils.data import ConcatDataset, Dataset
    
    # 假设 dataset1 和 dataset2 是两个独立的 HuggingFace Dataset
    combined_dataset = ConcatDataset([dataset1, dataset2])
    

    注意:如果你使用的是 Llama Factory 的训练脚本,确保在配置文件中只指定一个数据集,或者通过脚本手动合并。


    2. 降低 num_proc 参数值

    重点:避免设置过高的并发数(如 num_proc=16),以防止资源争抢。

    • 建议值
      • 如果你的机器是 8 核 CPU,可以将 num_proc=8 或更小。
      • 如果是 16 核,可尝试 num_proc=4num_proc=8
    # 示例配置文件中的参数
    data:
      num_proc: 4
    

    3. 分批次处理数据集

    重点:不要一次性对所有数据进行 tokenize,而是分批次处理。

    • 解决方案
      • 使用 map 函数时,设置 batched=True 并控制每批大小。
      • 例如:
    tokenized_datasets = dataset.map(
        lambda x: tokenizer(x["text"], truncation=True, padding="max_length", max_length=512),
        batched=True,
        batch_size=16,
        num_proc=4
    )
    

    说明batch_size 控制每次处理的数据量,太大会占用过多内存;太小会降低效率。


    4. 限制 GPU 内存使用(如果使用了 GPU)

    重点:避免因 GPU 内存不足导致 tokenizer 卡死。

    • 解决方案
      • 确保在训练脚本中设置 CUDA_VISIBLE_DEVICES 仅使用一个 GPU。
      • 或者使用 torch.cuda.empty_cache() 清理缓存。
    # 示例:只使用第0号GPU
    CUDA_VISIBLE_DEVICES=0 python train.py ...
    

    5. 检查 tokenizer 是否支持并行处理

    重点:某些 tokenizer 不支持多线程,需确认是否兼容。

    • 解决方案
      • 尝试使用 transformers 提供的 tokenizer,例如 AutoTokenizer
      • 确保 tokenizer 是可并行化的(如 BertTokenizerFast)。
    from transformers import AutoTokenizer
    
    tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
    

    🧠 总结

    以下是解决问题的关键步骤:

    1. 不要同时加载两个数据集,应逐个加载或合并后再使用。
    2. 调整 num_proc 参数,避免资源争抢。
    3. 分批次处理数据,避免一次性处理全部数据。
    4. 限制 GPU 使用,防止内存溢出。
    5. 确认 tokenizer 兼容性,使用支持并行处理的 tokenizer。

    🛠️ 示例代码(修改后的)

    from datasets import load_dataset
    from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
    
    # 加载第一个数据集
    dataset1 = load_dataset("your_first_dataset_name")
    
    # 加载第二个数据集
    dataset2 = load_dataset("your_second_dataset_name")
    
    # 合并数据集
    combined_dataset = dataset1["train"].concatenate(dataset2["train"])
    
    # 初始化 tokenizer
    tokenizer = AutoTokenizer.from_pretrained("your_pretrained_model_name")
    
    # Tokenize 数据集(分批次处理)
    def tokenize_function(examples):
        return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)
    
    tokenized_datasets = combined_dataset.map(
        tokenize_function,
        batched=True,
        batch_size=16,
        num_proc=4  # 根据硬件调整
    )
    
    # 初始化模型
    model = AutoModelForCausalLM.from_pretrained("your_pretrained_model_name")
    
    # 设置训练参数
    training_args = TrainingArguments(
        output_dir="./results",
        per_device_train_batch_size=8,
        num_train_epochs=3,
        save_steps=10_000,
        save_total_limit=2,
        logging_dir="./logs",
        logging_steps=100,
        report_to="none",
        no_cuda=False,  # 如果使用 GPU
    )
    
    # 创建 Trainer
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=tokenized_datasets,
    )
    
    # 开始训练
    trainer.train()
    

    如果你能提供具体的配置文件或训练命令,我可以进一步帮助你定位问题。希望以上内容对你有所帮助!

    评论

报告相同问题?

问题事件

  • 创建了问题 11月26日