使用OpenVINO GenAI API的轻量级生成式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 上启用优化,这些可以显著减少延迟并提高运行效率。此外,我们可以利用量化和权重压缩等模型优化技术来最小化内存占用(减少 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_venvScriptactivate

 

并安装依赖项,这是模型导出过程所必需的。这些要求可在  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::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:
')
    if 'Stop!' == prompt:
        break
    pipe.generate(prompt, config, streamer)


    print('
----------')
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] + " ");
    }
    std::string prompt;
    std::string model_path = argv[1];


    std::string device = "CPU";  // GPU can be used as well
    ov::LLMPipeline pipe(model_path, "CPU");
    
    ov::GenerationConfig config;
    config.max_new_tokens = 100;
    std::function 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:
";
        
        std::getline(std::cin, prompt);
        if (prompt == "Stop!") 
            break;


        pipe.generate(prompt, config, streamer);
        
        std::cout << "
----------
";
    }
    pipe.finish_chat();
} catch (const std::exception& error) {
    std::cerr << error.what() << '
';
    return EXIT_FAILURE;
} catch (...) {
    std::cerr << "Non-exception object thrown
";
    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通过开源可以实现的界限!

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分