基於英特爾® Gaudi® 2 AI 加速器的文字生成流水線

HuggingFace發表於2024-03-13

隨著生成式人工智慧 (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 模型在各模態資料上的應用及大規模模型的訓練推理。

相關文章