实战精选 | 5分钟利用 OpenVINO™ 部署 Qwen2.5

学术   2024-09-26 17:20   浙江  

点击蓝字

关注我们,让开发变得更有趣

作者 | 杨亦诚 英特尔 AI 软件工程师

排版 | 吴紫琴


OpenVINO™


Qwen2.5 是阿里通义团队近期最新发布的文本生成系列模型,基于更富的语料数据集训练,相较于 Qwen2,Qwen2.5 获得了显著更多的知识(MMLU:85+),并在编程能力(HumanEval 85+)和数学能力(MATH 80+)方面有了大幅提升。


此外,新模型在指令执行、生成长文本(超过 8K 标记)、理解结构化数据(例如表格)以及生成结构化输出特别是 JSON 方面取得了显著改进。Qwen2.5 模型总体上对各种 system prompt 更具适应性,增强了角色扮演实现和聊天机器人的条件设置功能。


与 Qwen2 类似,Qwen2.5 语言模型支持高达 128K tokens,并能生成最多 8K tokens 的内容。它们同样保持了对包括中文、英文、法文、西班牙文、葡萄牙文、德文、意大利文、俄文、日文、韩文、越南文、泰文、阿拉伯文等 29 种以上语言的支持。本文将以 Qwen2.5-7B-Instruct 为例,介绍如何利用 OpenVINO™ 的 Python API 在本地部署 Qwen2.5 系列模型。


OpenVINO™


安装相关依赖


本示例有以下依赖组件,需要通过 pip install 提前安装。

  • nncf==2.12.0

  • torch==2.3.1

  • modelscope

  • optimum[“openvino”]

  • openvino==2024.4.0

  • openvino-genai==2024.4.0


OpenVINO™


原始模型下载


我们可以通过魔搭社区提供的命令行工具,下载 Qwen2.5-7B-Instruct 的预训练模型:

modelscope download --model 'qwen/Qwen2.5-7B-Instruct ' --include '*.json' --cache_dir './local_dir'


这里的 './local_dir' 为保存模型的本地路径。


OpenVINO™


模型格式转换与量化


在部署模型之前,我们首先需要将原始的 PyTorch 模型转换为 OpenVINO™ 的 IR 静态图格式,并对其进行压缩,以实现更轻量化的部署和最佳的性能表现。通过 Optimum 提供的命令行工具 optimum-cli,我们可以一键完成模型的格式转换和权重量化任务:

optimum-cli export openvino --model './local_dir' --task text-generation-with-past --weight-format int4 --group-size 128 --ratio 0.8  Qwen2.5-7B-Instruct-int4-ov


开发者可以根据模型的输出结果,调整其中的量化参数,包括:

  • --weight-format:量化精度,可以选择

    fp32,fp16,int8,int4,int4_sym_g128,int4_asym_g128,int4_sym_g64,int4_asym_g64

  • --group-size:权重里共享量化参数的通道数量

  • --ratio:int4/int8 权重比例,默认为1.0,0.6表示60%的权重以 int4 表,40%以 int8 表示

  • --sym:是否开启对称量化


OpenVINO™


模型部署


OpenVINO™ 目前提供两种针对大语言模型的部署方案,如果您习惯于 Transformers 库的接口来部署模型,并想体验相对更丰富的功能,推荐使用基于 Python 接口的 Optimum-intel 工具来进行任务搭建。如果您想尝试更极致的性能或是轻量化的部署方式,GenAI API 则是不二的选择,它同时支持 Python 和 C++ 两种编程语言,安装容量不到200MB。


·       Optimum-intel 部署示例

from optimum.intel.openvino import OVModelForCausalLMfrom transformers import AutoConfig, AutoTokenizer
ov_model = OVModelForCausalLM.from_pretrained( llm_model_path, device='GPU', config=AutoConfig.from_pretrained(llm_model_path),)tok = AutoTokenizer.from_pretrained(llm_model_path)prompt = "<|im_start|>system\n<|im_end|>\n<|im_start|>user\n什么是人工智能?<|im_end|>\n<|im_start|>assistant\n"input_tokens = tok(prompt, return_tensors="pt", **tokenizer_kwargs)answer = ov_model.generate(**input_tokens, max_new_tokens=1024)tok.batch_decode(answer, skip_special_tokens=True)[0]


·       GenAI API 部署示例

import openvino_genai as ov_genai
pipe = ov_genai.LLMPipeline(llm_model_path, "GPU")pipe.generate(prompt, eos_token_id=151645, max_length=500)


当然你也可以通过以下方式实现流式输出。

def streamer(subword):    print(subword, end='', flush=True)return Falsepipe.generate(prompt, eos_token_id=151645, max_length=500, streamer=streamer)



输出结果示例:

人工智能(Artificial Intelligence,简称 AI)是指由计算机系统所表现出的一种智能行为。它是一门研究如何创建具有智能的计算机程序或系统的学科。人工智能的目标是使计算机能够执行通常需要人类智能才能完成的任务,例如学习、推理、感知、理解自然语言、解决问题、识别图像和语音等。


此外,GenAI API 提供了 chat 模式的构建方法,通过声明 pipe.start_chat()以及pipe.finish_chat(),多轮聊天中的历史数据将被以 kvcache 的形态,在内存中进行管理,从而提升运行效率。

pipe.start_chat()while True:    try:        prompt = input('question:\n')    except EOFError:        break    pipe.generate(prompt, config, streamer)    print('\n----------')pipe.finish_chat()


chat模式输出结果示例:



OpenVINO™


总结


可以看到,不管是利用 Optimum-intel 或是 OpenVINO™  GenAI API,我们都可以非常轻松地将转换后的 Qwen2.5 模型部署在 Intel 的硬件平台上,从而进一步在本地构建起各类基于 LLM 的服务和应用。


参考资料

完整示例:https://github.com/openvino-dev-samples/Qwen2.openvino


OpenVINO™

Datawhale
一个专注于AI领域的开源组织,汇聚了众多优秀学习者,使命-for the learner,和学习者一起成长。
 最新文章