欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 大模型微调01-使用transforms进行lora微调

大模型微调01-使用transforms进行lora微调

2025/3/17 11:44:33 来源:https://blog.csdn.net/jiangpeng59/article/details/146291192  浏览:    关键词:大模型微调01-使用transforms进行lora微调

环境

建议python>=3.10,在shell中运行如下脚本安装对应的库,并配置HuggingFace的国内镜像

#安装包
pip install datasets transformers torch
#解决科学上网问题
export HF_ENDPOINT=https://hf-mirror.com

数据集

数据使用一个医疗诊断数据medical-o1-reasoning-SFT

from datasets import load_dataset
dataset = load_dataset('FreedomIntelligence/medical-o1-reasoning-SFT', 'zh')
print(dataset['train'][4])

数据内容如下,本次只使用Question和Response即可

{'Question': '患者表现为干咳,或咯少量粘痰,有时痰中带血,胸部隐痛,午后手足心热,皮肤干灼,或有盗汗,舌质红苔薄,脉细数。请问该患者的中医辨证是什么?','Complex_CoT': '干咳,还有少量粘痰,有时痰中带血,这些症状听起来像是和肺部有关,可能有什么炎症或者热在作怪。我记得这种情况下有时候是因为肺里的津液不足。 \n\n \n\n接着,有午后手足心热这些表现,而且舌红,脉细数,感觉挺像是阴虚内热。如果是阴虚,体内的阴液不够,就容易这种内热的感觉。\n\n \n\n此外,患者居然还有皮肤干灼,有时出汗的症状!这些是典型的阴虚表现,尤其是肺阴虚的典型症状。看得出,是体内津液无法滋润皮肤导致的。\n\n \n\n所以综合起来,干咳、少痰、咳血,这说明肺阴虚外加点内热。这可能是因为阴虚,体内没有足够的津液滋润。\n\n \n\n嗯,细想一下,咳血还有可能是因为肺中有热,把血络给伤到了,更加说明内有热的感觉。这种情况应该就是阴虚然后内热引起的。 \n\n \n\n再有,患者说有胸部隐痛,这可能是气血不畅,还真挺符合阴虚导致的状况。这个痛说明虚火在身体里面扰动着。\n\n \n\n还有舌红苔薄,痰少,这些都和阴虚内热是一致的症状。患者阴虚的可能性更加大了,而且这和干咳症状很对得上。\n\n \n\n总是觉得症状和肺阴虚夹着内热的结合挺吻合。特别是干咳、皮肤干燥这些症状都在一个方向。\n\n \n\n再进一步想,肺阴亏虚是怎么样的呢?主要是津液不足导致外部的表现,因此有干咳、少痰还有皮肤干这些情况。哦,这和患者的症状基本完全吻合。\n\n \n\n所以,要是症状都是这种方向的话,归为肺阴亏虚应该是对的,也能解释所有的症状组合。影响了皮肤、呼吸等等,看来这个方向不容小视。\n\n \n\n这样子回头看看,所有症状的点线都很一致,确实是肺阴亏虚。这也符合大部分分析和患者症状的实际表现。','Response': '根据患者所表现的症状,干咳、少量粘痰、痰中带血、胸部隐痛、午后手足心热、皮肤干灼、盗汗、舌质红苔薄、脉细数,这些症状综合起来符合中医中的“肺阴虚”夹“内热”的表现。肺阴虚是指肺的阴液不足,无法滋润肺脏和其他相关系统,导致干咳、皮肤干燥等症状,而内热则会导致痰中带血、手足心热等表现。因此,该患者的中医辨证为“肺阴虚夹内热”。'}

模型推理

在训练前,看下基座模型的效果如何,使用上面的数据进行多次推理

from transformers import AutoModelForCausalLM, AutoTokenizer
base_model_name_or_path = 'Qwen/Qwen2.5-0.5B-Instruct'
model = AutoModelForCausalLM.from_pretrained(base_model_name_or_path)
# 加载对应的 tokenizer
tokenizer = AutoTokenizer.from_pretrained(base_model_name_or_path)
# 将模型设置为评估模式
model.eval()
prompt = "患者表现为干咳,或咯少量粘痰,有时痰中带血,胸部隐痛,午后手足心热,皮肤干灼,或有盗汗,舌质红苔薄,脉细数。请问该患者的中医辨证是什么?"
messages = [{"role": "system", "content": "你是一个经验丰富的医生"},{"role": "user", "content": prompt}
]
input_text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
for i in range(4):print('--'*10,i+1)outputs = model.generate(**inputs, max_new_tokens=1024)# 解码输出generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)print(generated_text.split('assistant')[-1])

下面是4次测试输出如下,结果一般

-------------------- 1
根据您描述的症状,可以将此患者的中医辨证归为肺阴亏虚型。具体来说:1. **咳嗽**:属于风燥咳嗽,是由于外感风邪、肺气不足所致。
2. **咳痰**:主要表现为干咳,可能是因肺阴亏损引起的干燥性咳嗽。
3. **胸痛**:多见于肺部疾病,如慢性支气管炎等,可能与肺气不宣有关。
4. **午后手足心热**:这提示体内阴液耗损,导致阳热内生。
5. **盗汗**:是由于阴精亏损,阳热内盛的体现。
6. **舌质红苔薄**:舌象为红润而少津,表示阴津受损。
7. **脉细数**:脉象显示肾阴不足。综合这些症状,中医治疗应以滋阴降火为主,方选六味地黄丸加减。同时,配合使用具有清热润肺作用的药物,如知柏地黄汤等,以达到补益肺阴的目的。在实际操作中,建议由专业的中医师进行辨证施治,并结合现代医学检查结果调整治疗方案。
-------------------- 2
根据您描述的症状,这位患者可能属于“风燥咳嗽”的范畴。"风燥咳嗽"是由于肺卫失和,外感风寒、燥邪侵袭所致的一种常见病证。### 中医辨证分析:1. **风**:风为阳邪,易动于肌肤,其性开泄,常影响人体的经络。
2. **燥**:燥邪多见于秋季,具有升散的特点,容易伤及肺卫。
3. **咳嗽**:当肺卫功能受损时,会引发各种原因引起的咳嗽症状,如干咳、咳痰等症状。根据您的描述,“干咳”、“少量粘痰”以及“痰中带血”等提示了肺部受累的情况;而“胸部隐痛”、“午后手足心热”、“皮肤干灼”和“盗汗”则表明身体对外界刺激(如风、燥)反应过度,导致气血运行不畅,进而影响到脏腑功能,引起一系列不适症状。### 针灸治疗建议:
- **清肺化痰止咳**:可以使用具有清热解毒、平肝息风作用的药物进行治疗,如生地黄、麦冬、丹参等。
- **养阴润燥**:对于干咳伴有口渴、咽干等症状,可考虑使用具有滋阴润燥作用的药材,如麦冬、玉竹等。
- **调理体质**:针对手脚心热、盗汗等症状,可适当调整饮食结构,增加温补食物的摄入,如羊肉、鸡肉、黑豆等,同时注意保暖,避免寒冷环境对身体的影响。请注意,在实际操作中,以上仅为初步诊断和治疗建议,并不能替代专业医师的详细诊疗。如果症状持续存在或者加重,请及时就医并遵医嘱进行治疗。
-------------------- 3根据您描述的症状,这位患者的中医辨证属于肺阴亏虚型咳嗽。具体来说:1. **病因**:主要可能是由于久病体虚、外感风寒或感受燥邪导致的肺气不足和津液亏损。2. **症状表现**:- 干咳,或出现少量粘痰。- 有时伴有痰中带血现象。- 胸部隐痛,甚至午后手足心热(阳明热盛的表现)。- 见到皮肤干燥,或者在某些情况下,还会出现盗汗的情况。- 舌质红,苔薄,脉细数。3. **治疗原则**:- 滋阴润肺:通过滋补肺阴来缓解干咳、盗汗等症状。- 清热化痰:针对因燥邪引起的咳喘,可以使用清热化痰的药物。4. **中药选择**:- 可以考虑使用具有滋阴润肺作用的方剂,如生地黄汤加减等。- 如果有明显的热象,则可能需要配合清热药,例如知柏地黄丸或丹栀逍遥散。5. **建议**:- 建议在专业中医师的指导下进行辨证施治,并结合个人体质调整用药方案。请注意,以上仅为初步诊断及建议,具体病情还需结合临床实际情况由专业医师进一步判断和处理。希望这位患者早日康复!
-------------------- 4根据您描述的症状,即干咳、少量粘痰、偶尔带血丝、胸痛、午后手足心热、皮肤干燥以及盗汗等症状,结合舌质红、苔薄和脉细数的特点,可以初步判断为肺燥咳嗽。在中医理论中,肺燥咳嗽主要表现为干咳无痰,口渴咽干,舌红少津,脉细数等特征。因此,您的症状符合肺燥咳嗽的中医辨证候。治疗上建议采取疏风清热、润肺止咳的方法:1. **药物选择**:可考虑使用具有清热解毒、宣肺平喘作用的中药,如黄连、黄芩、板蓝根、桔梗、杏仁、甘草等。
2. **饮食调理**:多食用具有润肺止咳功效的食物,如梨、百合、蜂蜜、绿豆汤等。
3. **生活习惯调整**:保持室内空气流通,避免吸入刺激性气体;适当增加水分摄入,保持大便通畅。
4. **针灸疗法**:可以通过针灸治疗来缓解咳嗽症状,常用的穴位包括肺俞、太渊、阴陵泉等。请注意,以上仅为基本指导,并不能替代专业医师的诊断与治疗。如有任何疑问,请及时就医并遵医嘱进行治疗。

模型模板

不同的模型训练时,使用的模版可能不一样,使用下面的方法确认qwen模型的模板内容

from transformers import AutoTokenizer, AutoModelForCausalLM
model_path = 'Qwen/Qwen2.5-0.5B-Instruct' #'Qwen/Qwen2.5-0.5B-Instruct'
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16).to(device)
tokenizer = AutoTokenizer.from_pretrained(model_path)
messages = [{"role": "system", "content": "你是一个经验丰富的医生"},{"role": "user", "content": '我头晕'},{"role": "assistant", "content": '你感冒了'}
]
text = tokenizer.apply_chat_template(messages,tokenize=False)
print(text)

输出如下

<|im_start|>system
你是一个经验丰富的医生<|im_end|>
<|im_start|>user
我头晕<|im_end|>
<|im_start|>assistant
你感冒了<|im_end|>

模型训练

训练16个epoch

import torch
import os
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers import  TrainingArguments, Trainer,DataCollatorForSeq2Seq
from peft import LoraConfig, get_peft_model#使用国内镜像加速下载
os.environ['HF_ENDPOINT']='https://hf-mirror.com'
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
MAX_LEN=1024
model_path = 'Qwen/Qwen2.5-0.5B-Instruct'
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16).to(device)
tokenizer = AutoTokenizer.from_pretrained(model_path)def format_func(example):# 提示词目标system="你是一个经验丰富的医生"user=example['Question']assistant=example["Response"]prompt_input=f"<|im_start|>system\n{system}<|im_end|>\n<|im_start|>user\n{user}<|im_end|>"prompt_output=f"<|im_start|>assistant\n{assistant}<|im_end|>"full_text = prompt_input + prompt_outputfull_tokens = tokenizer(full_text, max_length=MAX_LEN, truncation=True)input_prompt_tokens = tokenizer(prompt_input, max_length=MAX_LEN,truncation=True)["input_ids"]num_tokens_prompt = len(input_prompt_tokens)# 让模型不关注prompt的部分内容labels = [-100] * num_tokens_prompt + full_tokens["input_ids"][num_tokens_prompt:]return {'input_ids': full_tokens['input_ids'],'attention_mask': full_tokens['attention_mask'],'labels': labels}# 加载数据处理
dataset = load_dataset('FreedomIntelligence/medical-o1-reasoning-SFT', 'zh', split="train[0:800]")
dataset = dataset.map(format_func)# lora
lora_config = LoraConfig(r=8,  # Rank of the low-rank matriceslora_alpha=16,  # Scaling factortarget_modules=["q_proj", "k_proj", "v_proj", "o_proj"],  # Target modules for LoRAtask_type="CAUSAL_LM"  # Task type
)
model = get_peft_model(model, lora_config)training_args = TrainingArguments(per_device_train_batch_size=2,gradient_accumulation_steps=2,learning_rate=2e-4,num_train_epochs=16,fp16=True,logging_steps=10,weight_decay=0.01,lr_scheduler_type="linear",output_dir="outputs",)# 数据整理器,之前没有padding,这里设置padding=True
data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True)trainer = Trainer(model=model,args=training_args,train_dataset=dataset,data_collator=data_collator
)# 训练&保存模型
trainer.train()
model.save_pretrained('last_ck')
tokenizer.save_pretrained('last_ck')

训练日志输出

{'loss': 0.6698, 'grad_norm': 3.671365976333618, 'learning_rate': 2.625e-06, 'epoch': 15.8}                                          
{'loss': 0.6242, 'grad_norm': 4.191409111022949, 'learning_rate': 2.0000000000000003e-06, 'epoch': 15.85}                            
{'loss': 0.737, 'grad_norm': 3.6607933044433594, 'learning_rate': 1.3750000000000002e-06, 'epoch': 15.9}                             
{'loss': 0.6485, 'grad_norm': 2.723379373550415, 'learning_rate': 7.5e-07, 'epoch': 15.95}                                           
{'loss': 0.6677, 'grad_norm': 3.2586007118225098, 'learning_rate': 1.2500000000000002e-07, 'epoch': 16.0}                            
{'train_runtime': 1331.0882, 'train_samples_per_second': 9.616, 'train_steps_per_second': 2.404, 'train_loss': 1.091647335588932, 'epoch': 16.0}

模型推理2

同理使用基座模型+lora权重再次进行多次推理,看下效果如何

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel# 基础模型的路径或名称
base_model_name_or_path = "Qwen/Qwen2.5-0.5B-Instruct"
# LoRA 权重的路径
lora_model_path = "last_ck"
# 加载基础模型
model = AutoModelForCausalLM.from_pretrained(base_model_name_or_path)
# 加载 LoRA 权重
model = PeftModel.from_pretrained(model, lora_model_path)
# 加载对应的 tokenizer
tokenizer = AutoTokenizer.from_pretrained(base_model_name_or_path)
# 将模型设置为评估模式
model.eval()
prompt = "患者表现为干咳,或咯少量粘痰,有时痰中带血,胸部隐痛,午后手足心热,皮肤干灼,或有盗汗,舌质红苔薄,脉细数。请问该患者的中医辨证是什么?"
messages = [{"role": "system", "content": "你是一个经验丰富的医生"},{"role": "user", "content": prompt}
]
input_text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
for i in range(4):print('--'*10,i+1)outputs = model.generate(**inputs, max_new_tokens=1024)# 解码输出generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)print(generated_text.split('assistant')[-1])

输出结果,和原始数据中的结论基本差不多^_^

-------------------- 1
根据患者的症状表现,如干咳、少量黏痰中带血、痰液干燥为干咳,伴随的面部潮热、皮肤干灼、盗汗、舌质红苔薄、脉细数等症状,可以初步判断为肺阴虚与内热引起的症状。在中医理论中,肺是全身免疫系统的中枢,如果肺的阴液不足,就会引发一系列症状。而内热则会影响肺的功能,使身体处于一种“阴液不足”的状态。因此,患者表现出的咳嗽、血丝痰以及可能的呼吸道损伤可能是由于内热所致。同时,因盗汗可能涉及体内阴液的亏耗,也与肺功能弱有关。此外,手足心热通常与肾阳虚相关,而午后出现的午后手足心热,则进一步支持了肾阴虚的问题。这些都增加了整体阴液亏损的可能性,从而导致了上述症状的呈现。综合考虑以上因素,在对患者进行辩证时,应从肾气、阴液、内热三个方面入手,以调治相应的体质问题。治疗上应结合补益肾阴、固涩阴液等方法,以改善患者的不适症状。
-------------------- 2
根据患者的症状表现,包括干咳、少量粘痰、痰中带血、胸部隐痛、午后手足心热、皮肤干灼、盗汗、舌质红苔薄、脉细数,可以初步诊断为“肺阴虚夹痰内热。”首先,干咳是由于肺的清肃之气不固,而“肺阴虚”本身就是肺燥伤津,肺阴不足所致。同时,“痰中带血”则提示体内可能存在具有血瘀的痰邪,这与“内热亢浮”导致的内痰内热相关。其次,胸部隐痛可能与肝肾阴虚有关,肝郁乘痰在内,导致肝经痰热郁滞,进一步引发气血郁结。手足心热则是阳盛内扰的表现,因为肝和脾的功能被激发,体内湿热加剧。皮肤干灼和盗汗也常是阴液亏损的表现,阴虚火旺会导致身体对寒凉的抵抗能力减弱,从而出现这些症状。最后,舌质红苔薄、脉细数,则表明体内热毒内蕴。这种热毒内蕴不仅影响了肺的呼吸功能(咳嗽),还可能导致全身性的症状如盗汗。综上所述,患者的症状符合“肺阴虚夹痰内热”的中医辨证,需要通过滋阴润肺、化痰止血等治疗方法进行治疗。
-------------------- 3
根据患者的症状表现,如干咳、少量粘痰、痰中带血、胸部隐痛、午后手足心热、皮肤干灼、盗汗、舌质红苔薄、脉细数,可以初步判断为肺阴虚和肺火旺盛的综合症。首先,干咳虽然常见于肺阴不足的情况,但同时伴有“少量粘痰”、“痰中带血”,这表明病变不仅限于肺部,还涉及到了上焦或肺胃络。因此,“肺阴虚”是关键点,它需要进一步结合体内火热因素进行治疗。其次,患者表现出明显的津液亏损(手足心热),这与“风燥伤津”的现象相符。此外,盗汗的存在也支持了阴虚内热对津液消耗的加剧。再者,由于“皮肤干灼”、“皮肤干燥”和“肺肾两虚相兼”的特征,脉象细数提示体内还有精气衰弱的表现。这些都指向一种“阴竭阳脱”状态,即极度的阴虚而阳盛的现象。综上所述,患者的症状符合“肺阴虚夹肺热,阴竭阳脱,阴虚火旺,耗损肺肾之阴,耗散津液,故见皮疹”的中医辩证。需在专业中医师指导下制定个体化的治疗方案,以调和阴阳,滋阴养肺,润燥止痛。
-------------------- 4
根据患者的症状表现,如干咳、少量黏痰、痰中带血、胸部隐痛、午后手足心热、皮肤干灼、盗汗、舌质红苔薄、脉细数,可以初步判断为肺阴虚和肺火内炽的综合症。首先,干咳是由于肺阴亏耗,阴液不足,不能滋润燥邪,而痰中带血提示可能涉及血液凝滞问题,这在阴虚的情况下更为常见。因此,患者的咳嗽通常与阴虚密切相关。其次,肺火内炽是因肺气不利,运行不畅导致的异常生理反应。患者午后出现的手足心热、皮肤干燥以及盗汗等表现,支持了这一诊断。此外,伴随有“红苔薄”、“脉细数”的体征,进一步强化了火热外来的印象。综上所述,患者的中医辨证应为:“肺阴虚夹肺火炽。”这一诊断既符合其典型的阴虚内热症状,又考虑到了火热外袭的原因,从而全面解释了其当前的症状状态。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词