Mac M1上微调instructlab/merlinite-7b-lab模型遇MPS错误求助
修复Mac M1上LLM微调的MPS设备张量错误
问题根源
你遇到的RuntimeError: Placeholder storage has not been allocated on MPS device!错误,本质是部分参与计算的张量(输入数据、标签等)仍留在CPU,而模型已移至MPS设备,导致PyTorch无法跨设备执行运算。
具体代码修改步骤
1. 正确初始化MPS设备
在脚本开头添加设备判断,统一使用MPS(如果可用):
import torch # 优先使用MPS, fallback到CPU device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
2. 将模型移至MPS设备
确保加载模型后显式迁移到MPS:
from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("instructlab/merlinite-7b-lab") model = model.to(device) # 可选:验证模型设备 print(f"Model device: {next(model.parameters()).device}")
3. 迁移训练数据至MPS设备
这是最容易遗漏的步骤,需要确保每个batch的所有输入张量都移到MPS。有两种常见方式:
方式一:修改数据加载的collate_fn
如果使用自定义collate_fn,在返回数据前迁移张量:
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("instructlab/merlinite-7b-lab") def collate_fn(batch): # 常规张量拼接 input_ids = torch.stack([torch.tensor(item['input_ids']) for item in batch]) attention_mask = torch.stack([torch.tensor(item['attention_mask']) for item in batch]) labels = torch.stack([torch.tensor(item['labels']) for item in batch]) # 迁移到MPS设备 return { "input_ids": input_ids.to(device), "attention_mask": attention_mask.to(device), "labels": labels.to(device) } # 加载数据集时指定collate_fn from datasets import load_dataset dataset = load_dataset("json", data_files="train_merlinite_7b.jsonl") train_dataloader = torch.utils.data.DataLoader( dataset["train"], batch_size=2, # M1内存有限,建议小batch collate_fn=collate_fn, shuffle=True )
方式二:在训练循环中处理每个batch
如果没有自定义collate_fn,在训练循环内统一迁移:
for batch in train_dataloader: # 将batch内所有张量移到MPS batch = {k: v.to(device) for k, v in batch.items()} # 后续前向传播、损失计算 outputs = model(**batch) loss = outputs.loss loss.backward() # ...优化器步骤
4. 额外排查点
- 检查是否有手动创建的张量(如自定义掩码、权重)未迁移到MPS,这类张量也需要调用
.to(device) - M1内存有限,7B模型微调建议启用梯度检查点减少内存占用:
model.gradient_checkpointing_enable() - 避免在训练过程中随意将张量移回CPU(如不必要的
cpu()调用)
内容的提问来源于stack exchange,提问作者Salvatore D'angelo
相关产品推荐
相关产品推荐

