使用colab微调deepseek-r1
%%capture !pip install unsloth==2025.2.5 !pip install --force-reinstall --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth.git
from unsloth import FastLanguageModel #model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B-unsloth-bnb-4bit" model_name = "unsloth/DeepSeek-R1-Distill-Llama-8B" max_seq_length = 2048 model, tokenizer = FastLanguageModel.from_pretrained( model_name=model_name, max_seq_length=max_seq_length, load_in_4bit=True, )
==((====))== Unsloth 2025.2.12: Fast Llama patching. Transformers: 4.48.3. \\ /| GPU: Tesla T4. Max memory: 14.741 GB. Platform: Linux. O^O/ \_/ \ Torch: 2.6.0+cu124. CUDA: 7.5. CUDA Toolkit: 12.4. Triton: 3.2.0 \ / Bfloat16 = FALSE. FA [Xformers = 0.0.29.post3. FA2 = False] "-____-" Free Apache license: http://github.com/unslothai/unsloth Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!
prompt_style = """下面是描述任务的指令,与提供进一步上下文的输入配对。 编写一个适当完成请求的响应。 在回答之前,仔细思考问题,并创建一个循序渐进的思维链,以确保逻辑和准确的回答。 ### Instruction: 你是医学专家,在临床推理、诊断和治疗方面拥有先进的知识。 请回答以下医学问题。 ### Question: {} ### Response: <think>{}""" question = "一个患有急性阑尾炎的病人已经发病5天,腹痛稍有减轻但仍然发热,在体检时发现右下腹有压痛的包块,此时应如何处理?" FastLanguageModel.for_inference(model) inputs = tokenizer([prompt_style.format(question, "")], return_tensors="pt").to("cuda") outputs = model.generate( input_ids=inputs.input_ids, attention_mask=inputs.attention_mask, max_new_tokens=1200, use_cache=True, ) response = tokenizer.batch_decode(outputs) print(response[0].split("### Response:")[1])
<think> 首先,处理患有急性阑尾炎的病人,已经发病5天,腹痛稍有减轻但仍然发热,体检发现右下腹有压痛的包块。这提示可能有阑尾炎复发或并发感染的情况。因此,需要立即进行进一步的评估和治疗。 接下来,应该进行腹部超声检查,以确定包块的性质。超声可以帮助确认包块是否为胱结石、脓肿或其他结构,尤其是如果有不适的症状。 如果超声结果显示包块是胱结石,应考虑进行内镜下碎石引流术或经皮碎石引流。这些方法可以有效缓解症状,预防感染扩散。 如果包块是脓肿,可能需要抗生素治疗,以消除感染。同时,外科医生可能需要进行腹腔镜检查,以评估是否有需要疏通的脓液。 在处理过程中,必须注意患者的感染情况,及时进行抗菌治疗,防止感染扩散。此外,病情缓解后,应定期复查以排除复发或其他并发症。 整体来说,处理这种情况需要综合考虑包块的性质、患者的整体状况以及可能的并发症,制定相应的治疗方案。 </think> 在处理患有急性阑尾炎的病人时,发现右下腹有压痛的包块,可能提示阑尾炎复发或并发感染。建议立即进行腹部超声检查以确定包块性质。如果包块是胱结石,考虑内镜下或经皮碎石引流;如果是脓肿,进行抗生素治疗和腹腔镜检查以疏通脓液。同时注意感染预防,定期复查以排除复发。<|end▁of▁sentence|>
train_prompt_style = """下面是描述任务的指令,与提供进一步上下文的输入配对。 编写一个适当完成请求的响应。 在回答之前,仔细思考问题,并创建一个循序渐进的思维链,以确保逻辑和准确的回答。 ### Instruction: 你是医学专家,在临床推理、诊断和治疗方面拥有先进的知识。 请回答以下医学问题。 ### Question: {} ### Response: <think> {} </think> {}""" EOS_TOKEN = tokenizer.eos_token # must add EOS_TOKEN
def formatting_prompts_func(examples): inputs = examples["Question"] cots = examples["Complex_CoT"] outputs = examples["Response"] texts = [] for input_text, cot, output_text in zip(inputs, cots, outputs): text = train_prompt_style.format(input_text, cot, output_text) + EOS_TOKEN texts.append(text) return {"text": texts}
from datasets import get_dataset_config_names configs = get_dataset_config_names("FreedomIntelligence/medical-o1-reasoning-SFT") print(configs)
from datasets import load_dataset dataset = load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT", "zh", split="train[0:500]", trust_remote_code=True) dataset = dataset.map(formatting_prompts_func, batched=True) print(dataset["text"][0]) ####注意:这是一个伪数据集。请为您自己的用例创建或使用适当的数据集。
下面是描述任务的指令,与提供进一步上下文的输入配对。 编写一个适当完成请求的响应。 在回答之前,仔细思考问题,并创建一个循序渐进的思维链,以确保逻辑和准确的回答。 ### Instruction: 你是医学专家,在临床推理、诊断和治疗方面拥有先进的知识。 请回答以下医学问题。 ### Question: 根据描述,一个1岁的孩子在夏季头皮出现多处小结节,长期不愈合,且现在疮大如梅,溃破流脓,口不收敛,头皮下有空洞,患处皮肤增厚。这种病症在中医中诊断为什么病? ### Response: <think> 这个小孩子在夏天头皮上长了些小结节,一直都没好,后来变成了脓包,流了好多脓。想想夏天那么热,可能和湿热有关。才一岁的小孩,免疫力本来就不强,夏天的湿热没准就侵袭了身体。 用中医的角度来看,出现小结节、再加上长期不愈合,这些症状让我想到了头疮。小孩子最容易得这些皮肤病,主要因为湿热在体表郁结。 但再看看,头皮下还有空洞,这可能不止是简单的头疮。看起来病情挺严重的,也许是脓肿没治好。这样的情况中医中有时候叫做禿疮或者湿疮,也可能是另一种情况。 等一下,头皮上的空洞和皮肤增厚更像是疾病已经深入到头皮下,这是不是说明有可能是流注或瘰疬?这些名字常描述头部或颈部的严重感染,特别是有化脓不愈合,又形成通道或空洞的情况。 仔细想想,我怎么感觉这些症状更贴近瘰疬的表现?尤其考虑到孩子的年纪和夏天发生的季节性因素,湿热可能是主因,但可能也有火毒或者痰湿造成的滞留。 回到基本的症状描述上看,这种长期不愈合又复杂的状况,如果结合中医更偏重的病名,是不是有可能是涉及更深层次的感染? 再考虑一下,这应该不是单纯的瘰疬,得仔细分析头皮增厚并出现空洞这样的严重症状。中医里头,这样的表现可能更符合‘蚀疮’或‘头疽’。这些病名通常描述头部严重感染后的溃烂和组织坏死。 看看季节和孩子的体质,夏天又湿又热,外邪很容易侵入头部,对孩子这么弱的免疫系统简直就是挑战。头疽这个病名听起来真是切合,因为它描述的感染严重,溃烂到出现空洞。 不过,仔细琢磨后发现,还有个病名似乎更为合适,叫做‘蝼蛄疖’,这病在中医里专指像这种严重感染并伴有深部空洞的情况。它也涵盖了化脓和皮肤增厚这些症状。 哦,该不会是夏季湿热,导致湿毒入侵,孩子的体质不能御,其病情发展成这样的感染?综合分析后我觉得‘蝼蛄疖’这个病名真是相当符合。 </think> 从中医的角度来看,你所描述的症状符合“蝼蛄疖”的病症。这种病症通常发生在头皮,表现为多处结节,溃破流脓,形成空洞,患处皮肤增厚且长期不愈合。湿热较重的夏季更容易导致这种病症的发展,特别是在免疫力较弱的儿童身上。建议结合中医的清热解毒、祛湿消肿的治疗方法进行处理,并配合专业的医疗建议进行详细诊断和治疗。<|end▁of▁sentence|>
from peft import LoraConfig, TaskType, get_peft_model model = FastLanguageModel.get_peft_model( model, r = 16, target_modules = ["q_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj",], lora_alpha = 16, lora_dropout = 0, bias = "none", use_gradient_checkpointing = "unsloth", random_state = 3407, use_rslora = False, loftq_config = None, )
Not an error, but Unsloth cannot patch Attention layers with our manual autograd engine since either LoRA adapters are not enabled or a bias term (like in Qwen) is used. Unsloth 2025.2.12 patched 32 layers with 0 QKV layers, 32 O layers and 32 MLP layers.
from trl import SFTTrainer from transformers import TrainingArguments from unsloth import is_bfloat16_supported trainer = SFTTrainer( model = model, tokenizer = tokenizer, train_dataset = dataset, dataset_text_field = "text", max_seq_length = max_seq_length, dataset_num_proc = 2, packing = False, args = TrainingArguments( per_device_train_batch_size = 2, gradient_accumulation_steps = 4, warmup_steps = 5, max_steps = 60, learning_rate = 2e-4, fp16 = not is_bfloat16_supported(), bf16 = is_bfloat16_supported(), logging_steps = 1, optim = "adamw_8bit", weight_decay = 0.01, lr_scheduler_type = "linear", seed = 3407, output_dir = "outputs", report_to = "none", ), )
trainer_stats = trainer.train()
==((====))== Unsloth - 2x faster free finetuning | Num GPUs = 1 \\ /| Num examples = 500 | Num Epochs = 1 O^O/ \_/ \ Batch size per device = 2 | Gradient Accumulation steps = 4 \ / Total batch size = 8 | Total steps = 60 "-____-" Number of trainable parameters = 39,321,600
[60/60 22:02, Epoch 0/1]
Step | Training Loss |
---|---|
1 | 1.486200 |
2 | 1.567300 |
3 | 1.448400 |
4 | 1.403300 |
5 | 1.417400 |
6 | 1.305000 |
7 | 1.574500 |
8 | 1.474000 |
9 | 1.605600 |
10 | 1.517200 |
11 | 1.427900 |
12 | 1.328500 |
13 | 1.428300 |
14 | 1.452000 |
15 | 1.431300 |
16 | 1.356900 |
17 | 1.506600 |
18 | 1.517300 |
19 | 1.346400 |
20 | 1.423400 |
21 | 1.413900 |
22 | 1.434400 |
23 | 1.368800 |
24 | 1.437700 |
25 | 1.511600 |
26 | 1.476500 |
27 | 1.458100 |
28 | 1.327000 |
29 | 1.468700 |
30 | 1.585400 |
31 | 1.493100 |
32 | 1.462700 |
33 | 1.416000 |
34 | 1.440300 |
35 | 1.432400 |
36 | 1.453000 |
37 | 1.574800 |
38 | 1.326300 |
39 | 1.455500 |
40 | 1.364700 |
41 | 1.475400 |
42 | 1.311900 |
43 | 1.479200 |
44 | 1.273700 |
45 | 1.579100 |
46 | 1.444600 |
47 | 1.469000 |
48 | 1.359400 |
49 | 1.351600 |
50 | 1.446300 |
51 | 1.315500 |
52 | 1.381900 |
53 | 1.317100 |
54 | 1.622300 |
55 | 1.582400 |
56 | 1.417600 |
57 | 1.449100 |
58 | 1.485000 |
59 | 1.420100 |
60 | 1.519000 |
print(question)
一个患有急性阑尾炎的病人已经发病5天,腹痛稍有减轻但仍然发热,在体检时发现右下腹有压痛的包块,此时应如何处理?
FastLanguageModel.for_inference(model) # Unsloth has 2x faster inference inputs = tokenizer([prompt_style.format(question, "")], return_tensors="pt").to("cuda") outputs = model.generate( input_ids = inputs.input_ids, attention_mask = inputs.attention_mask, max_new_tokens = 1200, use_cache = True, ) response = tokenizer.batch_decode(outputs) print(response[0].split("### Response:")[1])
<think> 这个病人已经病了5天了,腹痛虽然稍微减轻了,但还在发烧。这让我觉得他可能需要进一步的处理。 在体检时,发现右下腹有压痛的包块。嗯,这个包块很可能是急性阑尾炎引起的炎症。虽然已经有了减轻的腹痛,但发烧还在,这说明病情并没有完全缓解。 我觉得应该考虑使用抗生素来处理这个感染。尤其是因为包块的存在,可能意味着细菌感染已经深入了。选用广谱抗生素可能会更安全,能够覆盖更多的可能细菌。 另外,虽然包块可能已经减轻,但不应该忽视它。可能需要进一步的处理,比如热敷或者药物来缓解不适。 当然,需要和医生沟通,听取专业意见。毕竟,病情变化还需要专业评估和治疗调整。 </think> 在这种情况下,病人的症状和体检结果表明急性阑尾炎的病情尚未完全缓解。虽然腹痛有所减轻,但仍然有发热的症状,并且右下腹有压痛的包块,这提示感染可能已经深入。因此,为了防止感染扩散并缓解症状,建议立即使用广谱抗生素进行治疗。同时,继续观察包块的变化,并根据情况进行热敷或其他缓解措施。建议立即与医疗团队沟通,进行进一步的专业评估和治疗调整。<|end▁of▁sentence|>
from google.colab import userdata HUGGINGFACE_TOKEN = userdata.get('HUGGINGGACE_TOKEN') # Save to 8bit Q8_0 if True: model.save_prestrained_gguf("model", tokenizer) # Save to 16bit GGUF if False: model.save_pretrained_gguf("model_f16", tokenizer, quantization_method="f16") # Save to q4_k_m GGUF if False: model.save_pretrained_gguf("model", tokenizer, quantization_method="q4_k_m")
from huggingface_hub import create_repo create_repo("gongzb2025/medical-model", token=HUGGINGFACE_TOKEN, exist_ok=True) model.push_to_hub_gguf("gongzb2025/medical-model", tokenizer, token=HUGGINGFACE_TOKEN)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具