大型语言模型(LLM)由于transformers (opens new window)和大量的训练数据,具有多功能性和出色的性能。通常,LLM是通用的,没有特定的训练目的。例如,GPT-4 (opens new window)可以进行语言翻译、文本生成、问答等多种功能。
对于特定的应用,比如为医疗保健提供聊天机器人或为少数语言提供语言翻译,我们需要一个专门的模型。幸运的是,LLM(以及其他基于transformer的模型)的一个强大特性是它们的适应能力。因此,我们可以不从头开始训练模型,而是在训练数据上微调现有的LLM模型。
微调在大型语言模型(LLM)领域至关重要,有许多方法可以进行微调。因此,我们将专门撰写几篇博客来深入探讨微调的主题,并与其他方法(如提示工程和RAG)进行比较。在我们的初始博客中,我们将探讨使用Hugging Face的transformers
库进行微调的过程,而下一篇博客将专注于使用OpenAI来微调通用模型。
# LLM微调
微调可以是全面的或部分的。由于LLM的巨大体积,无法对其进行全面微调,因此性能高效微调(通常称为PEFT (opens new window))是一种常用的LLM微调技术。由于PEFT在Hugging Face中得到了很好的支持,因此我们将使用Hugging Face (opens new window)模型进行微调。
# 加载预训练模型
Hugging Face拥有一个完整的库生态系统,因此有一些有用的库/模块,例如:
- 监督微调(SFT)
- 性能高效微调(PEFT)
- 自动分词器(AutoTokenizer)
对于预训练模型,我们可以使用任何开源模型。在这里,我们将使用Falcon-7b (opens new window),因为它体积较小且性能出色。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig
modelID = "tiiuae/falcon-7b"
# 准备数据集
SFT(我们将在稍后的训练中使用)允许直接使用Hugging Face hub数据集。我们可以利用那里提供的大量数据集。例如,我们将使用Open Assistance数据集 (opens new window)进行提示。
注意:
如果您要用于微调的数据集在Hugging Face hub上不可用,您可以使用自己的帐户上传它。
dataset = load_dataset("timdettmers/openassistant-guanaco", split="train")
# 根据需求修改模型
除了部分微调外,我们还可以使用量化来进一步减小权重的大小:
quantizationConfig = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_quant_type="nf4"
)
model = AutoModelForCausalLM.from_pretrained(modelID, quantization_config=quantizationConfig)
我们还将加载分词器:
tokenizer = AutoTokenizer.from_pretrained(modelID)
tokenizer.add_special_tokens({'pad_token': '<PAD>'})
注意:
加载和微调大型语言模型(LLM)需要大量的计算资源。我在这个模型中使用了Google Colab Pro和A100 GPU。
# 微调模型
现在,我们准备好初始化我们的训练器了。SFT的构造函数接受一些参数,例如:
model
:预训练模型train_dataset
:微调数据集dataset_text_field
:文本字段,通常为“text”max_seq_length
:最大序列长度tokenizer
:文本的分词器
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=512,
tokenizer=tokenizer,
packing=True,
)
然后我们可以开始训练:
trainer.train()
训练完成后,我们可以通过一些推理来测试它。但是我们需要首先调用相应的pipeline:
from transformers import pipeline
pipeline = pipeline(
"text-generation",
model=model,
tokenizer=AutoTokenizer.from_pretrained(model),
device_map="auto",
)
例如,我们使用以下提示进行推理:
sequences = pipeline(
"毫无疑问,这个星球上最美味的水果是腰果(生的形式)。它生长在巴西和其他热带地区,其味道无与伦比。你认为呢,山姆? \\n 山姆:",
max_length=200,
do_sample=True,
top_k=10,
num_return_sequences=1
)
for seq in sequences:
print(f"结果:{seq['generated_text']}")
我们得到了以下输出(由于语言模型的随机性质,您的结果可能会有所不同):
结果:毫无疑问,这个星球上最美味的水果是腰果(生的形式)。它生长在巴西和其他热带地区,其味道无与伦比。你认为呢,山姆?
山姆:我想说它很美味。它有一种略带坚果和甜味的味道,但带有非常愉悦的奶油味和顺滑的口感。它是我最喜欢的水果之一,我可以一把抓一把地吃。
你去过的最好的地方是哪里?
山姆:哦,这是一个困难的问题。这是一个非常困难的答案。
这是一个困难的答案吗?
山姆:我去过很多国家,但我最喜欢的地方可能是加拉帕戈斯群岛。我在那里呆了几个星期,喜欢那里的风景。
你去过的最糟糕的地方是哪里?
山姆:我认为可能是我见过的最糟糕的地方是柏林.
# LLM微调的实际应用
微调正在改变行业使用AI的方式,使其更加经济实惠和用户友好。与使用检索增强生成(RAG)需要持续成本的方法不同,微调可以让您一次性定制一个开源模型,而无需额外的费用。这使您完全掌控,并消除了额外基础设施的需求。像PaLM和FinGPT这样的示例展示了微调模型可以如何强大和灵活:
客户服务自动化: 通过为特定的客户服务业务微调模型,开发人员可以创建不仅仅模仿一般对话而且能够理解和回答与业务相关的查询的聊天机器人。这种方法避免了使用外部资源,并提供真正理解术语和客户问题的全天候客户支持,提高了整体客户体验和满意度。
语言翻译服务: 通过微调,开发人员可以改进语言模型以专门用于语言翻译任务,避免了通用的一刀切方法。这有助于更有效地消除国际商务和旅行中的语言障碍,而无需持续使用外部API的成本。
个性化教育: 微调使得创建AI驱动的平台,可以根据每个学生的速度和学习风格调整学习材料成为可能。通过拥有模型,教育机构可以在不增加额外成本的情况下不断改进和调整学习材料,使教育更加个性化和有影响力。
这些示例表明,微调LLM可以应用于解决现实世界的问题,并提升日常生活。微调模型的适应性和效率承诺在未来还会有更多创新应用。
# 结论
通过使用专门的数据集对LLM进行微调,可以利用LLM的能力来完成特定任务。借助Hugging Face和部分微调、量化等PEFT技术,LLM微调变得更加简单和经济实惠。
如今,许多组织正在使用大型语言模型(LLM)的API开发AI应用程序,其中向量数据库通过提供上下文嵌入的高效存储和检索发挥着重要作用。MyScale (opens new window)是一个专门为AI应用程序设计的向量数据库,考虑到成本、准确性和速度等因素。对于开发人员来说,它非常易于使用,只需要使用SQL进行交互。
微调在优化大型语言模型(LLM)中起着关键作用,提供了多种方法。请继续关注我们即将发布的博客,我们将探讨如何使用OpenAI微调通用模型。
相关文章:使用MyScale超越专门的向量数据库 (opens new window)
如果您有任何反馈或建议,请在MyScale的**Discord (opens new window)**上与我们联系。