使用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)
README.md: 100%
1.25k/1.25k [00:00<00:00, 76.4kB/s]
['en', 'zh']
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])

####注意:这是一个伪数据集。请为您自己的用例创建或使用适当的数据集。
medical_o1_sft_Chinese.json: 100%
 
 64.8M/64.8M [00:00<00:00, 28.9MB/s]
Generating train split: 100%
 
 24772/24772 [00:01<00:00, 20276.31 examples/s]
Map: 100%
 
 500/500 [00:00<00:00, 6604.56 examples/s]
下面是描述任务的指令,与提供进一步上下文的输入配对。
编写一个适当完成请求的响应。
在回答之前,仔细思考问题,并创建一个循序渐进的思维链,以确保逻辑和准确的回答。

### 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",
    ),
)
复制代码
Tokenizing train dataset (num_proc=2): 100% 500/500 [00:08<00:00, 145.36 examples/s]
Tokenizing train dataset (num_proc=2): 100% 500/500 [00:02<00:00, 217.34 examples/s]
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]

StepTraining 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)

 

posted @   有何m不可  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示