You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:43:10