微调Qwen2:7B模型,加入未知信息语料

对于QWen2这样的模型,在微调的时候,语料的投喂格式满足ChatML这样的格式!!!

OpenAI - ChatML

下面是ChatML格式的介绍:

https://github.com/openai/openai-python/blob/release-v0.28.1/chatml.md

传统上,GPT模型使用非结构化文本。
ChatGPT 模型需要一种结构化格式,称为 Chat Markup Language 聊天标记语言(简称 ChatML)。
ChatML 文档由一系列消息组成。每条消息都包含一个 header(现在由说这句话的人组成,但将来将包含其他元数据)和 内容(现在是文本有效负载,但将来将包含其他数据类型)。

我们仍在不断发展 ChatML,但当前版本 (ChatML v0) 可以用我们即将推出的“字典列表”JSON 格式表示,如下所示:

[
 {"token": "<|im_start|>"},
 "system\nYou are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: 2023-03-01",
 {"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
 "user\nHow are you",
 {"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
 "assistant\nI am doing well!",
 {"token": "<|im_end|>"}, "\n", {"token": "<|im_start|>"},
 "user\nHow are you now?",
 {"token": "<|im_end|>"}, "\n"
]

您还可以用经典的“不安全原始字符串”格式表示它。
然而,这种格式本质上允许从包含特殊令牌语法的用户输入进行注入,类似于 SQL 注入:

<|im_start|>system
You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.
Knowledge cutoff: 2021-09-01
Current date: 2023-03-01<|im_end|>
<|im_start|>user
How are you<|im_end|>
<|im_start|>assistant
I am doing well!<|im_end|>
<|im_start|>user
How are you now?<|im_end|>

 语料的获取:

可以让豆包或者chatgpt根据上传的文档进行分析,具体提示词如下:

根据文档列举出较全面的问题和答案

代码的实现:

yuliao.txt:

问题:王天龙的求职意向岗位是什么?
答案:大模型算法工程师
问题:王天龙熟悉哪些算法模型和算法原理?
答案:能够使用 LSTM、Transformer、Bert、GPT2 等算法模型和算法原理完成多标签分类、文本生成、文本摘要和机器翻译别等 NLP 任务以及大模型的相关工作
问题:王天龙熟悉哪些关系数据库和相关技能?
答案:熟悉 MySQL 等关系数据库,熟悉 SQL 语句的编写;熟悉 Pytorch 深度学习框架,具有良好的编程规范;熟练使用 docker、docker compose 部署,能够很好的应用到每一个项目部署上中去;熟悉使用 k8s 的搭建和部署模型推理项目;能够使用 Numpy、Pandas、transformers、FastAPl、streamlit 等辅助工具;能够进行很好的爬虫任务的实施
问题:王天龙在大模型量化微调部署上线推理项目中的工作内容有哪些?
答案:着重选择开源的大模型进行微调量化;着重考虑能够在 CPU 上推理,就不在 GPU 上推理;使用量化后的大模型进行推理,做一些常用的任务,比如说:机器翻译、文本摘要、样本打标签等工作;使用 streamlit 进行前端界面的展示,FastAPI 进行后端的部署,onnx 格式的转换等工作
问题:荣耀机器翻译项目使用什么架构进行翻译?涉及哪些语言?
答案:项目使用 transformer 的架构进行翻译,语料多达 1.5 亿条,翻译的模型任务所涉及的语言有法语、德语、英语、藏语、俄罗斯语等各种语言翻译成中文
问题:基于向量数据库的文本检索、图搜图、图搜视频项目的工作内容有哪些?
答案:利用 Kubernetes 部署 Milvus 分布式集群;负责将海量新闻、海量知识库、海量图片、海量公开视频、电影、电视剧转换成向量数据存储在搭建好的 Milvus 分布式集群向量数据库中;使用 FastAPI 封装操作 Milvus 向量数据库的 API;负责使用 streamlit 搭建前端服务,完成基于 Milvus 向量数据库的文本检索、图搜图、图搜视频的全部功能与工作
问题:系统运行指标摘要提取项目的内容包括哪些?
答案:信息提取:系统运行时产生的指标数据通常非常庞大而复杂,手动提取关键信息困难且耗时。因此,项目旨在开发一种自动化的机制,能够精确地从大量的指标数据中提取并汇总重要的信息;摘要生成:对于大规模的指标数据,人工总结可能会导致疏漏或不准确。该项目旨在开发一种智能系统,能够自动生成简洁而准确的摘要,帮助用户更好地了解系统的运行状态和趋势;异常检测:通过提取关键信息和生成中文长文本摘要,可以更容易地检测系统运行中的异常情况。该项目旨在开发一种智能系统,能够自动识别和报告系统指标数据中的异常值或变化,帮助用户及时发现潜在问题并采取适当的措施;性能分析:系统运行指标包含了关于性能、稳定性和可用性等方面的信息。通过智能提取关键信息和摘要,可以更好地进行性能分析并制定相应的改进措施
问题:在 CSCC 架构下的远程桌面系统项目中,王天龙的工作内容有哪些?
答案:UDP 打洞架构的设计,包括无法成功的端口受限锥形 + 对称型、对称型 + 对称型,这两种方式通过公网 linux 服务器进行消息的转发;图形界面的设计,采用 QT 进行图形界面的开发与部署;完成整体项目的程序打包发布;供公司不同区域的同事进行远程办公和通信

qwen2.py:

import torch
from torch.utils.data import DataLoader
from transformers import AutoTokenizer, AutoModelForCausalLM, AdamW, get_scheduler
from dataset import QwenDataset
from tqdm import tqdm

# 1. 加载预训练模型和分词器
model_name = "./Qwen/Qwen2-7B-Instruct"  # 替换为你实际使用的 Qwen2 模型名称
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

def collate_fn(batch):
    # 这里我们对文本进行分词并填充到最大长度
    finetue_template = \
"""<|im_start|>system
You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.
Knowledge cutoff: 2023-09-01
Current date: 2024-08-25<|im_end|>
<|im_start|>user
{question}<|im_end|>
<|im_start|>assistant
{answer}<|im_end|>
<|im_start|>user
{question}<|im_end|>
"""
    finetune_list = []
    for item in batch:
        question = item[0]
        answer = item[1]
        finetune_list.append(finetue_template.format(question=question, answer=answer))

    return finetune_list

def train():
    train_dataset = QwenDataset()
    # 3. 定义优化器和学习率调度器
    optimizer = AdamW(model.parameters(), lr=5e-5)
    train_dataloader = DataLoader(train_dataset, batch_size=1, shuffle=True,collate_fn=collate_fn)
    num_training_steps = len(train_dataloader) * 3  # 假设训练3轮
    scheduler = get_scheduler(
        "linear",
        optimizer=optimizer,
        num_warmup_steps=0,
        num_training_steps=num_training_steps,
    )

    # 4. 设置设备
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)

    # 5. 开始训练
    for epoch in range(30):  # 训练3轮
        model.train()
        train_dataloader = DataLoader(train_dataset, batch_size=1, shuffle=True,collate_fn=collate_fn)
        for batch in tqdm(train_dataloader):
            # 将数据从 `batch` 转换为模型需要的输入格式
            inputs = tokenizer(batch, return_tensors='pt', padding=True, truncation=True, max_length=512).to(device)
            input_ids = inputs['input_ids']
            
            # 使用 `input_ids` 作为 `labels`,因为我们希望模型预测下一个 token
            labels = input_ids.clone()
            
            # 前向传播
            outputs = model(input_ids=input_ids, labels=labels)
            loss = outputs.loss

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            scheduler.step()

            print(f"Epoch {epoch}, Loss: {loss.item()}")

    # 6. 保存微调后的模型
    model.save_pretrained("./fine-tuned-model")
    tokenizer.save_pretrained("./fine-tuned-model")



if __name__ == "__main__":
    train()

训练完成后,就可以生成了!!!

新的对话生成:

from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto

model = AutoModelForCausalLM.from_pretrained(
    "./fine-tuned-model",
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("./fine-tuned-model")

prompt = "王天龙熟悉哪些算法模型和算法原理?"
print(prompt)
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)

generated_ids = model.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aiotud

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

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

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

打赏作者

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

抵扣说明:

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

余额充值