MPT-7B-instruct文本生成报错及速度过慢问题求助
问题描述
我使用GCP的e2-highmem-4类型高效虚拟机(4 vCPU、32GB内存)加载并运行模型,代码如下:
import torch from transformers import pipeline from transformers import AutoTokenizer, AutoModelForSequenceClassification import transformers config = transformers.AutoConfig.from_pretrained( 'mosaicml/mpt-7b-instruct', trust_remote_code=True, ) # config.attn_config['attn_impl'] = 'flash' model = transformers.AutoModelForCausalLM.from_pretrained( 'mosaicml/mpt-7b-instruct', config=config, torch_dtype=torch.bfloat16, trust_remote_code=True, cache_dir="./cache" ) from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("EleutherAI/gpt-neox-20b", cache_dir="./cache") text_gen = pipeline("text-generation", model=model, tokenizer=tokenizer) text_gen(text_inputs="what is 2+2?")
当前代码生成文本耗时极长,创建pipeline时还出现警告:The model 'MPTForCausalLM' is not supported for text-generation,尝试生成文本时程序长时间无响应。请问我的操作是否存在错误?或有哪些方法可以提升生成速度?
问题分析与解决方案
一、代码中的错误点
- 模型与Tokenizer不匹配:使用
mosaicml/mpt-7b-instruct模型,却搭配EleutherAI/gpt-neox-20b的Tokenizer,两者词汇表、编码规则不一致,会导致生成逻辑混乱,加剧性能问题。必须使用模型对应的Tokenizer。 - 未启用Flash Attention:代码注释了
config.attn_config['attn_impl'] = 'flash',Flash Attention能大幅提升注意力机制的计算效率,关闭它会显著降低大模型的生成速度。 - pipeline兼容性问题:MPT模型对
text-generationpipeline的支持不完善,直接使用会增加额外开销,甚至导致程序无响应。
二、性能优化方法
1. 修正代码错误
替换对应Tokenizer、启用Flash Attention,改用手动生成逻辑替代pipeline:
import torch import transformers from transformers import AutoTokenizer, AutoModelForCausalLM # 加载配置并启用Flash Attention config = transformers.AutoConfig.from_pretrained( 'mosaicml/mpt-7b-instruct', trust_remote_code=True, ) config.attn_config['attn_impl'] = 'flash' # 加载模型 model = AutoModelForCausalLM.from_pretrained( 'mosaicml/mpt-7b-instruct', config=config, torch_dtype=torch.bfloat16, trust_remote_code=True, cache_dir="./cache" ) # 加载模型专属Tokenizer tokenizer = AutoTokenizer.from_pretrained("mosaicml/mpt-7b-instruct", cache_dir="./cache") # 手动处理文本生成 text_inputs = "what is 2+2?" inputs = tokenizer(text_inputs, return_tensors="pt").to(model.device) with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=50, temperature=0.7, do_sample=True ) print(tokenizer.decode(outputs[0], skip_special_tokens=True))
2. 硬件与环境优化
- 启用CPU多线程:利用4 vCPU的全部性能,可在代码开头添加:
或在启动脚本前设置环境变量:torch.set_num_threads(4)export OMP_NUM_THREADS=4 export MKL_NUM_THREADS=4 - 模型量化:安装
bitsandbytes库后,启用8位量化,降低内存占用同时提升CPU推理速度:model = AutoModelForCausalLM.from_pretrained( 'mosaicml/mpt-7b-instruct', config=config, torch_dtype=torch.bfloat16, trust_remote_code=True, cache_dir="./cache", load_in_8bit=True ) - 禁用梯度计算:始终用
torch.no_grad()包裹生成逻辑,避免不必要的内存和性能消耗。
3. 生成参数优化
- 限制生成长度:设置合理的
max_new_tokens值,避免生成过长文本拖慢速度。 - 调整解码策略:若不需要多样化输出,设置
do_sample=False使用贪婪解码,速度会明显提升。
内容的提问来源于stack exchange,提问作者DD111
相关产品推荐
相关产品推荐

