随着生成式人工智能 (Generative AI,GenAI) 革命的全面推进,使用 Llama 2 等开源 transformer 模型生成文本已成为新风尚。人工智能爱好者及开发人员正在寻求利用此类模型的生成能力来赋能不同的场景及应用。本文展示了如何基于 Optimum Habana 以及我们实现的流水线类轻松使用 Llama 2 系列模型 (7b、13b 及 70b) 生成文本 - 仅需几行代码,即可运行!

我们设计并实现了一个旨在为用户提供极大的灵活性和易用性流水线类。它提供了高层级的抽象以支持包含预处理和后处理在内的端到端文本生成。同时,用户也可以通过多种方法使用该流水线类 - 你可以在 Optimum Habana 代码库中直接运行 run_pipeline.py 脚本,也可以在你自己的 python 脚本中调用该流水线类,还可以用该流水线类来初始化 LangChain。

准备工作

由于 Llama 2 模型实行的是许可式访问,因此如果你尚未申请访问权限,需要首先申请访问权限。方法如下: 首先,访问 Meta 网站 并接受相应条款。一旦 Meta 授予你访问权限 (可能需要一两天),你需要使用你当时使用的电子邮箱地址申请 Hugging Face Llama 2 模型库 的访问权限。

获取访问权限后,可通过运行以下命令登录你的 Hugging Face 帐户 (此时会需要一个访问令牌,你可从 你的用户个人资料页面 上获取):

huggingface-cli login

你还需要安装最新版本的 Optimum Habana 并拉取其代码库以获取后续要使用的脚本。命令如下:

pip install optimum-habana==1.10.4
git clone -b v1.10-release https://github.com/huggingface/optimum-habana.git

如果想运行分布式推理,还需要根据你的 SynapseAI 版本安装对应的 DeepSpeed。在本例中,我使用的是 SynapseAI 1.14.0。

pip install git+https://github.com/HabanaAI/DeepSpeed.git@1.14.0

至此,准备完毕!

方法一: 通过命令直接使用流水线脚本

首先,使用如下命令进入 optimum-habana 的相应目录,然后按照 README 中的说明更新 PYTHONPATH

cd optimum-habana/examples/text-generation
pip install -r requirements.txt
cd text-generation-pipeline

如果你想用自己的提示生成文本序列,下面给出了一个示例:

python run_pipeline.py \
--model_name_or_path meta-llama/Llama-2-7b-hf \
--use_hpu_graphs \
--use_kv_cache \
--max_new_tokens 100 \
--do_sample \
--prompt "Here is my prompt"

你还可以传入多个提示作为输入,并更改生成的温度或 top_p 值,如下所示:

python run_pipeline.py \
--model_name_or_path meta-llama/Llama-2-13b-hf \
--use_hpu_graphs \
--use_kv_cache \
--max_new_tokens 100 \
--do_sample \
--temperature 0.5 \
--top_p 0.95 \
--prompt "Hello world" "How are you?"

如果想用 Llama-2-70b 等大尺寸模型生成文本,下面给出了一个用 DeepSpeed 启动流水线的示例命令:

python ../../gaudi_spawn.py \
--use_deepspeed \
--world_size 8 run_pipeline.py \
--model_name_or_path meta-llama/Llama-2-70b-hf \
--max_new_tokens 100 \
--bf16 \
--use_hpu_graphs \
--use_kv_cache \
--do_sample \
--temperature 0.5 \
--top_p 0.95 \
--prompt "Hello world" "How are you?" "Here is my prompt" "Once upon a time"

方法二: 在自己的 Python 脚本中调用流水线类

你还可以在自己的 Python 脚本中调用我们实现的流水线类,如下例所示。你需要在 optimum-habana/examples/text-generation/text- generation-pipeline 目录下运行该示例脚本 [译者注: 原因是 GaudiTextGenerationPipeline 这个类的定义在该目录的 pipeline.py 中]。

import argparse
import logging from pipeline import GaudiTextGenerationPipeline
from run_generation import setup_parser # Define a logger
logging.basicConfig(
format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
datefmt="%m/%d/%Y %H:%M:%S",
level=logging.INFO,
)
logger = logging.getLogger(__name__) # Set up an argument parser
parser = argparse.ArgumentParser()
args = setup_parser(parser) # Define some pipeline arguments. Note that --model_name_or_path is a required argument for this script
args.num_return_sequences = 1
args.model_name_or_path = "meta-llama/Llama-2-7b-hf"
args.max_new_tokens = 100
args.use_hpu_graphs = True
args.use_kv_cache = True
args.do_sample = True # Initialize the pipeline
pipe = GaudiTextGenerationPipeline(args, logger) # You can provide input prompts as strings
prompts = ["He is working on", "Once upon a time", "Far far away"] # Generate text with pipeline
for prompt in prompts:
print(f"Prompt: {prompt}")
output = pipe(prompt)
print(f"Generated Text: {repr(output)}")

你需要用 python <name_of_script>.py --model_name_or_path a_model_name 命令来运行上述脚本,其中 --model_name_or_path 是必需的参数。当然,你也可以在代码中直接更改模型名称 (如上述 Python 代码片段所示)。

上述代码段表明我们实现的流水线类 GaudiTextGenerationPipeline 会对输入字符串执行生成文本所需的全部操作,包括数据预处理及后处理在内。

方法二: 在 LangChain 中使用流水线类

如果在构造时传入 use_with_langchain 参数的话,我们的文本生成流水线还可以作为 LangChain 的兼容组件使用。首先,按照如下方式安装 LangChain:

pip install langchain==0.0.191

下面给出了一个如何在 LangChain 中使用我们的流水线类的代码示例。

import argparse
import logging from langchain.llms import HuggingFacePipeline
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain from pipeline import GaudiTextGenerationPipeline
from run_generation import setup_parser # Define a logger
logging.basicConfig(
format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",
datefmt="%m/%d/%Y %H:%M:%S",
level=logging.INFO,
)
logger = logging.getLogger(__name__) # Set up an argument parser
parser = argparse.ArgumentParser()
args = setup_parser(parser) # Define some pipeline arguments. Note that --model_name_or_path is a required argument for this script
args.num_return_sequences = 1
args.model_name_or_path = "meta-llama/Llama-2-13b-chat-hf"
args.max_input_tokens = 2048
args.max_new_tokens = 1000
args.use_hpu_graphs = True
args.use_kv_cache = True
args.do_sample = True
args.temperature = 0.2
args.top_p = 0.95 # Initialize the pipeline
pipe = GaudiTextGenerationPipeline(args, logger, use_with_langchain=True) # Create LangChain object
llm = HuggingFacePipeline(pipeline=pipe) template = """Use the following pieces of context to answer the question at the end. If you don't know the answer,\
just say that you don't know, don't try to make up an answer. Context: Large Language Models (LLMs) are the latest models used in NLP.
Their superior performance over smaller models has made them incredibly
useful for developers building NLP enabled applications. These models
can be accessed via Hugging Face's `transformers` library, via OpenAI
using the `openai` library, and via Cohere using the `cohere` library. Question: {question}
Answer: """ prompt = PromptTemplate(input_variables=["question"], template=template)
llm_chain = LLMChain(prompt=prompt, llm=llm) # Use LangChain object
question = "Which libraries and model providers offer LLMs?"
response = llm_chain(prompt.format(question=question))
print(f"Question 1: {question}")
print(f"Response 1: {response['text']}") question = "What is the provided context about?"
response = llm_chain(prompt.format(question=question))
print(f"\nQuestion 2: {question}")
print(f"Response 2: {response['text']}")

该流水线类当前仅在 LangChain 0.0.191 版上验证通过,其他版本可能不兼容。

总结

我们在英特尔 Gaudi 2 AI 加速器上实现了一个自定义的文本生成流水线,其可接受单个或多个提示作为输入。该流水线类灵活支持各种模型尺寸及各种影响文本生成质量参数。此外,不管是直接使用还是将它插入你自己的脚本都非常简单,并且其还与 LangChain 兼容。

使用预训练模型需遵守第三方许可,如 “Llama 2 社区许可协议”(LLAMAV2)。有关 LLAMA2 模型的预期用途有哪些、哪些行为会被视为滥用或超范围使用、预期使用者是谁以及其他条款,请仔细阅读此 链接 中的说明。用户需自主承担遵守任何第三方许可的责任和义务,Habana Labs 不承担任何与用户使用或遵守第三方许可相关的责任。为了能够运行像 Llama-2-70b-hf 这样的受限模型,你需要:

  • 有一个 Hugging Face 帐户
  • 同意 HF Hub 上模型卡中的模型使用条款
  • 设好访问令牌
  • 使用 HF CLI 登录你的帐户,即在启动脚本之前运行 huggingface-cli login

英文原文: https://hf.co/blog/textgen-pipe-gaudi

原文作者: Siddhant Jagtap

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

基于英特尔® Gaudi® 2 AI 加速器的文本生成流水线的更多相关文章

  1. 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训

    原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...

  2. 基于英特尔® 至强 E5 系列处理器的单节点 Caffe 评分和训练

    原文链接 在互联网搜索引擎和医疗成像等诸多领域,深度神经网络 (DNN) 应用的重要性正在不断提升. Pradeep Dubey 在其博文中概述了英特尔® 架构机器学习愿景. 英特尔正在实现 Prad ...

  3. 面向基于英特尔&#174; 架构的 Android* 的 CoCos2D

    Cocos2D 是一款游戏引擎,可与从电脑到手机等多种设备配合使用. 该引擎支持丰富的特性,可帮助创建出色的 2D 游戏.它甚至包含具备全面功能的物理引擎. CoCos2D 的核心元素是基本动画元素( ...

  4. 现代英特尔® 架构上的 TensorFlow* 优化——正如去年参加Intel AI会议一样,Intel自己提供了对接自己AI CPU优化版本的Tensorflow,下载链接见后,同时可以基于谷歌官方的tf版本直接编译生成安装包

    现代英特尔® 架构上的 TensorFlow* 优化 转自:https://software.intel.com/zh-cn/articles/tensorflow-optimizations-on- ...

  5. 英特尔® 至强® 平台集成 AI 加速构建数据中心智慧网络

    英特尔 至强 平台集成 AI 加速构建数据中心智慧网络 SNA 通过 AI 方法来实时感知网络状态,基于网络数据分析来实现自动化部署和风险预测,从而让企业网络能更智能.更高效地为最终用户业务提供支撑. ...

  6. 英特尔的Gen11集成显卡性能再次发力

    这是英特尔首个达到 1 TeraFLOP 算力的图形模块,与第九代酷睿移动版的性能相比,15W Ice Lake-U 在游戏测试场景中,平均帧速率的性能提升了 40%. 与同等的 AMD 产品相比,英 ...

  7. 什么是英特尔® Edison 模块?

    英特尔® Edison 模块 是一种 SD 卡大小的微型计算芯片,专为构建物联网 (IoT) 和可穿戴计算产品而设计. Edison 模块内含一个高速的双核处理单元.集成 Wi-Fi*.蓝牙* 低能耗 ...

  8. Intel 英特尔

    英特尔 英特尔 基本资料   公司名称:英特尔(集成电路公司)    外文名称:Intel Corporation(Integrated Electronics Corporation)    总部地 ...

  9. 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分

    原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...

  10. 借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流

    下载源代码请访问原文地址:借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流 简介 该可下载代码示例简要介绍了如何使用英特尔® 实感™ SDK 和 MATLAB 的图像采集工具 ...

随机推荐

  1. 宝塔 websocket连接wss配置

    https要使用wss连接,wss://xxxxx.com/wss 就转发到了 服务器内的127.0.0.1:2346服务. 具体转发可以放在 文件配置或者 伪静态里面 建议放在伪静态里面容易管理 n ...

  2. ListView 判断有没有选中的行方法

    ListView1.SelCount 返回选中行的行数 应该是 没有测试 但是测试了 如果没有选中行 返回0 如果选中一行了 返回1

  3. NC22596 Rinne Loves Data Structure

    题目链接 题目 题目描述 Rinne 喜欢 OI.在 9102 年的 PION 中,她在初赛遇到了这样一道题目: 阅读下列代码,然后回答问题. 补充:建树过程中会更新lc和rc,这实质上是一个二叉查找 ...

  4. look命令

    look命令 look命令用于查询单词,仅需指定欲查询的字首字符串,它会显示所有开头字符串符合该条件的单词. 语法 look [-bdf] [-t char] string [file ...] 参数 ...

  5. Oracle 表压缩(Table Compression)技术介绍

    Oracle 表压缩(Table Compression)介绍 1.官方文档说法: As your database grows in size, consider using table compr ...

  6. Java并发编程实例--3.打断一个线程

    一般来讲一个java程序如果运行着多个线程,那么只有在这些线程都运行完毕后才会终止. 但有时候,我们需要去结束某个线程或者取消某个任务.此时就用到了Java线程的打断机制,即interruption. ...

  7. 【CVE-2024-21626】容器逃逸漏洞修复

    哈喽大家好,我是咸鱼. 好久不见,最近有一个很火的 CVE--runc 容器逃逸漏洞.年前的时候我们已经在测试环境进行了相关操作打算年后线上进行修复. 因为今天咸鱼才开工,所以文章也就拖到了现在 漏洞 ...

  8. 【.Net Core】.Net Core 源码分析与深入理解 - 配置中心 Startup.cs (二)

    源码版本: .Net Core 3.1.14 上篇文章: [.Net Core].Net Core 源码分析与深入理解 - 入口 Program.cs (一) 注意:本篇文章主要研究的是 Startu ...

  9. 【复盘#01】myh笔试

    存疑 1.http响应体中版本和缓存是哪个字段(Etga) http和https的区别 2.mysql同一个表中有多个相同字段但搜索的时候只搜得出某一个,要怎么修改(inner ..) mysql如何 ...

  10. 【Azure 应用服务】在App Service中新建WebJob时候遇见错误,不能成功创建新的工作任务

    问题描述 在Azure App Service界面上,添加新的Web Job(工作任务)时,一直添加失败.无详细错误提示,在App Service的Activity Logs(活动日志)中,根本没有添 ...