介绍
近年来,大型语言模型(LLM)已经改变了人们的工作方式,并且已经在教育、营销、研究等许多领域被使用。鉴于其潜力,LLM可以通过进行fine-tuning来更好地解决我们的业务问题。这就是为什么我们需要进行LLM fine-tuning。
我们想要进行LLM fine-tuning的原因有很多,包括采用特定领域的用例、提高准确性、数据隐私和安全、控制模型偏见等等。有了所有这些好处,学习如何进行LLM fine-tuning以进行生产是非常重要的。
一种自动执行LLM fine-tuning的方法是使用Hugging Face的AutoTrain。HF AutoTrain是一个无代码平台,具有Python API,用于训练各种任务的最新模型,例如计算机视觉、表格和自然语言处理任务。即使我们对LLM fine-tuning过程了解不多,我们也可以使用AutoTrain的功能。
那么,它是如何工作的?让我们进一步探讨。
开始使用AutoTrain
即使HF AutoTrain是一个无代码解决方案,我们仍然可以在AutoTrain之上使用Python API进行开发。我们将探索代码路线,因为无代码平台在训练方面不够稳定。但是,如果您想使用无代码平台,我们可以使用以下页面创建AutoTrain空间。下面的图像显示了整个平台。
要使用Python API对LLM进行fine-tuning,我们需要安装Python包,您可以使用以下代码运行。
pip install -U autotrain-advanced
此外,我们将使用来自HuggingFace的Alpaca示例数据集,该数据集需要获取datasets包。
pip install datasets
然后,使用以下代码获取所需的数据。
from datasets import load_dataset # Load the datasetdataset = load_dataset("tatsu-lab/alpaca") train = dataset['train']
此外,由于我们需要这些数据进行fine-tuning,我们将以CSV格式保存数据。
train.to_csv('train.csv', index = False)
准备好环境和数据后,让我们尝试使用HuggingFace AutoTrain来对LLM进行fine-tuning。
Fine-tuning过程和评估
我将从AutoTrain示例中调整fine-tuning过程,您可以在此处找到相关示例。要启动这个过程,我们将把用于fine-tuning的数据放入名为data的文件夹中。
对于本教程,我尝试只抽样100行数据,这样我们的训练过程可以更快。在数据准备好后,我们可以使用Jupyter Notebook来fine-tuning我们的模型。请确保数据包含’text’列,因为AutoTrain将从该列读取数据。
首先,使用以下命令运行AutoTrain setup。
!autotrain setup
接下来,我们提供AutoTrain运行所需的信息。以下是有关项目名称和所需的预训练模型的信息。您只能选择HuggingFace中提供的模型。
project_name = 'my_autotrain_llm'model_name = 'tiiuae/falcon-7b'
然后,如果要将您的模型推送到存储库或使用私有模型,则会添加HF信息。
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
当所有信息准备好后,我们将设置环境以接受先前设置的所有信息。
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}" )
如果您成功运行了AutoTrain,您应该在目录中找到以下文件夹,其中包含AutoTrain生成的所有模型和分词器。
为了测试模型,我们将使用HuggingFace转换器包和以下代码。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_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)
predicted_text = tokenizer.decode(output[0], skip_special_tokens=False)
print(predicted_text)
结果当然可以更好,但至少它更接近我们所提供的样本数据。我们可以尝试调整预训练模型和参数来改善微调。
成功微调的提示
有一些最佳实践你可能想知道,以改善微调过程,包括:
- 准备与代表性任务匹配的优质数据集,
- 研究我们使用的预训练模型,
- 使用适当的正则化技术以避免过拟合,
- 尝试从小到大逐渐增加的学习率,
- 由于LLM通常能够快速学习新数据,所以使用较少的迭代次数作为训练次数,
- 不要忽视计算成本,因为随着数据、参数和模型的增大,计算成本会增加,
- 确保遵守使用数据时的道德考虑。
结论
对大型语言模型进行微调对于我们的业务流程是有益的,特别是如果我们有特定的要求。通过使用HuggingFace AutoTrain,我们可以加快训练过程,并轻松地使用现有的预训练模型对模型进行微调。
[Cornellius Yudha Wijaya](https://www.linkedin.com/in/cornellius-yudha-wijaya/)是一名数据科学助理经理兼数据作家。在全职工作于Allianz Indonesia期间,他喜欢通过社交媒体和写作媒体分享Python和数据技巧。