LLMOps-第十三周

LLMOps-第十三周

文章目录

结合金融、医疗数据,微调金融模型及医疗模型

环境部署

此次环境搭建是在AutoDL官方网站上搭建的实例,使用的基础镜像为PyTorch/2.8.0/3.12(ubuntu22.04)/12.8

结合医疗数据集,微调医疗模型

基础环境准备

bash 复制代码
# 查看显卡信息
nvidia-smi -L
# GPU 0: NVIDIA GeForce RTX 5090 (UUID: GPU-1f2035b0-8478-9ffc-23d2-0e7a5a6b2143)
nvidia-smi
# Thu Nov 13 09:47:59 2025
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 580.76.05              Driver Version: 580.76.05      CUDA Version: 13.0     |
# +-----------------------------------------+------------------------+----------------------+
# | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
# | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
# |                                         |                        |               MIG M. |
# |=========================================+========================+======================|
# |   0  NVIDIA GeForce RTX 5090        On  |   00000000:A8:00.0 Off |                  N/A |
# | 43%   28C    P8              5W /  575W |       0MiB /  32607MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+

# +-----------------------------------------------------------------------------------------+
# | Processes:                                                                              |
# |  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
# |        ID   ID                                                               Usage      |
# |=========================================================================================|
# |  No running processes found                                                             |
# +-----------------------------------------------------------------------------------------+
# 更新apt源
apt update
# 安装相关依赖包
apt install git git-lfs iproute2 jq tree -y
# 设置环境变量
cp -rp ~/.bashrc{,.`date +"%F_%H-%M-%S"`}
sed -i "s/HISTSIZE=1000/HISTSIZE=999999999/" ~/.bashrc
sed -i "83a alias datebak='date +"%F_%H-%M-%S"'" ~/.bashrc
sed -i "83a alias vi='vim'" ~/.bashrc
sed -i "83a alias ll='ls -lhrt'" ~/.bashrc
sed -i "83a alias grep='grep --color'" ~/.bashrc

# 生效配置
source .bashrc

# 创建虚拟环境
conda create -p /root/autodl-tmp/medical_lora_env python=3.12
conda-env list
# # conda environments:
# #
#                          /root/autodl-tmp/medical_lora_env
# base                     /root/miniconda3
# 进入虚拟环境
source .bashrc
conda activate /root/autodl-tmp/medical_lora_env
# 取消虚拟环境
conda deactivate

# 安装依赖包
pip install torch transformers peft datasets accelerate evaluate bitsandbytes deepspeed

# 加速huggingface
pip install -U huggingface_hub==0.35.3

# 设置环境变量
export HF_ENDPOINT=https://hf-mirror.com
# 永久添加环境变量
echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc

python -V
# Python 3.12.12
pip list|egrep "torch|transformers|peft|datasets|accelerate|evaluate|bitsandbytes|deepspeed|huggingface"
# accelerate               1.11.0
# bitsandbytes             0.48.2
# datasets                 4.4.1
# deepspeed                0.18.2
# evaluate                 0.4.6
# huggingface-hub          0.35.3
# peft                     0.17.1
# torch                    2.9.1
# transformers             4.57.1

# 创建数据集及模型的目录
mkdir /root/autodl-tmp/huggingface/{datasets,hub} -p
# 修改HF_HOME全局的缓存目录
export HF_HOME=/root/autodl-tmp/huggingface
# 永久保存
echo 'export HF_HOME=/root/autodl-tmp/huggingface' >> ~/.bashrc

ln -s /root/autodl-tmp/huggingface /root/.cache/huggingface

# 下载医疗相关的数据集
# huggingface-cli download --repo-type dataset --resume-download FreedomIntelligence/medical-o1-reasoning-SFT --local-dir ~/.cache/huggingface/datasets/FreedomIntelligence/medical-o1-reasoning-SFT
huggingface-cli download --repo-type dataset --resume-download FreedomIntelligence/medical-o1-reasoning-SFT --local-dir /root/autodl-tmp/huggingface/datasets/FreedomIntelligence/medical-o1-reasoning-SFT
# Download complete. Moving file to /root/autodl-tmp/huggingface/datasets/FreedomIntelligence/medical-o1-reasoning-SFT/README.md
# medical_o1_sft_mix_Chinese.json: 100%|████████████████████████████████████████████████████████████████████████████████████████| 65.6M/65.6M [00:04<00:00, 15.5MB/s]
# Download complete. Moving file to /root/autodl-tmp/huggingface/datasets/FreedomIntelligence/medical-o1-reasoning-SFT/medical_o1_sft_mix_Chinese.json0:02, 8.87MB/s]
# medical_o1_sft_mix.json: 100%|████████████████████████████████████████████████████████████████████████████████████████████████| 73.1M/73.1M [00:07<00:00, 9.43MB/s]
# Download complete. Moving file to /root/autodl-tmp/huggingface/datasets/FreedomIntelligence/medical-o1-reasoning-SFT/medical_o1_sft_mix.json[00:07<00:00, 8.99MB/s]
# medical_o1_sft.json: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 58.2M/58.2M [00:02<00:00, 22.3MB/s]
# Download complete. Moving file to /root/autodl-tmp/huggingface/datasets/FreedomIntelligence/medical-o1-reasoning-SFT/medical_o1_sft.json.2M [00:02<00:00, 22.6MB/s]
# Fetching 6 files: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6/6 [00:32<00:00,  5.40s/it]
# /root/autodl-tmp/huggingface/datasets/FreedomIntelligence/medical-o1-reasoning-SFT
# 下载模型
# huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Llama-8B --local-dir ~/.cache/huggingface/hub/deepseek-ai/DeepSeek-R1-Distill-Llama-8B
huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Llama-8B --local-dir /root/autodl-tmp/huggingface/hub/deepseek-ai/DeepSeek-R1-Distill-Llama-8B

直接加载基础模型提问医疗相关问题

医疗相关的问题: 一个患有急性阑尾炎的病人已经发病5天,腹痛稍有减轻但仍然发热,在体检时发现右下腹有压痛的包块,此时应如何处理?

bash 复制代码
# 未微调前模型针对医疗的回答
python inference_base_model_only.py
# 加载 tokenizer...
# 加载基础大模型(未微调)...
# Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:02<00:00,  1.40s/it]

# ============================================================
# 提问:
# 一个患有急性阑尾炎的病人已经发病5天,腹痛稍有减轻但仍然发热,在体检时发现右下腹有压痛的包块,此时应如何处理?

# 基础模型回答(未微调):
# 首先,急性阑尾炎通常是由感染引起的炎症反应,病人已经发病5天,腹痛有所缓解但仍发热,这可能意味着病情正在缓解或需要进一步的治疗。体检发现右下腹有压痛的包块,这可能提示存在阑尾炎的复发性或并发症,例如附睾炎或阑尾炎的脓肿。

# 为了明确诊断,建议进行腹部超声检查,以确认包块的性质。腹部超声可以帮助辨别包块是否为实体或虚假性,是否有液体积聚或其他异常征兆。超声结果如果显示包块为实体且有液体积聚,应考虑进行腹腔镜镜下检查以进一步明确病情。

# 在抗生素治疗方面,应根据细菌培养和药物敏感试验结果选择敏感的抗生素。通常选择第三代青霉素、头孢类药物或乙酰氨基酚-莫匹罗星等药物。如果细菌培养和药物测试结果未能提供足够的信息,临床医生可能需要根据临床表现和病情严重程度来选择初步治疗方案。

# 此外,病人需要继续进行热退烧治疗,如使用退烧药物(如对乙酰氨基酚)以缓解发热症状。饮食方面,建议患者避免油腻、辛辣的食物,饮用清淡、易消化的食物,以减轻胃肠道负担。

# 随着病情的发展,如果病人出现严重的腹痛、发热、恶心、呕吐或其他并发症,应立即就医进行进一步的处理,如引流或手术干预。

# 总之,处理急性阑尾炎患者的包块问题,应从影像学检查、细菌培养、药物治疗和病情监测等多个方面入手,以确保正确诊断和有效治疗。
# </think>

# 对于一个患有急性阑尾炎的病人,已经发病5天,腹痛稍有减轻但仍然发热,并且在体检时发现右下腹有压痛的包块,处理步骤如下:

# 1. **影像学检查**:建议进行腹部超声,以确定包块的性质,如是否为实体或虚假性,是否有液体积聚或其他异常征兆。
# 2. **细菌培养和药物敏感试验**:进行细菌培养和药物敏感试验,以选择敏感的抗生素,如第三代青霉素、头孢类药物或乙酰氨基酚-莫匹罗星。
# 3. **热退烧治疗**:使用退烧药物(如对乙酰氨基酚)缓解发热症状。
# 4. **饮食调理**:建议患者避免油腻、辛辣食物,饮用清淡、易消化的食物。
# 5. **病情监测**:密切观察病人是否出现严重腹痛、发热、恶心、呕吐或其他并发症,必要时进行进一步处理,如引流或手术干预。

# 这些步骤将有助于明确诊断、选择治疗方案并监测病情变化。
# ============================================================

微调模型

bash 复制代码
# 微调医疗
export CUDA_VISIBLE_DEVICES=0
# 查看环境变量
printenv |grep CUDA
# CUDA_DEVICE_ORDER=PCI_BUS_ID
# CUDA_VISIBLE_DEVICES=0

mkdir /root/autodl-tmp/Fine-Tuning -p
cd /root/autodl-tmp/Fine-Tuning
# 上传微调脚本
medical-lora.py
python medical-lora-qwen3_Max.py
# 使用设备: cuda
# 加载数据集完成. 大小: 500, 列名: ['Question', 'Complex_CoT', 'Response']
# 第一条原始数据: {'Question': '根据描述,一个1岁的孩子在夏季头皮出现多处小结节,长期不愈合,且现在疮大如梅,溃破流脓,口不收敛,头皮下有空洞,患处皮肤增厚。这种病症在中医中诊断为什么病?', 'Complex_CoT': '这个小孩子在夏天头皮上长了些小结节,一直都没好,后来变成了脓包,流了好多脓。想想夏天那么热,可能和湿热有关。才一岁的小孩,免疫力本来就不强,夏天的湿热没准就侵袭了身体。\n\n用中医的角度来看,出现小结节、再加上长期不愈合,这些症状让我想到了头疮。小孩子最容易得这些皮肤病,主要因为湿热在体表郁结。\n\n但再看看,头皮下还有空洞,这可能不止是简单的头疮。看起来病情挺严重的,也许是脓肿没治好。这样的情况中医中有时候叫做禿疮或者湿疮,也可能是另一种情况。\n\n等一下,头皮上的空洞和皮肤增厚更像是疾病已经深入到头皮下,这是不是说明有可能是流注或瘰疬?这些名字常描述头部或颈部的严重感染,特别是有化脓不愈合,又形成通道或空洞的情况。\n\n仔细想想,我怎么感觉这些症状更贴近瘰疬的表现?尤其考虑到孩子的年纪和夏天发生的季节性因素,湿热可能是主因,但可能也有火毒或者痰湿造成的滞留。\n\n回到基本的症状描述上看,这种长期不愈合又复杂的状况,如果结合中医更偏重的病名,是不是有可能是涉及更深层次的感染?\n\n再考虑一下,这应该不是单纯的瘰疬,得仔细分析头皮增厚并出现空洞这样的严重症状。中医里头,这样的表现可能更符合'蚀疮'或'头疽'。这些病名通常描述头部严重感染后的溃烂和组织坏死。\n\n看看季节和孩子的体质,夏天又湿又热,外邪很容易侵入头部,对孩子这么弱的免疫系统简直就是挑战。头疽这个病名听起来真是切合,因为它描述的感染严重,溃烂到出现空洞。\n\n不过,仔细琢磨后发现,还有个病名似乎更为合适,叫做'蝼蛄疖',这病在中医里专指像这种严重感染并伴有深部空洞的情况。它也涵盖了化脓和皮肤增厚这些症状。\n\n哦,该不会是夏季湿热,导致湿毒入侵,孩子的体质不能御,其病情发展成这样的感染?综合分析后我觉得'蝼蛄疖'这个病名真是相当符合。', 'Response': '从中医的角度来看,你所描述的症状符合"蝼蛄疖"的病症。这种病症通常发生在头皮,表现为多处结节,溃破流脓,形成空洞,患处皮肤增厚且长期不愈合。湿热较重的夏季更容易导致这种病症的发展,特别是在免疫力较弱的儿童身上。建议结合中医的清热解毒、祛湿消肿的治疗方法进行处理,并配合专业的医疗建议进行详细诊断和治疗。'}
# Map (num_proc=2): 100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 500/500 [00:00<00:00, 2590.03 examples/s]
# 格式化完成. 示例:
# Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.
# Before answering, think carefully about the question and create a step-by-step chain of thoughts to ensure a logical and accurate answer.

# ###...

# Map (num_proc=2): 100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 500/500 [00:00<00:00, 1073.82 examples/s]
# Tokenize 完成. 示例 input_ids 长度: 943
# 加载基础模型...
# `torch_dtype` is deprecated! Use `dtype` instead!
# Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:02<00:00,  1.42s/it]
# trainable params: 41,943,040 || all params: 8,072,204,288 || trainable%: 0.5196
# /root/autodl-tmp/Fine-Tuning/medical-lora-qwen3_Max.py:166: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `Trainer.__init__`. Use `processing_class` instead.
#   trainer = Trainer(
# The model is already on multiple devices. Skipping the move to device specified in `args`.
# 开始 LoRA 微调...
# The tokenizer has new PAD/BOS/EOS tokens that differ from the model config and generation config. The model config and generation config were aligned accordingly, being updated with the tokenizer's values. Updated tokens: {'pad_token_id': 128001}.
# {'loss': 1.9181, 'grad_norm': 0.4617004096508026, 'learning_rate': 0.00019047619047619048, 'epoch': 0.16}
# {'loss': 1.6214, 'grad_norm': 0.43387570977211, 'learning_rate': 0.0001798941798941799, 'epoch': 0.32}
# {'loss': 1.5488, 'grad_norm': 0.407852441072464, 'learning_rate': 0.00016931216931216931, 'epoch': 0.48}
# {'loss': 1.4967, 'grad_norm': 0.38817766308784485, 'learning_rate': 0.00015873015873015873, 'epoch': 0.64}
# {'loss': 1.5514, 'grad_norm': 0.41195449233055115, 'learning_rate': 0.00014814814814814815, 'epoch': 0.8}
# {'loss': 1.4683, 'grad_norm': 0.35507529973983765, 'learning_rate': 0.00013756613756613756, 'epoch': 0.96}
# {'loss': 1.4599, 'grad_norm': 0.4131045937538147, 'learning_rate': 0.00012698412698412698, 'epoch': 1.11}
# {'loss': 1.338, 'grad_norm': 0.5005064010620117, 'learning_rate': 0.0001164021164021164, 'epoch': 1.27}
# {'loss': 1.3203, 'grad_norm': 0.5236028432846069, 'learning_rate': 0.00010582010582010582, 'epoch': 1.43}
# {'loss': 1.3314, 'grad_norm': 0.5776126980781555, 'learning_rate': 9.523809523809524e-05, 'epoch': 1.59}
# {'loss': 1.3738, 'grad_norm': 0.5604743957519531, 'learning_rate': 8.465608465608466e-05, 'epoch': 1.75}
# {'loss': 1.3645, 'grad_norm': 0.5645044445991516, 'learning_rate': 7.407407407407407e-05, 'epoch': 1.91}
# {'loss': 1.261, 'grad_norm': 0.5650695562362671, 'learning_rate': 6.349206349206349e-05, 'epoch': 2.06}
# {'loss': 1.1729, 'grad_norm': 0.6441824436187744, 'learning_rate': 5.291005291005291e-05, 'epoch': 2.22}
# {'loss': 1.1592, 'grad_norm': 0.7328082323074341, 'learning_rate': 4.232804232804233e-05, 'epoch': 2.38}
# {'loss': 1.1471, 'grad_norm': 0.7765035033226013, 'learning_rate': 3.1746031746031745e-05, 'epoch': 2.54}
# {'loss': 1.1099, 'grad_norm': 0.7861570119857788, 'learning_rate': 2.1164021164021164e-05, 'epoch': 2.7}
# {'loss': 1.1541, 'grad_norm': 0.7390344142913818, 'learning_rate': 1.0582010582010582e-05, 'epoch': 2.86}
# {'train_runtime': 490.1031, 'train_samples_per_second': 3.061, 'train_steps_per_second': 0.386, 'train_loss': 1.365936799024148, 'epoch': 3.0}
# 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 189/189 [08:10<00:00,  2.59s/it]
# 微调完成!
# ***** train metrics *****
#   epoch                    =        3.0
#   total_flos               = 49217071GF
#   train_loss               =     1.3659
#   train_runtime            = 0:08:10.10
#   train_samples_per_second =      3.061
#   train_steps_per_second   =      0.386
# 保存模型和 tokenizer...
# LoRA 适配器和 tokenizer 已保存至: ./finetuned/medical-lora

验证微调模型

bash 复制代码
python medical_lora_evaluate.py
# 正在加载Tokenizer与LoRA/QLoRA权重...
# Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:02<00:00,  1.19s/it]

# ============== 开始测试(医疗 AI助手) ==============

# 提问:
# 一个患有急性阑尾炎的病人已经发病5天,腹痛稍有减轻但仍然发热,在体检时发现右下腹有压痛的包块,此时应如何处理?

# 模型回答:
# <think>
# 这个病人已经发病5天了,腹痛开始减轻但还在发烧。嗯,发烧和腹痛是急性阑尾炎的典型症状。现在体检发现右下腹有一个压痛的包块,这让我觉得阑尾可能已经发生了什么变化。

# 哦,对了,阑尾炎如果不及时处理,可能会发展成急性阑尾炎,甚至需要手术治疗。想想看,包块可能是阑尾的炎症已经形成了一个明显的肿块。这种情况下,手术似乎是更合适的选择。

# 我想起来,很多时候如果阑尾炎已经形成包块,手术能有效地去除病变的阑尾,减少感染的风险。当然,手术需要谨慎考虑,得确保病人没有其他严重健康问题,像心肺功能或血液指标正常。

# 所以,根据这些症状和体检结果,先考虑进行阑尾切除术似乎是最合适的。这样可以有效地解决问题,避免未来可能的并发症。

# 不过,等等,我要确认一下,这种包块在急性期是不是有其他可能的病因?有没有可能是炎症反应导致的假性包块呢?如果是这样,可能需要更多的时间来观察。

# 也许在手术前,我们应该先确认包块的性质。哦,如果有疑问的话,可能需要做个穿刺来看看里面是什么东西。

# 所以,结论是,虽然包块存在,我还是先做个穿刺来排除其他可能性是个好主意。这样就能确保手术的必要性和安全性了。
# </think>
# 根据病人的症状和体检结果,右下腹有压痛的包块很可能是由于急性阑尾炎形成的。一般来说,如果阑尾已经形成了明显的炎症包块,通常更适合进行阑尾切除术。这种手术可以有效去除病变的阑尾,防止进一步的感染和潜在的并发症。

# 在进行手术之前,建议进行进一步的检查以确认包块的性质。例如,可以考虑进行穿刺检查,以确定包块内的内容物。通过这种方法,可以排除其他可能性,如炎症反应导致的假性包块。

# 如果穿刺检查确认包块是由于阑尾炎形成的,并且其他健康状况允许,手术是合适的。手术前需确保病人没有严重的心肺功能或血液指标异常,以确保安全。

# 总之,在已知阑尾存在包块的情况下,建议进行手术治疗,并在手术前进行必要的检查以确保手术的必要性和安全性。这样的处理能够有效解决问题,避免未来可能的并发症。希望病人能够早日康复。
# ============== 测试结束(医疗 AI助手) ==============
相关推荐
空影星2 小时前
轻量日记神器RedNotebook,高效记录每一天
python·数据挖掘·数据分析·音视频
搬砖ing换来金砖2 小时前
Python入门-Task02
开发语言·python
databook2 小时前
告别盲人摸象,数据分析的抽样方法总结
后端·python·数据分析
全栈陈序员2 小时前
【Python】基础语法入门(九)—— 代码规范、调试技巧与性能初探
开发语言·python·代码规范
nvd112 小时前
解决 Gemini API 连接卡住问题的方案
python
李剑一2 小时前
Python学习笔记2
python
晨非辰3 小时前
C++ 波澜壮阔 40 年:从基础I/O到函数重载与引用的完整构建
运维·c++·人工智能·后端·python·深度学习·c++40周年
有梦想的西瓜3 小时前
如何优化电力系统潮流分布:最优潮流(OPF)问题
python·电力·opf
DanCheng-studio9 小时前
网安毕业设计简单的方向答疑
python·毕业设计·毕设