Unsloth-Factory : 微调qwen3-14b大模型

部署运行你感兴趣的模型镜像

之前的unsloth-factory版本已经支持了4个模型的微调,包括:DeepSeek-R1-0528-Qwen3-8B,
DeepSeek-R1-Distill-Qwen-7B,Qwen2-7B-Instruct,Qwen3-8B,实现了第一个小目标。

考虑到14B是生产系统的下限,尝试在tesla t4 16g显卡上微调14B模型,以便效果有所提高。在之前版本的基础上,主要改进了model_factory.py,validator.py,evaluator.py代码,解决了之前版本在微调14b出现的Qwen3Attention' object has no attribute 'apply_qkv'问题。

1.1. 微调过程

下面以Qwen3-14B大模型为例,完整的再现SFT微调-领域验证-基准测试-流式对话-权重合并-格式转换GGUF-量化导出的过程。

新增微调qwen3-14b功能的代码依旧在
https://github.com/lxx-com-cn/unsloth-factory/,如果需要看其他4个大模型的效果和日志,可参看之前的博客《微调框架:Unsloth-factory》。

1.1.1. SFT微调

大语言模型无法仅通过提示工程来完成领域适配。为了让大语言模型更好的适配到这些领域,需要对其参数进行微调。但由于大语言模型的参数量巨大,微调成本高昂,阻碍了大语言模型在一些垂直领域的应用。为了降低微调成本,亟需实现效果可靠、成本可控的参数高效微调,现在最常用的是低秩适配方法。

下图是微调现场的环境,在2片tesla t4的服务器上同时微调2个大模型,右边是qwen3-14b,左边是deepseek-r1-qwen3-8b,可以看到经过代码优化后,qwen3-14b也能在16g显卡中稳定持续的微调

(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ 
CUDA_VISIBLE_DEVICES=1 \
python cli.py sft \
  --model /home/yaoxp/models/Qwen3-14B/ \
  --domain medical \
  --dataset datasets/medical_o1_alpaca.json \
  --dataset_format alpaca \
  --output_dir output/sft-qwen3-14b \
  --epochs 3 \
  --max_seq_length 4096 \
  --batch_size 1 \
  --accumulation_steps 2 \
  --dataloader_workers 4 \
  --learning_rate 1e-5 \
  --data_limit 3000 \
  --no_packing \
  --lr_scheduler_type cosine \
  --save_steps 100 \
  --logging_steps 10 \
  --resume auto
/home/yaoxp/work/sft/unsloth-factory03/src/core/model_factory.py:9: UserWarning: WARNING: Unsloth should be imported before transformers, peft to ensure all optimizations are applied. Your code may run slower or encounter memory issues without these optimizations.

Please restructure your imports with 'import unsloth' at the top of your file.
  import unsloth
 Unsloth: Will patch your computer to enable 2x faster free finetuning.
 Unsloth Zoo will now patch everything to make training faster!
2025-08-07 15:39:46 - INFO - src.utils.helpers - 日志系统已初始化
2025-08-07 15:39:46 - INFO - src.trainers.trainer_factory - 创建 SFT 训练器
2025-08-07 15:39:46 - INFO - src.core.model_factory - 检测到模型类型: qwen3_14b
2025-08-07 15:39:46 - INFO - src.core.model_factory - 从原始模型加载tokenizer: /home/yaoxp/models/Qwen3-14B/
2025-08-07 15:39:47 - INFO - src.core.model_factory - 检测到14B大模型,应用特殊优化配置 (SFT模式)
==((====))==  Unsloth 2025.6.5: Fast Qwen3 patching. Transformers: 4.52.4.
   \\   /|    Tesla T4. Num GPUs = 1. Max memory: 14.564 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 license: http://github.com/unslothai/unsloth
Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!
Loading checkpoint shards: 100%|█| 8/8 [00:48<00:00,  6
2025-08-07 15:41:37 - INFO - src.core.model_factory - 使用Unsloth优化加载
2025-08-07 15:41:37 - INFO - src.core.model_factory - 已应用优化层配置
2025-08-07 15:41:39 - INFO - src.core.dataset_factory - 成功加载 alpaca 数据集,样本数: 3000
Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.05.
Unsloth will patch all other layers, except LoRA matrices, causing a performance hit.
Unsloth 2025.6.5 patched 40 layers with 0 QKV layers, 0 O layers and 0 MLP layers.
2025-08-07 15:41:41 - INFO - src.trainers.base_trainer - 使用Unsloth的LoRA配置
2025-08-07 15:41:41 - INFO - src.trainers.base_trainer - 总参数: 8226503680, 可训练参数: 64225280 (0.78%)
2025-08-07 15:41:41 - INFO - src.trainers.sft_trainer - 输出目录不存在,从头开始训练
2025-08-07 15:41:41 - INFO - src.trainers.sft_trainer - 训练配置: domain=medical, batch_size=1, accumulation_steps=2, logging_steps=10, data_limit=3000, resume=None, starting_step=0
2025-08-07 15:41:41 - INFO - src.trainers.sft_trainer - 创建训练器前内存使用: 内存: 1.81 GB, 显存: 120.00 MB
2025-08-07 15:41:41 - INFO - src.utils.helpers - 数据集统计: 总样本=3000, 空样本=0
2025-08-07 15:41:41 - INFO - src.utils.helpers - 文本长度: 最小=459, 最大=8428, 平均=1373.77
Map: 100%|█| 3000/3000 [00:04<00:00, 689.36 examples/s]
2025-08-07 15:41:46 - INFO - src.trainers.sft_trainer - 训练器创建后内存使用: 内存: 1.84 GB, 显存: 120.00 MB
2025-08-07 15:41:46 - INFO - src.trainers.sft_trainer - 数据加载器配置: 4 工作进程
2025-08-07 15:41:46 - INFO - src.trainers.sft_trainer - 开始medical领域的SFT训练...
2025-08-07 15:41:46 - INFO - src.trainers.sft_trainer - 梯度检查点已启用
2025-08-07 15:41:46 - INFO - src.trainers.sft_trainer - 训练开始前内存使用: 内存: 1.84 GB, 显存: 120.00 MB
2025-08-07 15:41:46 - INFO - src.trainers.sft_trainer - 总训练步数: 4500
==((====))==  Unsloth - 2x faster free finetuning | Num GPUs used = 1
   \\   /|    Num examples = 3,000 | Num Epochs = 3 | Total steps = 4,500
O^O/ \_/ \    Batch size per device = 1 | Gradient accumulation steps = 2
\        /    Data Parallel GPUs = 1 | Total batch size (1 x 2 x 1) = 2
 "-____-"     Trainable parameters = 64,225,280/14,000,000,000 (0.46% trained)
{'loss': 2.0778, 'grad_norm': 0.6758548617362976, 'learning_rate': 2.0000000000000002e-07, 'epoch': 0.01}
{'loss': 2.2808, 'grad_norm': 0.7839194536209106, 'learning_rate': 4.2222222222222226e-07, 'epoch': 0.01}
{'loss': 2.2886, 'grad_norm': 0.6878750324249268, 'learning_rate': 6.444444444444445e-07, 'epoch': 0.02}
{'loss': 2.2339, 'grad_norm': 0.7335460186004639, 'learning_rate': 8.666666666666668e-07, 'epoch': 0.03}
{'loss': 2.1574, 'grad_norm': 0.6755250692367554, 'learning_rate': 1.0888888888888889e-06, 'epoch': 0.03}
{'loss': 2.2591, 'grad_norm': 0.6511886119842529, 'learning_rate': 1.3111111111111112e-06, 'epoch': 0.04}
{'loss': 2.22, 'grad_norm': 0.9023497104644775, 'learning_rate': 1.5333333333333334e-06, 'epoch': 0.05}
{'loss': 2.1299, 'grad_norm': 0.7614842057228088, 'learning_rate': 1.7555555555555556e-06, 'epoch': 0.05}
{'loss': 2.1652, 'grad_norm': 1.0170913934707642, 'learning_rate': 1.977777777777778e-06, 'epoch': 0.06}
……
{'loss': 1.4787, 'grad_norm': 0.5960952043533325, 'learning_rate': 9.982138251966297e-06, 'epoch': 0.37}
{'loss': 1.7378, 'grad_norm': 0.7003071308135986, 'learning_rate': 9.978712962355634e-06, 'epoch': 0.38}
{'loss': 1.7534, 'grad_norm': 0.7429748177528381, 'learning_rate': 9.97498809840585e-06, 'epoch': 0.39}
{'loss': 1.5302, 'grad_norm': 0.8611544370651245, 'learning_rate': 9.970963884245885e-06, 'epoch': 0.39}
{'loss': 1.5468, 'grad_norm': 0.637263298034668, 'learning_rate': 9.96664056201689e-06, 'epoch': 0.4}
…..
{'loss': 1.5908, 'grad_norm': 1.082234263420105, 'learning_rate': 6.5118494537522235e-06, 'epoch': 1.39}
{'loss': 1.5691, 'grad_norm': 1.1498541831970215, 'learning_rate': 6.474834749609266e-06, 'epoch': 1.39}
{'loss': 1.5538, 'grad_norm': 1.0227395296096802, 'learning_rate': 6.4377313031249085e-06, 'epoch': 1.4}
……
{'loss': 1.478, 'grad_norm': 1.350367546081543, 'learning_rate': 1.4455468369845015e-09, 'epoch': 2.98}
{'loss': 1.6445, 'grad_norm': 1.209320068359375, 'learning_rate': 6.633743781642166e-10, 'epoch': 2.99}
{'loss': 1.4092, 'grad_norm': 1.262775182723999, 'learning_rate': 1.8201720574206884e-10, 'epoch': 2.99}
{'loss': 1.4821, 'grad_norm': 1.3172553777694702, 'learning_rate': 1.504283478892532e-12, 'epoch': 3.0}
{'train_runtime': 50898.1541, 'train_samples_per_second': 0.177, 'train_steps_per_second': 0.088, 'train_loss': 1.5449734569125706, 'epoch': 3.0}
100%|███████████| 4500/4500 [14:08:18<00:00, 11.31s/it]
2025-08-08 05:50:05 - INFO - src.trainers.sft_trainer - 训练完成后内存使用: 内存: 2.13 GB, 显存: 9078.00 MB
2025-08-08 05:50:06 - INFO - src.trainers.sft_trainer - 模型已保存至: output/sft-qwen3-14b/final_adapter
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ 

1.1.2. 领域验证

功能:

  • 用于验证微调后的模型在特定领域(如医疗、法律等)的表现。
  • 主要任务:加载基础模型和微调后的模型(如果有适配器),在验证数据集上生成响应,并与期望输出进行比较。
  • 生成验证报告,包括模型响应的平均长度、领域术语匹配情况(如是否遗漏关键术语)等。
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ 
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ CUDA_VISIBLE_DEVICES=1 \
python cli.py validate \
  --model /home/yaoxp/models/Qwen3-14B/ \
  --adapter output/sft-qwen3-14b/final_adapter \
  --dataset datasets/medical_o1_alpaca.json \
  --dataset_format alpaca \
  --max_samples 10 \
  --max_seq_length 4096 \
  --output_dir output/sft-qwen3-14b/validation_results
/home/yaoxp/work/sft/unsloth-factory03/src/core/model_factory.py:10: UserWarning: WARNING: Unsloth should be imported before transformers, peft to ensure all optimizations are applied. Your code may run slower or encounter memory issues without these optimizations.

Please restructure your imports with 'import unsloth' at the top of your file.
  import unsloth
 Unsloth: Will patch your computer to enable 2x faster free finetuning.
 Unsloth Zoo will now patch everything to make training faster!
2025-08-07 10:55:11 - INFO - src.utils.helpers - 日志系统已初始化
2025-08-07 10:55:11 - INFO - src.validators.validator - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 10:55:11 - INFO - src.core.model_factory - 检测到模型类型: qwen3_14b
2025-08-07 10:55:11 - INFO - src.core.model_factory - 从原始模型加载tokenizer: /home/yaoxp/models/Qwen3-14B/
2025-08-07 10:55:11 - INFO - src.core.model_factory - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 10:55:11 - INFO - src.core.model_factory - 检测到14B大模型,启用CPU offload
Loading checkpoint shards: 100%|███████████████████████████████| 8/8 [00:25<00:00,  3.17s/it]
Generating train split: 24772 examples [00:01, 24613.05 examples/s]
2025-08-07 10:55:39 - INFO - src.core.dataset_factory - 成功加载 alpaca 数据集,样本数: 10
2025-08-07 10:55:39 - INFO - src.validators.validator - 加载验证数据集: 10 条样本
验证基础模型:  50%|█████████████████████▌                     | 5/10 [04:31<04:34, 55.00s/it]2025-08-07 11:01:07 - WARNING - src.utils.helpers - 可能遗漏领域术语: 胆囊炎
2025-08-07 11:01:07 - WARNING - src.utils.helpers - 可能遗漏领域术语: 胰腺炎
验证基础模型: 100%|██████████████████████████████████████████| 10/10 [09:16<00:00, 55.69s/it]
2025-08-07 11:04:56 - INFO - src.validators.validator - 验证基础模型后内存使用: 内存: 1.92 GB, 显存: 36.00 MB
2025-08-07 11:04:56 - INFO - src.validators.validator - 释放基础模型后内存使用: 内存: 1.92 GB, 显存: 36.00 MB
2025-08-07 11:04:56 - INFO - src.validators.validator - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 11:04:56 - INFO - src.core.model_factory - 检测到模型类型: qwen3_14b
2025-08-07 11:04:56 - INFO - src.core.model_factory - 从原始模型加载tokenizer: /home/yaoxp/models/Qwen3-14B/
2025-08-07 11:04:57 - INFO - src.core.model_factory - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 11:04:57 - INFO - src.core.model_factory - 检测到14B大模型,启用CPU offload
Loading checkpoint shards: 100%|███████████████████████████████| 8/8 [00:24<00:00,  3.07s/it]
验证微调模型:  50%|█████████████████████▌                     | 5/10 [04:44<04:45, 57.15s/it]2025-08-07 11:11:04 - WARNING - src.utils.helpers - 可能遗漏领域术语: 胆囊炎
2025-08-07 11:11:04 - WARNING - src.utils.helpers - 可能遗漏领域术语: 胰腺炎
验证微调模型: 100%|██████████████████████████████████████████| 10/10 [09:32<00:00, 57.24s/it]
2025-08-07 11:14:54 - INFO - src.validators.validator - 验证微调模型后内存使用: 内存: 2.19 GB, 显存: 36.00 MB
2025-08-07 11:14:55 - INFO - src.validators.validator - 释放微调模型后内存使用: 内存: 2.02 GB, 显存: 36.00 MB
2025-08-07 11:14:55 - INFO - src.validators.validator - 验证完成! 结果保存至 output/sft-qwen3-14b/validation_results/validation_results.json

==================================================
验证摘要:
总样本数: 10
基础模型平均响应长度: 247 字符
基础模型领域警告数: 0/10
微调模型平均响应长度: 337 字符
微调模型领域警告数: 0/10
==================================================
完整验证结果已保存至: output/sft-qwen3-14b/validation_results/validation_results.json

==================================================
验证摘要:
总样本数: 10
基础模型平均响应长度: 247 字符
基础模型领域警告数: 0/10
微调模型平均响应长度: 337 字符
微调模型领域警告数: 0/10
==================================================
完整验证结果已保存至: output/sft-qwen3-14b/validation_results/validation_results.json

1.1.3. 评估测试

功能:

  • 评估模型在标准测试集(如C-Eval)上的表现。包括52个学科评估(临床医学、计算机网络、高等数学等),以及STEM专项分析(科学、技术、工程、数学)
  • 支持多种评估任务(目前实现了C-Eval任务)。
  • 评估基础模型和微调后的模型,并生成对比报告。、
  • 目前发现微调的版本和之前的原始版本在C-Eval并没有区别。
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ 
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ CUDA_VISIBLE_DEVICES=1 \
python cli.py evaluate \
  --task ceval \
  --model /home/yaoxp/models/Qwen3-14B/ \
  --adapter output/sft-qwen3-14b/final_adapter \
  --task_dir datasets/ceval-exam \
  --n_shot 10 \
  --lang zh \
  --max_seq_length 4096 \
  --save_dir output/sft-qwen3-14b/evaluation_results
/home/yaoxp/work/sft/unsloth-factory03/src/core/model_factory.py:10: UserWarning: WARNING: Unsloth should be imported before transformers, peft to ensure all optimizations are applied. Your code may run slower or encounter memory issues without these optimizations.

Please restructure your imports with 'import unsloth' at the top of your file.
  import unsloth
 Unsloth: Will patch your computer to enable 2x faster free finetuning.
 Unsloth Zoo will now patch everything to make training faster!
2025-08-07 11:18:50 - INFO - src.utils.helpers - 日志系统已初始化
2025-08-07 11:18:50 - INFO - src.evaluators.evaluator - ====================================================================
2025-08-07 11:18:50 - INFO - src.evaluators.evaluator - 评估基础模型
2025-08-07 11:18:50 - INFO - src.evaluators.evaluator - ====================================================================
2025-08-07 11:18:50 - INFO - src.evaluators.evaluator - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 11:18:50 - INFO - src.core.model_factory - 检测到模型类型: qwen3_14b
2025-08-07 11:18:50 - INFO - src.core.model_factory - 从原始模型加载tokenizer: /home/yaoxp/models/Qwen3-14B/
2025-08-07 11:18:50 - INFO - src.core.model_factory - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 11:18:50 - INFO - src.core.model_factory - 检测到14B大模型,启用CPU offload
Loading checkpoint shards: 100%|███████████████████████████████| 8/8 [00:25<00:00,  3.15s/it]
2025-08-07 11:19:16 - INFO - src.evaluators.evaluator - 加载基础模型后内存使用: 内存: 1.76 GB, 显存: 36.00 MB
2025-08-07 11:19:16 - INFO - src.evaluators.ceval_evaluator - 模型支持的生成参数: inputs, generation_config, logits_processor, stopping_criteria, prefix_allowed_tokens_fn, synced_gpus, assistant_model, streamer, negative_prompt_ids, negative_prompt_attention_mask, use_model_defaults, custom_generate, kwargs
2025-08-07 11:19:16 - INFO - src.evaluators.ceval_evaluator - 找到 52 个学科: clinical_medicine, computer_network, high_school_chemistry...
评估CEval学科:   0%|                                                  | 0/52 [00:00<?, ?it/s]2025-08-07 11:19:16 - INFO - src.evaluators.ceval_evaluator - 开始评估学科: clinical_medicine
2025-08-07 11:19:16 - INFO - src.evaluators.ceval_evaluator - 成功加载 22 条样本: datasets/ceval-exam/val/clinical_medicine_val.csv
2025-08-07 11:19:16 - INFO - src.evaluators.ceval_evaluator - 加载 22 条验证集样本
2025-08-07 11:19:16 - INFO - src.evaluators.ceval_evaluator - 使用 10 条few-shot示例
2025-08-07 11:20:06 - INFO - src.evaluators.ceval_evaluator - 学科 clinical_medicine 评估完成 | 准确率: 0.2273
……
2025-08-07 12:23:15 - INFO - src.evaluators.ceval_evaluator - 成功加载 37 条样本: datasets/ceval-exam/val/college_programming_val.csv
2025-08-07 12:23:15 - INFO - src.evaluators.ceval_evaluator - 加载 37 条验证集样本
2025-08-07 12:23:15 - INFO - src.evaluators.ceval_evaluator - 使用 10 条few-shot示例
2025-08-07 12:25:22 - INFO - src.evaluators.ceval_evaluator - 学科 college_programming 评估完成 | 准确率: 0.2432
评估 college_programming | 准确率: 0.2432:  98%|█████████▊| 51/52 [1:06:05<01:46, 106.63s/it]2025-08-07 12:25:22 - INFO - src.evaluators.ceval_evaluator - 开始评估学科: business_administration
2025-08-07 12:25:22 - INFO - src.evaluators.ceval_evaluator - 成功加载 33 条样本: datasets/ceval-exam/val/business_administration_val.csv
2025-08-07 12:25:22 - INFO - src.evaluators.ceval_evaluator - 加载 33 条验证集样本
2025-08-07 12:25:22 - INFO - src.evaluators.ceval_evaluator - 使用 10 条few-shot示例
2025-08-07 12:26:58 - INFO - src.evaluators.ceval_evaluator - 学科 business_administration 评估完成 | 准确率: 0.2424
评估 business_administration | 准确率: 0.2424: 100%|███████| 52/52 [1:07:41<00:00, 78.11s/it]
2025-08-07 12:26:58 - INFO - src.evaluators.ceval_evaluator - 评估结果保存至: output/sft-qwen3-14b/evaluation_results/base_model
2025-08-07 12:26:58 - INFO - src.evaluators.evaluator - 评估基础模型后内存使用: 内存: 1.97 GB, 显存: 36.00 MB
2025-08-07 12:26:58 - INFO - src.evaluators.evaluator - 释放基础模型后内存使用: 内存: 1.97 GB, 显存: 36.00 MB
2025-08-07 12:26:58 - INFO - src.evaluators.evaluator - =======================================================================
2025-08-07 12:26:58 - INFO - src.evaluators.evaluator - 评估微调后的模型
2025-08-07 12:26:58 - INFO - src.evaluators.evaluator - ========================================================================
2025-08-07 12:26:58 - INFO - src.evaluators.evaluator - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 12:26:58 - INFO - src.core.model_factory - 检测到模型类型: qwen3_14b
2025-08-07 12:26:58 - INFO - src.core.model_factory - 从原始模型加载tokenizer: /home/yaoxp/models/Qwen3-14B/
2025-08-07 12:26:59 - INFO - src.core.model_factory - 加载基础模型: /home/yaoxp/models/Qwen3-14B/
2025-08-07 12:26:59 - INFO - src.core.model_factory - 检测到14B大模型,启用CPU offload
Loading checkpoint shards: 100%|███████████████████████████████| 8/8 [00:24<00:00,  3.07s/it]
2025-08-07 12:27:24 - INFO - src.evaluators.evaluator - 加载微调模型后内存使用: 内存: 2.34 GB, 显存: 36.00 MB
2025-08-07 12:27:24 - INFO - src.evaluators.ceval_evaluator - 模型支持的生成参数: inputs, generation_config, logits_processor, stopping_criteria, prefix_allowed_tokens_fn, synced_gpus, assistant_model, streamer, negative_prompt_ids, negative_prompt_attention_mask, use_model_defaults, custom_generate, kwargs
2025-08-07 12:27:24 - INFO - src.evaluators.ceval_evaluator - 找到 52 个学科: clinical_medicine, computer_network, high_school_chemistry...
评估CEval学科:   0%|                                                  | 0/52 [00:00<?, ?it/s]2025-08-07 12:27:24 - INFO - src.evaluators.ceval_evaluator - 开始评估学科: clinical_medicine
2025-08-07 12:27:24 - INFO - src.evaluators.ceval_evaluator - 成功加载 22 条样本: datasets/ceval-exam/val/clinical_medicine_val.csv
2025-08-07 12:27:24 - INFO - src.evaluators.ceval_evaluator - 加载 22 条验证集样本
2025-08-07 12:27:24 - INFO - src.evaluators.ceval_evaluator - 使用 10 条few-shot示例
2025-08-07 12:28:20 - INFO - src.evaluators.ceval_evaluator - 学科 clinical_medicine 评估完成 | 准确率: 0.2273
……
评估 business_administration | 准确率: 0.2424: 100%|███████| 52/52 [1:08:22<00:00, 78.90s/it]
2025-08-07 13:35:47 - INFO - src.evaluators.ceval_evaluator - 评估结果保存至: output/sft-qwen3-14b/evaluation_results/finetuned_model
2025-08-07 13:35:47 - INFO - src.evaluators.evaluator - 评估微调模型后内存使用: 内存: 2.34 GB, 显存: 36.00 MB
2025-08-07 13:35:47 - INFO - src.evaluators.evaluator - 释放微调模型后内存使用: 内存: 2.14 GB, 显存: 36.00 MB
2025-08-07 13:35:47 - INFO - src.evaluators.evaluator - 评估结果保存至: output/sft-qwen3-14b/evaluation_results/evaluation_results.json
2025-08-07 13:35:47 - INFO - src.evaluators.evaluator - 对比报告保存至: output/sft-qwen3-14b/evaluation_results/comparison_report.txt

=======================================================================
评估对比摘要:
=======================================================================
基础模型平均准确率: 0.2258
基础模型STEM平均: 0.2324
基础模型性能评级: 需改进
--------------------------------------------------------------------------------
微调模型平均准确率: 0.2258
微调模型STEM平均: 0.2324
微调模型性能评级: 需改进
--------------------------------------------------------------------------------
性能对比:
平均准确率变化: 0.0000 (下降)
STEM平均变化: 0.0000 (下降)
========================================================================
完整评估结果和对比报告已保存至: output/sft-qwen3-14b/evaluation_results
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ 

1.1.4. 流式对话

这里的效果,要好于经过量化的版本,对话的结果可以看后续的ollama部署的章节。因为这里没有量化,而且上下文是8k,给与了大模型充分的资源。

启用微调后的对话

原始大模型的对话版本

CUDA_VISIBLE_DEVICES=1 \
python cli.py chat \
  --model /home/yaoxp/models/Qwen3-14B/ \
  --adapter output/sft-qwen3-14b/final_adapter/ \
  --system "你是一个专业的医疗助手" \
  --think_chain
  --max_new_tokens 2048 \
  --no_context
/home/yaoxp/work/sft/unsloth-factory03/src/core/model_factory.py:9: UserWarning: WARNING: Unsloth should be imported before transformers, peft to ensure all optimizations are applied. Your code may run slower or encounter memory issues without these optimizations.

Please restructure your imports with 'import unsloth' at the top of your file.
  import unsloth
 Unsloth: Will patch your computer to enable 2x faster free finetuning.
 Unsloth Zoo will now patch everything to make training faster!
2025-08-09 08:55:33 - INFO - src.utils.helpers - 日志系统已初始化
2025-08-09 08:55:33 - INFO - src.chat.chat - 正在加载模型: /home/yaoxp/models/Qwen3-14B/
2025-08-09 08:55:33 - INFO - src.chat.chat - 检测到模型类型: qwen2
The `load_in_4bit` and `load_in_8bit` arguments are deprecated and will be removed in the future versions. Please, pass a `BitsAndBytesConfig` object in `quantization_config` argument instead.
2025-08-09 08:55:34 - INFO - accelerate.utils.modeling - We will use 90% of the memory on device 0 for storing the model, and 10% for the buffer to avoid OOM. You can set `max_memory` in to a higher value to use more memory (at your own risk).
Loading checkpoint shards: 100%|███████████████████████████████████████████| 8/8 [01:30<00:00, 11.37s/it]
/home/yaoxp/anaconda3/envs/unsloth/lib/python3.11/site-packages/peft/tuners/lora/bnb.py:351: UserWarning: Merge lora module to 4-bit linear may get different generations due to rounding errors.
  warnings.warn(
2025-08-09 08:57:44 - INFO - src.chat.chat - 适配器已合并
2025-08-09 08:57:44 - INFO - src.chat.chat - 模型加载完成
========================================================================
智能助手已启动 - 模型: qwen2
输入 'exit' 或 'quit' 退出
输入 'clear' 清空历史
========================================================================
已启用思维链分析模式
========================================================================

对话部分内容见效果对比章节,有6个模型的回答进行对比分析,分别是Qwen2-7B-Instruct,
DeepSeek-R1-Distill-Qwen-7B,Qwen3-8B,Qwen3-14B,Qwen3-14B量化版本,以及Qwen3-14B原始版本。

1.1.5. 权重合并

把微调后的权重文件和原始大模型的权重文件进行合并,生成微调后完整的大模型权重文件。

(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$ python cli.py merge \
  --model /home/yaoxp/models/Qwen3-14B \
  --adapter output/sft-qwen3-14b/final_adapter \
  --output output/sft-qwen3-14b/merged_model
/home/yaoxp/work/sft/unsloth-factory03/src/core/model_factory.py:10: UserWarning: WARNING: Unsloth should be imported before transformers, peft to ensure all optimizations are applied. Your code may run slower or encounter memory issues without these optimizations.

Please restructure your imports with 'import unsloth' at the top of your file.
  import unsloth
 Unsloth: Will patch your computer to enable 2x faster free finetuning.
 Unsloth Zoo will now patch everything to make training faster!
2025-08-07 13:40:01 - INFO - src.utils.helpers - 日志系统已初始化
2025-08-07 13:40:01 - INFO - src.merger.model_merger - 使用数据类型: torch.float16
2025-08-07 13:40:01 - INFO - src.merger.model_merger - 加载 tokenizer...
2025-08-07 13:40:01 - INFO - src.merger.model_merger - 加载基础模型到 CPU...
Loading checkpoint shards: 100%|███████████████████████████████████████████| 8/8 [00:05<00:00,  1.55it/s]
2025-08-07 13:40:07 - INFO - src.merger.model_merger - 加载并合并 LoRA 到 CPU...
2025-08-07 13:40:35 - INFO - src.merger.model_merger - 保存合并后的模型到磁盘...
2025-08-07 13:41:14 - INFO - src.merger.model_merger - 复制辅助文件: README.md
2025-08-07 13:41:14 - INFO - src.merger.model_merger - 复制辅助文件: tokenizer_config.json
2025-08-07 13:41:14 - INFO - src.merger.model_merger - 复制辅助文件: .mv
2025-08-07 13:41:14 - INFO - src.merger.model_merger - 复制辅助文件: .mdl
2025-08-07 13:41:18 - INFO - src.merger.model_merger - 复制辅助文件: merges.txt
2025-08-07 13:41:18 - INFO - src.merger.model_merger - 复制辅助文件: vocab.json
2025-08-07 13:41:18 - INFO - src.merger.model_merger - 复制辅助文件: model.safetensors.index.json
2025-08-07 13:41:18 - INFO - src.merger.model_merger - 复制辅助文件: LICENSE
2025-08-07 13:41:18 - INFO - src.merger.model_merger - 复制辅助文件: .msc
2025-08-07 13:41:18 - INFO - src.merger.model_merger - 复制辅助文件: configuration.json
2025-08-07 13:41:18 - INFO - src.merger.model_merger - 复制辅助文件: config.json
2025-08-07 13:41:19 - INFO - src.merger.model_merger - 复制辅助文件: tokenizer.json
2025-08-07 13:41:19 - INFO - src.merger.model_merger - 复制辅助文件: generation_config.json
2025-08-07 13:41:19 - INFO - src.merger.model_merger - ✅ 合并完成,模型已保存至: output/sft-qwen3-14b/merged_model
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03$

1.1.6. 格式转换

直接使用llama.cpp作为格式转换和量化导出的工具

(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model$ /home/yaoxp/work/llama.cpp/convert_hf_to_gguf.py --outfile qwen3-14b.gguf ./
INFO:hf-to-gguf:Loading model:
INFO:hf-to-gguf:Model architecture: Qwen3ForCausalLM
INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only
INFO:hf-to-gguf:Exporting model...
INFO:hf-to-gguf:gguf: loading model weight map from 'model.safetensors.index.json'
INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00015.safetensors'
INFO:hf-to-gguf:token_embd.weight,         torch.float16 --> F16, shape = {5120, 151936}
INFO:hf-to-gguf:blk.0.ffn_gate.weight,     torch.float16 --> F16, shape = {5120, 17408}
INFO:hf-to-gguf:blk.0.attn_k_norm.weight,  torch.float16 --> F32, shape = {128}
INFO:hf-to-gguf:blk.0.attn_k.weight,       torch.float16 --> F16, shape = {5120, 1024}
INFO:hf-to-gguf:blk.0.attn_output.weight,  torch.float16 --> F16, shape = {5120, 5120}
INFO:hf-to-gguf:blk.0.attn_q_norm.weight,  torch.float16 --> F32, shape = {128}
INFO:hf-to-gguf:blk.0.attn_q.weight,       torch.float16 --> F16, shape = {5120, 5120}
INFO:hf-to-gguf:blk.0.attn_v.weight,       torch.float16 --> F16, shape = {5120, 1024}
……
INFO:hf-to-gguf:blk.39.attn_v.weight,      torch.float16 --> F16, shape = {5120, 1024}
INFO:hf-to-gguf:gguf: loading model part 'model-00015-of-00015.safetensors'
INFO:hf-to-gguf:output.weight,             torch.float16 --> F16, shape = {5120, 151936}
INFO:hf-to-gguf:blk.39.attn_norm.weight,   torch.float16 --> F32, shape = {5120}
INFO:hf-to-gguf:blk.39.ffn_down.weight,    torch.float16 --> F16, shape = {17408, 5120}
INFO:hf-to-gguf:blk.39.ffn_up.weight,      torch.float16 --> F16, shape = {5120, 17408}
INFO:hf-to-gguf:blk.39.ffn_norm.weight,    torch.float16 --> F32, shape = {5120}
INFO:hf-to-gguf:output_norm.weight,        torch.float16 --> F32, shape = {5120}
INFO:hf-to-gguf:Set meta model
INFO:hf-to-gguf:Set model parameters
INFO:hf-to-gguf:gguf: context length = 40960
INFO:hf-to-gguf:gguf: embedding length = 5120
INFO:hf-to-gguf:gguf: feed forward length = 17408
INFO:hf-to-gguf:gguf: head count = 40
INFO:hf-to-gguf:gguf: key-value head count = 8
INFO:hf-to-gguf:gguf: rope theta = 1000000
INFO:hf-to-gguf:gguf: rms norm epsilon = 1e-06
INFO:hf-to-gguf:gguf: file type = 1
INFO:hf-to-gguf:Set model quantization version
INFO:hf-to-gguf:Set model tokenizer
INFO:gguf.vocab:Adding 151387 merge(s).
INFO:gguf.vocab:Setting special token type eos to 151645
INFO:gguf.vocab:Setting special token type pad to 151643
INFO:gguf.vocab:Setting special token type bos to 151643
INFO:gguf.vocab:Setting add_bos_token to False
INFO:gguf.vocab:Setting chat_template to {%- if tools %}
    {{- '<|im_start|>system\n' }}
    {%- if messages[0].role == 'system' %}
        {{- messages[0].content + '\n\n' }}
    {%- endif %}
    {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
    {%- for tool in tools %}
        {{- "\n" }}
        {{- tool | tojson }}
    {%- endfor %}
    {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
{%- else %}
    {%- if messages[0].role == 'system' %}
        {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }}
    {%- endif %}
{%- endif %}
{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
{%- for message in messages[::-1] %}
    {%- set index = (messages|length - 1) - loop.index0 %}
    {%- if ns.multi_step_tool and message.role == "user" and message.content is string and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}
        {%- set ns.multi_step_tool = false %}
        {%- set ns.last_query_index = index %}
    {%- endif %}
{%- endfor %}
{%- for message in messages %}
    {%- if message.content is string %}
        {%- set content = message.content %}
    {%- else %}
        {%- set content = '' %}
    {%- endif %}
    {%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
        {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
    {%- elif message.role == "assistant" %}
        {%- set reasoning_content = '' %}
        {%- if message.reasoning_content is string %}
            {%- set reasoning_content = message.reasoning_content %}
        {%- else %}
            {%- if '</think>' in content %}
                {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
                {%- set content = content.split('</think>')[-1].lstrip('\n') %}
            {%- endif %}
        {%- endif %}
        {%- if loop.index0 > ns.last_query_index %}
            {%- if loop.last or (not loop.last and reasoning_content) %}
                {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
            {%- else %}
                {{- '<|im_start|>' + message.role + '\n' + content }}
            {%- endif %}
        {%- else %}
            {{- '<|im_start|>' + message.role + '\n' + content }}
        {%- endif %}
        {%- if message.tool_calls %}
            {%- for tool_call in message.tool_calls %}
                {%- if (loop.first and content) or (not loop.first) %}
                    {{- '\n' }}
                {%- endif %}
                {%- if tool_call.function %}
                    {%- set tool_call = tool_call.function %}
                {%- endif %}
                {{- '<tool_call>\n{"name": "' }}
                {{- tool_call.name }}
                {{- '", "arguments": ' }}
                {%- if tool_call.arguments is string %}
                    {{- tool_call.arguments }}
                {%- else %}
                    {{- tool_call.arguments | tojson }}
                {%- endif %}
                {{- '}\n</tool_call>' }}
            {%- endfor %}
        {%- endif %}
        {{- '<|im_end|>\n' }}
    {%- elif message.role == "tool" %}
        {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
            {{- '<|im_start|>user' }}
        {%- endif %}
        {{- '\n<tool_response>\n' }}
        {{- content }}
        {{- '\n</tool_response>' }}
        {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
            {{- '<|im_end|>\n' }}
        {%- endif %}
    {%- endif %}
{%- endfor %}
{%- if add_generation_prompt %}
    {{- '<|im_start|>assistant\n' }}
    {%- if enable_thinking is defined and enable_thinking is false %}
        {{- '<think>\n\n</think>\n\n' }}
    {%- endif %}
{%- endif %}
INFO:gguf.gguf_writer:Writing the following files:
INFO:gguf.gguf_writer:qwen3-14b.gguf: n_tensors = 443, total_size = 29.5G
Writing: 100%|████████████████████████████████████████████████████| 29.5G/29.5G [01:04<00:00, 459Mbyte/s]
INFO:hf-to-gguf:Model successfully exported to qwen3-14b.gguf
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model$

注意:

关于DeepSeek-R1-0528-Qwen3-8B模型的格式转换报错的问题。虽然前面微调,验证,测试,对话,包括微调权重和原生权重文件的合并都是正常的,但在调用llama.cpp做格式转换的报错,经查是llama.cpp 的 convert_hf_to_gguf.py 在解析 DeepSeek-R1-0528-Qwen3-8B 时,遇到 “BPE pre-tokenizer 未被识别” 的异常,最终抛出NotImplementedError("BPE pre-tokenizer was not recognized...。这个bug应该在晚些时候可以被修复,这里没有持续跟进。

1.1.7. 量化导出

为了有更好的效果,采用Q5_K_M量化,而不是Q_4,不同的量化效果和使用场景在下面列出:

  • Q5_0 的含义
  1. Q5_0 是一种 朴素量化方法(Vanilla Quantization),属于 llama.cpp 支持的量化类型之一。
  2. 数字后缀(5):表示每个权重参数使用 5 bit 进行量化(即每个权重的精度为 5 bit)。
  3. 后缀 0:表示使用 0 型量化,即:
  4. 量化范围对齐到以 0 为中心的对称区间(如 -16 到 15 对于 5 bit 有符号数)。
  5. 适用场景:适合对精度要求较高的场景,但相比混合精度量化(如 Q5_K_M),其压缩率较低,显存占用较大
  • Q4_K_M:
  1. 4 bit 量化,使用 K-quants 分块量化(Block-wise Quantization)和 M 级混合精度优化。
  2. 每个块(32/64 权重)共享缩放因子,部分关键层(如注意力层)使用更高精度(如 6 bit)。
  3. 平衡精度与显存占用,是通用推荐选项。
  • Q5_K_M:
  1. 5 bit 量化,混合精度优化级别为 M。
  2. 相比 Q4_K_M,精度更高但显存占用略大,适合对精度敏感的任务(如代码生成、数学推理)。
  • Q6_K:
  1. 6 bit 量化,接近 FP16 精度,适合需要极低精度损失的场景(如研究调试)。

量化导出也是使用llama.cpp工具

(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model$
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model$ /home/yaoxp/work/llama.cpp/build/bin/llama-quantize qwen3-14b.gguf qwen3-14b-q5km.gguf Q5_K_M
main: build = 0 (unknown)
main: built with cc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 for x86_64-linux-gnu
main: quantizing 'qwen3-14b.gguf' to 'qwen3-14b-q5km.gguf' as Q5_K_M
llama_model_loader: loaded meta data with 32 key-value pairs and 443 tensors from qwen3-14b.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv   0:                       general.architecture str              = qwen3
llama_model_loader: - kv   1:                               general.type str              = model
llama_model_loader: - kv   2:                         general.size_label str              = 15B
llama_model_loader: - kv   3:                            general.license str              = apache-2.0
llama_model_loader: - kv   4:                       general.license.link str              = https://huggingface.co/Qwen/Qwen3-14B...
llama_model_loader: - kv   5:                   general.base_model.count u32              = 1
llama_model_loader: - kv   6:                  general.base_model.0.name str              = Qwen3 14B Base
llama_model_loader: - kv   7:          general.base_model.0.organization str              = Qwen
llama_model_loader: - kv   8:              general.base_model.0.repo_url str              = https://huggingface.co/Qwen/Qwen3-14B...
llama_model_loader: - kv   9:                               general.tags arr[str,1]       = ["text-generation"]
llama_model_loader: - kv  10:                          qwen3.block_count u32              = 40
llama_model_loader: - kv  11:                       qwen3.context_length u32              = 40960
llama_model_loader: - kv  12:                     qwen3.embedding_length u32              = 5120
llama_model_loader: - kv  13:                  qwen3.feed_forward_length u32              = 17408
llama_model_loader: - kv  14:                 qwen3.attention.head_count u32              = 40
llama_model_loader: - kv  15:              qwen3.attention.head_count_kv u32              = 8
llama_model_loader: - kv  16:                       qwen3.rope.freq_base f32              = 1000000.000000
llama_model_loader: - kv  17:     qwen3.attention.layer_norm_rms_epsilon f32              = 0.000001
llama_model_loader: - kv  18:                 qwen3.attention.key_length u32              = 128
llama_model_loader: - kv  19:               qwen3.attention.value_length u32              = 128
llama_model_loader: - kv  20:                          general.file_type u32              = 1
llama_model_loader: - kv  21:               general.quantization_version u32              = 2
llama_model_loader: - kv  22:                       tokenizer.ggml.model str              = gpt2
llama_model_loader: - kv  23:                         tokenizer.ggml.pre str              = qwen2
llama_model_loader: - kv  24:                      tokenizer.ggml.tokens arr[str,151936]  = ["!", "\"", "#", "#34;, "%", "&", "'", ...
llama_model_loader: - kv  25:                  tokenizer.ggml.token_type arr[i32,151936]  = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv  26:                      tokenizer.ggml.merges arr[str,151387]  = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv  27:                tokenizer.ggml.eos_token_id u32              = 151645
llama_model_loader: - kv  28:            tokenizer.ggml.padding_token_id u32              = 151643
llama_model_loader: - kv  29:                tokenizer.ggml.bos_token_id u32              = 151643
llama_model_loader: - kv  30:               tokenizer.ggml.add_bos_token bool             = false
llama_model_loader: - kv  31:                    tokenizer.chat_template str              = {%- if tools %}\n    {{- '<|im_start|>...
llama_model_loader: - type  f32:  161 tensors
llama_model_loader: - type  f16:  282 tensors
[   1/ 443]                        output.weight - [ 5120, 151936,     1,     1], type =    f16, converting to q6_K .. size =  1483.75 MiB ->   608.57 MiB
[   2/ 443]                   output_norm.weight - [ 5120,     1,     1,     1], type =    f32, size =    0.020 MB
[   3/ 443]                    token_embd.weight - [ 5120, 151936,     1,     1], type =    
……
[ 435/ 443]              blk.39.attn_norm.weight - [ 5120,     1,     1,     1], type =    f32, size =    0.020 MB
[ 436/ 443]            blk.39.attn_output.weight - [ 5120,  5120,     1,     1], type =    f16, converting to q5_K .. size =    50.00 MiB ->    17.19 MiB
[ 437/ 443]                 blk.39.attn_q.weight - [ 5120,  5120,     1,     1], type =    f16, converting to q5_K .. size =    50.00 MiB ->    17.19 MiB
[ 438/ 443]            blk.39.attn_q_norm.weight - [  128,     1,     1,     1], type =    f32, size =    0.000 MB
[ 439/ 443]                 blk.39.attn_v.weight - [ 5120,  1024,     1,     1], type =    f16, converting to q6_K .. size =    10.00 MiB ->     4.10 MiB
[ 440/ 443]               blk.39.ffn_down.weight - [17408,  5120,     1,     1], type =    f16, converting to q6_K .. size =   170.00 MiB ->    69.73 MiB
[ 441/ 443]               blk.39.ffn_gate.weight - [ 5120, 17408,     1,     1], type =    f16, converting to q5_K .. size =   170.00 MiB ->    58.44 MiB
[ 442/ 443]               blk.39.ffn_norm.weight - [ 5120,     1,     1,     1], type =    f32, size =    0.020 MB
[ 443/ 443]                 blk.39.ffn_up.weight - [ 5120, 17408,     1,     1], type =    f16, converting to q5_K .. size =   170.00 MiB ->    58.44 MiB
llama_model_quantize_impl: model size  = 28169.12 MB
llama_model_quantize_impl: quant size  = 10021.79 MB

main: quantize time = 164409.87 ms
main:    total time = 164409.87 ms

此刻完整的权重+导出+量化的文件列表如下:

(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model$ ll
总计 67979280
drwxrwxr-x 2 yaoxp yaoxp        4096  8月  7 13:53 ./
drwxr-xr-x 9 yaoxp yaoxp        4096  8月  7 13:40 ../
-rw-rw-r-- 1 yaoxp yaoxp         707  8月  7 13:40 added_tokens.json
-rw-rw-r-- 1 yaoxp yaoxp        4168  8月  7 13:40 chat_template.jinja
-rw-r--r-- 1 yaoxp yaoxp         728  7月 31 16:15 config.json
-rw-r--r-- 1 yaoxp yaoxp          73  7月 31 16:15 configuration.json
-rw-r--r-- 1 yaoxp yaoxp         239  7月 31 16:15 generation_config.json
-rw-r--r-- 1 yaoxp yaoxp       11343  7月 31 16:15 LICENSE
-rw-r--r-- 1 yaoxp yaoxp          37  7月 31 16:15 .mdl
-rw-r--r-- 1 yaoxp yaoxp     1671853  7月 31 16:16 merges.txt
-rw-rw-r-- 1 yaoxp yaoxp  1859913128  8月  7 13:40 model-00001-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875376  8月  7 13:40 model-00002-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875376  8月  7 13:40 model-00003-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875376  8月  7 13:40 model-00004-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:40 model-00005-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:40 model-00006-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:40 model-00007-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:40 model-00008-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:40 model-00009-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:41 model-00010-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:41 model-00011-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:41 model-00012-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:41 model-00013-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1981875408  8月  7 13:41 model-00014-of-00015.safetensors
-rw-rw-r-- 1 yaoxp yaoxp  1912371880  8月  7 13:41 model-00015-of-00015.safetensors
-rw-r--r-- 1 yaoxp yaoxp       36514  7月 31 16:17 model.safetensors.index.json
-rw------- 1 yaoxp yaoxp        1408  7月 31 16:21 .msc
-rw-r--r-- 1 yaoxp yaoxp          36  7月 31 16:21 .mv
-rw-rw-r-- 1 yaoxp yaoxp 29543423712  8月  7 13:52 qwen3-14b.gguf
-rw-rw-r-- 1 yaoxp yaoxp 10514569952  8月  7 13:56 qwen3-14b-q5km.gguf
-rw-r--r-- 1 yaoxp yaoxp       16670  7月 31 16:17 README.md
-rw-rw-r-- 1 yaoxp yaoxp         613  8月  7 13:40 special_tokens_map.json
-rw-r--r-- 1 yaoxp yaoxp        9732  7月 31 16:17 tokenizer_config.json
-rw-r--r-- 1 yaoxp yaoxp    11422654  7月 31 16:17 tokenizer.json
-rw-r--r-- 1 yaoxp yaoxp     2776833  7月 31 16:18 vocab.json
(unsloth) yaoxp@ubt22ai5:~/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model$

1.1.8. Ollama部署

最后一步,把量化后的gguf部署在ollama,从而形成从微调到部署的闭环处理。先要获取modelfile,这一步可以直接从ollama中获取到,然后最关键的一步是修改路径地址,指向你量化后的gguf的位置,同时modelfile也要部署在相同的位置上。

cd /home/yaoxp/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model
ollama show qwen3:14b --modelfile >> Modelfile
vi Modelfile
FROM /home/yaoxp/work/sft/unsloth-factory03/output/sft-qwen3-14b/merged_model/qwen3-14b-6k.gguf

ollama create qwen3-14b-q6k -f Modelfile

创建成功后,我们可以使用“ollama list”来查看部署好的模型并执行
ollama list
ollama run qwen3-14b-q6k:latest

验证

为了尽可能获得高质量回复,放弃Q5_K_M而启用Q6_K,kOllama启动后,对模型提了几个相同的问题,如下:

对比

因为察觉到相同的问题,ollama的回答与之前的chat的对话内容和长度有些不同,而且感觉回答质量差距大,所以后续做了6个模型详细对比,此处就不在单独分析全尺寸版本和ollama量化版本的区别。

1.2. 效果对比

通过unsloth-factory微调了4个模型(deepseek-r1-qwen3-8b不能导出gguf格式文件),对比了
DeepSeek-R1-Distill-Qwen-7B,Qwen2-7B-Instruct,Qwen3-8B,Qwen3-14B,Qwen3-14B量化版本(q6_k,部署在ollama上),以及Qwen3-14B原始版本,分别对6个模型提出了3个相同问题:

1. 问题1:一名70岁的男性患者因胸痛伴呕吐16小时就医,心电图显示下壁导联和右胸导联ST段抬高0.1~0.3mV,经补液后血压降至80/60mmHg,患者出现呼吸困难和不能平卧的症状,体检发现双肺有大量水泡音。在这种情况下,最恰当的药物处理是什么?

2. 问题2:对于一名60岁男性患者,出现右侧胸疼并在X线检查中显示右侧肋膈角消失,诊断为肺结核伴右侧胸腔积液,请问哪一项实验室检查对了解胸水的性质更有帮助?

3. 问题3:一个1岁的孩子在夏季头皮出现多处小结节,长期不愈合,且现在疮大如梅,溃破流脓,口不收敛,头皮下有空洞,患处皮肤增厚。这种病症在中医中诊断为什么病?

考虑到篇幅,所以只保留一个问题作为示范,并对格式做紧致拍板,结论还是针对3个问题的综合回答

1.2.1. qwen3-14-微调版本对话

<用户>: 一名70岁的男性患者因胸痛伴呕吐16小时就医,心电图显示下壁导联和右胸导联ST段抬高0.1~0.3mV,经补液后血压降至80/60mmHg,患者出现呼吸困难和不能平卧的症状,体检发现双肺有大量水泡音。在这种情况下,最恰当的药物处理是什么?

<思维链分析>

:嗯,患者是一位70岁的男性,胸痛和呕吐已经持续了16小时,这确实有点时间了。首先,心电图显示下壁导联和右胸导联ST段抬高,这让我想到可能发生了急性心肌梗死,特别是下壁和右室的梗死。因为下壁梗死可能影响右室的供血,导致右室功能不全,而右室梗死的话,右心室的收缩力下降,可能会引起低血压。

然后,患者在补液后血压下降到80/60mmHg,这可能是因为右室梗死导致右心室充盈压升高,而左心室的输出减少,所以补液反而加重了右心室的负荷,导致心输出量进一步下降。这时候出现呼吸困难和不能平卧,还有双肺的大量水泡音,这提示可能有急性肺水肿,但右室梗死时,左心室可能不会出现明显的心衰,反而因为右心室的低输出,导致肺循环压力升高,或者可能合并了左心室的问题?

不过,右室梗死通常导致低血压和右心衰竭,而不是左心衰竭,所以肺水肿可能不是主要问题,但患者出现了这些症状,可能需要考虑是否同时存在左心室的问题,或者是否有其他原因导致肺水肿,比如肺动脉高压或者急性左心衰。不过右室梗死通常不会导致左心衰,除非合并了其他因素。

接下来,处理方面,右室梗死的治疗通常需要避免过多的补液,因为右室梗死时,右心室对容量负荷敏感,补液可能会加重右心室的负担,导致低血压。但患者已经补液后血压下降,这可能说明需要限制补液,同时可能需要使用血管活性药物来维持血压。另外,患者出现呼吸困难和肺水肿,可能需要利尿剂来减轻肺淤血,但需要注意是否会导致低血压加重。

不过,右室梗死的处理通常包括使用升压药如多巴胺或多巴酚丁胺来维持血压,同时避免过多的补液。如果患者有心源性休克,可能需要使用机械支持,比如主动脉内球囊反搏(IABP)或者体外膜肺氧合(ECMO)。另外,溶栓治疗或者紧急PCI可能是必要的,但需要评估患者是否适合溶栓或者是否需要立即行冠状动脉造影。

不过,患者已经出现低血压和肺水肿,可能需要同时处理休克和肺水肿,所以可能需要使用利尿剂和升压药的组合。但需要谨慎,因为右室梗死时,过多的利尿可能导致血容量不足,进一步降低心输出量。这时候可能需要使用小剂量利尿剂,同时使用升压药维持血压。

可能的药物处理包括使用多巴胺或去甲肾上腺素来维持血压,同时使用利尿剂如呋塞米来减轻肺淤血,但需要监测血压和尿量。另外,可能需要使用硝酸甘油来减轻心脏负荷,但需要小心避免血压进一步下降。不过,右室梗死时,硝酸甘油可能会降低左心室前负荷,但右室梗死时右心室前负荷可能已经很高,所以可能需要谨慎使用。

另外,是否需要考虑溶栓治疗?如果患者在时间窗内,可能需要溶栓,但需要评估是否有禁忌症,比如年龄、出血风险等。如果时间已经超过了溶栓的窗口期,可能需要紧急PCI。不过患者已经出现休克,可能需要紧急再灌注治疗。

不过,现在的问题是,最恰当的药物处理是什么?可能需要立即开始升压药物维持血压,同时使用利尿剂减轻肺淤血,但要避免过多补液。可能需要多巴胺或去甲肾上腺素,同时使用小剂量利尿剂。此外,可能需要监测心输出量,考虑使用主动脉内球囊反搏来支持循环。

不过,可能还需要考虑患者是否有心肌梗死的再灌注治疗,比如溶栓或PCI,但需要根据具体情况决定。不过问题问的是药物处理,可能重点是升压和利尿,同时避免过多补液。

</think>

根据患者临床表现和心电图特征,最可能的诊断是**急性下壁和右室心肌梗死**,并已发展为**右心室功能不全**和**低血压性休克**。此时的处理需兼顾维持血压、改善心输出量及避免加重右心室负荷。以下是关键处理步骤和药物选择:

---

### **1. 确认诊断与紧急处理**

- **心电图特征**:下壁导联(II、III、aVF)和右胸导联(V1–V4)ST段抬高提示**右室梗死**,常合并下壁梗死。

- **临床表现**:低血压(80/60 mmHg)、呼吸困难、肺水肿(双肺水泡音)提示**右心室衰竭**(右室梗死导致右心室充盈压升高,左心室输出减少),而非典型左心衰竭。

---

### **2. 最恰当的药物处理**

#### **(1)避免过度补液**

- 右室梗死患者对容量负荷敏感,补液可能加重右室淤血,导致低血压。**需限制液体摄入**,避免进一步降低心输出量。

#### **(2)使用升压药物维持血压**

- **去甲肾上腺素**(首选):

- 增加外周血管阻力,提升收缩压和平均动脉压。

- 避免过度升压导致心肌耗氧增加,需监测血压(目标:维持平均动脉压≥60–70 mmHg)。

- **多巴胺**(可选):

- 小剂量(<3 µg/kg/min)用于增加心输出量,大剂量(>10 µg/kg/min)可能加重右室负荷,需谨慎。

#### **(3)利尿剂减轻肺淤血**

- **呋塞米**(静脉注射):

- 小剂量(如20–40 mg)缓解肺淤血,但需避免过度利尿导致血容量不足。

- 需密切监测尿量、电解质及血压变化。

#### **(4)避免使用硝酸甘油**

- 硝酸甘油可能降低左心室前负荷,但右室梗死时右心室前负荷已升高,使用可能加重右室淤血,导致血压进一步下降。

#### **(5)考虑机械支持**

- 若药物治疗无效,需考虑**主动脉内球囊反搏(IABP)**或**体外膜肺氧合(ECMO)**支持循环。

---

### **3. 其他关键措施**

- **再灌注治疗**:

- 若患者在溶栓时间窗内(发病<12小时),可考虑**溶栓治疗**(如阿替普酶)。

- 若条件允许,**急诊冠状动脉造影及PCI**是首选,尤其针对右冠状动脉(RCA)闭塞。

- **监测与评估**:

- 持续监测血压、心电图、尿量及肺水肿情况。

- 避免使用β受体阻滞剂(可能加重低血压)。

---

### **总结**

最恰当的药物处理是:

- **去甲肾上腺素**维持血压;

- **小剂量呋塞米**缓解肺淤血;

- **限制补液**,避免加重右心室负荷;

- **紧急再灌注治疗**(溶栓或PCI)以恢复右室供血。

需在心血管专科团队指导下迅速处理,以改善预后。

1.2.2. qwen3-14-原始版本对话

<用户>: 一名70岁的男性患者因胸痛伴呕吐16小时就医,心电图显示下壁导联和右胸导联ST段抬高0.1~0.3mV,经补液后血压降至80/60mmHg,患者出现呼吸困难和不能平卧的症状,体检发现双肺有大量水泡音。在这种情况下,最恰当的药物处理是什么?

<思维链分析>

嗯,患者是一位70岁的男性,胸痛和呕吐已经持续了16小时,这确实有点时间了。首先,心电图显示下壁导联和右胸导联ST段抬高,这让我想到可能发生了急性心肌梗死,特别是下壁和右室的梗死。因为下壁梗死可能影响右室的供血,导致右室功能不全,而右室梗死的话,右心室的收缩力下降,可能会引起低血压。

然后,患者在补液后血压下降到80/60mmHg,这可能是因为右室梗死导致右心室充盈压升高,而左心室的输出减少,所以补液反而加重了右心室的负荷,导致心输出量进一步下降。这时候出现呼吸困难和不能平卧,还有双肺的大量水泡音,这提示可能有急性肺水肿,但右室梗死时,左心室可能不会出现明显的心衰,反而因为右心室的低输出,导致肺循环压力升高,或者可能合并了左心室的问题?

不过,右室梗死通常导致低血压和右心衰竭,而不是左心衰竭,所以肺水肿可能不是主要问题,但患者出现了这些症状,可能需要考虑是否同时存在左心室的问题,或者是否有其他原因导致肺水肿,比如肺动脉高压或者急性左心衰。不过右室梗死通常不会导致左心衰,除非合并了其他因素。

接下来,处理方面,右室梗死的治疗通常需要避免过多的补液,因为右室梗死时,右心室对容量负荷敏感,补液可能会加重右心室的负担,导致低血压。但患者已经补液后血压下降,这可能说明需要限制补液,同时可能需要使用血管活性药物来维持血压。另外,患者出现呼吸困难和肺水肿,可能需要利尿剂来减轻肺淤血,但需要注意是否会导致低血压加重。

不过,右室梗死的处理通常包括使用升压药如多巴胺或多巴酚丁胺来维持血压,同时避免过多的补液。如果患者有心源性休克,可能需要使用机械支持,比如主动脉内球囊反搏(IABP)或者体外膜肺氧合(ECMO)。另外,溶栓治疗或者紧急PCI可能是必要的,但需要评估患者是否适合溶栓或者是否需要立即行冠状动脉造影。

不过,患者已经出现低血压和肺水肿,可能需要同时处理休克和肺水肿,所以可能需要使用利尿剂和升压药的组合。但需要谨慎,因为右室梗死时,过多的利尿可能导致血容量不足,进一步降低心输出量。这时候可能需要使用小剂量利尿剂,同时使用升压药维持血压。

可能的药物处理包括使用多巴胺或去甲肾上腺素来维持血压,同时使用利尿剂如呋塞米来减轻肺淤血,但需要监测血压和尿量。另外,可能需要使用硝酸甘油来减轻心脏负荷,但需要小心避免血压进一步下降。不过,右室梗死时,硝酸甘油可能会降低左心室前负荷,但右室梗死时右心室前负荷可能已经很高,所以可能需要谨慎使用。

另外,是否需要考虑溶栓治疗?如果患者在时间窗内,可能需要溶栓,但需要评估是否有禁忌症,比如年龄、出血风险等。如果时间已经超过了溶栓的窗口期,可能需要紧急PCI。不过患者已经出现休克,可能需要紧急再灌注治疗。

不过,现在的问题是,最恰当的药物处理是什么?可能需要立即开始升压药物维持血压,同时使用利尿剂减轻肺淤血,但要避免过多补液。可能需要多巴胺或去甲肾上腺素,同时使用小剂量利尿剂。此外,可能需要监测心输出量,考虑使用主动脉内球囊反搏来支持循环。

不过,可能还需要考虑患者是否有心肌梗死的再灌注治疗,比如溶栓或PCI,但需要根据具体情况决定。不过问题问的是药物处理,可能重点是升压和利尿,同时避免过多补液。

</think>

根据患者临床表现和心电图特征,最可能的诊断是**急性下壁和右室心肌梗死**,并已发展为**右心室功能不全**和**低血压性休克**。此时的处理需兼顾维持血压、改善心输出量及避免加重右心室负荷。以下是关键处理步骤和药物选择:

---

### **1. 确认诊断与紧急处理**

- **心电图特征**:下壁导联(II、III、aVF)和右胸导联(V1–V4)ST段抬高提示**右室梗死**,常合并下壁梗死。

- **临床表现**:低血压(80/60 mmHg)、呼吸困难、肺水肿(双肺水泡音)提示**右心室衰竭**(右室梗死导致右心室充盈压升高,左心室输出减少),而非典型左心衰竭。

---

### **2. 最恰当的药物处理**

#### **(1)避免过度补液**

- 右室梗死患者对容量负荷敏感,补液可能加重右室淤血,导致低血压。**需限制液体摄入**,避免进一步降低心输出量。

#### **(2)使用升压药物维持血压**

- **去甲肾上腺素**(首选):

- 增加外周血管阻力,提升收缩压和平均动脉压。

- 避免过度升压导致心肌耗氧增加,需监测血压(目标:维持平均动脉压≥60–70 mmHg)。

- **多巴胺**(可选):

- 小剂量(<3 µg/kg/min)用于增加心输出量,大剂量(>10 µg/kg/min)可能加重右室负荷,需谨慎。

#### **(3)利尿剂减轻肺淤血**

- **呋塞米**(静脉注射):

- 小剂量(如20–40 mg)缓解肺淤血,但需避免过度利尿导致血容量不足。

- 需密切监测尿量、电解质及血压变化。

#### **(4)避免使用硝酸甘油**

- 硝酸甘油可能降低左心室前负荷,但右室梗死时右心室前负荷已升高,使用可能加重右室淤血,导致血压进一步下降。

#### **(5)考虑机械支持**

- 若药物治疗无效,需考虑**主动脉内球囊反搏(IABP)**或**体外膜肺氧合(ECMO)**支持循环。

---

### **3. 其他关键措施**

- **再灌注治疗**:

- 若患者在溶栓时间窗内(发病<12小时),可考虑**溶栓治疗**(如阿替普酶)。

- 若条件允许,**急诊冠状动脉造影及PCI**是首选,尤其针对右冠状动脉(RCA)闭塞。

- **监测与评估**:

- 持续监测血压、心电图、尿量及肺水肿情况。

- 避免使用β受体阻滞剂(可能加重低血压)。

---

### **总结**

最恰当的药物处理是:

- **去甲肾上腺素**维持血压;

- **小剂量呋塞米**缓解肺淤血;

- **限制补液**,避免加重右心室负荷;

- **紧急再灌注治疗**(溶栓或PCI)以恢复右室供血。

需在心血管专科团队指导下迅速处理,以改善预后。

<用户>:

1.2.3. qwen3-14-量化q6K对话

>>> 一名70岁的男性患者因胸痛伴呕吐16小时就医,心电图显示下壁导联和右胸导联ST段抬高0.1~0.3mV,经补液后血压降至80/60mmHg,患者出现呼吸困难和不能平卧的症状,体检发现双肺有大量水泡音。在这种情况下,最恰当的药物处理是什么?

Thinking...

患者是一位70岁的男性,出现了胸痛和呕吐,已经持续了16小时。看起来他可能有严重的心脏问题。心电图显示下壁导联和右胸导联ST段抬高,这通常提示可能发生了急性心肌梗死,尤其是下壁和右室的梗死。

哦,还有一点,他的血压降到了80/60mmHg,这表明他可能有低血压,而低血压可能是因为心肌梗死导致的心输出量减少,或者因为心肌受损导致泵功能下降。

现在,他还出现了呼吸困难和不能平卧,体检也发现双肺有大量水泡音。这听起来像心脏衰竭,可能是由于心肌梗死引起的急性心力衰竭。

在这种情况下,心源性休克和急性心力衰竭同时发生,需要迅速处理。首先,我们需要稳定他的生命体征,比如纠正低血压。补液是第一步,但似乎没有效果,因为补液后血压还是低,这提示可能需要使用升压药物来提高血压。

对于急性心肌梗死,尤其是下壁和右室梗死,硝酸甘油可能不是最佳选择,因为它可能导致低血压加重。所以我们应该考虑其他药物,比如多巴胺或多巴酚丁胺,但这些药物主要用于提升心输出量。

然而,考虑到他可能同时有急性心力衰竭,我们还需要考虑如何减轻心脏的负担。利尿剂,如呋塞米,可以快速减轻肺水肿,从而缓解呼吸困难的症状。

所以,结合这些因素,呋塞米是当前最合适的药物选择,因为它能快速减轻肺水肿,缓解呼吸困难。这样,我们可以在稳定血压的同时,缓解急性心力衰竭的症状。

综上所述,在这种情况下,给予呋塞米来缓解急性心力衰竭症状是最恰当的。

...done thinking.

在这种情况下,患者表现出急性心肌梗死(尤其是下壁和右室梗死)以及急性心力衰竭的症状,如低血压、呼吸困难和双肺水泡音。针对这些症状,最恰当的药物处理是使用利尿剂,如呋塞米(Furosemide)。

呋塞米能够迅速减轻肺水肿,缓解呼吸困难的症状,并且有助于改善心力衰竭的表现。尽管补液未能有效提升血压,但呋塞米可以帮助减轻心脏的负担,从而改善整体的循环状态。因此,在这种情况下,给予呋塞米是当前最合适的药物选择。

1.2.4. Qwen3-8B-微调版本对话

<用户>: 一名70岁的男性患者因胸痛伴呕吐16小时就医,心电图显示下壁导联和右胸导联ST段抬高0.1~0.3mV,经补液后血压降至80/60mmHg,患者出现呼吸困难和不能平卧的症状,体检发现双肺有大量水泡音。在这种情况下,最恰当的药物处理是什么?

<思维链分析>

嗯,用户的问题是关于一个70岁男性患者,有胸痛和呕吐16小时,心电图显示下壁和右胸导联ST段抬高,补液后血压降到80/60mmHg,出现呼吸困难和不能平卧,双肺有水泡音。需要确定最恰当的药物处理。

首先,我需要分析患者的病情。患者有胸痛、呕吐,持续16小时,这提示可能是急性心肌梗死,尤其是下壁心梗,因为心电图显示下壁和右胸导联ST段抬高。补液后血压下降到80/60mmHg,这可能是因为补液过多或者心功能不全导致的低血压。同时,患者出现呼吸困难,不能平卧,双肺有水泡音,这提示肺水肿,可能与心衰有关。

接下来要考虑的是,ST段抬高可能是心肌梗死的表现,而肺水肿可能由心衰引起。这时候需要考虑是否是心源性休克,因为血压低、呼吸困难和肺水肿都是心功能不全的表现。患者有心梗,所以可能合并心源性休克,需要紧急处理。

药物处理方面,首先应该考虑血管活性药物,比如多巴酚丁胺或米力农,这些药物可以增强心肌收缩力,改善心输出量,从而缓解心衰和低血压。同时,利尿剂如呋塞米可以减轻肺水肿,降低心脏负荷。另外,如果存在心肌缺血,可能需要硝酸甘油,但硝酸甘油会降低血压,而患者血压已经很低,所以可能需要谨慎使用。或者使用硝普盐,因为它可以扩张外周血管,降低心脏后负荷,同时维持血压。

另外,补液后血压下降,可能因为补液过多导致容量过负荷,所以可能需要限制补液,甚至使用利尿剂。同时,需要考虑是否需要机械支持,比如IABP,但这是在更严重的情况下。不过用户问的是药物处理,所以可能优先考虑药物。

可能的药物包括:多巴酚丁胺或米力农增强心功能,呋塞米利尿,可能加用硝普盐或硝酸甘油来扩张血管,但要注意血压。另外,如果怀疑右心梗,可能需要处理右心室功能不全,但这种情况比较少见。

需要确认患者是否有急性心梗,是否需要溶栓或PCI。但用户问的是药物处理,所以可能在等待进一步检查的同时,使用血管活性药物和利尿剂。另外,血压低可能需要升压药物,如去甲肾上腺素,但需要权衡利弊。

总结,可能的处理是:多巴酚丁胺或米力农改善心功能,呋塞米减轻肺水肿,必要时使用硝普盐或去甲肾上腺素维持血压。同时需要评估是否需要机械支持或溶栓。

<正式回答>根据患者的临床表现和心电图结果,最恰当的药物处理应综合考虑急性心肌梗死(下壁心梗)合并心源性休克及急性肺水肿的治疗原则。以下是分步骤的处理方案:

---

### **1. 紧急处理:稳定血流动力学**

- **血管活性药物**:

- **多巴酚丁胺**(起始剂量:2.5-5 μg/kg/min)或 **米力农**(起始剂量:3.5-6 μg/kg/min):

- **目的**:增强心肌收缩力,改善心输出量,缓解心衰症状(如呼吸困难、不能平卧)。

- **注意**:需密切监测血压和尿量,避免过度负荷。

- **硝普盐**(静脉输注,起始剂量:0.5-10 μg/kg/min):

- **目的**:扩张外周血管(降低后负荷)和冠状动脉(改善心肌供血),同时维持血压。

- **注意**:需同时使用利尿剂(如呋塞米)以防止容量过负荷。

---

### **2. 利尿剂:缓解急性肺水肿**

- **呋塞米**(静脉注射,剂量:40-80 mg/次):

- **目的**:快速减轻肺水肿,降低心脏前负荷。

- **注意**:需监测电解质和肾功能,避免低钾血症。

---

### **3. 血压支持:维持器官灌注**

- **去甲肾上腺素**(静脉输注,起始剂量:1-2 μg/kg/min):

- **目的**:在严重低血压(如血压<80/50 mmHg)时,通过收缩外周血管维持血压,同时避免过度使用硝普盐(可能降低血压)。

- **注意**:需根据血压调整剂量,必要时联合多巴酚丁胺。

---

### **4. 机械支持(必要时)**

- **主动脉内球囊反搏(IABP)**:

- **适应症**:若血压持续低于80/50 mmHg,且对药物反应不佳,可考虑机械辅助。

---

### **5. 其他关键措施**

- **氧疗**:高流量吸氧(6-8 L/min)以改善缺氧。

- **监测**:持续心电监护、尿量监测、动脉血气分析(评估氧合和酸碱平衡)。

- **溶栓或介入治疗**:若急性心梗未完全缓解,需尽快评估是否溶栓(如ST段持续抬高>20分钟)或急诊PCI(如条件允许)。

---

### **总结:优先药物处理顺序**

1. **硝普盐 + 呋塞米**(改善心肌供血、减轻水肿)

2. **多巴酚丁胺/米力农**(增强心功能)

3. **去甲肾上腺素**(维持血压)

4. **机械支持**(如IABP)

5. **溶栓/PCI**(根据心电图和血流动力学状态决定)

**关键点**:需在血流动力学稳定的前提下,避免过度利尿或降压,同时尽快明确是否需要介入治疗(如STEMI)。

1.2.5. DeepSeek-R1-Qwen-7B-微调版本对话

<用户>: 一名70岁的男性患者因胸痛伴呕吐16小时就医,心电图显示下壁导联和右胸导联ST段抬高0.1~0.3mV,经补液后血压降至80/60mmHg,患者出现呼吸困难和不能平卧的症状,体检发现双肺有大量水泡音。在这种情况下,最恰当的药物处理是什么?

<思维链分析>

嗯,这个情况我得仔细想想。首先,患者是70岁,男性,胸痛伴呕吐持续16小时,心电图显示下壁导联和右胸导联的ST段抬高,0.1到0.3mV。补液后血压降到了80/60 mmHg,但接着出现了呼吸困难和不能平卧的症状,同时双肺有大量水泡音。

首先,心电图的ST段抬高提示可能是缺血或者心肌梗死。16小时的时间有点长,可能要考虑心肌梗死的可能性,尤其是右侧,因为右胸导联的问题。补液后血压下降,说明液体输入可能缓解了心脏的负担,但症状没有立即消失,反而加重了。

接着,呼吸困难和不能平卧提示肺部有严重的问题。双肺有大量水泡音,这听起来像是肺浸润性病变,比如肺栓塞、肺栓塞可能引起水泡音,或者是慢性阻塞性肺病(COPD)的早期表现。但结合心脏的问题,可能更倾向于急性肺栓塞或者心源性肺水肿。

急性肺栓塞通常是由于血栓形成在肺动脉,导致肺组织缺血,出现水泡音。患者的症状符合急性肺栓塞的典型表现:胸痛、呕吐、呼吸困难,尤其是不能平卧,因为肺水肿会压迫到气管,导致呼吸困难加重。此外,急性肺栓塞通常在发病后1-6小时内诊断,而患者的症状持续时间超过了补液后的时间,可能提示急性肺栓塞。

心电图的变化可能提示心脏的前load情况,如果心脏功能受损,可能会影响肺血流量,导致肺水肿。但急性肺栓塞更可能直接导致肺部缺血和水泡音。

所以,药物处理方面,首先考虑抗组胺药物,比如氯雷他定或西替利嗪,用于缓解患者的呼吸症状,如腹痛、咳嗽等。此外,快速的抗凝治疗是关键,因为肺栓塞需要尽快打破血栓,通常使用肝素类药物,如肝素或低分子肝素。同时,补液也很重要,但要注意不能用碳酸氢盐,以免加重酸中毒。

此外,考虑肺部的影像学检查,如CT或者胸片,以明确诊断。可能还需要进行凝血功能检查,确保肝素治疗的安全性。如果有其他并发症,如肺栓塞引起的心律失常,可能需要进一步的处理。

总结一下,药物处理应包括快速抗凝治疗,同时注意补液,控制血压,以及在必要时进行影像学检查和进一步的凝血功能监测。

</think>

在这种情况下,最恰当的药物处理应首先考虑急性肺栓塞的可能性。急性肺栓塞通常表现为胸痛、呕吐、呼吸困难和不能平卧等症状,与患者的症状高度吻合。结合心电图ST段抬高和大量水泡音,进一步支持了急性肺栓塞的诊断。

处理步骤包括:

1. **抗组胺药物**:用于缓解患者的腹痛、咳嗽等症状,如氯雷他定或西替利嗪。

2. **快速抗凝治疗**:使用肝素类药物,如肝素或低分子肝素,以快速打破血栓,如阿司匹林(已停用)或他汀类药物(如辛伐他汀)。

3. **补液**:在紧急情况下,应尽快补液,但避免使用碳酸氢盐以免加重酸中毒。

4. **影像学检查**:如CT胸 scan或胸片以明确诊断。

5. **凝血功能检查**:确保肝素治疗的安全性。

6. **其他支持治疗**:如监测血压、心率和呼吸情况。

最终,尽快进行CT胸 scan以明确肺栓塞的位置和严重程度,并在医生指导下进行进一步的治疗和评估。

1.2.6. Qwen2-7B-Instruct-微调版本对话

<用户>: 一名70岁的男性患者因胸痛伴呕吐16小时就医,心电图显示下壁导联和右胸导联ST段抬高0.1~0.3mV,经补液后血压降至80/60mmHg,患者出现呼吸困难和不能平卧的症状,体检发现双肺有大量水泡音。在这种情况下,最恰当的药物处理是什么?

根据描述的情况,这名患者可能正在经历急性心肌梗死(AMI)伴有心源性休克和急性左心衰竭。在这样的临床背景下,需要紧急处理以稳定患者的状况:

1. **液体复苏**:虽然已经进行了补液治疗,但如果患者仍然存在低血压并且存在心脏泵血功能不全,可能需要进一步的液体支持和/或血管活性药物以维持足够的组织灌注。

2. **血管活性药物**:如果患者持续低血压,可能需要使用血管加压药如多巴胺或多巴酚丁胺来增加心脏输出量和支持血压。

3. **正性肌力药物**:如果患者对补液反应不佳,可以考虑使用正性肌力药物,如多巴酚丁胺,以增加心肌收缩力和改善心脏输出。

4. **利尿剂**:由于患者出现了急性左心衰竭的症状,如双肺湿啰音,利尿剂(如呋塞米)可以帮助减轻肺水肿和降低前负荷,从而减轻心脏负担。

5. **硝酸酯类药物**:这类药物可以扩张冠状动脉和静脉系统,有助于减轻心脏前后负荷,改善心肌供氧和减少心脏工作量。

6. **抗凝治疗**:考虑到AMI的风险,建议给予抗凝治疗,以预防血栓形成,例如使用肝素或低分子肝素。

7. **β受体阻滞剂**:在患者病情相对稳定时,可考虑开始β受体阻滞剂治疗,以预防未来的心肌梗死事件。

8. **ACE抑制剂或ARBs**:对于非禁忌症的患者,可以开始使用ACE抑制剂或ARBs,以减轻心脏重塑和改善长期预后。

9. **冠状动脉再灌注**:如果有条件,应尽快进行冠状动脉造影并进行PCI或溶栓治疗以恢复缺血心肌的血液供应。

综上所述,在这种情况下,首先需要评估并确保患者的基本生命体征稳定,然后根据具体的心功能状态选择合适的药物组合来进行治疗。治疗方案应由心血管专科医生制定,并根据患者的实时状况进行调整。

1.3. 对比结果结论

一、医学问答模型质量对比和排序

1. qwen3-14-微调版本 - 在所有三个问题上都提供了专业、详细、准确的回答

2. qwen3-14-原始版本 - 与微调版本质量接近,但在部分细节上略逊

3. Qwen3-8B-微调版本 - 专业性高,但某些方面不如qwen3-14系列深入

4. Qwen2-7B-Instruct-微调版本 - 专业性较高,但分析不够全面深入

5. qwen3-14-量化q6K版本 - 专业性一般,缺乏深度和准确性

6. DeepSeek-R1-Qwen-7B-微调版本 - 专业性差,问题1甚至出现严重错误诊断

二、各问题详细质量对比

问题1:急性心肌梗死患者的药物处理

最佳回答:qwen3-14-微调版本 & qwen3-14-原始版本

优势:

  • 准确诊断为"急性下壁和右室心肌梗死"并识别"右心室功能不全和低血压性休克"
  • 详细解释了心电图特征与临床表现的关联
  • 提出关键处理原则:避免过度补液(针对右室梗死的特殊处理)
  • 明确推荐去甲肾上腺素为首选升压药,而非多巴胺
  • 指出应避免使用硝酸甘油(右室梗死时可能加重病情)
  • 提供了清晰的药物处理优先顺序和剂量建议
  • 包含再灌注治疗建议和机械支持考虑

其他模型问题:

  • qwen3-14-量化q6K:仅推荐呋塞米,忽略了升压药物,未认识到右室梗死的特殊性
  • DeepSeek-R1-Qwen-7B:错误诊断为"急性肺栓塞",建议使用抗组胺药物(完全错误)
  • Qwen3-8B-微调:虽专业但未强调右室梗死的特殊处理细节
  • Qwen2-7B-Instruct:处理方案较全面,但缺乏对右室梗死特殊性的深入分析

问题2:肺结核伴胸腔积液的实验室检查

最佳回答:Qwen3-8B-微调版本 & qwen3-14-微调版本

优势:

  • Qwen3-8B-微调:明确指出胸水腺苷脱氨酶(ADA)检测是关键检查
  • 详细解释ADA>45 U/L对结核性积液的诊断价值(特异性>90%)
  • 分析了其他检查的局限性(如细胞学检查阳性率低)
  • 提供了明确的临床决策路径
  • qwen3-14-微调:全面分析了胸水检查
  • 区分了渗出性/漏出性胸水的判断标准
  • 提及ADA检测、葡萄糖水平和pH值对结核性胸膜炎的诊断价值

其他模型问题:

  • qwen3-14-量化q6K:仅强调细胞学分析,未突出ADA的特殊价值
  • DeepSeek-R1-Qwen-7B:混淆了多种检查,未明确指出关键检查
  • Qwen2-7B-Instruct:虽提及ADA,但未将其作为核心检查重点强调

问题3:儿童头皮疾病的中医诊断

最佳回答:qwen3-14-微调版本 & Qwen3-8B-微调版本

优势:

qwen3-14-微调:

  • 诊断为"湿热毒蕴"所致的"痈"或"疔疮"
  • 详细分析病因病机(湿热邪气侵袭,夏季湿热较重)
  • 提供了中医辨证分型和具体治疗原则
  • 包含西医排查建议和注意事项

Qwen3-8B-微调:

  • 诊断为"岩"或"湿毒郁结"之证,属于"恶疮"或"头疮"范畴
  • 详细分析中医病名辨证和辨证要点
  • 提供了系统的治疗原则、注意事项和鉴别诊断

其他模型问题:

  • qwen3-14-原始版本:诊断为"发际疮",分析较全面但不如微调版本深入
  • qwen3-14-量化q6K:诊断为"湿热疮"或"血热疮",分析较为简单
  • DeepSeek-R1-Qwen-7B:使用非标准中医术语
  • Qwen2-7B-Instruct:仅诊断为"疖"或"痈",分析不够深入

三、差异原因分析

1. 模型规模与架构差异

  • qwen3-14B(140亿参数) 比 Qwen3-8B(80亿参数)和 Qwen2-7B(70亿参数)具有更强的知识表示能力
  • 更大的模型能更好地捕捉医学专业知识的复杂模式和关联

2. 微调数据质量与针对性

  • qwen3-14-微调版本 使用了3000条专业医学术语进行微调,特别针对医学领域进行了优化
  • 量化版本(qwen3-14-量化q6K)在量化过程中损失了部分精度,影响了专业判断
  • DeepSeek-R1-Qwen-7B 虽然也是7B级别,但微调数据可能不够专业或针对性不强

3. 医学专业知识深度

qwen3-14系列 展示出对医学概念的准确理解:

  • 正确识别右室梗死需要避免过度补液的特殊处理
  • 理解ADA检测对结核性胸膜炎的特异性诊断价值
  • 能将症状、体征与病理生理机制准确关联

低质量模型:

  • DeepSeek-R1-Qwen-7B在问题1中错误诊断为急性肺栓塞
  • qwen3-14-量化q6K在问题1中忽略了右室梗死的特殊处理原则

4. 临床推理能力

高质量模型(qwen3-14系列)展示出更强的临床推理能力:

  • 能理解为什么右室梗死患者补液后血压下降
  • 能将多个临床表现整合为一致的诊断思路
  • 能提供符合当前指南的治疗建议

低质量模型往往机械应用一般原则,缺乏对特殊情况的针对性处理

5. 回答结构与专业性

高质量模型的回答结构清晰:

  • 明确诊断 → 详细分析 → 具体处理建议 → 总结
  • 使用专业术语准确,逻辑严密

低质量模型的回答往往:

  • 信息杂乱,缺乏逻辑结构
  • 混淆概念(如DeepSeek-R1将心梗误诊为肺栓塞)
  • 提供不恰当的治疗建议(如建议使用抗组胺药物)

四、总结建议

模型质量差异主要源于模型规模、微调数据质量与针对性、医学专业知识深度三个关键因素。qwen3-14-微调版本在所有方面都表现出色,证明了高质量专业数据微调对特定领域性能提升的重要性。

在医学领域应用中,专业领域的高质量微调比单纯增加模型参数更为关键。即使是较小的模型(如Qwen3-8B),通过针对性的专业微调,也能在特定问题上提供非常专业的回答。

对于需要高精度医学建议的应用场景,应优先选择经过专业医学数据微调的大模型,而非仅依赖模型参数规模。

  • 临床场景:优先选择Qwen3-14B微调版,其诊断、药物、检查建议最接近真实医疗决策。
  • 资源受限:Qwen3-8B微调可作为次选,但需人工复核。
  • 避免使用:DeepSeek-7B与量化Q6K在医学准确性上存在显著缺陷,可能误导临床判断。
  • 差异核心:模型规模(参数量) + 专业语料微调质量 + 量化损失共同决定回答的临床可靠性。

最终推荐:医学场景优先选用 Qwen3-14B微调版,避免使用7B以下模型或量化版本。若需部署轻量模型,Qwen3-8B微调版为最低可用底线。

您可能感兴趣的与本文相关的镜像

Qwen3-14B

Qwen3-14B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

<think>嗯,用户现在想了解如何微调DeepSeek-R1:14B模型,我需要根据提供的引用和之前的对话内容来构建一个详细的教程。首先,我需要确认用户的问题背景,他们在之前遇到了Ollama的export命令报错的问题,现在转向微调模型。用户可能是在尝试导出模型失败后,想要自己进行微调,以便更好地控制模型。接下来,我需要参考用户提供的引用内容。引用[5]提到了使用Unsloth进行本地微调的流程,包括安装PyTorch特定版本和wandb。引用[3]则提到DeepSeek-R1-14B被微调为DeepCoder-14B-Preview,使用了分布式强化学习。引用[2]讨论了通过蒸馏提升模型推理能力,这可能与微调后的优化相关。引用[4]提到了使用Llamafactory启动webui,这可能与微调工具相关。我需要将这些信息整合成一个结构清晰的教程。首先,准备环境,安装必要的库和工具,如PyTorch、Unsloth、HuggingFaceTransformers等。然后,准备数据集,用户可能需要自己的数据,或者使用公开数据集。接着,配置微调参数,比如学习率、批次大小等。然后运行微调脚本,使用HuggingFace的Trainer类或者Unsloth的优化方法。最后是验证和部署模型,比如使用Llamafactory的webui或者导出模型。另外,用户之前的报错问题涉及Ollama的export命令不可用,因此在微调后的模型部署部分,可能需要考虑替代方案,比如直接使用HuggingFace的模型保存方式,或者通过API调用。引用[1]中提到了使用curl调用API,这可能作为部署后的测试步骤。需要确保步骤详细,代码示例正确,特别是注意PyTorch版本的兼容性,如引用[5]中的安装命令。同时,微调方法部分需要区分全参数微调和高效微调方法,如LoRA,这可能来自用户之前的问题中的相关信息。最后,生成相关问题,可能需要包括如何优化微调性能、处理显存不足、评估模型效果等,这些都与用户的实际操作中可能遇到的问题相关。</think>### 如何微调 DeepSeek-R1-14B 模型的完整教程 #### 一、环境准备 1. **安装 PyTorch 和 CUDA** 根据引用[5],建议使用 CUDA 12.4 和 PyTorch 2.6.0: ```bash pip3 install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu124 ``` 2. **安装微调工具链** 使用 `transformers` 和 `trl` 库进行模型微调: ```bash pip install transformers trl peft accelerate datasets ``` 若需使用 Unsloth 优化(引用[5]): ```bash pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" ``` #### 二、数据准备 1. **数据集格式** 需构建符合微调任务的 JSONL 格式数据集,例如: ```json {"prompt": "解释量子纠缠", "response": "量子纠缠是..."} {"prompt": "写一首关于春天的诗", "response": "春风拂面..."} ``` 2. **数据预处理** 使用 Hugging Face `datasets` 库加载数据: ```python from datasets import load_dataset dataset = load_dataset("json", data_files="your_dataset.jsonl", split="train") ``` #### 三、模型加载与配置 1. **加载基础模型** 使用 Hugging Face 接口加载 DeepSeek-R1-14B: ```python from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained( "deepseek-ai/deepseek-r1-distilled-qwen-14b", device_map="auto", torch_dtype=torch.bfloat16 ) tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-r1-distilled-qwen-14b") ``` 2. **配置微调参数** 使用 LoRA 进行高效微调(显存需求降低约 50%[^5]): ```python from peft import LoraConfig lora_config = LoraConfig( r=64, # 秩 lora_alpha=128, # 缩放系数 target_modules=["q_proj", "v_proj"], # 适配层 lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) ``` #### 四、执行微调 1. **训练脚本示例** 使用 `Trainer` 类进行监督式微调: ```python from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./output", per_device_train_batch_size=2, # 14B 模型建议 batch_size=2 gradient_accumulation_steps=4, learning_rate=2e-5, num_train_epochs=3, logging_steps=50, fp16=True, # 使用混合精度训练 optim="adamw_torch", ) trainer = Trainer( model=model, args=training_args, train_dataset=dataset, data_collator=lambda data: {"input_ids": tokenizer(data["prompt"], padding=True, truncation=True, max_length=1024)}, ) trainer.train() ``` 2. **使用 Unsloth 优化** 根据引用[5],可替换模型加载方式以启用加速: ```python from unsloth import FastLanguageModel model, tokenizer = FastLanguageModel.from_pretrained( model_name="deepseek-ai/deepseek-r1-distilled-qwen-14b", max_seq_length=4096, dtype=torch.bfloat16, load_in_4bit=True # 4 位量化 ) ``` #### 五、验证与部署 1. **模型验证** 生成测试样例: ```python inputs = tokenizer("请解释相对论:", return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=200) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` 2. **部署到 WebUI** 使用 LLaMA Factory 部署(引用[4]): ```bash export USE_MODELSCOPE_HUB=1 llamafactory-cli webui --model_name_or_path ./output ``` #### 六、性能优化建议 - **混合精度训练**:使用 `fp16` 或 `bf16` 模式降低显存占用 - **梯度检查点**:添加 `gradient_checkpointing=True` 可减少 25% 显存[^5] - **量化微调**:4 位量化 (QLoRA) 支持在 24GB 显存卡上运行 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值