对于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)