hugging face 抱抱脸

_

什么是hugging face?🤔

如何使用?🔧

hugging face模型下载

首先安装相关库

pip install -U huggingface_hub

然后编写一个python文件,如下

# 设置环境变量

import os

os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

from huggingface_hub import hf_hub_download

# 举例
repo_id = "Duffy/Llama-820m"

file_list = [
    ".gitattributes",
    "README.md",
    "config.json",
    "generation_config.json",
    "xxx.py",
    "pytorch_model.bin",
    "special_tokens_map.json",
    "tokenizer.json",
    "tokenizer_config.json",
]

local_dir = "./your_model_file_dir"

for file_name in file_list:
    hf_hub_download(repo_id=repo_id, filename=file_name, local_dir=local_dir)

Hugging Face Hub

Hugging Face Hub 是一个集成模型、数据集、和其他机器学习资源的平台,它使得分享和使用模型变得非常方便。Hub 提供了易于使用的 API、GitHub 风格的模型管理,并且是目前许多 NLP 和计算机视觉任务中最流行的模型资源。

可以通过访问 Hugging Face Hub 页面浏览大量的预训练模型。这些模型可以按任务类别、框架(例如 TensorFlow、PyTorch)和领域(如 NLP、计算机视觉)进行筛选。

每个模型都有详细的文档README file,描述模型的用途、性能和限制。

Hugging Face 提供了 transformers 库,通过简单的几行代码,你可以轻松加载和使用预训练模型。

使用 AutoModelForXxx 和 AutoTokenizer 来加载适合你任务的模型和对应的 tokenizer。

如果我希望加载一个文本分类模型(如 BERT):

from transformers import AutoModelForSequenceClassification, AutoTokenizer

model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

这两行代码会自动从 Hugging Face Hub 下载 bert-base-uncased 模型及其对应的 tokenizer,并准备好进行后续推理或微调。 如果存在网络问题,我们可以下载模型到本地,然后把模型id换为模型地址。

上传自己的模型

如果你训练了自己的模型,并希望将其上传到 Hugging Face Hub,与他人共享或用于在线推理,可以使用 Hugging Face 的 CLI 工具。

#  先安装 Hugging Face CLI 工具:
pip install huggingface_hub
# 然后登录 Hugging Face:
huggingface-cli login
# 需要提供 Hugging Face 账户的 token,登录后即可上传模型。
# 上传模型的方法:
huggingface-cli upload ./path_to_model

这样,你可以把自己训练的模型上传到 Hugging Face Hub,其他用户也能下载并使用。

创建和管理模型库

• Hugging Face Hub 不仅仅是一个模型仓库,它也支持模型版本管理,你可以对上传的模型进行版本管理和更新。

• 每次上传新版本的模型时,Hugging Face 会为你自动保存版本,允许你方便地回退到之前的版本。

Transformers 库

transformers 是 Hugging Face 提供的一个重要库,它涵盖了很多自然语言处理(NLP)模型的实现,并提供了简洁的 API 来加载、微调和使用这些模型。这个库支持多种任务,如文本生成、分类、情感分析、翻译、命名实体识别等。

加载预训练模型

transformers 库的核心特性之一是通过 AutoModel 和 AutoTokenizer 类,轻松加载预训练模型和对应的 tokenizer。AutoModel 是一个通用类,它会根据你指定的模型名称自动加载合适的模型。

使用方法

• 假设你想加载一个用于文本分类的 BERT 模型:

from transformers import AutoModelForSequenceClassification, AutoTokenizer

model_name = "bert-base-uncased"  # 这里是模型的名称

model = AutoModelForSequenceClassification.from_pretrained(model_name)

tokenizer = AutoTokenizer.from_pretrained(model_name)

• AutoModelForSequenceClassification 会根据模型名称下载适合文本分类任务的模型结构。

• AutoTokenizer 会加载适配模型的 tokenizer(分词器),并准备好对输入文本进行编码。

2.2 进行推理(Inference)

推理过程是指将一个输入传入模型,得到模型的输出。transformers 库提供了非常简便的接口来进行推理。

步骤

• 假设你想使用 BERT 进行情感分析:

from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch

model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 编码输入文本
inputs = tokenizer("I love Hugging Face!", return_tensors="pt")

# 推理
with torch.no_grad():
    logits = model(**inputs).logits

# 获取预测结果
predicted_class = logits.argmax().item()

print(f"Predicted class: {predicted_class}")

• 在这段代码中,我们首先通过 tokenizer 编码了输入文本 I love Hugging Face!,然后将其传递给模型进行推理,最后从模型输出中获取预测的类标签。

2.3 Fine-tuning(微调)

微调是指将预训练模型根据自己的任务和数据进行进一步训练。在 transformers 中,微调过程可以通过 Trainer API 简化。Trainer 提供了很多功能,包括训练过程管理、评估、日志记录等。

步骤

• 假设你有一个分类任务数据集,你可以使用 Trainer 来微调 BERT 模型:

from transformers import Trainer, TrainingArguments

# 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",          # 模型输出文件夹
    evaluation_strategy="epoch",      # 每个 epoch 后评估
    per_device_train_batch_size=8,   # 每个设备的训练批次大小
    per_device_eval_batch_size=8,    # 每个设备的评估批次大小
    logging_dir="./logs",           # 日志文件夹
)

trainer = Trainer(
    model=model,                     # 你的模型
    args=training_args,              # 训练参数
    train_dataset=train_dataset,     # 训练数据集
    eval_dataset=eval_dataset,       # 验证数据集
)

trainer.train()

• 在这个代码中,Trainer 会管理整个训练过程,包括从数据加载到模型训练,并在每个 epoch 后进行评估。你只需要指定训练参数和数据集。

3. Datasets 库

Hugging Face 的 datasets 库提供了一个简洁的接口来访问和处理各种公共数据集,帮助开发者快速加载和使用数据集进行训练和评估。这个库包括了许多常用的 NLP 数据集,比如 GLUE、SQuAD、IMDB 等,也支持用户上传自己的数据集。

3.1 加载公共数据集

你可以通过 load_dataset 函数直接加载 Hugging Face Hub 上的各种数据集。这个库支持很多格式的数据集,比如 CSV、JSON、文本文件等,也支持根据任务进行预处理。

使用方法

• 假设你要加载 IMDB 数据集:

from datasets import load_dataset

dataset = load_dataset("imdb")
print(dataset)

这段代码会自动从 Hugging Face Hub 下载并加载 IMDB 数据集。load_dataset 会返回一个字典对象,包含了训练集、验证集等不同的分区。

• 你可以查看数据集的内容:

print(dataset['train'][0])  # 查看训练集的第一个样本

3.2 加载自定义数据集

如果你有自己的数据集,比如 CSV 文件,可以通过 Dataset 类将其转换为 Hugging Face 格式,以便于处理和使用。

使用方法

• 假设你有一个包含文本和标签的 CSV 文件,你可以将其加载为 Hugging Face 数据集:

from datasets import Dataset
import pandas as pd

# 加载 CSV 文件为 pandas DataFrame
df = pd.read_csv("your_dataset.csv")

# 将 DataFrame 转换为 Hugging Face Dataset 格式
dataset = Dataset.from_pandas(df)
print(dataset)

• 如果你的数据集是存储在 JSON 文件中,也可以通过类似的方法加载:

dataset = load_dataset("json", data_files="your_dataset.json")

3.3 数据集操作

Hugging Face 的 datasets 库支持对数据集进行各种操作,如筛选、拆分、批处理等。

数据集拆分

如果你希望将数据集划分为训练集、验证集和测试集,可以使用 train_test_split 方法:

dataset = load_dataset("imdb")
train_test = dataset["train"].train_test_split(test_size=0.2)
print(train_test)

过滤数据

如果你想基于特定条件筛选数据集中的样本:

dataset_filtered = dataset.filter(lambda example: example['label'] == 1)
print(dataset_filtered)

映射函数

你可以对数据集进行预处理操作,比如文本清洗或分词:

def preprocess_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

dataset = dataset.map(preprocess_function, batched=True)

3.4 保存和共享数据集

你可以将处理好的数据集保存为本地文件,并上传到 Hugging Face Hub 进行分享。

保存为 CSV 文件

dataset.to_csv("processed_dataset.csv")

上传到 Hugging Face Hub

• 在 Hugging Face Hub 上创建一个新的数据集页面并上传自己的数据集。

4. Tokenizers 库

Hugging Face 的 tokenizers 库是一个高效的工具,用于处理文本的分词和编码。它支持各种分词方法,如 BPE(Byte Pair Encoding)、WordPiece、SentencePiece 等,可以帮助你高效地处理文本数据。

4.1 加载和使用 Tokenizer

Hugging Face 提供了多种预训练的 tokenizer,你可以使用 AutoTokenizer 类来加载适配不同模型的分词器。

使用方法

• 假设你想使用 BERT 模型的 tokenizer:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

encoding = tokenizer("Hello, Hugging Face!")
print(encoding)

这会将输入文本 "Hello, Hugging Face!" 转换为模型能够理解的 token 格式,并输出一个包含 token IDs 的字典。

4.2 自定义 Tokenizer

如果你想自定义一个 tokenizer,可以使用 tokenizers 库提供的低级 API。你可以选择不同的分词算法(如 BPE、WordPiece 等),并根据自己的语料库训练一个新的 tokenizer。

创建自定义 BPE Tokenizer

from tokenizers import Tokenizer, models, pre_tokenizers, trainers

# 创建一个空的 BPE 模型
tokenizer = Tokenizer(models.BPE())

# 设置分词器的预处理步骤
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()

# 创建一个训练器,设置特殊 token
trainer = trainers.BpeTrainer(special_tokens=["[UNK]", "[CLS]", "[SEP]"])

# 训练 tokenizer
tokenizer.train_from_file("your_data.txt", trainer=trainer)

# 保存模型
tokenizer.save("custom_tokenizer.json")

• 这段代码会使用你的数据(your_data.txt)训练一个 BPE 分词器,并保存为 custom_tokenizer.json 文件。

4.3 Tokenizer 的高级功能

分词

tokens = tokenizer.encode("Hello, Hugging Face!")
print(tokens.tokens)  # 输出 token 列表

解码

decoded_text = tokenizer.decode(tokens.ids)
print(decoded_text)  # 输出原始文本

编码和解码批量数据

你可以对多个文本样本进行批量编码和解码:

texts = ["Hello, Hugging Face!", "I love transformers!"]
encodings = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
print(encodings)

5. Inference API (推理 API)

Hugging Face 提供了一个强大的推理 API,用户可以通过简单的 HTTP 请求将数据传给在线模型,获取推理结果。这对于没有自己训练模型的用户,或者希望快速部署模型的用户非常有用。

5.1 通过 Transformers 库使用推理 API

Hugging Face 提供了一个简便的 pipeline API,用于快速进行推理。你只需要传入模型的名称和任务类型,pipeline 会自动选择合适的模型和 tokenizer,并进行推理。

使用方法

• 假设你想进行文本生成:

from transformers import pipeline

generator = pipeline("text-generation", model="gpt2")
result = generator("Once upon a time", max_length=50)
print(result)

• 你可以指定其他任务,如文本分类、命名实体识别等:

classifier = pipeline("sentiment-analysis")
print(classifier("I love Hugging Face!"))

5.2 通过 HTTP 调用推理 API

如果你不想直接使用 transformers 库,也可以通过 HTTP 请求直接调用 Hugging Face 提供的 API。这对于开发 Web 服务或集成其他系统非常有用。

步骤

  1. 在 Hugging Face Hub 上找到你需要的模型,并获取 API Token。

  2. 使用 HTTP 请求调用模型 API。

示例

• 使用 curl 调用推理 API:

curl -X POST https://api-inference.huggingface.co/models/gpt2 \
     -H "Authorization: Bearer YOUR_API_TOKEN" \
     -d '{"inputs": "Once upon a time"}'

• 你也可以在 Python 中使用 requests 发送 POST 请求:

import requests

headers = {"Authorization": "Bearer YOUR_API_TOKEN"}
data = {"inputs": "Once upon a time"}

response = requests.post("https://api-inference.huggingface.co/models/gpt2", headers=headers, json=data)
print(response.json())

5.3 推理 API 的高级功能

批量推理:你可以一次性发送多个输入进行批量推理。

自定义参数:你可以根据需要调整推理参数,例如生成的文本长度、温度、top-k 采样等。

6. Accelerate 库

accelerate 是 Hugging Face 提供的一个用于加速模型训练和推理的库,特别适用于大规模训练任务。它简化了在多设备(如 GPU 和 TPU)上并行训练和分布式训练的复杂性。你可以通过它来轻松地在多个设备之间分配任务,提高计算效率。

6.1 安装 Accelerate

首先,你需要安装 accelerate 库:

pip install accelerate

6.2 简化多设备训练

accelerate 可以帮助你自动管理多 GPU 或多机器训练,并且可以通过简单的命令运行模型训练。它支持多种设备类型,包括 CPU、GPU 和 TPU。

步骤

  1. 在训练脚本中,首先导入 Accelerator 类:
from accelerate import Accelerator
  1. 创建 Accelerator 实例并设置训练过程:
accelerator = Accelerator()
  1. 使用 accelerator.prepare() 来自动准备模型、优化器和数据加载器:
model, optimizer, train_dataloader = accelerator.prepare(model, optimizer, train_dataloader)
  1. 然后,你可以像平常一样进行训练,accelerate 会自动处理多设备的同步和调度。

示例:使用 accelerate 进行简单的训练

from accelerate import Accelerator
from transformers import AutoModelForSequenceClassification, AutoTokenizer, AdamW
from datasets import load_dataset

# 初始化 Accelerator
accelerator = Accelerator()

# 加载数据集和模型
dataset = load_dataset("imdb")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 准备数据
train_dataset = dataset["train"].map(lambda x: tokenizer(x["text"], padding=True, truncation=True), batched=True)
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=8)

# 初始化优化器
optimizer = AdamW(model.parameters(), lr=5e-5)

# 准备所有内容
model, optimizer, train_dataloader = accelerator.prepare(model, optimizer, train_dataloader)

# 训练过程
for epoch in range(3):
    model.train()
    for batch in train_dataloader:
        optimizer.zero_grad()
        inputs = {key: batch[key].to(accelerator.device) for key in batch}
        labels = inputs.pop("label")
        outputs = model(**inputs, labels=labels)
        loss = outputs.loss
        accelerator.backward(loss)
        optimizer.step()
    print(f"Epoch {epoch} completed")

通过使用 accelerate,你可以轻松地在多设备上进行训练,不需要手动编写复杂的分布式训练代码。accelerate 处理了数据并行、梯度累积等方面的内容。

6.3 并行推理

accelerate 还支持推理时的多设备加速。例如,如果你有多个 GPU,并希望将推理负载分配到多个设备上,可以使用 accelerate 来加速推理。

from accelerate import Accelerator
from transformers import AutoModelForSequenceClassification, AutoTokenizer

accelerator = Accelerator()

model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# 准备模型和 tokenizer
model, tokenizer = accelerator.prepare(model, tokenizer)

# 推理
inputs = tokenizer("Hello, Hugging Face!", return_tensors="pt")
inputs = {key: value.to(accelerator.device) for key, value in inputs.items()}
outputs = model(**inputs)

7. Hugging Face Spaces

Hugging Face Spaces 是一个用于托管和分享机器学习模型和应用的平台。你可以在 Hugging Face Spaces 上创建、部署和分享你的机器学习应用,支持通过 Streamlit、Gradio 等库快速搭建交互式界面。

7.1 创建 Hugging Face Spaces

Hugging Face Spaces 允许用户通过简单的代码和界面,快速构建 Web 应用来展示模型的推理能力。你可以选择使用 Gradio 或 Streamlit 来构建应用界面。

步骤

  1. 登录 Hugging Face 账户并创建一个 Space 页面。

  2. 在 Space 中创建一个应用,可以选择 Gradio 或 Streamlit 框架。

示例:使用 Gradio 创建交互式界面

pip install gradio

然后,创建一个简单的 Gradio 应用来展示模型:

import gradio as gr
from transformers import pipeline

# 加载预训练模型
classifier = pipeline("sentiment-analysis")

# 创建 Gradio 界面
def predict(text):
    return classifier(text)

# 设置界面
interface = gr.Interface(fn=predict, inputs="text", outputs="json")

# 启动应用
interface.launch()

这段代码创建了一个简单的文本分类应用,用户可以输入文本,应用会返回该文本的情感分析结果。

7.2 使用 Streamlit 创建交互式界面

Streamlit 也是一个非常流行的 Python 库,用于快速创建 Web 应用。你可以在 Hugging Face Spaces 中使用 Streamlit 构建应用。

pip install streamlit

然后,创建一个简单的应用:

import streamlit as st
from transformers import pipeline

# 加载模型
classifier = pipeline("sentiment-analysis")

# 创建 Streamlit 应用
st.title("Sentiment Analysis")
text_input = st.text_area("Enter text:")

if text_input:
    result = classifier(text_input)
    st.write(result)

然后,通过 streamlit run 启动应用:

streamlit run app.py

这样你就可以通过 Streamlit 创建一个简单的应用,用户输入文本后即可看到情感分析的结果。

7.3 分享和部署应用

一旦你创建了 Hugging Face Space,你可以分享它的链接给其他人,让他们也能访问和使用你的应用。Hugging Face 会为每个 Space 提供一个独立的 URL,你可以将其嵌入到文档、博客等地方。

• 在 Space 页面上,你可以选择公开或私有你的应用。如果你选择公开,其他人也可以访问并使用这个应用。

• 你也可以在应用中上传自己的数据或模型文件,使得应用更加丰富和个性化。

8. Hugging Face 文档和社区支持

Hugging Face 提供了丰富的文档和社区支持,帮助开发者解决问题并学习如何使用 Hugging Face 的工具。

8.1 官方文档

Hugging Face 官方文档:包含了从模型加载、训练到部署等各个方面的详细说明,涵盖了各类 API 和功能的使用示例。

8.2 Hugging Face 论坛

Hugging Face 论坛:你可以在这个论坛上向社区提问,分享经验,讨论最新的研究成果。论坛中有许多来自不同领域的专家,他们会回答你的问题,提供帮助。

8.3 Hugging Face Discord

• Hugging Face 还提供了一个 Discord 频道,你可以在这里与其他开发者和研究人员实时交流。

总结

我们已经详细探讨了 Hugging Face 的许多功能,包括:

  1. Accelerate 库:帮助在多个设备上加速训练和推理,简化分布式训练。

  2. Hugging Face Spaces:用于创建和部署机器学习应用,支持 Gradio 和 Streamlit 界面,方便展示和分享模型。

  3. 文档和社区支持:提供丰富的文档、论坛和实时交流平台,帮助开发者解决问题。

Hugging Face 生态系统为机器学习从业者提供了完整的工具链,从模型训练到部署,从数据处理到应用开发,极大地降低了机器学习项目的门槛。通过合理利用这些工具,开发者可以更加专注于算法和业务逻辑,而非重复的基础设施工作。

回溯算法 2024-11-13
transformer 2024-12-01

评论区