探索QWEN 2.5大模型本地部署与性能优化:一次技术调研实战
在人工智能浪潮中,大型语言模型(LLM)扮演着日益重要的角色。阿里云推出的QWEN系列模型,以其卓越的性能和广泛的应用场景,备受业界关注。最新发布的QWEN 2.5版本,在数据规模、模型能力和多语言支持等方面都实现了显著提升。本文将深入探讨QWEN 2.5大模型的关键特性,并结合实际操作,分享在本地环境下部署和优化QWEN 2.5 7B量化版模型的经验。
QWEN 2.5大模型:技术特性与亮点剖析
QWEN 2.5是阿里云QWEN系列的最新一代大型语言模型,相较于2.0版本,它在多个方面都进行了显著的改进和扩展。以下是QWEN 2.5大模型的一些关键特性和亮点:
- 海量预训练数据:QWEN 2.5系列模型在高达18T tokens的数据集上进行了预训练,这赋予了它们更广阔的知识面和更精准的理解力,使其在各种自然语言处理任务中表现出色。
- 性能全面提升:相比QWEN 2,QWEN 2.5的整体性能提升超过18%。在知识能力方面,如MMLU基准测试等多个测评中都有显著改进,数学能力也得到了显著加强,为解决复杂问题奠定了基础。
- 指令跟随与结构化数据处理:QWEN 2.5在指令跟随方面表现出色,能够更准确地理解并执行用户的指令。同时,对于结构化数据的理解和生成能力也显著提高,尤其是在处理JSON格式的数据时,表现更加出色。
- 强大的多语言支持:QWEN 2.5支持高达128K的上下文长度,并能生成最多8K的内容,能够流畅地响应各种系统提示,从而实现角色扮演和聊天机器人等复杂任务。它支持包括中文、英文、法文、西班牙文、俄文、日文、越南文、阿拉伯文在内的29种以上语言,展现出强大的多语言处理能力。
- 专业领域模型:
- QWEN 2.5-Coder模型:通过5.5T代码数据的训练,实现了对92种编程语言的高效支持,同时保持了卓越的数学和通用推理能力,是编程辅助的强大工具。
- QWEN 2.5-Math模型:凭借1T高质量数学数据的训练,并结合COT和TIR等先进技术,在数学领域展现出卓越的性能,能够有效解决复杂的数学问题。
- 灵活的模型尺寸选择:QWEN 2.5系列提供从1.5B到72B不同尺寸的模型,以满足不同开发者的需求,开发者可以根据自身资源和应用场景选择合适的模型。
- 友好的开源许可:QWEN 2.5-Coder模型采用Apache 2.0许可证,确保了开源社区的参与和扩展能力,促进了技术的共享和发展。
- 卓越的性能评测结果:QWEN 2.5-72B模型在MMLU-rudex基准、MBPP基准和MATH基准的得分分别高达86.8、88.2和83.1,充分展示了其卓越的性能。
QWEN 2.5大模型的这些特性使其在语言理解、知识问答、编程辅助、数学问题解决等多个领域具有广阔的应用前景。
本地部署QWEN 2.5:环境搭建与问题解决
为了将QWEN 2.5大模型应用于实际项目,笔者尝试在本地环境中进行部署和技术调研。由于硬件资源的限制,选择部署7B的量化版模型。以下是详细的部署过程和遇到的问题及解决方案:
1. 硬件环境
- 显卡:Nvidia 2080 (11GB显存)
2. 软件环境
- 操作系统:Ubuntu 20.04
- Python:3.8
- CUDA:11.0
- PyTorch:1.10
3. 模型下载
从Hugging Face下载QWEN 2.5-7B-Instruct模型:Qwen/Qwen2.5-7B-Instruct · Hugging Face
考虑到国内网络环境,建议使用镜像网站或hfd脚本进行下载,提高下载速度。
4. 安装vLLM框架
为了提升模型推理性能,选择使用vLLM框架。执行以下命令安装vLLM:
pip install vllm
在安装过程中,可能会遇到“gcc: error trying to exec ‘cc1plus‘: execvp: 没有那个文件或目录”的错误。这通常是由于缺少g++或gcc版本过低导致的。
解决方案:
(1) 安装或升级gcc和g++。
由于编译vLLM需要gcc 9.0及以上版本,而系统默认的gcc版本可能较低(如7.5)。因此,需要先安装或升级gcc和g++。
执行以下命令安装gcc和g++的11版本:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-11
sudo apt install g++-11
(2) 配置gcc和g++版本。
安装完成后,系统中会同时存在多个gcc和g++版本。需要使用update-alternatives
命令来管理和切换默认版本。
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 50
然后,通过以下命令在交互模式下设置默认使用的版本:
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
选择gcc-11和g++-11作为默认版本。完成以上步骤后,重新运行pip install vllm
,应该可以成功安装。
QWEN 2.5模型运行实战:三种方式对比
成功安装vLLM后,就可以开始运行QWEN 2.5模型了。这里介绍三种不同的运行方式,并分析它们的优缺点。
1. Hugging Face运行方式
通过Hugging Face的transformers库加载模型,并以对话模式运行。这种方式简单易用,适合快速验证模型的功能。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_path = 'models/Qwen/Qwen2.5-7B-Instruct-GPTQ-Int8/'
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype="auto", device_map="cuda:0", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_path)
prompt = '你好,请介绍一下你自己。'
messages = [
{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=1024,
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
优点:
- 代码简单易懂,易于上手。
- 可以直接使用Hugging Face Hub上的预训练模型。
缺点:
- 推理速度较慢,尤其是在CPU上运行时。
- 对显存的利用率不高,难以充分发挥GPU的性能。
2. 批处理运行模式
为了提高显卡利用率,可以采用批处理方式运行模型。这种方式将多个输入打包成一个batch,一次性输入到模型中进行推理。
from transformers import pipeline
model_path = 'models/Qwen/Qwen2.5-7B-Instruct-GPTQ-Int8/'
pipe = pipeline("text-generation", model_path, torch_dtype="auto", device_map="cuda:0", trust_remote_code=True)
messages_batch = []
for i in range(8):
prompt = '你好,请介绍一下你自己。'
message = [
{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
{"role": "user", "content": prompt}
]
messages_batch.append(message)
pipe.tokenizer.padding_side="left"
result_batch = pipe(messages_batch, max_new_tokens=512, batch_size=8)
response_message_batch = [result[0]["generated_text"][-1] for result in result_batch]
for response in response_message_batch:
print(response)
优点:
- 提高了显卡利用率,推理速度更快。
- 可以同时处理多个输入,提高效率。
缺点:
- 代码相对复杂,需要对transformers库有更深入的了解。
- 需要根据硬件资源调整batch size,以达到最佳性能。
3. vLLM运行方式
vLLM是一个专门为LLM设计的推理引擎,可以显著提高推理速度和显存利用率。使用vLLM运行QWEN 2.5模型,可以获得更好的性能。
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer
model_path = 'models/Qwen/Qwen2.5-3B-Instruct-AWQ/'
model = LLM(model=model_path, quantization="awq", trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_path)
messages_batch = []
batch_size = 16
sampling_params = SamplingParams(temperature=0, top_p=0.8, repetition_penalty=1.05, max_tokens=2048)
for i in range(batch_size):
prompt = '你好,请介绍一下你自己。'
message = [
{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
message,
tokenize=False,
add_generation_prompt=False
)
messages_batch.append(text)
outputs = model.generate(messages_batch, sampling_params, use_tqdm=False)
for output in outputs:
generated_text = output.outputs[0].text
print(generated_text)
优点:
- 推理速度非常快,比Hugging Face原生方式快数倍。
- 显存利用率更高,可以在有限的显存下运行更大的模型。
缺点:
- 配置相对复杂,需要安装vLLM框架。
- 对硬件资源要求较高,可能需要更大的显存。
注意: 在2080显卡上运行vLLM可能会遇到显存不足的问题。可以尝试减小模型尺寸(如使用3B模型)、降低batch size或使用更高效的量化方法来缓解显存压力。
总结与展望
通过本次技术调研,我们深入了解了QWEN 2.5大模型的特性和优势,并成功在本地环境中部署和运行了7B量化版模型。通过对比不同的运行方式,发现vLLM框架在推理速度和显存利用率方面具有显著优势,值得推荐。尽管在部署过程中遇到了一些问题,但通过仔细分析和查找解决方案,最终都得以解决。
未来,可以进一步探索QWEN 2.5大模型在更多领域的应用,如智能客服、文本生成、代码生成等。同时,也需要关注模型优化和部署方面的技术进展,以便更好地利用大模型的能力,推动人工智能技术的发展。