Press "Enter" to skip to content

完全初学者的Hugging Face LLM工具指南

Hugging Face是一个AI研究实验室和中心,建立了一个学者、研究人员和爱好者的社区。在短时间内,Hugging Face在AI领域获得了很大的影响力。包括谷歌、亚马逊和英伟达在内的科技巨头已经通过大量投资支持了AI初创公司Hugging Face,使其估值达到45亿美元。

在本指南中,我们将介绍transformers、LLMs以及Hugging Face库在促进开源AI社区中发挥的重要作用。我们还将通过Python实例详细介绍Hugging Face的基本功能,包括pipelines、数据集、模型等等。

NLP中的Transformers

2017年,康奈尔大学发表了一篇影响深远的论文,介绍了transformers。这些是用于NLP的深度学习模型。这一发现推动了像ChatGPT这样的大型语言模型的发展。

大型语言模型或LLMs是使用transformers来理解和创建类似人类文本的AI系统。然而,创建这些模型是昂贵的,通常需要数百万美元,这限制了它们只能由大公司使用。

成立于2016年的Hugging Face旨在使NLP模型对每个人都可访问。尽管是一家商业公司,但它提供了一系列的开源资源,帮助人们和组织以经济实惠的方式构建和使用transformer模型。机器学习是教导计算机通过识别模式执行任务的过程,而深度学习是机器学习的一个子集,它创建一个能够独立学习的网络。Transformers是一种深度学习架构,能够有效灵活地使用输入数据,因此在构建大型语言模型时成为热门选择,因为其训练时间要求较低。

Hugging Face如何促进NLP和LLM项目

完全初学者的Hugging Face LLM工具指南 四海 第1张

Hugging Face通过提供以下功能使LLM的使用更加简单:

  1. 一系列预训练模型供选择。
  2. 工具和示例,以根据特定需求对这些模型进行微调。
  3. 针对各种环境的简单部署选项。

Hugging Face提供的一个重要资源是Open LLM Leaderboard。作为一个综合性平台,它系统地监控、排名和评估一系列大型语言模型(LLMs)和聊天机器人,提供对开源领域进展的明智分析。

LLM Benchmarks通过四个指标来衡量模型:

  • AI2推理挑战(25-shot)- 一系列关于基础科学课程的问题。
  • HellaSwag(10-shot)- 一个常识推理测试,对于人类来说很简单,但对于尖端模型来说是一个重大挑战。
  • MMLU(5-shot)- 一个多方面的评估,涵盖了文本模型在57个不同领域的熟练程度,包括基本数学、法律、计算机科学等。
  • TruthfulQA(0-shot)- 用于确定模型倾向于重复经常遇到的在线错误信息的工具。

这些基准以“25-shot”、“10-shot”、“5-shot”和“0-shot”等术语描述,表示模型在评估过程中给予的提示示例数量,以评估其在不同领域中的性能和推理能力。在“few-shot”范式中,模型被提供了少量示例来帮助指导其响应,而在“0-shot”设置中,模型不接收任何示例,必须完全依靠其现有知识来做出适当的响应。

Hugging Face的组成部分

Pipelines

pipelines是Hugging Face的transformers库的一部分,它是一个功能,可以帮助轻松使用Hugging Face仓库中提供的预训练模型。它为包括情感分析、问答、掩码语言建模、命名实体识别和摘要等在内的一系列任务提供直观的API。

Pipelines集成了Hugging Face的三个核心组件:

  1. Tokenizer:将您的文本转换为模型可以理解的格式。
  2. Model:这是管道的核心,根据预处理的输入进行实际预测。
  3. Post-processor:将模型的原始预测转换为可读的形式。

这些流水线不仅减少了大量的编码工作,还提供了一个用户友好的界面来完成各种自然语言处理任务。

使用Hugging Face库的Transformer应用

Hugging Face库的一个亮点是Transformers库,它通过将模型与必要的预处理和后处理阶段连接起来,简化了自然语言处理任务,简化了分析过程。要安装和导入该库,请使用以下命令:

pip install -q transformers
from transformers import pipeline

完成上述操作后,您可以执行以情感分析为起点的自然语言处理任务,将文本分类为积极或消极情感。该库强大的pipeline()函数作为一个集线器,包含其他流水线,便于在音频、视觉和多模态领域进行特定任务的应用。

实际应用

文本分类

Hugging Face的pipeline()函数使得文本分类变得轻而易举。以下是如何启动一个文本分类流水线的方法:

classifier = pipeline("text-classification")

为了亲身体验,将一个字符串或字符串列表提供给流水线,以获得预测结果,可以使用Python的Pandas库将结果整洁地可视化。以下是演示这一点的Python代码片段:

sentences = ["我很高兴向你介绍人工智能的奇妙世界。",
"希望它不会让你失望。"]
# 为列表中的每个句子获取分类结果
results = classifier(sentences)
# 遍历每个结果并打印标签和分数
for i, result in enumerate(results):
print(f"结果 {i + 1}:")
print(f" 标签: {result['label']}")
print(f" 分数: {round(result['score'], 3)}\n")

输出

结果 1: 
标签: 积极 
分数: 1.0 
结果 2: 
标签: 积极 
分数: 0.996 

命名实体识别(NER)

NER在从文本中提取现实世界对象(称为“命名实体”)方面起着重要作用。利用NER流水线可以有效地识别这些实体:

ner_tagger = pipeline("ner", aggregation_strategy="simple")
text = "Elon Musk是SpaceX的CEO。"
outputs = ner_tagger(text)
print(outputs)

输出

 结果 1: 标签: 积极 分数: 1.0 结果 2: 标签: 积极 分数: 0.996 

问答

问答涉及从给定上下文中提取精确答案以回答特定问题。初始化一个问答流水线,并输入您的问题和上下文以获得所需的答案:

reader = pipeline("question-answering")
text = "Hugging Face是一家创建自然语言处理工具的公司。它位于纽约,成立于2016年。"
question = "Hugging Face总部在哪里?"
outputs = reader(question=question, context=text)
print(outputs)

输出

 {'score': 0.998, 'start': 51, 'end': 60, 'answer': '纽约'} 

Hugging Face的pipeline函数提供了一系列预建的流水线,用于不同的任务,除了文本分类、NER和问答之外。以下是一些可用任务的详细信息:

表格:Hugging Face流水线任务

任务 描述 流水线标识符
文本生成 根据给定提示生成文本 pipeline(task=“text-generation”)
摘要 总结冗长的文本或文档 pipeline(task=“summarization”)
图像分类 为输入图像打标签 pipeline(task=“image-classification”)
音频分类 对音频数据进行分类 pipeline(task=“audio-classification”)
视觉问答 使用图像和问题回答查询 pipeline(task=“vqa”)

详细描述和更多任务,请参阅Hugging Face网站上的流水线文档。

为什么Hugging Face将焦点转向Rust

完全初学者的Hugging Face LLM工具指南 四海 第2张

Hugging Face的Safetensors和tokenizer GitHub页面

Hugging Face(HF)生态系统开始在其库中使用Rust,例如safesensors和tokenizers。

Hugging Face最近还发布了一个名为Candle的新的机器学习框架。与使用Python的传统框架不同,Candle是用Rust构建的。使用Rust的目标是提高性能,简化用户体验,并支持GPU操作。

Candle的关键目标是促进无服务器推理,使部署轻量级二进制文件成为可能,并从生产工作负载中移除Python,这有时会因其开销而减慢进程。这个框架解决了使用PyTorch等完整机器学习框架在集群上创建实例时遇到的问题,这些框架通常很大且速度较慢。

让我们探讨为什么Rust比Python更受青睐。

  1. 速度和性能 – Rust以其令人难以置信的速度而闻名,超越了传统的机器学习框架所使用的Python。Python的性能有时会因其全局解释器锁(GIL)而变慢,但Rust没有这个问题,承诺在实施时执行任务更快,从而在实施了Rust的项目中提供改进的性能。
  2. 安全性 – Rust提供了无垃圾收集器的内存安全保证,这是确保并发系统安全性的重要方面。这在像safetensors这样的领域中发挥了关键作用,其中处理数据结构的安全性是优先考虑的。

Safetensors

Safetensors受益于Rust的速度和安全功能。Safetensors涉及对张量进行操作,这是一种复杂的数学实体,使用Rust可以确保操作不仅快速,而且安全,避免由于内存处理不当而引起的常见错误和安全问题。

Tokenizer

Tokenizer将句子或短语分解为更小的单位,例如单词或术语。Rust通过加快执行时间来帮助这个过程,确保分词过程不仅准确而且快速,提高自然语言处理任务的效率。

Hugging Face的分词器的核心是子词分词的概念,它在词和字符级别的分词之间取得了微妙的平衡,以优化信息保留和词汇量大小。它通过创建子词(如“##ing”和“##ed”)来实现功能,保持语义丰富性,同时避免庞大的词汇表。

完全初学者的Hugging Face LLM工具指南 四海 第3张

子词分词涉及训练阶段,以确定字符和词级别的分词之间最有效的平衡。它超越了简单的前缀和后缀规则,需要对广泛的文本语料进行全面的语言模式分析,以设计出高效的子词分词器。生成的分词器能够处理新词,将其分解为已知的子词,并保持高水平的语义理解。

分词组件

完全初学者的Hugging Face LLM工具指南 四海 第4张

tokenizers库将分词过程分为几个步骤,每个步骤都处理分词的不同方面。让我们深入了解这些组件:

  • 规范化器:对输入字符串进行初始转换,应用必要的调整,例如转为小写、Unicode规范化和剥离。
  • 预分词器:负责将输入字符串分割为预分段,根据预定义的规则确定分割点,例如空格分界。
  • 模型:负责发现和创建子词,适应于您的输入数据的特定情况,并提供训练能力。
  • 后处理器:增强构造特性,以便与许多基于transformer的模型(如BERT)兼容,通过添加诸如[CLS]和[SEP]之类的标记。

要开始使用Hugging Face的tokenizers,可以使用命令pip install tokenizers安装该库,并将其导入到Python环境中。该库可以在很短的时间内对大量文本进行分词处理,从而节省宝贵的计算资源,用于更加密集的任务,如模型训练。

tokenizers库使用Rust语言,继承了C++的语法相似性,同时引入了编程语言设计中的新概念。结合Python绑定,可以在Python环境中享受低级语言的性能。

数据集

完全初学者的Hugging Face LLM工具指南 四海 第5张

Hugging Face数据集

数据集是AI项目的基石。Hugging Face提供了各种适用于各种NLP任务等数据集。要有效地利用它们,了解加载和分析数据集的过程是必不可少的。下面是一个有详细注释的Python脚本,演示了如何探索Hugging Face上可用的数据集:

from datasets import load_dataset
# 加载数据集
dataset = load_dataset('squad')
# 显示第一个条目
print(dataset[0])

这个脚本使用load_dataset函数加载了SQuAD数据集,这是进行问答任务的常用选择。

利用预训练模型并将其整合在一起

完全初学者的Hugging Face LLM工具指南 四海 第6张

Hugging Face模型

预训练模型是许多深度学习项目的基础,使研究人员和开发人员能够在不从头开始的情况下启动他们的项目。Hugging Face提供了多样化的预训练模型,如下面的代码所示:

from transformers import AutoModelForQuestionAnswering, AutoTokenizer
# 加载预训练模型和分词器
model = AutoModelForQuestionAnswering.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
tokenizer = AutoTokenizer.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
# 显示模型的架构
print(model)

模型和分词器加载完毕后,我们可以创建一个函数,该函数接受一段文本和一个问题作为输入,并返回从文本中提取的答案。我们将利用分词器将输入文本和问题处理成与模型兼容的格式,然后将这个处理后的输入输入到模型中获取答案:

def get_answer(text, question):
    # 对输入文本和问题进行分词
    inputs = tokenizer(question, text, return_tensors='pt', max_length=512, truncation=True)
    outputs = model(**inputs)
    # 获取答案的起始和结束位置
    answer_start = torch.argmax(outputs.start_logits)
    answer_end = torch.argmax(outputs.end_logits) + 1
    answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs['input_ids'][0][answer_start:answer_end]))
    return answer

在代码片段中,我们从transformers包中导入所需的模块,然后使用from_pretrained方法加载一个预训练模型及其对应的分词器。我们选择了在SQuAD数据集上微调的BERT模型。

让我们看一个使用这个函数的示例用例,我们有一段文本,并想从中提取一个特定问题的答案:

text = """
The Eiffel Tower, located in Paris, France, is one of the most iconic landmarks in the world. It was designed by Gustave Eiffel and completed in 1889. The tower stands at a height of 324 meters and was the tallest man-made structure in the world at the time of its completion.
"""
question = "Who designed the Eiffel Tower?"
# 获取问题的答案
answer = get_answer(text, question)
print(f"问题的答案是:{answer}")
# 输出:问题的答案是:Gustave Eiffel

在这个脚本中,我们构建了一个get_answer函数,它接受一个文本和一个问题,适当地进行分词,并利用预训练的BERT模型从文本中提取答案。它展示了Hugging Face的transformers库的一个实际应用,用于构建一个简单而强大的问答系统。为了更好地理解这些概念,建议使用Google Colab Notebook进行实际操作。

结论

通过其广泛的开源工具、预训练模型和用户友好的流程,它使资深专业人士和新手都能轻松理解和探索AI的广阔世界。此外,将Rust整合进来,凭借其速度和安全特性,凸显了Hugging Face在促进创新、确保AI应用的效率和安全方面的承诺。Hugging Face的改革性工作不仅使高水平的AI工具更加民主化,而且在AI领域培养了一个学习和发展的合作环境,促进了AI可访问性的未来。

Leave a Reply

Your email address will not be published. Required fields are marked *