文章目录
前言
Hugging Face是一家专注于自然语言处理(NLP)和对话系统的创新型公司。它成立于2016年,总部位于纽约,由两位热衷于开源的机器学习工程师Clément Delangue和Julien Chaumond创立。Hugging Face的使命是推动NLP技术,让更多人能够轻松地访问和使用先进的语言模型。 Hugging Face的主要产品包括Transformers库、Datasets库、Tokenizers库以及Hugging Face Hub等。这些工具和平台为开发者和研究人员提供了一个全面、强大的NLP生态系统,帮助他们构建、部署和共享各种自然语言处理应用。也正是如此,很多大模型均会使用huggingface来构建,能为开发人员减少不必要工作量,如加速deepspeed、vit与llama等模型集成、高效微调PEFT(LoRA)等,也是我花费一定精力构建huggingface教程初衷。当然,我的教程不再文字上面内容解读,更多是源码内容解读,以为学习者二次开发,特别是想开发大模型相关的开发者。本篇文章简单介绍Huggingface!
一、 Hugging Face简介
Hugging Face是一家专注于自然语言处理(NLP)和对话系统的创新型公司。它成立于2016年,总部位于纽约,由两位热衷于开源的机器学习工程师Clément Delangue和Julien Chaumond创立。Hugging Face的使命是推动NLP技术,让更多人能够轻松地访问和使用先进的语言模型。 Hugging Face的主要产品包括Transformers库、Datasets库、Tokenizers库以及Hugging Face Hub等。这些工具和平台为开发者和研究人员提供了一个全面、强大的NLP生态系统,帮助他们构建、部署和共享各种自然语言处理应用。
二、 Hugging Face的生态系统
Hugging Face的生态系统由几个重要的组件组成,包括Transformers库、Datasets库、Tokenizers库和Hugging Face Hub等。这些组件相互协作,为开发者提供了一个完整的NLP工具链。
1. Transformers库
Transformers库是Hugging Face公司最著名的产品,它是一个开源的Python库,专注于为NLP任务提供高度可配置和易于使用的神经网络模型。Transformers库支持多种预训练模型,如BERT、GPT、RoBERTa、XLNet等,并提供了一致的API来加载、微调和使用这些模型。
Transformers库的主要特点包括:
预训练模型:Transformers库提供了多种经过预训练的模型,特别是语言模型,覆盖了广泛的NLP任务,如文本分类、问答、命名实体识别、文本生成等。开发者可以直接使用这些预训练模型,或进一步微调它们以适应特定的应用场景。
易用性: Transformers库提供了一致的API,使得开发者可以轻松地加载、微调和使用这些预训练模型,大大降低了NLP相关应用开发的复杂度。
多任务支持: Transformers库支持多种NLP任务,使得开发者可以在单一框架内完成不同的自然语言处理需求。 多语言支持: Transformers库支持多种自然语言,包括英语、中文、德语、法语等,为跨语言应用的开发提供了便利。
模型压缩: Transformers库提供了模型压缩功能,可以减小模型大小而不损失性能,从而更好地支持边缘设备和移动端的部署。
2.Datasets库
Datasets库是Hugging Face提供的另一个重要组件,它是一个开源的Python库,旨在为NLP任务提供高质量、易用的数据集。Datasets库拥有大量内置的数据集,涵盖了文本分类、问答、机器翻译等常见的NLP任务。同时,它还提供了一个简单易用的API,使开发者可以轻松地加载、处理和操作这些数据集。
Datasets库的主要特点包括:
丰富的数据集: Datasets库内置了数百个高质量的NLP数据集,包括常见的基准数据集和一些较为罕见的数据集。开发者可以轻松地浏览和使用这些数据集。
易用的API: Datasets库提供了一致的API,使开发者可以快速地加载、预处理和操作数据集,大大简化了NLP应用开发的前期准备工作。
数据集管理: Datasets库提供了数据集版本管理、缓存和重用等功能,帮助开发者更好地管理和共享数据资源。
自定义数据集: Datasets库支持开发者创建和上传自定义的数据集,并在Hugging Face Hub上与社区共享。
多语言支持: Datasets库支持多种自然语言,为跨语言NLP应用的开发提供了便利。
3. Tokenizers库
Tokenizers库是Hugging Face提供的另一个重要组件,它是一个开源的Python库,专注于为NLP任务提供高性能、可定制的文本分词器(Tokenizer),可参考博客介绍这里。Tokenizers库支持多种分词算法,如WordPiece、BPE、SentencePiece等,并提供了一致的API来使用这些分词器。
Tokenizers库的主要特点包括:
高性能: Tokenizers库采用Rust语言实现,具有极高的处理速度和并行化能力,大大提升了NLP应用的运行效率。
可定制性: Tokenizers库支持多种分词算法,并提供了丰富的参数配置选项,使开发者可以根据不同的应用需求定制自己的Tokenizer。
与Transformers的集成: Tokenizers库与Transformers库无缝集成,可以直接用于Transformers模型的输入和输出处理,大大简化了NLP应用的开发过程。
多语言支持: Tokenizers库支持多种自然语言,为跨语言NLP应用的开发提供了便利。
社区支持: Tokenizers库拥有活跃的开源社区,开发者可以从中获得丰富的技术支持和最佳实践。
Hub
Hugging Face Hub是Hugging Face公司提供的一个在线平台,它是Hugging Face生态系统中的一个重要组成部分。Hub旨在成为NLP模型和数据集的中心枢纽,为开发者和研究人员提供以下功能:
模型共享和部署: Hub允许开发者在平台上共享和发布自己训练的NLP模型,并提供了简单易用的部署工具,使模型可以被广泛使用。
模型评估和比较: Hub为开发者提供了一个统一的模型评估和比较平台,使用户可以轻松地评估和比较不同模型在各种NLP任务上的性能。
社区参与和贡献: Hub鼓励开发者和研究人员参与到NLP模型和数据集的贡献和讨论中来,促进整个NLP生态系统的发展。
模型追踪和版本管理: Hub提供了模型版本管理和追踪功能,使开发者可以更好地管理和迭代自己的NLP模型。
跨平台部署: Hub支持将NLP模型部署到多种平台和环境中,包括云服务、边缘设备等,为开发者提供了更灵活的部署选择。
总的来说,Hugging Face的生态系统为NLP应用开发提供了一个全面、强大的工具链,使开发者能够更高效地构建、部署和共享各种自然语言处理应用。接下来,我们将分别深入探讨这些组件的具体使用方法。
三、Transformers库的使用
1. 安装和导入
要使用Transformers库,首先需要安装它。可以使用pip命令进行安装:
pip install transformers
安装完成后,我们可以在Python代码中导入Transformers库:
from transformers import AutoTokenizer, AutoModel
这里我们导入了两个关键类:AutoTokenizer和AutoModel。AutoTokenizer用于加载预训练的分词器,AutoModel用于加载预训练的语言模型。
2. 预训练模型的加载和使用
Transformers库提供了大量预训练的语言模型,开发者可以直接加载并使用这些模型。以BERT模型为例,我们可以使用以下代码加载并使用它:
# 加载BERT预训练模型和分词器
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')
# 对输入文本进行编码
text = "This is a sample text for demonstrating Transformers." encoded_input = tokenizer(text, return_tensors='pt')
# 使用BERT模型进行前向传播
output = model(**encoded_input)
# 访问模型输出
print(output.last_hidden_state.shape)
# torch.Size([1, 12, 768])
在这个示例中,我们首先使用AutoTokenizer.from_pretrained()加载了BERT的预训练分词器,然后使用AutoModel.from_pretrained()加载了BERT的预训练模型。之后,我们将输入文本编码为Transformers模型能够接受的格式,并将其传入模型进行前向传播。最后,我们可以访问模型的输出,如最后一层的隐藏状态。
3. 微调预训练模型
尽管预训练模型已经具有强大的能力,但在某些特定任务上可能还需要进一步的微调。Transformers库提供了便捷的微调接口,使开发者可以轻松地在预训练模型的基础上进行微调。 以文本分类任务为例,我们可以使用以下代码进行模型微调:
from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer
# 加载预训练模型和分词器
model = AutoModelForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
# 准备训练数据
train_dataset = load_dataset('glue', 'sst2', split='train') eval_dataset = load_dataset('glue', 'sst2', split='validation')
# 定义训练参数
training_args = TrainingArguments(
output_dir='./results',
evaluation_strategy='epoch',
learning_rate=2e-5,
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=3,
weight_decay=0.01,
)
# 创建Trainer对象并进行训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
tokenizer=tokenizer,
)
trainer.train()
在这个示例中,我们首先加载了预训练的BERT模型和分词器,然后使用Hugging Face提供的内置数据集glue/sst2作为训练和验证数据集。接下来,我们定义了训练参数,包括学习率、批量大小、训练轮数等。最后,我们创建了一个Trainer对象,并调用train()方法开始模型的微调过程。
4. 生成文本
除了对输入文本进行编码和分类,Transformers库还支持生成文本的功能。这一功能主要依赖于预训练的语言生成模型,如GPT-2、GPT-Neo、CTRL等。
以使用GPT-2生成文本为例,我们可以使用以下代码:
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# 加载GPT-2预训练模型和分词器
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# 设置生成参数
prompt = "The quick brown fox"
max_length = 50
num_return_sequences = 3
top_k = 50
top_p = 0.95
do_sample = True
# 生成文本
input_ids = tokenizer.encode(prompt, return_tensors='pt')
output_ids = model.generate(
input_ids,
max_length=max_length,
num_return_sequences=num_return_sequences,
top_k=top_k,
top_p=top_p,
do_sample=do_sample )
# 解码生成的文本
generated_texts = [tokenizer.decode(output_id, skip_special_tokens=True)
for output_id in output_ids] for text in generated_texts:
print(text)
在这个示例中,我们首先加载了预训练的GPT-2模型和分词器。然后,我们设置了一些生成参数,如最大长度、生成序列数量、采样策略等。接下来,我们将提示词编码为模型可接受的输入格式,并使用model.generate()方法生成文本。最后,我们将生成的输出ID解码为可读的文本,并打印出结果。
通过这些示例,我们可以看到Transformers库为NLP应用的开发提供了强大而灵活的工具。接下来,我们将探讨Hugging Face的另一个重要组件 - Datasets库。
四、Datasets库的使用
Datasets库为NLP开发者提供了一个高质量、易用的数据集管理工具。无论是使用内置的数据集,还是创建自定义数据集,Datasets库都能为您提供帮助。
1.加载内置数据集
Datasets库内置了大量常用的NLP数据集,开发者可以轻松地加载和使用它们。以GLUE数据集为例,我们可以使用以下代码进行加载:
from datasets import load_dataset
# 加载GLUE数据集的SST-2任务
dataset = load_dataset("glue", "sst2")
# 查看数据集信息
print(dataset)
# DatasetDict({
# train: Dataset(features: ['sentence', 'label'], num_rows: 67349)
# validation: Dataset(features: ['sentence', 'label'], num_rows: 872)
# test: Dataset(features: ['sentence', 'label'], num_rows: 1821)
# })
# 访问数据集samples
print(dataset['train'][0])
# {'sentence': 'A masterpiece of black comedy, coulding ranks with the best satire of the 20th century.', 'label': 1}
在这个示例中,我们使用load_dataset()函数加载了GLUE数据集的SST-2任务。该函数会返回一个DatasetDict对象,其中包含训练集、验证集和测试集。我们可以通过字典键访问这些子数据集,并查看数据集的详细信息。
2. 创建自定义数据集
除了使用内置数据集,Datasets库也支持开发者创建和上传自定义数据集。下面是一个示例,演示如何创建一个简单的文本分类数据集:
from datasets import Dataset
# 创建样本数据
data = [ {"text": "This is a positive review.", "label": 1}, {"text": "The product is terrible.", "label": 0}, {"text": "I had a great experience.", "label": 1}, {"text": "Disappointing quality.", "label": 0} ]
# 创建Dataset对象
dataset = Dataset.from_list(data)
# 查看数据集信息
print(dataset)
# Dataset(features={'text': Value(dtype='string', id=None), 'label': Value(dtype='int64', id=None)}, num_rows=4)
# 访问数据集samples print(dataset[0])
# {'text': 'This is a positive review.', 'label': 1}
在这个示例中,我们首先定义了一些样本数据,包含文本和标签。然后,我们使用Dataset.from_list()方法创建了一个自定义的Dataset对象。最后,我们可以查看数据集的信息,并访问其中的样本数据。
3.数据集预处理
在使用Datasets库加载数据集后,通常需要对数据进行一些预处理操作,如文本清洗、特征提取等。Datasets库提供了丰富的预处理功能,使开发者能够轻松地完成这些任务。
以文本分类任务为例,我们可以使用以下代码对数据集进行预处理:
from transformers import AutoTokenizer
# 加载GLUE数据集的SST-2任务
dataset = load_dataset("glue", "sst2")
# 加载BERT分词器
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
# 定义数据预处理函数
def preprocess_function(examples):
return tokenizer(examples['sentence'], padding='max_length', truncation=True, max_length=128)
# 应用预处理函数到数据集
processed_dataset = dataset.map(preprocess_function, batched=True)
# 查看预处理后的数据样例
print(processed_dataset['train'][0])
# {'input_ids': [101, 2023, 2003, 1037, 3403, 1012, 102], 'attention_mask': [1, 1, 1, 1, 1, 1, 1], 'label': 1}
在这个示例中,我们首先加载了GLUE数据集的SST-2任务,然后加载了BERT分词器。接下来,我们定义了一个数据预处理函数preprocess_function()。该函数使用BERT分词器对文本进行编码,包括添加特殊标记、填充和截断等操作。最后,我们使用map()方法将预处理函数应用到整个数据集,得到了一个新的预处理后的数据集processed_dataset。
通过Datasets库提供的预处理功能,开发者可以轻松地对数据集进行各种清洗和特征提取操作,为后续的模型训练和应用开发做好准备。
五、Tokenizers库的使用
Tokenizers库是Hugging Face生态系统中另一个重要的组件,它专注于为NLP任务提供高性能、可定制的文本分词器(Tokenizer)。
1. 了解Tokenizer
Tokenizer是NLP中一个关键的组件,它负责将输入文本分割为模型可理解的token序列。Tokenizers库支持多种分词算法,如WordPiece、BPE、SentencePiece等,并提供了一致的API来使用这些分词器。
以BERT的WordPiece分词器为例,我们可以使用以下代码进行初始化和使用:
from transformers import BertTokenizer
# 初始化BERT分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 对输入文本进行编码
text = "This is a sample text." encoded_input = tokenizer(text)
# 查看编码结果
print(encoded_input)
# {'input_ids': [101, 2023, 2003, 1037, 3403, 1012, 102], 'attention_mask': [1, 1, 1, 1, 1, 1, 1]}
在这个示例中,我们首先初始化了BERT的WordPiece分词器。然后,我们使用tokenizer()方法对输入文本进行编码,得到了包含input_ids和attention_mask的字典。input_ids是分词后的token ID序列,attention_mask指示哪些token需要参与模型的计算。
2.自定义Tokenizer
除了使用预定义的分词器,Tokenizers库还支持开发者自定义分词器。这可以帮助开发者针对特定的应用场景和语言特点,创建更加适合的分词规则。
下面是一个自定义BPE分词器的示例:
from tokenizers import ByteLevelBPETokenizer
# 创建BPE分词器
tokenizer = ByteLevelBPETokenizer()
# 训练分词器
tokenizer.train( files=['/path/to/corpus1.txt', '/path/to/corpus2.txt'], vocab_size=30000, min_frequency=2, special_tokens=['[UNK]', '[CLS]', '[SEP]', '[PAD]', '[MASK]'] )
# 保存分词器
tokenizer.save_model('/path/to/tokenizer')
# 使用分词器
encoded_input = tokenizer.encode("This is a sample text.")
print(encoded_input.ids)
# [21845, 267, 28, 2320, 4199, 13]
在这个示例中,我们创建了一个BPE分词器,并使用给定的语料库对其进行训练。训练过程中,我们指定了词表大小、最小频率以及一些特殊标记符。训练完成后,我们将分词器保存到磁盘,并演示了如何使用它对输入文本进行编码。
3. Tokenizer与Transformers的结合
Tokenizers库与Transformers库紧密集成,使得开发者可以将自定义的Tokenizer无缝地应用于Transformers模型的输入和输出处理。
下面是一个示例,演示如何将自定义的Tokenizer与BERT模型结合使用:
from transformers import BertForSequenceClassification, BertConfig from tokenizers import ByteLevelBPETokenizer
# 加载自定义Tokenizer
tokenizer = ByteLevelBPETokenizer.from_pretrained('/path/to/tokenizer')
# 创建BERT模型配置
config = BertConfig(
vocab_size=tokenizer.get_vocab_size(),
max_position_embeddings=514,
num_attention_heads=12,
num_hidden_layers=6,
type_vocab_size=2
)
# 创建BERT模型
model = BertForSequenceClassification(config)
# 使用自定义Tokenizer对输入进行编码
encoded_input = tokenizer.encode("This is a sample text.")
model_input = {
'input_ids': encoded_input.ids,
'attention_mask': encoded_input.attention_mask
}
# 将输入传入BERT模型进行前向传播
output = model(**model_input)
在这个示例中,我们首先加载了之前自定义训练的BPE分词器。然后,我们根据分词器的词表大小创建了一个BERT模型配置,并使用该配置初始化了一个BERT文本分类模型。最后,我们使用自定义的分词器对输入文本进行编码,并将编码结果传入BERT模型进行前向计算。 通过这种方式,开发者可以充分利用Tokenizers库提供的分词能力,并将其与Transformers库结合。
六、Hugging Face Hub的应用
Hugging Face Hub是Hugging Face生态系统中的一个重要组成部分,它为开发者和研究人员提供了一个集中的平台,用于管理、共享和部署NLP模型。
1.模型共享和部署
Hugging Face Hub允许开发者将自己训练的NLP模型上传到平台上,并提供了简单易用的部署工具,使得这些模型可以被其他用户轻松地调用和使用。这一功能对于促进NLP技术的发展和应用非常重要。
以将BERT文本分类模型部署到Hub为例,我们可以使用以下代码:
from transformers import pipeline
# 加载预训练的BERT文本分类模型
classifier = pipeline('text-classification', model='bert-base-uncased-finetuned-sst-2-english')
# 保存模型到Hugging Face Hub
classifier.save_pretrained('username/my-text-classifier')
在这个示例中,我们首先使用Transformers库提供的pipeline()函数加载了一个预训练的BERT文本分类模型。然后,我们调用模型的save_pretrained()方法,将其上传到Hugging Face Hub上。这个过程会自动处理模型文件的打包和上传,使得其他用户可以轻松地访问和下载该模型。
2. 模型评估和比较
Hugging Face Hub不仅提供了模型共享和部署的功能,还支持开发者对NLP模型进行评估和比较。这个功能对于选择最合适的模型非常有帮助。
以在Hub上评估GLUE基准测试为例,我们可以使用以下代码:
from transformers import pipeline
# 加载GLUE评估任务管道
eval_pipeline = pipeline('text-classification', model='distilbert-base-uncased-finetuned-sst-2-english')
# 在GLUE SST-2验证集上进行评估
eval_results = eval_pipeline.evaluate('glue', 'sst2')
print(eval_results)
# {'accuracy': 0.9112, 'f1': 0.9112, 'recall': 0.9112, 'precision': 0.9112}
在这个示例中,我们首先使用pipeline()函数加载了一个预训练的文本分类模型。然后,我们调用模型的evaluate()方法,传入GLUE评估任务的名称和数据集名称。这将自动在指定的数据集上进行评估,并返回包含准确率、F1值等指标的结果字典。
通过这种方式,开发者可以轻松地比较不同模型在标准数据集上的性能,并选择最合适的模型进行部署。
3. 社区参与和贡献
Hugging Face Hub不仅是一个模型管理和部署的平台,也是一个积极的开源社区。开发者可以在Hub上讨论、分享和贡献各种NLP资源,如预训练模型、数据集、教程等,从而推动整个NLP生态系统的发展。
例如,开发者可以在Hub上创建自己的模型仓库,并邀请其他人进行评论、测试和改进。同时,开发者也可以参与到已有模型的改进中来,为社区做出贡献。
总的来说,Hugging Face Hub为NLP开发者提供了一个全方位的支持平台,包括模型共享、部署、评估和社区参与等功能。这有助于加速NLP技术的普及和应用,为更多人带来便利。
七、 总结
Hugging Face是一家专注于NLP技术的创新公司,其生态系统包括Transformers库、Datasets库、Tokenizers库和Hugging Face Hub等重要组件。这些工具和平台为开发者和研究人员提供了一个强大、完整的NLP工具链,大大简化了NLP应用的开发过程。
通过本文的介绍,我们了解到:
Transformers库为NLP任务提供了大量预训练模型,并支持简单易用的加载、微调和使用接口。 Datasets库拥有丰富的内置数据集,同时也支持开发者自定义数据集,并提供了高效的数据预处理功能。
Tokenizers库专注于为NLP任务提供高性能、可定制的文本分词器,并可与Transformers库无缝集成。
Hugging Face Hub是一个集中的NLP模型和数据集管理平台,支持模型共享、部署、评估和社区参与等功能。
随着自然语言处理技术的快速发展,Hugging Face的生态系统必将在未来发挥越来越重要的作用。开发者和研究人员可以充分利用Hugging Face提供的工具和资源,在各种NLP应用的开发和部署中获得极大的便利。同时,通过参与Hugging Face社区,开发者也可以为NLP领域做出自己的贡献,助力整个生态系统的发展。