
轻松加载llama和其他hugging Face Llms:5个简单步骤实现离线使用
Image generated using DALL-E
你知道吗,你可以直接在本地机器上加载大多数大型语言模型,而无需依赖Ollama、AI Studio、Llama.cpp或任何此类依赖项!Hugging Face提供了一个庞大的开源LLM库,包括流行的Llama系列,你可以通过几个简单的步骤加载。在本指南中,我将带你完成整个过程,从请求访问到本地加载模型并生成模型输出——甚至在初始设置后可以离线工作,无需互联网连接。
无论你是开发者、研究人员还是AI爱好者,本指南将帮助你使用Hugging Face API加载像**Llama 3.1 8B Instruct model**这样的LLM。通过稍微调整,你可以将这些步骤应用于加载Hugging Face上其他可用的模型。
在我们开始之前,请确保你具备以下条件:
- Python环境:在本地系统上设置Python(最好是3.9或更高版本)。
- 具有足够显存的GPU:建议至少15GB的显存用于较小的模型(对于本文中使用的模型已足够)。对于较大的模型,你可能需要更强大的GPU硬件。
- Hugging Face账户/GitHub:你需要一个账户来访问模型并生成用户访问API令牌。
- 互联网连接:仅在初始下载时需要。一旦模型被缓存,你可以离线加载。
Hugging Face上许多LLM,包括Llama系列,即使是开源的,也需要填写访问请求。以下是操作步骤:
- 访问Hugging Face上模型的页面(例如,Llama 3.1 8B Instruct)。
- 点击**“Expand to Review and Access”**,并填写你的详细信息。
- 提交表单。访问通常在几分钟到几个小时内授予。
Step 2: 生成您的 Hugging Face 访问令牌
在您的访问请求处于审批阶段时,创建一个用户访问令牌以验证您的 Hugging Face 请求:
-
登录到您的 Hugging Face 账户。
-
导航到 设置 > 访问令牌。
-
点击 “新令牌” 并根据您的需求自定义其权限:
- 如果您只需要下载、推理和测试模型,请使用 读取令牌。
- 如果您正在上传模型、数据集或更改仓库,请使用 写入令牌。
- 如果您需要对模型的特定资源进行安全的生产级访问,请使用 细粒度令牌。
对于我们的用例,我们只需要对模型仓库的 读取访问,将所有其他设置保持为默认,然后点击“创建令牌”。创建后,您将收到一个新的用户访问令牌。请安全保存此令牌,因为在后续步骤中将需要进行身份验证。
Step 3: 验证模型访问并保存模型详情
在生成令牌后,重新访问 Hugging Face 上的模型页面,验证您的访问权限是否已被授予。如果成功,页面将不再显示“请求访问”按钮或待处理请求。一旦您的访问权限获得批准,您还将收到来自 Hugging Face 的电子邮件确认。
一旦访问权限被授予,从模型 URL 页面复制 模型名称 ID。它通常采用以下格式: meta-llama/Llama-3.1-8B-Instruct
。将此信息保存以供您的代码使用。
第4步:设置您的编码环境
您可以使用您选择的任何编码平台,例如 VS Code、Anaconda Jupyter Notebook、pycharm 或任何其他代码编辑器。确保您的本地系统具有 GPU启用环境,因为大型语言模型需要大量计算资源。
我们可以使用以下命令检查显存和其他GPU使用情况:
output of nvidia-smi
1. 创建虚拟环境
如果您正在本地系统上工作,请根据您的操作系统创建一个 Python 虚拟环境 并激活它,以隔离您的项目依赖。
2. 安装所需库
接下来,安装运行模型所需的最新版本库。使用以下代码安装核心依赖项:
!pip install -U bitsandbytes
!pip install -U transformers
!pip install -U accelerate
!pip install -U torch
第5步:导入库
一旦库安装完成,您可以开始编写代码:
import transformers
from transformers import AutoModelForCausalLM
from transformers import AutoTokenizer
from transformers import BitsAndBytesConfig
import torch
接下来,使用您之前生成的访问令牌对Hugging Face请求进行身份验证。将YOUR_HUGGINGFACE_ACCESS_TOKEN
替换为您在第2步中保存的令牌。此步骤确保您拥有访问模型所需的权限。用您的模型ID和令牌初始化变量:
model_id = "meta-llama/Meta-Llama-3.1-8B-Instruct"
access_token = "YOUR_HUGGINGFACE_ACCESS_TOKEN"
Step 6: 在本地系统上高效运行的配置
现在您已经设置好环境,是时候配置和加载模型了。我们将使用经过量化的模型版本,该版本针对显存有限的系统进行了优化。量化通过压缩权重来减少模型的内存使用。对于低显存的GPU,我们将使用 BitsAndBytesConfig
来启用4位量化,这对于高效性能是理想的。
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
load_in_4bit=True
超参数确保模型以4位量化格式加载。
第7步:从Hugging Face Hub加载模型
以下是将模型从Hugging Face的库加载到您的本地系统的.cache
文件夹(位于根目录)中的代码:
tokenizer = AutoTokenizer.from_pretrained(model_id, token=access_token)
model = AutoModelForCausalLM.from_pretrained(
model_id,
token=access_token,
quantization_config=bnb_config,
torch_dtype=torch.bfloat16,
trust_remote_code=True,
device_map="auto"
)
- 首次加载:您需要互联网连接才能加载模型。加载后,它将被缓存到您的
.cache
文件夹中以供将来使用。
第8步:在通过Hugging Face访问令牌加载模型后使用缓存文件夹进行离线模型加载
在第一次下载后,模型存储在您的本地缓存中(通常位于您本地系统的根文件夹:~/.cache/huggingface/hub/models--[model_id]/snapshots/[hash]
)。要离线加载它:
- 定位并复制缓存快照路径(例如,
~/.cache/huggingface/hub/models--meta-llama--Meta-Llama-3.1-8b-Instruct/snapshots/abcdef12345
)。 - 修改您的代码以引用复制的本地路径:
model_id = "~/.cache/huggingface/hub/models--meta-llama--Meta-Llama-3.1-8b-Instruct/snapshots/khjkfoweomcla4dsflknvowhg"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
torch_dtype=torch.bfloat16,
trust_remote_code=True,
device_map="auto"
)
- 无需访问令牌:由于模型已被缓存,您无需提供访问令牌。
- 消除了对互联网连接的依赖。
第9步. 从模型生成响应
一旦模型加载完成,您可以使用它生成响应。以下是一个简单的函数以供开始:
def get_response(text, prompt, model, tokenizer, temperature=0.3, max_length=10000):
messages = [
{"role": "system", "content": prompt},
{"role": "user", "content": text},
]
input_ids = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt"
).to("cuda")
terminators = [
tokenizer.eos_token_id,
tokenizer.convert_tokens_to_ids("")
]
outputs = model.generate(
input_ids,
max_new_tokens=max_length,
eos_token_id=terminators,
do_sample=True,
temperature=temperature,
top_p=0.9
)
res = tokenizer.decode(outputs[0][input_ids.shape[-1]:], skip_special_tokens=True)
return res
- 自定义超参数: 使用
max_length
、temperature
或top_p
进行实验,以微调模型的输出。
prompt = "在给定主题上写一篇40-60行的文章"
text = "人工智能:人机交互的进步"
response = get_response(text, prompt)
print(response)
- 尝试不同的量化级别: 为了获得更精确的结果,您可以通过修改量化代码块以 8位 或 16位 量化加载模型。
(额外) 从GitHub加载模型
如果模型在GitHub上可用,您可以直接从克隆的仓库加载它。以下是操作步骤:
- 从GitHub克隆模型仓库:
!git lfs install
!git clone https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct
从克隆的仓库中复制缓存快照的路径,将 model_id
变量替换为该路径,并运行第8步中的相同步骤。
model_id = "~github_path/model_name/snapshots/alktohlsnvosoikljsljldj"
总结一下,以下是主要要点:
-
离线访问:一旦模型被缓存或克隆,您可以在没有互联网连接的情况下加载和使用它(离线加载)。
-
灵活性:根据您的偏好,从 Hugging Face 或 GitHub 加载模型。
-
针对低显存进行优化:量化确保模型在资源有限的 GPU 系统上高效运行。
-
可定制:尝试不同的量化级别和超参数,以适应您的特定用例。