随着 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通过开源可以实现的界限!
全部0条评论
快来发表一下你的评论吧 !