‘
大家都在关注OpenAI LLM排行榜和旨在达到GPT-4性能的新开源模型。最近引起很大关注的一个模型是Zephyr-7B。
‘在本教程中,我们将学习一个名为Zephyr-7B的新语言模型。我们将使用Transformers pipeline访问它,并在Agent-Instruct数据集上对模型进行微调。如果你对人工智能还不熟悉,可以查看AI Fundamentals技能轨迹。它将帮助你准备好,并为你成为未来的人工智能工程师铺平道路。
了解Zephyr-7B
Zephyr-7B是由WebPilot.AI开发的尖端语言模型。它是Zephyr系列语言模型的一部分,这些模型经过训练,可以作为有帮助的助手。Zephyr-7B旨在在各种基于语言的任务中表现出色,例如生成连贯的文本,跨不同语言进行翻译,总结重要信息,分析情感,并根据上下文回答问题。
Zephyr-7B-β
Zephyr-7B-β是该系列的第二个模型。它是Mistral-7B模型的优化版本,使用直接偏好优化(DPO)算法在公共和合成数据集的组合上进行训练。因此,Zephyr-7B-β展示了从解释复杂问题到总结长篇文字的能力。
发布时,Zephyr-7B-β是MT-Bench和AlpacaEval基准测试中排名最高的7B聊天模型。它利用自然语言处理的最新进展,达到了理解和生成类似人类文本的新高度。
您可以通过在Zephyr Chat上尝试免费演示来体验其改进的性能。
这段文字的中文翻译如下:
图片来自Zephyr Chat
访问Zephyr-7B
与Mistral 7B教程类似,我们将使用Hugging Face的transformers
加载和使用Zephyr-7B-beta
。这非常简单。
注意:如果您在加载模型时遇到问题,请查看推理 Kaggle 笔记本。
首先,安装所有必要的库。确保您正在运行最新版本,否则它将无法正常工作。
!pip install -q -U transformers
!pip install -q -U accelerate
!pip install -q -U bitsandbytes
然后,从transformers库中加载Pytorch库和pipeline模块。
import torch
from transformers import pipeline
我们将使用模型名称torch_dtype
和device_map
参数构建文本生成管道。
在device_map
中的“auto”表示它可以使用多个GPU来更快地生成响应。
torch.bfloat16
(脑浮点)是一种16位浮点数据类型,其指数大小与torch.float32
相同,但尾数大小较小。这样可以实现更快的计算和更低的内存使用,但也会降低精度和准确性。
model_name = "HuggingFaceH4/zephyr-7b-beta"
pipe = pipeline(
"text-generation",
model=model_name,
torch_dtype=torch.bfloat16,
device_map="auto",
)
我们需要为管道对象提供提示和其他必要的参数,并打印出响应。
prompt = "编写一个Python函数,可以从文件中清除HTML标签:"
outputs = pipe(
prompt,
max_new_tokens=300,
do_sample=True,
temperature=0.7,
top_k=50,
top_p=0.95,
)
print(outputs[0]["generated_text"])
这个回答非常令人印象深刻。它提供了带有注释的Python代码。
这段文字的中文翻译如下:
我们甚至可以通过以Zephyr-7B风格提供系统提示来自定义模型的响应。
我们将使用函数pipe.tokenizer.apply_chat_template
来使用一个字典列表创建提示。这些字典包含有关聊天助手角色和行为以及用户提示的信息。
messages = [
{
"role": "system",
"content": "您是一位熟练的软件工程师,能够持续产出高质量的Python代码。",
},
{
"role": "user",
"content": "编写一个Python代码以星形图案显示文本。",
},
]
prompt = pipe.tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
最后,我们将传递pipeline对象prompt和其他参数来生成回复。
outputs = pipe(
prompt,
max_new_tokens=300,
do_sample=True,
temperature=0.7,
top_k=50,
top_p=0.95,
)
print(outputs[0]["generated_text"])
Zephyr-7B提供了最优化的解决方案,并附带函数的解释和输出。这太棒了。人们应该使用它来生成Python代码。
这段文字的中文翻译如下:
微调Zephyr-7B
在本节中,我们将学习如何使用Kaggle的免费GPU对自定义数据集上的Zephyr-7B-beta模型进行微调。按照说明,您将能够在仅两个小时内准备好部署您的模型。
注意:如果您在训练模型时遇到问题,请查看Fine-tuning Kaggle Notebook。
设置
首先,安装必要的Python库来加载数据集和模型,并进行微调。
%%capture
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U peft
%pip install -U accelerate
%pip install -U trl
然后,我们将加载必要的模块,这些模块将使我们的生活更轻松,并帮助我们在有限的内存下训练模型。
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
HfArgumentParser,
TrainingArguments,
pipeline,
logging,
)
from peft import (
LoraConfig,
PeftModel,
prepare_model_for_kbit_training,
get_peft_model,
)
import os, torch, wandb
from datasets import load_dataset
from trl import SFTTrainer
这部分是特定于Kaggle笔记本的。我们已经在Kaggle secrets中添加了Hugging Face和Weights & Biases(wandb)的API密钥。我们将安全地使用它们将模型上传到Hugging Face Hub,并在Weights and Biases服务器上实时监控模型训练过程。
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()
secret_hf = user_secrets.get_secret("HUGGINGFACE_TOKEN")
secret_wandb = user_secrets.get_secret("wandb")
使用CLI和API密钥登录到Hugging Face。
!huggingface-cli login --token $secret_hf
同样地,登录到wandb并启动项目。
# 监控LLM
wandb.login(key = secret_wandb)
run = wandb.init(
project='Fine tuning Zephyr 7B',
job_type="training",
anonymous="allow"
)
提供用于微调、保存和推送到Hugging Face hub的基础模型、数据集和新模型的名称。
base_model = "HuggingFaceH4/zephyr-7b-beta"
dataset_name = "THUDM/AgentInstruct"
new_model = "zephyr-7b-beta-Agent-Instruct"
AgentInstruct 数据集
我们将加载数据集,然后使用 format_prompt
函数将其转换为 Zephyr-7B 提示样式。该函数从数据集中提取角色和内容,并将它们转换为以系统提示开头、以默认指令结尾的长字符串。
#导入数据集
dataset = load_dataset(“THUDM/AgentInstruct”, split=”train”)
def format_prompt(sample):
intro = “下面是一个用户和您之间的对话。”
end = “指令:根据对话编写适当的回复。”
try:
formatted_conversations = “\n”.join(
f”<{resp[‘from’]}>: {resp[‘value’]}”
for resp in sample[“conversations”]
)
sample[“text”] = f”{intro}\n\n{formatted_conversations}\n\n{end}”
except (TypeError, KeyError):
raise ValueError(“输入样本的格式无效。”)
return sample
dataset = dataset.map(
format_prompt,
remove_columns=[“conversations”]
)
dataset[“text”][100]
加载模型和分词器
我们将从Hugging Face下载并加载一个4位精度的模型,以实现更快的训练。这对于具有有限VRAM的GPU进行微调是必要的。之后,我们将加载分词器并配置它以解决fp16的问题。
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type=”nf4″,
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=False,
)
model = AutoModelForCausalLM.from_pretrained(
base_model,
load_in_4bit=True,
quantization_config=bnb_config,
torch_dtype=torch.bfloat16,
device_map=”auto”,
trust_remote_code=True,
)
model.config.use_cache = False
model.config.pretraining_tp = 1
model.gradient_checkpointing_enable()
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True)
tokenizer.padding_side = ‘right’
tokenizer.pad_token = tokenizer.eos_token
tokenizer.add_eos_token = True
tokenizer.add_bos_token, tokenizer.add_eos_token
构建模型
我们现在将向我们的模型添加一个适配器层,以便更高效地进行微调。我们将只更新适配器层中的参数,以加快训练速度。
model = prepare_model_for_kbit_training(model)
peft_config = LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM",
target_modules=['up_proj', 'base_layer', 'down_proj']
)
model = get_peft_model(model, peft_config)
训练模型
在训练参数中设置正确的超参数非常重要。您可以通过阅读Fine-Tuning LLaMA 2教程了解每个超参数。
然后,我们将使用HuggingFace的TRL库来构建SFT Trainer,其中包括模型、数据集、Lora配置、分词器和训练参数等必要组件。
最后,我们将开始训练。
# 超参数
training_arguments = TrainingArguments(
output_dir=”./results”,
num_train_epochs=1,
per_device_train_batch_size=4,
gradient_accumulation_steps=1,
optim=”paged_adamw_32bit”,
save_steps=25,
logging_steps=25,
learning_rate=2e-4,
weight_decay=0.001,
fp16=False,
bf16=False,
max_grad_norm=0.3,
max_steps=-1,
warmup_ratio=0.03,
group_by_length=True,
lr_scheduler_type=”constant”,
report_to=”wandb”
)
# 设置sft参数
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=peft_config,
max_seq_length= 512,
dataset_text_field=”text”,
tokenizer=tokenizer,
args=training_arguments,
packing= False,
)
trainer.train()
在大约1小时40分钟后,训练完成,并观察到训练损失逐渐减小。
这段文字的中文翻译如下:
这是来自Weights & Biases的更详细的模型评估。
这段文字的中文翻译如下:
我们现在将保存模型,完成wandb实例,并将模型推送到Hugging Face Hub。这将创建一个带有保存的适配器文件的模型仓库。
# 保存微调后的模型
trainer.model.save_pretrained(new_model)
wandb.finish()
trainer.model.push_to_hub(new_model, use_temp_dir=False)
这是一个精调模型仓库,您可以使用以下链接访问:hf.co/kingabzpro/zephyr-7b-beta-Agent-Instruct
这段文字的中文翻译如下:
现在是时候在各种提示下测试我们调整完善的模式了。
我们已经向我们的模型询问了如何在DataCamp上使用Python的问题。
logging.set_verbosity(logging.CRITICAL)
prompt = "如何在DataCamp上使用Python在线编程?"
pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, max_length=200)
result = pipe(prompt)
print(result[0]['generated_text'])
我们可以看到,响应类似于AgentGPT,这是一个自动化的AI代理,使用各种扩展执行多个任务,并实现类似于先进AI机器的结果。这些机器可以执行类似于人类的任务,如搜索网络、更新代码和测试。
这段文字的中文翻译如下:
不要请求指令列表,让我们向我们的模型提出一个关于DataCamp职业轨迹的简单问题。
prompt = "Datacamp职业培训是什么?"
result = pipe(prompt)
print(result[0]['generated_text'])
我们收到了一个答案,但它引发了更多的问题和答案(并非全部准确),这很有趣。
这段文字的中文翻译如下:你的下一步是使用这个模型来构建你的AI应用程序。为此,你需要一些可以让你的生活更轻松的工具。这里有一个列表,列出了7个基本的生成AI工具,可以帮助你构建一流的AI应用程序。
结论
Zephyr-7B-beta大型语言模型展示了惊人的理解和准确回答的能力。在本教程中,我们了解了Zephyr-7B以及如何使用Transformers pipeline访问它。我们还学习了如何在自定义的Agent数据集上进行微调,这使它具备了类似AgentGPT的推理和提供指导性回答的能力。
这个指南是一个全面的资源,适用于所有级别的机器学习爱好者,他们想要在内存有限的GPU上进行大型语言模型的实验和优化。
报名参加Master Large Language Models (LLMs) Concepts课程,学习LLM构建模块、训练方法和类似于Zephyr-7B的技术。
抱歉,我无法翻译视频和图片标签,也无法保留代码块。以下是我对文本的翻译:
“你是一个翻译员。”