使用 Optimum-Intel 和 OpenVINO GenAI 优化和部署模型
在端侧部署 Transformer 模型需要仔细考虑性能和兼容性。Python 虽然功能强大,但对于部署来说有时并不算理想,特别是在由 C++ 主导的环境中。这篇博客将指导您如何使用 Optimum-Intel 和 OpenVINO™ GenAI 来优化和部署 Hugging Face Transformers 模型,确保在最小依赖性的情况下进行高效的 AI 推理。
为什么使用 OpenVINO 来进行端侧部署
OpenVINO™ 最初是作为 C++ AI 推理解决方案开发的,使其非常适合在端侧设备部署中,其中最小化依赖性至关重要。随着引入 GenAI API,将大型语言模型 (LLMs) 集成到 C++ 或 Python 应用程序中变得更加简单,其特性旨在简化部署并提升性能。
第一步: 创建环境
预先准备
开始之前,请确保您的环境已正确配置了 Python 和 C++。安装必要的 Python 包:
pip install --upgrade --upgrade-strategy eager optimum[openvino]
以下是本文中使用的具体包:
transformers==4.44
openvino==24.3
openvino-tokenizers==24.3
optimum-intel==1.20
lm-eval==0.4.3
有关 GenAI C++ 库的安装,请按照
第二步: 将模型导出为 OpenVINO IR
Hugging Face 和 Intel 的合作促成了 OV
前缀开头,例如 OVModelForCausalLM
。除此之外,它与 🤗 Transformers 库的 API 类似。
要将 Transformers 模型导出为 OpenVINO 中间表示 (IR),可以使用两种方法: 可以使用 Python 的 .from_pretrained()
方法或 Optimum 命令行界面 (CLI)。以下是使用这两种方法的示例:
使用 Python API
from optimum.intel import OVModelForCausalLM
model_id = "meta-llama/Meta-Llama-3.1-8B"
model = OVModelForCausalLM.from_pretrained(model_id, export=True)
model.save_pretrained("./llama-3.1-8b-ov")
使用命令行 (CLI)
optimum-cli export openvino -m meta-llama/Meta-Llama-3.1-8B ./llama-3.1-8b-ov
./llama-3.1-8b-ov 文件夹将包含 .xml 和 bin IR 模型文件以及来自源模型的所需配置文件。🤗 tokenizer 也将转换为 openvino-tokenizers 库的格式,并在同一文件夹中创建相应的配置文件。
第三步: 模型优化
在资源受限的端侧设备上运行大型语言模型 (LLMs) 时,模型优化是一个极为重要的步骤。仅量化权重是一种主流方法,可以显著降低延迟和模型占用空间。Optimum-Intel 通过神经网络压缩框架 (NNCF) 提供了仅量化权重 (weight-only quantization) 的功能,该框架具有多种专为 LLMs 设计的优化技术: 从无数据 (data-free) 的 INT8 和 INT4 权重量化到数据感知方法,如
-
AWQ https://hf.co/docs/transformers/main/en/quantization/awq -
GPTQ https://hf.co/docs/transformers/main/en/quantization/gptq
对于 meta-llama/Meta-Llama-3.1-8B
模型,我们建议结合 AWQ、量化 scale 估计以及使用反映部署用例的校准数据集进行混合精度 INT4/INT8 权重的量化。与导出情况类似,在将 4 比特仅量化权重应用于 LLM 模型时有两种选项:
使用 Python API
-
在 .from_pretrained()
方法中指定quantization_config
参数。在这种情况下,应创建OVWeightQuantizationConfig
对象,并将其设置为该参数,如下所示:
from optimum.intel import OVModelForCausalLM, OVWeightQuantizationConfig
MODEL_ID = "meta-llama/Meta-Llama-3.1-8B"
quantization_config = OVWeightQuantizationConfig(bits=4, awq=True, scale_estimation=True, group_size=64, dataset="c4")
model = OVModelForCausalLM.from_pretrained(MODEL_ID, export=True, quantization_config=quantization_config)
model.save_pretrained("./llama-3.1-8b-ov")
使用命令行 (CLI)
optimum-cli export openvino -m meta-llama/Meta-Llama-3.1-8B --weight-format int4 --awq --scale-estimation --group-size 64 --dataset wikitext2 ./llama-3.1-8b-ov
第四步: 使用 OpenVINO GenAI API 进行部署
在转换和优化之后,使用 OpenVINO GenAI 部署模型非常简单。OpenVINO GenAI 中的 LLMPipeline 类提供了 Python 和 C++ API,支持各种文本生成方法,并具有最小的依赖关系。
Python API 的例子
import argparse
import openvino_genai
device = "CPU" # GPU can be used as well
pipe = openvino_genai.LLMPipeline(args.model_dir, device)
config = openvino_genai.GenerationConfig()
config.max_new_tokens = 100
print(pipe.generate(args.prompt, config))
为了运行这个示例,您需要在 Python 环境中安装最小的依赖项,因为 OpenVINO GenAI 旨在提供轻量级部署。您可以将 OpenVINO GenAI 包安装到相同的 Python 环境中,或者创建一个单独的环境来比较应用程序的占用空间:
pip install openvino-genai==24.3
C++ API 的例子
让我们看看如何使用 OpenVINO GenAI C++ API 运行相同的流程。GenAI API 的设计非常直观,并提供了与 🤗 Transformers API 无缝迁移的功能。
注意: 在下面的示例中,您可以为 “device” 变量指定环境中的任何其他可用设备。例如,如果您正在使用带有集成显卡的 Intel CPU,则尝试使用 “GPU” 是一个不错的选择。要检查可用设备,您可以使用 ov::Core::get_available_devices 方法 (参考
query-device-properties )。
#include "openvino/genai/llm_pipeline.hpp"
#include <iostream>
int main(int argc, char* argv[]) {
std::string model_path = "./llama-3.1-8b-ov";
std::string device = "CPU" // GPU can be used as well
ov::genai::LLMPipeline pipe(model_path, device);
std::cout << pipe.generate("What is LLM model?", ov::genai::max_new_tokens(256));
}
自定义生成配置
LLMPipeline
还允许通过 ov::genai::GenerationConfig
来指定自定义生成选项:
ov::genai::GenerationConfig config;
config.max_new_tokens = 256;
std::string result = pipe.generate(prompt, config);
使用 LLMPipeline,用户不仅可以轻松利用各种解码算法,如 Beam Search,还可以像下面的示例中那样构建具有 Streamer 的交互式聊天场景。此外,用户可以利用 LLMPipeline 的增强内部优化,例如利用先前聊天历史的 KV 缓存减少提示处理时间,使用 chat 方法: start_chat()
和 finish_chat()
(参考
ov::genai::GenerationConfig config;
config.max_new_tokens = 100;
config.do_sample = true;
config.top_p = 0.9;
config.top_k = 30;
auto streamer = [](std::string subword) {
std::cout << subword << std::flush;
return false;
};
// Since the streamer is set, the results will
// be printed each time a new token is generated.
pipe.generate(prompt, config, streamer);
最后你可以看到如何在聊天场景下使用 LLMPipeline:
pipe.start_chat()
for (size_t i = 0; i < questions.size(); i++) {
std::cout << "question:\n";
std::getline(std::cin, prompt);
std::cout << pipe.generate(prompt) << std::endl;
}
pipe.finish_chat();
结论
Optimum-Intel 和 OpenVINO™ GenAI 的结合为在端侧部署 Hugging Face 模型提供了强大而灵活的解决方案。通过遵循这些步骤,您可以在 Python 可能不是理想选择的环境中实现优化的高性能 AI 推理,以确保您的应用在 Intel 硬件上平稳运行。
其他资源
-
您可以在这个 教程 中找到更多详细信息。https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/genai-guide.html -
要构建上述的 C++ 示例,请参考这个 文档 。https://github.com/openvinotoolkit/openvino.genai/blob/releases/2024/3/src/docs/BUILD.md -
OpenVINO 文档 docs.openvino.ai -
Jupyter 笔记本 https://docs.openvino.ai/2024/learn-openvino/interactive-tutorials-python.html -
Optimum 文档 https://hf.co/docs/optimum/main/en/intel/index
原文链接:
https://hf.co/blog/deploy-with-openvino 原文作者: Alexander, Yury Gorbachev, Ekaterina Aidova, Ilya Lavrenov, Raymond Lo, Helena, Ella Charlaix
译者: Zipxuan
本文分享自微信公众号 - Hugging Face(gh_504339124f0f)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
更快的辅助生成: 动态推测
⭐ 在这篇博客文章中,我们将探讨 动态推测解码 ——这是由英特尔实验室和 Hugging Face 开发的一种新方法,可以加速文本生成高达 2.7 倍,具体取决于任务。从 Transformers🤗 发布的版本 4.45.0 开始,这种方法是辅助生成的默认模式⭐ Transformers🤗 https://github.com/huggingface/transformers 4.45.0 版本发布信息 https://github.com/huggingface/transformers/releases/tag/v4.45.0 推测解码 推测解码 技术十分流行,其用于加速大型语言模型的推理过程,与此同时保持其准确性。如下图所示,推测解码通过将生成过程分为两个阶段来工作。在第一阶段,一个快速但准确性较低的 草稿 模型 (Draft,也称为助手) 自回归地生成一系列标记。在第二阶段,一个大型但更准确的 目标 模型 (Target) 对生成的草稿标记进行并行验证。这个过程允许目标模型在单个前向传递中生成多个标记,从而加速自回归解码。推测解码的成功在很大程度上取决于 推测前瞻 (Spe...
- 下一篇
淘宝AI试衣素材高效写入IC实践
随着电商行业的快速发展,用户对于在线购物体验的要求也在不断提高。特别是在服装领域,用户希望能够更加直观地了解商品的实际穿着效果。为此,淘宝试衣项目应运而生,通过AI技术为用户提供个性化的试衣体验。本文将详细介绍淘宝试衣项目的背景、现状、合作场景以及技术实现,特别是如何通过定时任务驱动的试衣素材高效写入IC(商品中心)拓展结构,提升用户体验和转化率。 背景 ▐现状 服饰属于非标商品,用户无法直观的通过模特上身图去预估自己的真实上身结果;在详情页内,用户主要通过卖家秀、问大家等获取真实参考;因此部分数据不全的商品内,用户难以快速决策发生购买。 ▐淘宝试衣已经做了什么 扩大女装商品覆盖:例如连衣裙、上装等 支持同商品的不同sku的试穿,提供分类目的不同上身效果的衣长指南 优化多版模特,使其更加真实自然;支持多种身型模特以及用户照片试穿 优化试衣效果及清晰度 ▐淘宝试衣在其他合作场景 LAZADA详情:为没有模特上身图的商家替换东南亚模特试穿的详情主图 淘宝详情、购物车等:试衣标志,为有需求的用户提供试衣体验 BC消息:咨询界面为客户实时提供试穿入口,让用户看到真实试穿效果 ▐淘宝试衣x详情场...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 2048小游戏-低调大师作品
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker安装Oracle12C,快速搭建Oracle学习环境