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
相关产品推荐
相关产品推荐

