【AI】pytorch一些错误的解决办法
2024-04-22 23:00:46
本文讨论一些难以调试的错误。
Assertion srcIndex < srcSelectDimSize
failed.
这个错误表明CUDA上的张量出现了索引越界问题。
解决方法
阅读代码,找出可能出现的索引越界代码段。
如果第一步比较困难,您要知道,在CUDA上调试程序比较困难,所以可以考虑在CPU上运行代码,能获得更加具体的报错信息。
另外,对于使用huggingface相关库的代码,查看加载数据集是否正确,比如:
1
data = load_dataset("json")
就可能引发错误,因为这样写会导入默认的数据集,考虑改写为:
1
data = load_dataset("json", data_files=data_path)
Error while deserializing header: InvalidHeaderDeserialization
这个错误表明导入的预训练模型有问题。我遇到这个问题的情况是,同时使用了transformers.Trainer
和torch.compile()
。将预训练模型输出,发现state_dict
为空。此外,貌似PyTorch和PEFT的兼容性问题也是导致这个问题的一个原因。
解决办法
- 重新训练预训练模型。
- 若您和我的情况一样,请移除
torch.compile()
方法。详见SafetensorError: Error while deserializing header: InvalidHeaderDeserialization when open .safetensor model。 - 如果是在微调LLM时遇到这个问题,请将
torch.float16
数据类型改为torch.float32
。
RuntimeError: CUDA error: out of memory
两种可能:
- 显卡总算力不足。
- 没有用全部的显卡训练。
解决办法
第一种情况,优化模型或者换更强力/数量更多的显卡。第二种情况,利用多卡并行运算策略,考虑使用:
Pytorch下的
nn.DataParallel(model)
。transformers的
device_map="auto"
策略,比如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17from 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,
)
...