如何使用 OpenVINO™ 生成式AI API (GenAI API) 以更少的代码构建更快的生成式AI应用
新的 OpenVINO™ 生成式AI API (GenAI API)为开发人员提供了更简单、更清晰的代码来维护。OpenVINO™也从计算机视觉和AI加速和优化库发展成为面向开发人员的生成式AI推动者。
作者:Raymond Lo, Dmitriy Pastushenkov, 武卓 Intel AI软件布道师
随着 ChatGPT 等聊天机器人的风暴席卷全球,生成式预训练Transformers (GPT) 在开发者中正在成为家喻户晓的新名字。生成式AI(GenAI)的发展,尤其是大语言模型和聊天机器人的进步很快、变化不断,很难预测接下来会有什么突破,开发者应该关注什么。我们知道生成式AI将继续存在,开发人员希望看到在本地开发、维护和部署 AI 应用程序的更简洁明了的方法。
尽管 生成式AI 令人兴奋,但对这些模型运行推理仍面临重大挑战,尤其是在边缘设备和 AI PC 上。
英特尔硬件上当前最先进的生成式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 应用程序的开发之旅。
检查OpenVINO GenAI库的安装情况,我们可以看到 ,不仅代码行数大大减少了,而且安装的依赖项只有寥寥几个,从而形成了一个简洁紧凑的环境,运行生成式AI推理仅需216Mb!
图 2:使用 OpenVINO GenAI API 部署解决方案不仅可以减少磁盘使用量,还可以简化构建生成式 AI 应用的依赖性要求。这通常是开发人员开始维护 生成式AI 应用程序时面临的最大挑战之一。
表 1:OpenVINO GenAI API 与 Optimum-Intel 软件包的比较
与 Optimum-Intel 相比,GenAI API 仅集成了最常用的采样方法,包括贪心和波束搜索。 同时,开发者还可以通过多项式解码 来自定义采样参数,例如 Top-k、Temperature等。
考虑到多用户的场景,GenAI API 仅原生实现了 Continue***atching、Paged-attention。在文本生成过程中,这些技术可以帮助提高性能并优化在进行多批次推理时的内存消耗。
由于 Hugging Face 的分词器只能与 Python 配合使用,为了与 OpenVINO C++ 运行时的输入/输出张量格式保持一致,GenAI API 将分别通过推理 2 个 OpenVINO 模型来对输入文本分词并对输出解分词。在这种方法之前,开发人员可以使用 Optimum-Intel CLI 将 Hugging Face 的分词器转换为 OpenVINO IR 模型。
到目前为止,我们已经强调了使用新的 OpenVINO GenAI API 的一些关键优势。在下一节中,我们将更深入地了解如何逐步运行演示。
使用 OpenVINO GenAI API 的轻量级生成式AI
安****>设置新的 OpenVINO™ GenAI API 以在生成式 AI 和 LLM上运行推理,设计简单明了。安装过程可以通过 PyPI 或下载存档来执行,让您可以灵活地选择最适合您需求的方法。例如,您可以使用以下内容进行 PyPI 安装 ,该安装包含在我们最新的 OpenVINO 2024.2 版本中:
python -m pip install openvino-genai
关于安装的更多信息可以在这里找到。
运行推理
安装 OpenVINO 后,您可以开始在 GenAI 和 LLM 模型上运行推理。通过利用此 API,您可以加载模型,向其传递上下文,并仅使用几行代码接收响应。在内部,
OpenVINO处理输入文本的标记化,在您选择的设备上执行生成循环,并提供最终响应。让我们根据 openvino.genai 存储库中提供的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 来随时停止令牌生成。
此外,有状态模型在内部运行,用于推理文本生成,从而加快生成速度并减少由于数据表示转换而产生的开销。因此,在输入之间保持 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(arg***odel_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] + " ");
}
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 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™ 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™ Notebook***r/>Provide Feedback & Report Issue***r/>
通知及免责声明
英特尔技术可能需要支持的硬件、软件或服务激活。
没有任何产品或组件可以绝对安全。
您的成本和结果可能会有所不同。
© 英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能是其他公司的财产。