lora微调记录
lora吧
全部回复
仅看楼主
level 1
xwbmotor 楼主
1-download
!git clone https://gitclone.com/github.com/hiyouga/LLaMA-Factory.git
%cd LLaMA-Factory
%ls
!pip install -e .[torch,bitsandbytes]
!pip install modelscope
from modelscope.hub.snapshot_download import snapshot_downloadmodel_dir = snapshot_download( 'AI-ModelScope/gemma-2b-it', cache_dir='/root/models/gemma-2b-it' )
from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download(
'AI-ModelScope/gemma-2b-it',
cache_dir='/root/models/gemma-2b-it'
)
---
2-data
!pip install pandas
import pandas as pd
import json
instruction="Determine if the two sentences are semantically equivalent . Output '1' if they are equivalent, '0' if they are not."
df = pd.read_csv('./LLaMA-Factory/train_data/MRPC_tsv/train.tsv',sep='\t',on_bad_lines='skip')
df.tail(5)
# 创建一个空列表来存储转换后的数据
alpaca_data = []
for index, row in df.iterrows():
# 创建一个字典来存储当前行的数据
data_point = {
"instruction": instruction,
"input": f"Sentence 1: {row['#1 String']}\nSentence 2: {row['#2 String']}",
"output": str(row['Quality'])
}
# 将字典添加到列表中
alpaca_data.append(data_point)
# 将列表转换为JSON字符串
alpaca_json = json.dumps(alpaca_data, indent=4)
alpaca_data[-1]
#保存到文件
with open('LLaMA-Factory/data/MRPC_train_data.json', 'w') as f:
f.write(alpaca_json)
## 2.2 编辑dataset_info.json
> 将生成的文件名,添加到LLama-factory/data/dataset_info.json 中
```json
{
"MRPC_train_data": {
"file_name": "MRPC_train_data.json"
},
"identity": {
"file_name": "identity.json"
},
"alpaca_en_demo": {
"file_name": "alpaca_en_demo.json"
},...
}
```
df = pd.read_csv('./LLaMA-Factory/train_data/MRPC_tsv/dev.tsv',sep='\t',on_bad_lines='skip')
df.tail()
# 创建一个空列表来存储转换后的数据
alpaca_data = []
for index, row in df.iterrows():
# 创建一个字典来存储当前行的数据
data_point = {
"instruction": instruction,
"input": f"Sentence 1: {row['#1 String']}\nSentence 2: {row['#2 String']}",
"output": str(row['Quality'])
}
# 将字典添加到列表中
alpaca_data.append(data_point)
# 将列表转换为JSON字符串
alpaca_json = json.dumps(alpaca_data, indent=4)
#保存到文件
with open('LLaMA-Factory/data/MRPC_test_data.json', 'w') as f:
f.write(alpaca_json)
(parquet)
df = pd.read_parquet('./LLaMA-Factory/train_data/MRPC_hf/train-00000-of-00001.parquet')
df.tail()
# 创建一个空列表来存储转换后的数据
alpaca_data = []
for index, row in df.iterrows():
# 创建一个字典来存储当前行的数据
data_point = {
"instruction": instruction,
"input": f"Sentence 1: {row['sentence1']}\nSentence 2: {row['sentence2']}",
"output": str(row['label'])
}
# 将字典添加到列表中
alpaca_data.append(data_point)
# 将列表转换为JSON字符串
alpaca_json = json.dumps(alpaca_data, indent=4)
alpaca_data[-1]
#保存到文件
with open('LLaMA-Factory/data/MRPC_train_data.json', 'w') as f:
f.write(alpaca_json)
(jsonl)
# 创建一个空列表来存储转换后的数据
alpaca_data = []
# 打开并读取JSONL文件
with open('./LLaMA-Factory/train_data/MRPC_hf/train.jsonl', 'r') as f:
for line in f:
# 解析每一行JSON数据
data_point = json.loads(line)
# 创建一个字典来存储转换后的数据
alpaca_point = {
"instruction": instruction,
"input": f"Sentence 1: {data_point['text1']}\nSentence 2: {data_point['text2']}",
"output": str(data_point['label'])
}
# 将字典添加到列表中
alpaca_data.append(alpaca_point)
alpaca_data[-1]
#保存到文件
with open('LLaMA-Factory/data/MRPC_train_data.json', 'w') as f:
f.write(alpaca_json)
---
3
%cd LLaMA-Factory/
# 使用物理路径 gemma-2b-it 参见 《1训练环境准备》 模型下载 魔搭下载的路径需要手工验证下,很怪
model_name_or_path="/root/models/gemma-2b-it/AI-ModelScope/gemma-2b-it"
# 保存 LoRA 适配器的路径
adapter_name_or_path="train_MRPC",
import json
args = dict(
stage="sft", # 进行指令监督微调
do_train="True",
model_name_or_path=model_name_or_path,
preprocessing_num_workers=16,
finetuning_type="lora", # 使用 LoRA 适配器来节省显存
template="gemma", # 使用 gemma 提示词模板
flash_attn="auto",
dataset_dir="data",
dataset="MRPC_train_data", # 使用 MRPC_train_data数据集 参见 《2数据准备.ipynb》 2.2节
cutoff_len=1024,
learning_rate=5e-05, # 学习率大小
num_train_epochs=3.0, # 训练轮数
max_samples=100000, # 使用每个数据集中的样本条数
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
lr_scheduler_type="cosine", # 使用余弦学习率退火算法
max_grad_norm=1.0, # 将梯度范数裁剪至 1.0
logging_steps=10, # 每 10 步输出一个记录
save_steps=1000, # 每 1000 步保存一个检查点
warmup_steps=0, # 使用预热学习率,这里没有使用,可以设置步数
optim="adamw_torch",
output_dir="train_MRPC", # 保存 LoRA 适配器的路径
plot_loss=True,
ddp_timeout=180000000,
include_num_input_tokens_seen=True,
lora_rank=8,
lora_alpha=16,
lora_dropout=0, #LoRA 随机丢弃率
fp16=True, # 使用 float16 混合精度训练
lora_target="all" # 添加 LoRA 适配器至全部线性层
)
json.dump(args, open("train_gemma.json", "w", encoding="utf-8"), indent=2)
!llamafactory-cli train train_gemma.json
from IPython.display import Image
# 指定图片的路径
image_path = 'train_MRPC/training_loss.png'
# 显示图片
Image(filename=image_path)
from llamafactory.chat import ChatModel
from llamafactory.extras.misc import torch_gc
from tqdm import tqdm
import json
import pandas as pd
# 读取评估集的JSON文件
with open('data/MRPC_test_data.json', 'r') as f:
evaluation_data = json.load(f)
args = dict(
model_name_or_path=model_name_or_path,
adapter_name_or_path="train_MRPC", # 加载之前保存的 LoRA 适配器
template="gemma", # 和训练保持一致
finetuning_type="lora" # 和训练保持一致
)
chat_model = ChatModel(args)
results = []
# 使用 tqdm 添加进度条
for sample in tqdm(evaluation_data, desc="Evaluating"):
instruction = sample['instruction']
input_text = sample['input']
expected_output = sample['output']
messages = [
{"role": "user", "content": f"{instruction}\n{input_text}"}
]
response = ""
for new_text in chat_model.stream_chat(messages):
response += new_text
# 记录模型的输出和预期输出
results.append({
"instruction": instruction,
"input": input_text,
"expected_output": expected_output,
"model_output": response.strip()
})
# 将结果存储到 DataFrame 中
df = pd.DataFrame(results)
# 保存 DataFrame 到 CSV 文件
df.to_csv('evaluation_results.csv', index=False)
torch_gc()
#评估
!pip install scikit-learn
import pandas as pd
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 读取 CSV 文件
df = pd.read_csv('evaluation_results.csv')
# 确保 model_output 和 expected_output 列是字符串类型
df['model_output'] = df['model_output'].astype(str)
df['expected_output'] = df['expected_output'].astype(str)
# 将模型输出和预期输出转换为二分类标签
df['model_output_binary'] = df['model_output'].apply(lambda x: 1 if x.strip() == '1' else 0)
df['expected_output_binary'] = df['expected_output'].apply(lambda x: 1 if x.strip() == '1' else 0)
# 计算评估指标
accuracy = accuracy_score(df['expected_output_binary'], df['model_output_binary'])
precision = precision_score(df['expected_output_binary'], df['model_output_binary'])
recall = recall_score(df['expected_output_binary'], df['model_output_binary'])
f1 = f1_score(df['expected_output_binary'], df['model_output_binary'])
# 打印评估指标
print(f"准确性 Accuracy: {accuracy:.4f}")
print(f"精确率 Precision: {precision:.4f}")
print(f"召回率 Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")
2024年08月01日 01点08分 1
1