如何使用 OpenVINO™ 生成式AI API (GenAI API) 以更少的代码构建更快的生成式AI 应用...

点击蓝字

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

作者 | Raymond Lo, Dmitriy Pastushenkov, 武卓  Intel AI软件布道师

排版 | 吴紫琴

随着 ChatGPT 等聊天机器人的风暴席卷全球,生成式预训练 Transformers (GPT) 在开发者中正在成为家喻户晓的新名字。生成式 AI(GenAI) 的发展,尤其是大语言模型和聊天机器人的进步很快、变化不断,很难预测接下来会有什么突破,开发者应该关注什么。我们知道生成式AI将继续存在,开发人员希望看到在本地开发、维护和部署 AI 应用程序的更简洁明了的方法。

尽管生成式AI 令人兴奋,但对这些模型运行推理仍面临重大挑战,尤其是在边缘设备和 AI PC 上。

OpenVINO™

英特尔硬件上当前最先进的生成式AI

如今,为了在 Intel 硬件上获得 生成式AI 的最佳性能,开发人员可以使用 Optimum Intel 和 OpenVINO™ 后端优化的 Hugging Face 流水线来运行 生成式AI 模型。OpenVINO™ 可以在 CPU、GPU或NPU 上启用优化,这些可以显著减少延迟并提高运行效率(https://docs.openvino.ai/2024/about-openvino/performance-benchmarks.html)。此外,我们可以利用量化和权重压缩等模型优化技术来最小化内存占用(减少 2-3 倍的内存使用量)。这通常是模型部署中的主要瓶颈,因为客户端或边缘设备仅配备 32GB 或更少的 内存。

图 1:借助新的 OpenVINO™ 生成式AI API (GenAI API),我们可以在代码编写方面做得更好!如上图所示,推理代码仅减少到3行代码!这种新的工作流程为开发者提供了一个低得多的的学习曲线,从而开始生成式AI 应用程序的开发之旅。

不仅代码行数大大减少了,而且安装的依赖项只有寥寥几个,从而形成了一个简洁紧凑的环境,运行生成式AI 推理仅需216Mb!

图 2:使用 OpenVINO™ GenAI API 部署解决方案不仅可以减少磁盘使用量,还可以简化构建生成式 AI 应用的依赖性要求。这通常是开发人员开始维护 生成式AI 应用程序时面临的最大挑战之一。


OpenVINO™ 生成式AI API

Optimum-Intel

附加的依赖项

非常轻

许多依赖项,包括 PyTorch 等

推理代码

非常轻的编码

基于 Hugging Face

API

Python, C++

Python

模型支持

大语言模型 (其它生成式模型即将推出)

广泛的模型集

采样方法

贪心、波束搜索 以及多项式解码

全部

并行生成优化

是的* (比如 Continues-batching, Paged-attention…)

不支持

分词

通过 OpenVINO™ tokenizer模型完成

通过 Hugging Face tokenizer 完成(仅针对Python)



*特性持续开发中

表 1:OpenVINO™ GenAI API 与 Optimum-Intel 软件包的比较

与 Optimum-Intel 相比,GenAI API 仅集成了最常用的采样方法,包括贪心和波束搜索。同时,开发者还可以通过多项式解码  来自定义采样参数,例如 Top-k、Temperature等。

考虑到多用户的场景,GenAI API 仅原生实现了 Continues-batching、Paged-attention。在文本生成过程中,这些技术可以帮助提高性能并优化在进行多批次推理时的内存消耗。

由于 Hugging Face 的分词器只能与 Python 配合使用,为了与 OpenVINO™ C++ 运行时的输入/输出张量格式保持一致,GenAI API 将分别通过推理 2 个 OpenVINO 模型来对输入文本分词并对输出解分词。在这种方法之前,开发人员可以使用 Optimum-Intel CLI 将 Hugging Face 的分词器转换为 OpenVINO™ IR 模型。

到目前为止,我们已经强调了使用新的 OpenVINO™ GenAI API 的一些关键优势。在下一节中,我们将更深入地了解如何逐步运行演示。

OpenVINO™

使用 OpenVINO™ GenAI API 的轻量级生成式AI

安装

设置新的 OpenVINO™ GenAI API 以在生成式 AI 和 LLM 上运行推理,设计简单明了。安装过程可以通过 PyPI 或下载存档来执行,让您可以灵活地选择最适合您需求的方法。例如,您可以使用以下内容进行 PyPI 安装 ,该安装包含在我们最新的 OpenVINO™ 2024.2 版本中:

python -m pip install openvino-genai

关于安装的更多信息可以在 https://docs.openvino.ai/2024/get-started/install-openvino/install-openvino-genai.html 找到。

运行推理

安装 OpenVINO™ 后,您可以开始在 GenAI 和 LLM 模型上运行推理。通过利用此 API,您可以加载模型,向其传递上下文,并仅使用几行代码接收响应。

在内部,OpenVINO™ 处理输入文本的标记化,在您选择的设备上执行生成循环,并提供最终响应。让我们根据 openvino.genai(https://github.com/openvinotoolkit/openvino.genai/tree/master/samples/cpp/chat_sample) 存储库中提供的chat_sample(https://github.com/openvinotoolkit/openvino.genai/tree/master/samples/cpp/chat_sample)范例,在 Python 和 C++ 中逐步探索这个过程。

第一步: 必须使用 Hugging Face Optimum-Intel(在本例中,我们使用聊天调优的 Tiny Llama)下载 LLM 模型并将其导出为 OpenVINO™ IR 格式。对于此步骤,建议创建一个单独的虚拟环境,以避免任何依赖项冲突。例如

python -m venv openvino_venv

激活它,

openvino_venv\Script\activate

并安装依赖项,这是模型导出过程所必需的。这些要求可在  openvino.genai 仓库中找到

python -m pip install –upgrade-strategy eager -r requirements.txt

要下载和导出模型,请使用以下命令。

optimum-cli export openvino --trust-remote-code --
model TinyLlama/TinyLlama-1.1B-Chat-v1.0 TinyLlama-1.1B-Chat-v1.0

为了提高 LLM 推理期间的性能,我们建议对模型权重使用较低的精度,例如 INT4。在模型导出过程中,您可以使用神经网络压缩框架 (NNCF) 压缩权重,如下所示。

optimum-cli export openvino --trust-remote-code --
model TinyLlama/TinyLlama-1.1B-Chat-v1.0 -–weight-format int4 TinyLlama-
1.1B-Chat-v1.0

此步骤中安装的虚拟环境和依赖项不再需要,因为模型只需导出一次。请随意从磁盘中删除此虚拟环境。

第二步: 通过 Python 或 C++ API 运行LLM文本生成的推理

通过新的 Python API 设置流水线:

pipe = ov_genai.LLMPipeline(model_path, "CPU")
print(pipe.generate("The Sun is yellow because"))

通过新的 C++ API 设置流水线:

int main(int argc, char* argv[]) {
std::string model_path = argv[1];
ov::genai::LLMPipeline pipe(model_path, "CPU");//target device is CPU
std::cout << pipe.generate("The Sun is yellow because"); //input context

如上所示, 构建 LLM 生成流水线现在只需要几行代码。这种简单性是由于从 Hugging Face Optimum-Intel 导出的模型已经包含执行所需的所有信息,包括 tokenizer/detokenizer 和生成配置,确保结果与 Hugging Face 生成一致。我们提供 C++ 和 Python API 来运行 LLM,对应用程序的依赖性和添加性最少。

提供的代码在 CPU 上运行,但通过将设备名称替换为“GPU”,可以很容易地使其在 GPU 上运行: 

pipe = ov_genai.LLMPipeline(model_path, "GPU")

为了创建更具交互性的用户界面,我们添加了对流式模型输出标记的支持,以便在模型生成输出词后立即提供输出词, 也可以通过从流处理器返回 True 来随时停止令牌生成。

此外,有状态模型(https://docs.openvino.ai/2024/openvino-workflow/running-inference/stateful-models.html)在内部运行,用于推理文本生成,从而加快生成速度并减少由于数据表示转换而产生的开销。因此,在输入之间保持 KV缓存被证明可能是有益的。用针对聊天的特定方法 start_chat 和 finish_chat标记对话会话来加以实现,如以下示例所示。

Python:

import argparse
import openvino_genai




def streamer(subword):
    print(subword, end='', flush=True)
    # Return flag correspods whether generation should be stopped.
    # False means continue generation.
    return False
model_path = TinyLlama-1.1B-Chat-v1.0


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


pipe.start_chat()
while True:
    prompt = input('question:\n')
    if 'Stop!' == prompt:
        break
    pipe.generate(prompt, config, streamer)


    print('\n----------')
pipe.finish_chat()

C++:

#include "openvino/genai/llm_pipeline.hpp"


int main(int argc, char* argv[]) try {
    if (2 != argc) {
        throw std::runtime_error(std::string{"Usage: "} + argv[0] + " <MODEL_DIR>");
    }
    std::string prompt;
    std::string model_path = argv[1];


    std::string device = "CPU";  // GPU can be used as well
    ov::genai::LLMPipeline pipe(model_path, "CPU");
    
    ov::genai::GenerationConfig config;
    config.max_new_tokens = 100;
    std::function<bool(std::string)> streamer = [](std::string word) { 
        std::cout << word << std::flush;
        // Return flag correspods whether generation should be stopped.
        // false means continue generation.
        return false; 
    };


    pipe.start_chat();
    for (;;) {
        std::cout << "question:\n";
        
        std::getline(std::cin, prompt);
        if (prompt == "Stop!") 
            break;


        pipe.generate(prompt, config, streamer);
        
        std::cout << "\n----------\n";
    }
    pipe.finish_chat();
} catch (const std::exception& error) {
    std::cerr << error.what() << '\n';
    return EXIT_FAILURE;
} catch (...) {
    std::cerr << "Non-exception object thrown\n";
    return EXIT_FAILURE;
}

最后,以下是我们在 AI PC 上运行上述示例时得到的结果:

图 3:在 AI PC 上本地运行的基于 Llama 的聊天机器人的现场演示

总而言之 ,GenAI API 包括以下 API,可实现轻量级部署和代码编写:

  • generation_config – 用于启用生成过程自定义的配置,例如生成文本的最大长度、是否忽略句尾标记以及解码策略(贪心、波束搜索或多项式采样)的细节。

  • llm_pipeline - 提供用于文本生成的类和实用程序,包括用于处理输入、生成文本和使用可配置选项管理输出的流水线。

  • streamer_base - 用于创建 Streamer 的抽象基类。

  • tokenizer - 用于文本编码和解码的 Tokenizer 类。

  • visibility - 控制 生成式AI 库的可见性。

OpenVINO™

总结

最新 OpenVINO™ 2024.2 版本中的新 OpenVINO™ 生成式AI API 提供了显著的优势和功能,使其成为开发人员创建 生成式AI 和大语言模型应用程序的强大工具。凭借其简单的设置过程和最小的依赖性,该 API 降低了代码复杂性,使您能够仅使用几行代码快速构建高效的 生成式 AI 推理流水线。此外,对流式模型输出分词的支持有助于创建交互式用户界面,从而增强用户体验。

我们欢迎您试用新的 生成式AI  API,并在你的项目中探索更多功能!我们可以一起突破生成式AI通过开源可以实现的界限!更多资源和详细信息可以参考:

https://docs.openvino.ai/2024/learn-openvino/llm_inference_guide/genai-guide.html


引用:

https://huggingface.co/docs/transformers/pipeline_tutorial

[need the one related to performance]

其它资源

OpenVINO™ Documentation

OpenVINO™ Notebooks

Provide Feedback & Report Issues

通知及免责声明

英特尔技术可能需要支持的硬件、软件或服务激活。

没有任何产品或组件可以绝对安全。

您的成本和结果可能会有所不同。

© 英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能是其他公司的财产。

OpenVINO™

---------------------------------------

*OpenVINO and the OpenVINO logo are trademarks of Intel Corporation or its subsidiaries.

-----------------------------

 OpenVINO 中文社区 

微信号 : openvinodev

B站:OpenVINO中文社区

“开放、开源、共创”

致力于通过定期举办线上与线下的沙龙、动手实践及开发者交流大会等活动,促进人工智能开发者之间的交流学习。

○ 点击 “ 在看 ”,让更多人看见

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值