IPEX-LLM 在英特尔 GPU 上的应用
IPEX-LLM 是一个 PyTorch 库,用于在英特尔 CPU 和 GPU(例如配备集成显卡的本地 PC,以及 Arc、Flex 和 Max 等独立显卡)上以极低延迟运行大语言模型。
本示例介绍如何使用 LlamaIndex 与 ipex-llm 在英特尔 GPU 上进行文本生成和对话交互。
备注
您可以参考此处查看
IpexLLM的完整示例。请注意,若要在英特尔GPU上运行,请在运行示例时于命令行参数中指定-d 'xpu'或-d 'xpu:<device_id>'。
要在英特尔GPU上受益于IPEX-LLM,需要完成工具安装和环境准备的几个前提步骤。
如果您是Windows用户,请访问在Windows上使用英特尔GPU安装IPEX-LLM指南,并按照安装先决条件更新GPU驱动程序(可选)并安装Conda。
如果您是Linux用户,请访问在配备英特尔GPU的Linux系统上安装IPEX-LLM,并按照安装先决条件来安装GPU驱动程序、英特尔® oneAPI基础工具包2024.0和Conda。
安装 llama-index-llms-ipex-llm
Section titled “Install llama-index-llms-ipex-llm”在完成先决条件安装后,您应该已经创建了一个包含所有先决条件的conda环境,激活您的conda环境并按如下方式安装llama-index-llms-ipex-llm:
conda activate <your-conda-env-name>
pip install llama-index-llms-ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/此步骤还将安装 ipex-llm 及其依赖项。
备注
你也可以使用
https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/作为extra-indel-url。
为获得最佳性能,建议根据您的设备设置以下环境变量:
适用于配备英特尔酷睿Ultra集成显卡的Windows用户
Section titled “For Windows Users with Intel Core Ultra integrated GPU”在 Anaconda 提示符中:
set SYCL_CACHE_PERSISTENT=1set BIGDL_LLM_XMX_DISABLED=1适用于配备英特尔锐炫 A 系列 GPU 的 Linux 用户
Section titled “For Linux Users with Intel Arc A-Series GPU”# Configure oneAPI environment variables. Required step for APT or offline installed oneAPI.# Skip this step for PIP-installed oneAPI since the environment has already been configured in LD_LIBRARY_PATH.source /opt/intel/oneapi/setvars.sh
# Recommended Environment Variables for optimal performanceexport USE_XETLA=OFFexport SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1export SYCL_CACHE_PERSISTENT=1备注
首次在英特尔集成显卡/英特尔锐炫 A300 系列或 Pro A60 上运行每个模型时,可能需要几分钟时间进行编译。
IpexLLM
Section titled “IpexLLM”在初始化 IpexLLM 时设置 device_map="xpu" 可将LLM模型部署在英特尔GPU上,并受益于IPEX-LLM优化。
备注
如果您有多个英特尔GPU可用,可以设置
device="xpu:<device_id>",其中device_id从0开始计数。默认情况下device="xpu"等于device="xpu:0"。
在加载Zephyr模型之前,您需要定义completion_to_prompt和messages_to_prompt用于格式化提示。请按照模型卡片中的说明遵循zephyr-7b-alpha的正确提示格式。这对于准备模型能准确解析的输入至关重要。使用IpexLLM通过IpexLLM.from_model_id本地加载Zephyr模型。这将直接加载Huggingface格式的模型,并自动转换为低比特格式进行推理。
# Transform a string into input zephyr-specific inputdef completion_to_prompt(completion): return f"<|system|>\n</s>\n<|user|>\n{completion}</s>\n<|assistant|>\n"
# Transform a list of chat messages into zephyr-specific inputdef messages_to_prompt(messages): prompt = "" for message in messages: if message.role == "system": prompt += f"<|system|>\n{message.content}</s>\n" elif message.role == "user": prompt += f"<|user|>\n{message.content}</s>\n" elif message.role == "assistant": prompt += f"<|assistant|>\n{message.content}</s>\n"
# ensure we start with a system prompt, insert blank if needed if not prompt.startswith("<|system|>\n"): prompt = "<|system|>\n</s>\n" + prompt
# add final assistant prompt prompt = prompt + "<|assistant|>\n"
return prompt
from llama_index.llms.ipex_llm import IpexLLM
llm = IpexLLM.from_model_id( model_name="HuggingFaceH4/zephyr-7b-alpha", tokenizer_name="HuggingFaceH4/zephyr-7b-alpha", context_window=512, max_new_tokens=128, generate_kwargs={"do_sample": False}, completion_to_prompt=completion_to_prompt, messages_to_prompt=messages_to_prompt, device_map="xpu",)请注意,在此示例中我们将使用 HuggingFaceH4/zephyr-7b-alpha 模型进行演示。这需要更新
transformers和tokenizers软件包。Terminal window pip install -U transformers==4.37.0 tokenizers==0.15.2
然后你可以正常执行补全任务或聊天任务:
print("----------------- Complete ------------------")completion_response = llm.complete("Once upon a time, ")print(completion_response.text)print("----------------- Stream Complete ------------------")response_iter = llm.stream_complete("Once upon a time, there's a little girl")for response in response_iter: print(response.delta, end="", flush=True)print("----------------- Chat ------------------")from llama_index.core.llms import ChatMessage
message = ChatMessage(role="user", content="Explain Big Bang Theory briefly")resp = llm.chat([message])print(resp)print("----------------- Stream Chat ------------------")message = ChatMessage(role="user", content="What is AI?")resp = llm.stream_chat([message], max_tokens=256)for r in resp: print(r.delta, end="")或者,您可以将低比特模型保存到磁盘一次,并使用from_model_id_low_bit而不是from_model_id来重新加载以供后续使用——甚至可以在不同的机器之间使用。这种方式非常节省空间,因为低比特模型所需的磁盘空间远小于原始模型。而且from_model_id_low_bit在速度和内存使用方面也比from_model_id更高效,因为它跳过了模型转换步骤。
要保存低比特模型,请按如下方式使用 save_low_bit。然后从保存的低比特模型路径加载模型。同时使用 device_map 将模型加载至xpu。
请注意,低比特模型的保存路径仅包含模型本身,但不包含分词器。如果您希望将所有内容集中存放,您需要手动从原始模型目录下载或复制分词器文件到低比特模型保存的位置。
尝试使用已加载的低比特模型进行流式补全。
saved_lowbit_model_path = ( "./zephyr-7b-alpha-low-bit" # path to save low-bit model)
llm._model.save_low_bit(saved_lowbit_model_path)del llm
llm_lowbit = IpexLLM.from_model_id_low_bit( model_name=saved_lowbit_model_path, tokenizer_name="HuggingFaceH4/zephyr-7b-alpha", # tokenizer_name=saved_lowbit_model_path, # copy the tokenizers to saved path if you want to use it this way context_window=512, max_new_tokens=64, completion_to_prompt=completion_to_prompt, generate_kwargs={"do_sample": False}, device_map="xpu",)
response_iter = llm_lowbit.stream_complete("What is Large Language Model?")for response in response_iter: print(response.delta, end="", flush=True)