无GPU的Windows环境下用Transformers运行LLM速度慢问题排查
问题描述
我没有GPU,但通过Ollama运行openbuddy-llama3-8b-v21.1-8k模型时速度约为1t/s。但使用以下代码运行时,model.generate的速度比Ollama慢很多,且进程仅占用25%的CPU,请问问题出在哪里?
from transformers import ( AutoModelForCausalLM, AutoTokenizer, GenerationConfig, ) import torch new_model = "openbuddy/openbuddy-llama3-8b-v21.1-8k" model = AutoModelForCausalLM.from_pretrained( new_model, device_map="auto", trust_remote_code=True, torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, ) tokenizer = AutoTokenizer.from_pretrained( new_model, max_length=2048, trust_remote_code=True, use_fast=True, ) tokenizer.pad_token = tokenizer.eos_token tokenizer.padding_side = "right" prompt = """<|im_start|>system You are a helpful AI assistant.<|im_end|> <|im_start|>user Как открыть брокерский счет?<|im_end|> <|im_start|>assistant """ inputs = tokenizer.encode( prompt, return_tensors="pt", add_special_tokens=False ).cpu() generation_config = GenerationConfig( max_new_tokens=700, temperature=0.5, top_p=0.9, top_k=40, repetition_penalty=1.1, do_sample=True, pad_token_id=tokenizer.eos_token_id, eos_token_id=tokenizer.eos_token_id, ) outputs = model.generate( generation_config=generation_config, input_ids=inputs, ) print(tokenizer.decode(outputs[0], skip_special_tokens=False))
问题原因及解决方法
核心原因
- 缺少CPU加速优化:Ollama默认集成OpenBLAS、MKL等CPU加速库,且启用多线程并行计算;你的transformers代码未配置任何加速参数,仅低线程运行,导致CPU利用率不足。
- 未使用量化模型:8B参数的原生bfloat16模型在CPU上推理时内存占用大、计算效率低;Ollama使用的是量化后的GGUF格式模型,体积更小、计算速度更快。
具体修复方案
方案一:为transformers启用量化与CPU加速
- 启用4-bit量化:通过
bitsandbytes库对模型做量化处理,降低内存占用并提升速度:from transformers import ( AutoModelForCausalLM, AutoTokenizer, GenerationConfig, ) import torch import os # 设置CPU多线程数(根据你的CPU核心数调整,比如8核设为8) os.environ["OMP_NUM_THREADS"] = "8" os.environ["MKL_NUM_THREADS"] = "8" new_model = "openbuddy/openbuddy-llama3-8b-v21.1-8k" model = AutoModelForCausalLM.from_pretrained( new_model, device_map="cpu", # 明确指定CPU设备 trust_remote_code=True, torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, load_in_4bit=True, # 开启4-bit量化 bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16 ) # 后续tokenizer和生成代码保持不变 - 确保PyTorch带加速库:若你的PyTorch未集成MKL,建议重新安装带MKL支持的官方版本。
方案二:使用GGUF格式模型(与Ollama底层一致)
直接使用llama-cpp-python库加载对应模型的GGUF量化版本,可获得和Ollama接近的推理速度:
from llama_cpp import Llama # 加载GGUF格式的量化模型(需自行下载对应模型文件) llm = Llama( model_path="./openbuddy-llama3-8b-v21.1-8k.Q4_K_M.gguf", n_ctx=8192, n_threads=8, # 线程数匹配CPU核心数 n_threads_batch=8 ) prompt = """<|im_start|>system You are a helpful AI assistant.<|im_end|> <|im_start|>user Как открыть брокерский счет?<|im_end|> <|im_start|>assistant """ output = llm( prompt, max_tokens=700, temperature=0.5, top_p=0.9, top_k=40, repeat_penalty=1.1, stop=["<|im_end|>"] ) print(output["choices"][0]["text"])
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

