单卡4090上用最新LLaMA-Factory微调Qwen3 最新模型(14B)

镜像构建

LLaMA-Factory 项目提供了镜像构建的 dockerfile: https://github.com/hiyouga/LLaMA-Factory/blob/main/docker/docker-cuda/Dockerfile

只需根据自己的环境略作修改即可。比如我的环境cuda驱动是12.1,所以修改 Dockerfile 的基础镜像为

FROM pytorch/pytorch:2.5.1-cuda12.1-cudnn9-devel

因为后面会用到 qlora ,需要在镜像中额外安装 bitsandbytes 包:

pip install bitsandbytes

构建好的镜像,启动的容器中,主要库的版本:

accelerate                1.6.0datasets                  3.5.0llamafactory              0.9.3.dev0   /appnvidia-cuda-cupti-cu12    12.1.105nvidia-cuda-nvrtc-cu12    12.1.105nvidia-cuda-runtime-cu12  12.1.105opencv-python-headless    4.5.5.64peft                      0.15.1stack-data                0.6.2torch                     2.5.1+cu121torchaudio                2.5.1+cu121torchelastic              0.2.2torchvision               0.20.1+cu121transformers              4.51.3trl                       0.9.6types-dataclasses         0.6.6tzdata                    2025.2uvicorn                   0.34.2bitsandbytes              0.45.5

模型和数据集准备

本文采用14B尺寸的qwen3模型:https://modelscope.cn/models/Qwen/Qwen3-14B

数据集不变:https://huggingface.co/datasets/qihoo360/Light-R1-SFTData/stage2-3k.json

编写 LLaMA-Factory 格式的 dataset_info.json 放到容器挂载的 /datasets 根目录下:

{    "Light-R1-SFT-stage2": {      "file_name": "qihoo360/Light-R1-SFTData/stage2-3k.json",      "file_sha1": "481cd356262d36b9d16ac49f7fc8ff3d4c9f349c",      "formatting": "sharegpt",      "columns": {        "messages": "conversations"      },      "tags": {        "role_tag": "from",        "content_tag": "value",        "user_tag": "user",        "assistant_tag": "assistant"      },      "ranking": false,      "field": "auto"    }}

Qwen3-14B训练

容器启动后,在界面表单上选择如下内容:

  • 模型路径:/root/.cache/modelscope/hub/qwen/Qwen3-14B
  • 数据路径:data
  • 数据集:Light-R1-SFT-stage2
  • 微调方法: Lora
  • 量化等级(启用量化QLora):4
  • 量化方法:bnb
  • 对话模版:qwen3
  • 训练阶段:Supervised Fine-Tuning

对于14B模型,我们开启 qlora ,否则会显存 OOM;

界面设置好后,点击 “Preview command” 按钮(或预览命令)按钮,显示的命令内容应如下所示:

llamafactory-cli train \    --stage sft \    --do_train True \    --model_name_or_path /root/.cache/modelscope/hub/qwen/Qwen3-14B \    --preprocessing_num_workers 16 \    --finetuning_type lora \    --template qwen3 \    --flash_attn auto \    --dataset_dir data \    --dataset Light-R1-SFT-stage2 \    --cutoff_len 2048 \    --learning_rate 5e-05 \    --num_train_epochs 3.0 \    --max_samples 100000 \    --per_device_train_batch_size 2 \    --gradient_accumulation_steps 8 \    --lr_scheduler_type cosine \    --max_grad_norm 1.0 \    --logging_steps 5 \    --save_steps 100 \    --warmup_steps 0 \    --packing False \    --report_to none \    --output_dir saves/Qwen3-14B-Instruct/lora/train_2025-05-16-13-17-41 \    --bf16 True \    --plot_loss True \    --trust_remote_code True \    --ddp_timeout 180000000 \    --include_num_input_tokens_seen True \    --optim adamw_torch \    --quantization_bit 4 \    --quantization_method bnb \    --double_quantization True \    --lora_rank 8 \    --lora_alpha 16 \    --lora_dropout 0 \    --lora_target all

训练日志:

。。。[INFO|configuration_utils.py:691] 2025-05-16 13:20:36,257 >> loading configuration file /root/.cache/modelscope/hub/qwen/Qwen3-14B/config.json[INFO|configuration_utils.py:765] 2025-05-16 13:20:36,258 >> Model config Qwen3Config {  "architectures": [    "Qwen3ForCausalLM"  ],  "attention_bias": false,  "attention_dropout": 0.0,  "bos_token_id": 151643,  "eos_token_id": 151645,  "head_dim": 128,  "hidden_act": "silu",  "hidden_size": 5120,  "initializer_range": 0.02,  "intermediate_size": 17408,  "max_position_embeddings": 40960,  "max_window_layers": 40,  "model_type": "qwen3",  "num_attention_heads": 40,  "num_hidden_layers": 40,  "num_key_value_heads": 8,  "rms_norm_eps": 1e-06,  "rope_scaling": null,  "rope_theta": 1000000,  "sliding_window": null,  "tie_word_embeddings": false,  "torch_dtype": "bfloat16",  "transformers_version": "4.51.3",  "use_cache": true,  "use_sliding_window": false,  "vocab_size": 151936}。。。Loading checkpoint shards: 100%|██████████| 8/8 [02:25<00:00, 18.15s/it]。。。[INFO|trainer.py:748] 2025-05-16 13:23:03,174 >> Using auto half precision backend[INFO|trainer.py:2414] 2025-05-16 13:23:03,496 >> ***** Running training *****[INFO|trainer.py:2415] 2025-05-16 13:23:03,496 >>   Num examples = 3,259[INFO|trainer.py:2416] 2025-05-16 13:23:03,496 >>   Num Epochs = 3[INFO|trainer.py:2417] 2025-05-16 13:23:03,496 >>   Instantaneous batch size per device = 2[INFO|trainer.py:2420] 2025-05-16 13:23:03,496 >>   Total train batch size (w. parallel, distributed & accumulation) = 16[INFO|trainer.py:2421] 2025-05-16 13:23:03,496 >>   Gradient Accumulation steps = 8[INFO|trainer.py:2422] 2025-05-16 13:23:03,496 >>   Total optimization steps = 609[INFO|trainer.py:2423] 2025-05-16 13:23:03,500 >>   Number of trainable parameters = 32,112,640[INFO|2025-05-16 13:25:21] llamafactory.train.callbacks:143 >> {'loss': 0.4967, 'learning_rate': 4.9995e-05, 'epoch': 0.02, 'throughput': 1188.24}{'loss': 0.4967, 'grad_norm': 0.14969857037067413, 'learning_rate': 4.999467794024707e-05, 'epoch': 0.02, 'num_input_tokens_seen': 163840}。。。{'loss': 0.4186, 'grad_norm': 0.08530048280954361, 'learning_rate': 8.315552395404824e-09, 'epoch': 2.98, 'num_input_tokens_seen': 19829952}{'train_runtime': 16766.8078, 'train_samples_per_second': 0.583, 'train_steps_per_second': 0.036, 'train_loss': 0.40401273466683374, 'epoch': 3.0, 'num_input_tokens_seen': 19961024}***** train metrics *****  epoch                    =       2.9963  num_input_tokens_seen    =     19961024  total_flos               = 1564083299GF  train_loss               =        0.404  train_runtime            =   4:39:26.80  train_samples_per_second =        0.583  train_steps_per_second   =        0.036Figure saved at: saves/Qwen3-14B-Instruct/lora/train_2025-05-16-13-17-41/training_loss.png

同样的3千多条数据,相比 0.6B 只用了40分钟,14B 即使开了qlora 也用了近5个小时才训练完。loss图:

image.png

用以上相同的环境和参数,qlora微调 Qwen3-32B 或 DeepSeek-R1-Distill-Qwen-32B,实测都报错 torch.OutOfMemoryError: CUDA out of memory ; 能把 32B 模型的微调训练在 24G 显存的卡上跑起来,还不是一件容易的事情。后面祭出 unsloth 来试试。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

### 使用 LLaMA-FactoryQwen模型进行微调 #### 准备工作环境 切换到 `llama-factory` 的工作目录,以便执行后续命令。这一步骤确保所有操作都在正确的路径下完成。 ```bash cd \root\LLaMA-Factory ``` #### 配置训练参数 为了启动微调过程,需要指定 GPU 设备以及配置文件的位置。这里假设使用的是具有多个 GPU 的机器,并指定了具体的 YAML 文件作为配置输入。 ```bash CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 llamafactory-cli train /path/to/your/config_file.yaml ``` 其中 `/path/to/your/config_file.yaml` 应替换为实际使用的配置文件路径,例如 `examples/train_lora/qwen2vl_lora_sft_my20241112.yaml`[^2]。 #### 创建自定义数据集 对于特定应用场景下的微调,创建一个包含目标领域样本的数据集至关重要。如果希望使 Qwen 模型能够更准确地识别某些类别,则应准备相应的标注图像集合用于训练。比如,在案例中提到的将一张手帕误标为裙子的情况,可以构建类似的带有误导性的标记数据来进行针对性调整[^3]。 #### 执行微调流程 一旦准备工作就绪,就可以运行上述命令开始微调过程。此阶段会基于预设的学习率和其他超参数自动迭代优化权重直到收敛或达到最大轮次限制为止。 #### 测试与验证效果 当微调完成后,保存下来的 checkpoint 即代表了经过改进后的模型版本。此时可以通过加载该 checkpoint 并进入聊天界面来评估其性能表现: - 加载刚刚生成的新版模型- 进入 chat 页面; - 上传待测图片并询问对象是什么; 通过这种方式可以直接观察到模型是否按照预期改变了原有的分类行为模式。 #### 后续处理 考虑到原生 Qwen 模型本身已经具备较高的精度水平(约90%),但在引入额外映射机制之后整体准确度有所下降至大约80%,因此直接针对所需标签空间实施细粒度定制化修改不失为一种有效策略,从而减少不必要的转换环节所带来的误差累积问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值