【AI】pytorch一些错误的解决办法
2024-04-22 23:00:46

本文讨论一些难以调试的错误。

Assertion srcIndex < srcSelectDimSize failed.

这个错误表明CUDA上的张量出现了索引越界问题。

解决方法

  1. 阅读代码,找出可能出现的索引越界代码段。

  2. 如果第一步比较困难,您要知道,在CUDA上调试程序比较困难,所以可以考虑在CPU上运行代码,能获得更加具体的报错信息。

  3. 另外,对于使用huggingface相关库的代码,查看加载数据集是否正确,比如:

    1
    data = load_dataset("json")

    就可能引发错误,因为这样写会导入默认的数据集,考虑改写为:

    1
    data = load_dataset("json", data_files=data_path)

Error while deserializing header: InvalidHeaderDeserialization

这个错误表明导入的预训练模型有问题。我遇到这个问题的情况是,同时使用了transformers.Trainertorch.compile()。将预训练模型输出,发现state_dict为空。此外,貌似PyTorch和PEFT的兼容性问题也是导致这个问题的一个原因。

解决办法

  1. 重新训练预训练模型。
  2. 若您和我的情况一样,请移除torch.compile()方法。详见SafetensorError: Error while deserializing header: InvalidHeaderDeserialization when open .safetensor model
  3. 如果是在微调LLM时遇到这个问题,请将torch.float16数据类型改为torch.float32

RuntimeError: CUDA error: out of memory

两种可能:

  1. 显卡总算力不足。
  2. 没有用全部的显卡训练。

解决办法

第一种情况,优化模型或者换更强力/数量更多的显卡。第二种情况,利用多卡并行运算策略,考虑使用:

  1. Pytorch下的nn.DataParallel(model)

  2. transformers的device_map="auto"策略,比如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from peft import PeftModel
    from transformers import GenerationConfig, LlamaForCausalLM, LlamaTokenizer

    if __name__ == "__main__":
    device_map = "auto"
    model = LlamaForCausalLM.from_pretrained(
    base_path,
    torch_dtype=torch.float32,
    device_map=device_map,
    )
    model = PeftModel.from_pretrained(
    model,
    lora_weights,
    device_map=device_map,
    torch_dtype=torch.float32,
    )
    ...
Prev
2024-04-22 23:00:46
Next