深度学习训练过程出现如下错误:
RuntimeError: [enforce fail at CPUAllocator.cpp:68] . DefaultCPUAllocator: can't allocate memory: you tried to allocate 10526388877312 bytes. Error code 12 (Cannot allocate memory)
常见原因及解决方案:
- 张量形状不匹配导致广播爆炸
最常见的原因为张量操作中的维度不匹配,导致广播操作产生巨大中间结果。
python
# 错误示例:形状不匹配导致内存爆炸
import torch
# 假设有两个形状不匹配的张量
a = torch.randn(100, 10, 1000) # 形状: (100, 10, 1000)
b = torch.randn(10, 1000) # 形状: (10, 1000)
# 这个操作可能导致广播产生巨大张量
# result = a + b # 可能产生问题
# 解决方案:检查并修正形状
# 确保张量形状兼容
a = torch.randn(100, 10, 1000)
b = torch.randn(100, 10, 1000) # 修正为相同形状
- 矩阵乘法维度错误
python
# 错误示例:矩阵维度不匹配
A = torch.randn(1000000, 100) # 形状: (1000000, 100)
B = torch.randn(100, 1000000) # 形状: (100, 1000000)
# 这个矩阵乘法会产生 (1000000, 1000000) 的巨大矩阵
# C = torch.matmul(A, B) # 需要 3.7TB 内存!
# 解决方案:
# 1. 检查矩阵维度是否正确
# 2. 使用分块计算
- 数据加载器问题
检查数据加载时是否意外复制了数据:
python
# 检查batch size是否合理
batch_size = 64 # 而不是 64000000
# 检查数据预处理
dataset = YourDataset()
# 确保__getitem__返回单个样本,而不是整个数据集