如何使用Hugging Face AutoTrain微调Mistral AI 7B LLM

2023年11月10日 由 camellia 发表 1631 0
随着全球LLM研究的进步,许多模型变得更易于获取。其中一个小型但强大的开源模型是Mistral AI 7B LLM。该模型在许多用例的适应性上表现出色,其性能超过了LlaMA 2 13B在所有基准测试中的表现,它采用滑动窗口注意力(SWA)机制,且易于部署。

Mistral 7B的整体性能基准如下图所示。

21

Mistral 7B模型也可在HuggingFace中获取。因此,我们可以使用Hugging Face AutoTrain来微调模型,适配我们的用例。Hugging Face的AutoTrain是一个无代码平台,带有Python API,我们可以轻松地用它来微调HugginFace中可用的任何LLM模型。

这个教程会教我们如何使用Hugging Face AutoTrain微调Mistral AI 7B LLM。它是如何工作的?

环境与数据集准备

为了使用Python API微调LLM,我们需要安装Python包,可以使用以下代码运行。
pip install -U autotrain-advanced
此外,我们将使用HuggingFace中的Alpaca样本数据集,这需要datasets包来获取和transformers 包来操作Hugging Face模型。
pip install datasets transformers
接下来,我们需要格式化我们的数据,以便微调Mistral 7B模型。通常,Mistral发布了两个基础模型版本:Mistral 7B v0.1和 Mistral 7B Instruct v0.1。Mistral 7B v0.1是基础基线模型,而Mistral 7B Instruct v0.1则是已经针对会话和问答进行了微调的Mistral 7B v0.1模型。

我们需要一个包含文本列的CSV文件来使用Hugging Face AutoTrain进行微调。然而,在微调基础和指令模型时,我们将使用不同的文本格式。

首先,让我们看看我们用于示例的数据集。
from datasets import load_dataset
import pandas as pd

# Load the dataset
train= load_dataset("tatsu-lab/alpaca",split='train[:10%]')
train = pd.DataFrame(train)
上述代码将会取实际数据的10%样本。对于这个教程来说,我们只需要那么多,因为对于更大的数据将会需要更长的训练时间。我们的数据样本看起来像下图。

10%样本下

数据集已经包含了我们需要用来微调LLM模型的格式化文本列。这就是为什么我们不需要执行任何操作。然而,如果你有需要格式化的其他数据集,我会提供代码。
def text_formatting(data):

# If the input column is not empty
if data['input']:

text = f"""Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.\n\n### Instruction:\n{data["instruction"]} \n\n### Input:\n{data["input"]}\n\n### Response:\n{data["output"]}"""

else:

text = f"""Below is an instruction that describes a task. Write a response that appropriately completes the request.\n\n### Instruction:\n{data["instruction"]}\n\n### Response:\n{data["output"]}"""

return text

train['text'] = train.apply(text_formatting, axis =1)
对于 Hugging Face AutoTrain,我们需要 CSV 格式的数据,以便使用以下代码保存数据。
train.to_csv('train.csv', index = False)
然后,将 CSV 结果移动到名为 data 的文件夹中。这就是准备数据集以微调 Mistral 7B v0.1所需的全部内容。

如果你想微调 Mistral 7B Instruct v0.1以进行对话和问答,我们需要遵循 Mistral 提供的聊天模板格式,如下面的代码块所示。
<s>[INST] Instruction [/INST] Model answer</s>[INST] Follow-up instruction [/INST]
如果我们使用前面的示例数据集,则需要重新格式化文本列。我们将仅使用数据,而不为聊天模型提供任何输入。
train_chat = train[train['input'] == ''].reset_index(drop = True).copy()
然后,我们可以使用以下代码重新格式化数据。
def chat_formatting(data):

text = f"<s>[INST] {data['instruction']} [/INST] {data['output']} </s>"

return text

train_chat['text'] = train_chat.apply(chat_formatting, axis =1)
train_chat.to_csv('train_chat.csv', index =False)
我们最终会得到一个适合微调 Mistral 7B Instruct v0.1模型的数据集。

准备工作上

完成所有准备工作后,我们现在可以启动 AutoTrain 来微调我们的 Mistral 模型。

培训和微调
 
让我们设置 Hugging Face AutoTrain 环境来微调 Mistral 模型。首先,让我们使用以下命令运行 AutoTrain 安装程序。
!autotrain setup
接下来,我们将提供 AutoTrain 运行所需的信息。在本教程中,让我们使用 Mistral 7B Instruct v0.1。
project_name = 'my_autotrain_llm'
model_name = 'mistralai/Mistral-7B-Instruct-v0.1'
然后,如果你想将模型推送到存储库,我们将添加 Hugging Face 信息。
push_to_hub = False
hf_token = "YOUR HF TOKEN"
repo_id = "username/repo_name"
最后,我们将在下面的变量中启动模型参数信息。您可以更改它们以查看结果是否良好。
learning_rate = 2e-4
num_epochs = 4
batch_size = 1
block_size = 1024
trainer = "sft"
warmup_ratio = 0.1
weight_decay = 0.01
gradient_accumulation = 4
use_fp16 = True
use_peft = True
use_int4 = True
lora_r = 16
lora_alpha = 32
lora_dropout = 0.045
我们可以调整许多参数,但本文不会讨论它们。改进 LLM 微调的一些技巧包括使用较低的学习率来保持预先学习的表示,反之亦然,通过调整 epoch 的数量来避免过度拟合,使用更大的批量大小来保持稳定性,或者在有记忆问题时调整梯度累积。

当所有信息都准备好后,我们将设置环境以接受我们之前设置的所有信息。
import os
os.environ["PROJECT_NAME"] = project_name
os.environ["MODEL_NAME"] = model_name
os.environ["PUSH_TO_HUB"] = str(push_to_hub)
os.environ["HF_TOKEN"] = hf_token
os.environ["REPO_ID"] = repo_id
os.environ["LEARNING_RATE"] = str(learning_rate)
os.environ["NUM_EPOCHS"] = str(num_epochs)
os.environ["BATCH_SIZE"] = str(batch_size)
os.environ["BLOCK_SIZE"] = str(block_size)
os.environ["WARMUP_RATIO"] = str(warmup_ratio)
os.environ["WEIGHT_DECAY"] = str(weight_decay)
os.environ["GRADIENT_ACCUMULATION"] = str(gradient_accumulation)
os.environ["USE_FP16"] = str(use_fp16)
os.environ["USE_PEFT"] = str(use_peft)
os.environ["USE_INT4"] = str(use_int4)
os.environ["LORA_R"] = str(lora_r)
os.environ["LORA_ALPHA"] = str(lora_alpha)
os.environ["LORA_DROPOUT"] = str(lora_dropout)
我们将使用以下命令在笔记本中运行 AutoTrain。
!autotrain llm \
--train \
--model ${MODEL_NAME} \
--project-name ${PROJECT_NAME} \
--data-path data/ \
--text-column text \
--lr ${LEARNING_RATE} \
--batch-size ${BATCH_SIZE} \
--epochs ${NUM_EPOCHS} \
--block-size ${BLOCK_SIZE} \
--warmup-ratio ${WARMUP_RATIO} \
--lora-r ${LORA_R} \
--lora-alpha ${LORA_ALPHA} \
--lora-dropout ${LORA_DROPOUT} \
--weight-decay ${WEIGHT_DECAY} \
--gradient-accumulation ${GRADIENT_ACCUMULATION} \
$( [[ "$USE_FP16" == "True" ]] && echo "--fp16" ) \
$( [[ "$USE_PEFT" == "True" ]] && echo "--use-peft" ) \
$( [[ "$USE_INT4" == "True" ]] && echo "--use-int4" ) \
$( [[ "$PUSH_TO_HUB" == "True" ]] && echo "--push-to-hub --token ${HF_TOKEN} --repo-id ${REPO_ID}" )
如果微调过程成功,我们将拥有微调模型的新目录。我们将使用此目录来测试我们新微调的模型。
from transformers import AutoModelForCausalLM, AutoTokenizer

model_path = "my_autotrain_llm"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path)
模型和分词器准备好后,我们将使用输入示例来尝试该模型。
input_text = "Give three tips for staying healthy."
input_ids = tokenizer.encode(input_text, return_tensors="pt")
output = model.generate(input_ids, max_new_tokens = 200)
predicted_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(predicted_text)
输出:

给出三个保持健康的小贴士。

  • 吃均衡饮食:确保你的饮食中包含了丰富的水果、蔬菜、瘦肉和全谷物。这将帮助你获取所需营养,保持健康和充满活力。
  • 定期锻炼:每天至少进行30分钟的中等强度运动,例如快走或骑自行车。这将帮助你保持健康的体重,降低慢性病的风险,提高你的整体生理和心理健康。
  • 保证充足睡眠:每晚力求获得7-9小时的优质睡眠。这将帮助你在白天感到更加休息和警觉,并且也将帮助你保持健康的体重和降低慢性病的风险。
模型的输出接近我们训练数据的实际输出,如下:

  • 吃均衡饮食,确保包括大量的水果和蔬菜。
  • 定期锻炼,保持身体活跃和强壮。
  • 保证充足的睡眠,维持一致的睡眠习惯。

Mistral模型确实因其体积而强大,因为简单的微调已经显示出有希望的结果。尝试使用你的数据集,看看它是否适合你的工作。

结论

Mistral AI 7B家族模型是一个性能强大的LLM模型,优于LLaMA,并且具有极好的适应性。由于该模型可在Hugging Face中获取,我们可以使用HuggingFace AutoTrain来微调模型。目前在Hugging Face中有两个可供微调的模型;Mistral 7B v0.1适用于基础基线模型,而Mistral 7B Instruct v0.1适用于会话和问答。即使是快速的训练过程,微调也展现出了有希望的结果。
文章来源:https://www.kdnuggets.com/how-to-finetune-mistral-ai-7b-llm-with-hugging-face-autotrain
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消