在英特尔 GPU 上使用 IPEX-LLM 进行本地嵌入¶
IPEX-LLM 是一个 PyTorch 库,可在英特尔 CPU 和 GPU(例如配备集成显卡的本地 PC,或 Arc、Flex 和 Max 等独立显卡)上以极低延迟运行大语言模型。
本示例演示如何利用 LlamaIndex 在英特尔 GPU 上通过 ipex-llm
优化执行嵌入任务。这在 RAG、文档问答等应用中非常有用。
注意
完整
IpexLLMEmbedding
示例可参考此处。请注意,若要在英特尔 GPU 上运行,请在执行示例时通过命令行参数指定-d 'xpu'
或-d 'xpu:<device_id>'
。
安装前提条件¶
要在英特尔 GPU 上使用 IPEX-LLM,需完成工具安装和环境准备的几个必要步骤。
Windows 用户请访问在 Windows 上为英特尔 GPU 安装 IPEX-LLM 指南,并按照安装前提条件更新 GPU 驱动(可选)和安装 Conda。
Linux 用户请访问在 Linux 上为英特尔 GPU 安装 IPEX-LLM,并按照安装前提条件安装 GPU 驱动、Intel® oneAPI Base Toolkit 2024.0 和 Conda。
安装 llama-index-embeddings-ipex-llm
¶
完成前提条件安装后,您应已创建包含所有必备组件的 conda 环境,激活该环境并按以下方式安装 llama-index-embeddings-ipex-llm
:
conda activate <your-conda-env-name>
pip install llama-index-embeddings-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 用户¶
在 Anaconda Prompt 中执行:
set SYCL_CACHE_PERSISTENT=1
set BIGDL_LLM_XMX_DISABLED=1
使用英特尔锐炫 A 系列显卡的 Linux 用户¶
# 配置 oneAPI 环境变量。通过 APT 或离线安装 oneAPI 时必须执行此步骤
# 通过 PIP 安装 oneAPI 可跳过此步骤,因环境变量已配置在 LD_LIBRARY_PATH 中
source /opt/intel/oneapi/setvars.sh
# 推荐性能优化环境变量
export USE_XETLA=OFF
export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
export SYCL_CACHE_PERSISTENT=1
注意
首次在英特尔集成显卡/锐炫 A300 系列或 Pro A60 上运行模型时,可能需要数分钟进行编译。
IpexLLMEmbedding
¶
初始化 IpexLLMEmbedding
时设置 device="xpu"
可将嵌入模型部署至英特尔 GPU 并享受 IPEX-LLM 优化:
from llama_index.embeddings.ipex_llm import IpexLLMEmbedding
embedding_model = IpexLLMEmbedding(
model_name="BAAI/bge-large-en-v1.5", device="xpu"
)
请注意
IpexLLMEmbedding
目前仅对 Hugging Face Bge 系列模型提供优化支持。若有多块英特尔 GPU 可用,可设置
device="xpu:<device_id>"
,其中device_id
从 0 开始计数。默认情况下device="xpu"
等同于device="xpu:0"
。
随后可正常执行嵌入任务:
sentence = "IPEX-LLM is a PyTorch library for running LLM on Intel CPU and GPU (e.g., local PC with iGPU, discrete GPU such as Arc, Flex and Max) with very low latency."
query = "What is IPEX-LLM?"
text_embedding = embedding_model.get_text_embedding(sentence)
print(f"embedding[:10]: {text_embedding[:10]}")
text_embeddings = embedding_model.get_text_embedding_batch([sentence, query])
print(f"text_embeddings[0][:10]: {text_embeddings[0][:10]}")
print(f"text_embeddings[1][:10]: {text_embeddings[1][:10]}")
query_embedding = embedding_model.get_query_embedding(query)
print(f"query_embedding[:10]: {query_embedding[:10]}")