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

M1芯片Mac本地运行Mistral-7B卡在生成阶段的解决办法

解决M1 macOS上运行Mistral-7B模型卡住的问题

在搭载M1芯片的macOS系统中,使用transformers库运行Mistral-7B-Instruct-v0.2模型时,模型卡在生成阶段无响应,核心原因是模型参数规模过大,M1内存不足以承载全精度模型,且未启用硬件加速,以下是针对性解决方案:

问题代码回顾

from transformers import AutoTokenizer, AutoModelForCausalLM, LlamaTokenizer
import torch

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2", padding_side="left")
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")

while True:
    prompt = 'What is YouTube?'
    input_ids = tokenizer.encode(tokenizer.eos_token + prompt, return_tensors="pt")
    
    print('generating response...')
    output = model.generate(input_ids, max_length=20, pad_token_id=tokenizer.eos_token_id)
    decoded_output = tokenizer.decode(output[0], skip_special_tokens=True)
    print("Response: ", decoded_output)

解决方案

1. 启用4-bit量化加载模型

Mistral-7B全精度模型需要约28GB内存,远超M1的常规内存容量,通过4-bit量化可将内存占用降至3.5GB左右,适配M1硬件:

  • 先安装依赖:pip install bitsandbytes accelerate
  • 修改模型加载代码:
    model = AutoModelForCausalLM.from_pretrained(
        "mistralai/Mistral-7B-Instruct-v0.2",
        load_in_4bit=True,
        device_map="auto",
        torch_dtype=torch.float16
    )
    

2. 启用MPS硬件加速

利用M1的GPU(MPS)大幅提升生成速度,避免纯CPU运行的低效:

  • 确保PyTorch版本≥1.12(支持MPS),添加设备配置:
    # 检测并设置设备
    device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
    # 将模型和输入张量移至MPS设备
    model = model.to(device)
    input_ids = input_ids.to(device)
    

3. 优化生成参数

调整生成参数避免无效计算,同时明确生成逻辑:

  • 用max_new_tokens代替max_length,精准控制生成的新token数量(避免因输入长度超过max_length导致无输出)
  • 启用贪心解码(do_sample=False)进一步提升速度
    修改生成代码:
    output = model.generate(
        input_ids,
        max_new_tokens=50,  # 生成50个新token
        pad_token_id=tokenizer.eos_token_id,
        do_sample=False,
        temperature=0.7
    )
    

4. 释放系统内存

关闭浏览器、IDE等占用大量内存的应用,避免系统因内存不足陷入swap读写循环。

修改后的完整代码

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2", padding_side="left")
# 启用4-bit量化加载模型
model = AutoModelForCausalLM.from_pretrained(
    "mistralai/Mistral-7B-Instruct-v0.2",
    load_in_4bit=True,
    device_map="auto",
    torch_dtype=torch.float16
)

# 设置设备
device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
model = model.to(device)

while True:
    prompt = 'What is YouTube?'
    # 编码输入并移至对应设备
    input_ids = tokenizer.encode(tokenizer.eos_token + prompt, return_tensors="pt").to(device)
    
    print('generating response...')
    # 生成响应
    output = model.generate(
        input_ids,
        max_new_tokens=50,
        pad_token_id=tokenizer.eos_token_id,
        do_sample=False
    )
    # 解码输出
    decoded_output = tokenizer.decode(output[0], skip_special_tokens=True)
    print("Response: ", decoded_output)

内容的提问来源于stack exchange,提问作者Shuai Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:50:33