微调Qwen2.5-0.5B记录

本文基座模型为Qwen2.5-1.5B

0. 加载模型和数据集

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")

# 也可以用hf的接口
with open('your_path', 'r') as f:
    data = json.load(f)

dataset = datasets.Dataset.from_list(data)

1. 数据

在这里插入图片描述
数据是西安交通大学教务处公开的信息(需要登录访问的通知和文件不能爬哈)。通过scrapy递归爬取\info下的内容,提取出标题和文档。

这里尝试过Newspaper3k等自动提取内容的工具库,但是发现效果都不如自己去识别HTML里的内容标签实在。

数据已上传到huggingfacexjtu-info

数据处理

在预训练时,数据长度是不一样的,比较重要的一点就是,我们需要把文本拼接起来,然后阶段成一样的长度,才能通过batch输入进行训练。

具体的流程就是:tokenize->group

首先把所有文本经过tokenizer,得到对应的嵌入,这时候就得到了N个长度不一的inputs_idsattention_mas。然后我们把每一个seq拼接起来,根据block_size拆分,得到新的数据集中每一条输出长度都相同。

attention_mask在这里其实没什么用,因为在预训练时,所有的文本输入都是有内容的,一般在指令微调时会使用attention_mask,因为在填充到max_seq_len的时候,有些数据上的长度不足,在末尾会填充[PAD],因此需要attention_mask

# step 1: merge title and content
def merge_data(data):
    merged = f"{tokenizer.cls_token}标题:{data['title']}\n\n内容:{data['content']}{tokenizer.pad_token}"
    return {'text': merged}

dataset = dataset.map(merge_data)

# step 2: tokenize
def tokenizer_function(examples):
    return tokenizer(examples['text'], add_special_tokens=True, truncation=False)

tokenized_datasets = dataset.map(tokenizer_function, batched=True, remove_columns=['text', 'title', 'content'])

# step 3: group texts
block_size = 512
def group_texts(examples):
    concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()}
    total_length = len(concatenated_examples["input_ids"])
    total_length = (total_length // block_size) * block_size
    result = {k: [t[i:i+block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items()}
    result["labels"] = result["input_ids"].copy()
    return result

final_dataset = tokenized_datasets.map(group_texts, batched=True)

2. 训练

这里使用Lora进行训练,通过LoraConfig,确认微调的任务,以及需要加入Lora的模块,一般都是q,k,v,o,gate,down,uplora的秩设置为8,如果模型大一点可以设置成16,32。alpha是lora模块的权重。

然后就是训练时的设置,训练步数,每个设备的batch数,学习率等等,这里不一一介绍。

最后只需要调用Trainer,输入我们的模型和配置以及数据集即可开始训练。

# step 4: define training arguments
peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["q_proj",
                    "v_proj",
                    "k_proj",
                    "o_proj",
                    "gate_proj",
                    "down_proj",
                    "up_proj"
                    ],
    r=8,
    lora_alpha=16,
    lora_dropout=0.05
)

model = get_peft_model(model, peft_config)
model.print_trainable_parameters()


args=TrainingArguments(
    output_dir="./results",
    num_train_epochs=2,
    per_device_train_batch_size=2,
    warmup_steps=100,
    weight_decay=0.01,
    learning_rate=5e-5,
    logging_steps=10,
    save_strategy='steps',
    save_steps=10,
    save_total_limit=2,
    )

trainer = Trainer(
    model=model,
    args=args,
    train_dataset=final_dataset,
)

trainer.train()

Hugging facetransformers还提供了很多方法,例如BitandBytes量化加载,或者混合精度训练,这里没有一一尝试,有兴趣的可以自己去了解,使用也很简单,transformers都帮我们封装好了。

3. 分布式训练

我们可以使用Accelerate来分布式以及加速训练。使用Trainer这种方法训练是完美兼容Accelerate的,你甚至不用在训练代码里导入Accelerate

只需要在命令行里输入accelerate config,然后配置对应的选项,这里只有单机多卡,于是选择了多卡,2卡,卡1和卡2。你还可以选择是否使用DeepSpeedMegatron。然后选择混合精度训练,fp16还是bf16。
在这里插入图片描述

4. 训练结果

预训练前:模型不知道学校具体有哪些教室,也不知道考场在哪。
在这里插入图片描述

训练后:模型知道了考试时间以及地点,虽然不是很准确,但是掌握了大致的知识。
在这里插入图片描述

模型照猫画虎给出了回答,并且模仿了教务的口吻,但是回答的内容其实很不准,下一步通过RAG,让模型可以找出准确的内容,给出正确的答案。

### 微调Qwen2.5-0.5B模型(GGUF格式) 对于希望深入探索并优化特定应用场景下的性能而言,微调预训练的语言模型是一个重要的环节。针对Qwen2.5-0.5B模型,在Windows环境下利用ModelScope平台下载相应版本之后,可以按照如下方法来进行微调操作。 #### 准备工作 为了能够顺利地进行微调流程,首先需要确保已经成功安装了必要的依赖库以及配置好了开发环境。这通常涉及到Python环境的搭建、PyTorch或其他框架的支持包安装等前置条件[^1]。 #### 数据集准备 拥有高质量的数据集是实现有效微调的基础。应当收集与目标领域紧密关联的文字资料作为训练素材,并对其进行适当的前处理,比如分词、去除噪声数据等。这些准备工作有助于提高最终模型的表现力和适用范围。 #### 实施微调 当一切就绪后,可以通过定义自定义的任务来启动微调过程: ```bash ollama create fine_tuned_model_name -f Modelfile_path ``` 这里`fine_tuned_model_name`代表新创建的经过微调后的模型名;而`Modelfile_path`则是指向包含具体参数设置及结构描述的文件位置。此命令会基于现有的基础架构之上执行进一步的学习调整,使得模型更加贴合实际需求场景[^2]。 需要注意的是,由于涉及到了较为专业的技术和工具链使用,建议参考官方文档获取最权威的操作指南和支持信息。此外,考虑到计算资源消耗较大等因素,在实施过程中可能还需要额外注意硬件兼容性和效率优化等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

volcanical

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值