window系统使用transformers库和SFT本地微调Qwen模型

从0开始使用pycharm搭建python环境,下载模型权重,安装依赖,运行模型,本地微调

一、文档说明与环境准备

1.1 文档说明

访问qwen开源代码,了解模型差异和使用教程

https://github.com/QwenLM/Qwen
https://qwen.readthedocs.io/zh-cn/latest/getting_started/quickstart.html

1.2 运行环境准备

下载pycharm,一直下一步安装即可,使用pycharm提供的虚拟环境部署运行项目

二、相关文件下载

2.1 安装虚拟环境

#安装本地python虚拟环境
PS D:\workspace\AI\code\scratch-llm-main> python -m venv qwenvm
#激活
PS D:\workspace\AI\code\scratch-llm-main> qwenvm\scripts\activate

2.2 模型文件下载
推荐使用国内的模型库 魔搭或者huggingface镜像,模型下的全部文件都要下载

https://www.modelscope.cn/
https://hf-mirror.com/
https://huggingface.co/

可以手动下载也可以使用命令行下载

(qwenvm) PS D:\workspace\AI\code\scratch-llm-main> modelscope download --model Qwen/Qwen2.5-0.5B-Instruct

下载完成后的目录

下载微调代码demo (demo中包含测试训练数据集

https://github.com/FutureAI-X/scratch-llm
代码目录

三、安装项目依赖

#导包,可以使用镜像加速下载
 pip install --upgrade pip
 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

#也可以只安装需要的依赖
pip install torch
pip install datasets
pip install --no-cache-dir transformers -i https://pypi.tuna.tsinghua.edu.cn/simple

#在代码运行过程中,根据提示额外安装一些依赖
 pip install accelerate==0.27.2
 pip install --no-cache-dir trl==0.13.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

四、在本地虚拟环境中推理

第一步:指定本地地址,加载模型

from transformers import AutoModelForCausalLM, AutoTokenizer

# model_name = "Qwen/Qwen2.5-0.5B-Instruct"
model_name = r"D:/workspace/AI/modelspace/Qwen2___5-0___5B-Instruct"
# 加载预训练模型,自动推断和选择 数据类型和设备
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
print("1.model加载成功")

第二步:加载分词器

prompt = "介绍一下浙江,他的省会在哪里"
messages = [
    {"role": "system", "content": "You are Qwen, 一个大聪明."},
    {"role": "user", "content": prompt},
]
# 格式化输入
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,#不分词,展示原始文本格式
    add_generation_prompt=True,#添加生成提示,会生成更多的响应
)
#将格式化的文本转为模型输入,并转换成pytorch张量,移动到指定设备
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# 生成文本
generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512 #最大token
)
#从生成的id中提取新生成的id
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
#使用分词器将id解码成文本,并跳过特殊token
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

第三步:启动推理脚本(可以使用pycharm右键运行文件)

 python .\qwenquikstart.py

运行结果

五、在本地虚拟环境中进行微调

配置训练参数,执行本地训练

06_pretrain_province_qwen2_trainer.py(可以使用pycharm右键运行文件)

"""
自定义 Transformer 模型预训练
模型:自定义 Transformer 模型
数据集:省份介绍/省会数据
方式:使用 Hugging Face 的 trainer 类
"""
# 安装加载依赖库
import torch
from datasets import load_dataset
from transformers import AutoTokenizer, TrainingArguments, Trainer

from model_define.model_qwen.configuration_qwen2 import Qwen2Config
from model_define.model_qwen.modeling_qwen2 import Qwen2ForCausalLM
device = 'cuda' if torch.cuda.is_available() else 'cpu'
"""
MODULE 2 Tokenizer 与 Model 定义
"""
# 2.1 初始化 Tokenizer(使用 Qwen 2.5 的 Tokenizer)
# tokenizer = AutoTokenizer.from_pretrained("../tokenizer_file/tokenizer_qwen")
tokenizer = AutoTokenizer.from_pretrained("D:/workspace/AI/modelspace/Qwen2___5-0___5B-Instruct")

# 2.2初始化模型参数
config = Qwen2Config()
config.max_position_embeddings = 32
config.hidden_size = 64
config.num_attention_heads = 8
config.num_key_value_heads = 2
config.num_hidden_layers = 4

# 2.3 初始化模型
model = Qwen2ForCausalLM(config)
model = model.to(device)
"""
MODULE 3 数据集加载与Token化
"""
# 3.1 加载数据集
dataset = load_dataset('json', data_files={"train": f"../dataset_file/dataset_province/{dataset_file_name}.jsonl"})

# 3.2 定义数据集[token化]处理函数
def tokenize_function(batch):
    """
    对原始文本进行token化,生成新的参数:
        input_ids       token化之后的数值
        attention_mask  损失掩码,为1表示需要计算损失,为0表示不计算损失
    """
    tokenizer_temp = tokenizer(batch["text"], padding="max_length", truncation=True, max_length=config.max_position_embeddings + 1)
    tokenizer_temp["labels"] = tokenizer_temp["input_ids"].copy()
    return tokenizer_temp

# 3.3 执行数据集[token化]处理
tokenized_datasets = dataset.map(tokenize_function, batched=True, remove_columns=["text"])
"""
MODULE 4 定义训练参数
"""
training_args = TrainingArguments(
	# 保存模型
    output_dir=f"../checkpoint_folder/checkpoint_province/{model_save_path}",
    overwrite_output_dir=True,  # 如果设置为 True,则允许覆盖输出目录中的现有内容。
    num_train_epochs=1000,  # 训练的总轮数(epoch),即整个数据集会被遍历 500 次。
    per_device_train_batch_size=10,  # 每个设备(GPU/CPU)上的训练批次大小。如果使用多个 GPU,总批次大小将是这个值乘以 GPU 数量。
    save_steps=100,  # 每多少步保存一次模型检查点。这里表示每 50 步保存一次。
    save_total_limit=3,  # 最多保存多少个检查点。当超过这个限制时,最早的检查点将被删除。
    logging_steps=1,  # 每多少步记录一次日志。这里表示每 1 步记录一次。
    learning_rate=1e-3,  # 学习率,用于优化器更新模型参数的速度。这里设置为 0.001。
    weight_decay=0.01,  # 权重衰减(L2正则化)系数,用于防止过拟合。
)
"""
MODULE 5 定义训练器并执行训练
"""
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"]
)

trainer.train()

推理微调模型

06_pretrain_province_qwen2_trainer_test.py

from transformers import AutoTokenizer

from model_define.model_qwen.modeling_qwen2 import Qwen2ForCausalLM
import torch

"""
MODULE 0 定义任务类型
city:省会信息
else:省份介绍
"""
dataset_type = "city1"
model_save_name = "qwen2-province-intro"
eval_prompt_list = ['台湾']

"""
MODULE 1 定义运行设备
"""
device = 'cuda' if torch.cuda.is_available() else 'cpu'


"""
MODULE 2 Tokenizer 与 Model 定义,加载微调后保存的模型
"""
model_path = f"../checkpoint_folder/checkpoint_province/{model_save_name}/checkpoint-2000"
tokenizer = AutoTokenizer.from_pretrained("../tokenizer_file/tokenizer_qwen")
model = Qwen2ForCausalLM.from_pretrained(model_path)

"""
MODULE 3 生成测试
"""
for start in eval_prompt_list:
    for i in range(3):
        inputs = tokenizer(start, return_tensors="pt")

        generate_ids = model.generate(inputs.input_ids, max_new_tokens=10)
        response = tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]

        print('---------------')
        print(response) #输出数据集中定义的内容
        print('---------------')

参考资料

解析Tansformer模型
保姆级教程~本地微调DeepSeek-R1-8b模型
LLM训练全链路最佳实践
从零开始:Windows系统下Qwen2.5大模型的实践教程(二)-lora微调
Qwen-1.5-7b指令微调实战:SwanLab可视化训练

### 微调Qwen模型Windows环境下的方法 对于希望在Windows操作系统微调Qwen模型的情况,可以采用基于Python虚拟环境的方法来设置必要的软件栈并安装依赖项[^1]。首先,在本地机器上配置好Python以及pip工具之后,创建一个新的虚拟环境用于隔离项目所需的包版本其他项目的冲突。 接着,通过`pip install`命令安装transformers以及其他可能需要的辅助,比如datasets、accelerate等,这些能够极大地简化数据预处理训练过程中的许多操作[^2]。 为了更高效地利用硬件资源,建议确认已正确安装CUDA驱动程序(如果计算机配备NVIDIA显卡),以便让PyTorch框架能充分利用GPU加速计算性能。 下面是一个简单的例子展示如何加载预训练好的Qwen模型,并准备对其进行微调: ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_name_or_path = "Qwen-7B" # 这里填写具体的Qwen变体名称或路径 tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path) # 假设已经准备好了一个Dataset对象train_dataset # 接下来就可以定义Trainer来进行实际的微调工作了... ``` 值得注意的是,由于大型语言模型通常具有庞大的参数量,因此直接在个人电脑尤其是只有CPU支持的情况下进行完整的端到端训练可能是不现实的选择;此时可以选择先对部分层做冻结再解冻的方式逐步优化,或者是仅针对特定下游任务定制化调整最后一两层结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值