如何使用Hugging Face AutoTrain微调Mistral AI 7B LLM
2023年11月10日 由 camellia 发表
1631
0
随着全球LLM研究的进步,许多模型变得更易于获取。其中一个小型但强大的开源模型是Mistral AI 7B LLM。该模型在许多用例的适应性上表现出色,其性能超过了LlaMA 2 13B在所有基准测试中的表现,它采用滑动窗口注意力(SWA)机制,且易于部署。
Mistral 7B的整体性能基准如下图所示。
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%样本。对于这个教程来说,我们只需要那么多,因为对于更大的数据将会需要更长的训练时间。我们的数据样本看起来像下图。
数据集已经包含了我们需要用来微调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