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

如何使用Hugging Face的AutoTrain对Mistral AI 7B语言模型进行微调

 

随着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.1Mistral 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_datasetimport pandas as pd# 加载数据集train= load_dataset("tatsu-lab/alpaca",split='train[:10%]')train = pd.DataFrame(train)

 

上面的代码将获取实际数据的10%样本。对于本教程,我们只需要这么多数据,因为训练更大的数据会花费更长时间。我们的数据样本如下图所示。

  

数据集已经包含了我们需要对LLM模型进行微调所需的文本列的格式。这就是为什么我们不需要执行任何操作。然而,如果您有另一个需要格式化的数据集,我可以提供一段代码。

def text_formatting(data):    # 如果输入列不为空    if data['input']:        text = f"""下面是一条描述任务的指令,配有提供进一步上下文的输入。请编写一个适当完成请求的响应。\n\n### 指令:\n{data["instruction"]} \n\n### 输入:\n{data["input"]}\n\n### 响应:\n{data["output"]}"""    else:        text = f"""下面是一条描述任务的指令。请编写一个适当完成请求的响应。\n\n### 指令:\n{data["instruction"]}\n\n### 响应:\n{data["output"]}"""     return texttrain['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] 指令 [/INST] 模型答案</s>[INST] 后续指令 [/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 texttrain_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 = Falsehf_token = "YOUR HF TOKEN"repo_id = "username/repo_name"

 

最后,我们将在以下变量中初始化模型参数信息。您可以更改它们以查看结果是否良好。

learning_rate = 2e-4num_epochs = 4batch_size = 1block_size = 1024trainer = "sft"warmup_ratio = 0.1weight_decay = 0.01gradient_accumulation = 4use_fp16 = Trueuse_peft = Trueuse_int4 = Truelora_r = 16lora_alpha = 32lora_dropout = 0.045

 

我们可以调整许多参数,但在本文中不讨论它们。一些改善LLM微调的技巧包括使用较低的学习率来保持预训练的表示,相反地,通过调整epoch的数量来避免过拟合,使用更大的批量大小来保持稳定性,或者如果存在内存问题,调整梯度累积。

当所有信息准备好之后,我们将设置环境以接受先前设置的所有信息。

import osos.environ["PROJECT_NAME"] = project_nameos.environ["MODEL_NAME"] = model_nameos.environ["PUSH_TO_HUB"] = str(push_to_hub)os.environ["HF_TOKEN"] = hf_tokenos.environ["REPO_ID"] = repo_idos.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, AutoTokenizermodel_path = "my_autotrain_llm"tokenizer = AutoTokenizer.from_pretrained(model_path)model = AutoModelForCausalLM.from_pretrained(model_path)

 

准备好要使用的模型和标记器后,我们将尝试使用一个输入示例来使用模型。

input_text = "给出三个保持健康的建议。"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)

 

输出:

给出三个保持健康的建议。

  1. 均衡饮食:确保在您的饮食中包括大量水果、蔬菜、瘦肉和全谷物。这将帮助您获得所需的营养,保持健康和精力充沛。
  2. 定期锻炼:每天至少进行30分钟的中等强度锻炼,如快走或骑自行车。这将帮助您保持健康的体重,减少慢性疾病的风险,改善您的整体身体和心理健康。
  3. 获得足够的睡眠:每晚争取7-9小时的优质睡眠。这将帮助您在白天感觉更加休息和警觉,还将帮助您保持健康的体重,减少慢性疾病的风险。

模型的输出已经接近我们训练数据的实际输出,如下图所示。

  1. 均衡饮食,确保摄入足够的水果和蔬菜。
  2. 定期锻炼,让身体保持活跃和强壮。
  3. 保证充足的睡眠,并保持固定的睡眠时间。

对于其尺寸来说,Mistral模型确实非常强大,简单的微调已经显示出了有希望的结果。尝试使用您的数据集,看看是否适合您的工作。

结论

Mistral AI 7B系列模型是一个强大的LLM模型,比LLaMA具有更高的性能和出色的适应性。由于该模型在Hugging Face上是可用的,我们可以使用HuggingFace AutoTrain来进行模型的微调。目前在Hugging Face上有两个可供微调的模型;Mistral 7B v0.1是基础模型,Mistral 7B Instruct v0.1用于对话和问题回答。即使在快速训练过程中,微调也显示出了有希望的结果。

[Cornellius Yudha Wijaya](https://www.linkedin.com/in/cornellius-yudha-wijaya/) 是一位数据科学助理经理和数据作家。他全职在Allianz Indonesia工作,热衷于通过社交媒体和写作媒体分享Python和数据技巧。