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

在 《单卡4090上用最新LLaMA-Factory微调Qwen3 最新模型(14B)》中提到用同样的方式,在RTX4090单卡上用LLaMaFactory微调Qwen3或DeepSeek-R1的32B模型都会爆显存失败。因此要用之前的成功案例 《花费20块5小时,用单卡4090微调一个超越满血版的,可商用行业垂直模型》中用的 unsloth 来试试。虽说LLaMaFactory里面也能集成 unsloth,但是还是要在LLaMaFactory环境中手动安装unsloth才行。与其这样,不如独立装一个unsloth环境,还能避免两者之间可能的包冲突等问题。

独立安装 unsloth 环境微调实测中也遇到了各种问题,包括:

  
Traceback (most recent call last):  
  File "/workspace/scripts/test.py", line 2, in <module>  
    from torchvision.ops import nms  
  File "/opt/conda/lib/python3.11/site-packages/torchvision/__init__.py", line 10, in <module>  
    from torchvision import _meta_registrations, datasets, io, models, ops, transforms, utils  # usort:skip  
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
  File "/opt/conda/lib/python3.11/site-packages/torchvision/_meta_registrations.py", line 163, in <module>  
    @torch.library.register_fake("torchvision::nms")  
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
  File "/opt/conda/lib/python3.11/site-packages/torch/library.py", line 795, in register  
    use_lib._register_fake(op_name, func, _stacklevel=stacklevel + 1)  
  File "/opt/conda/lib/python3.11/site-packages/torch/library.py", line 184, in _register_fake  
    handle = entry.fake_impl.register(func_to_register, source)  
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
  File "/opt/conda/lib/python3.11/site-packages/torch/_library/fake_impl.py", line 31, in register  
    if torch._C._dispatch_has_kernel_for_dispatch_key(self.qualname, "Meta"):  
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
RuntimeError: operator torchvision::nms does not exist

解决后又有新的报错:

  
  File "/opt/conda/lib/python3.11/importlib/__init__.py", line 126, in import_module  
    return _bootstrap._gcd_import(name[level:], package, level)  
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
  File "/opt/conda/lib/python3.11/site-packages/vllm/platforms/cuda.py", line 15, in <module>  
    import vllm._C  # noqa  
    ^^^^^^^^^^^^^^  
ImportError: /opt/conda/lib/python3.11/site-packages/vllm/_C.abi3.so:   
undefined symbol: _ZN5torch3jit17parseSchemaOrNameERKSsb

以及:

  
  File "/opt/conda/lib/python3.11/site-packages/transformers/modeling_utils.py", line 1304, in _get_device_map  
    hf_quantizer.validate_environment(device_map=device_map)  
  File "/opt/conda/lib/python3.11/site-packages/transformers/quantizers/quantizer_bnb_4bit.py", line 104, in validate_environment  
    raise ValueError(  
ValueError: Some modules are dispatched on the CPU or the disk.   
Make sure you have enough GPU RAM to fit the quantized model.   
If you want to dispatch the model on the CPU or the disk while keeping these modules in 32-bit,   
you need to set `llm_int8_enable_fp32_cpu_offload=True` and pass a custom `device_map` to `from_pretrained`.   
Check https://huggingface.co/docs/transformers/main/en/main_classes/quantization#offload-between-cpu-and-gpu for more details.

还有警告:

  
Unsloth: Will patch your computer to enable 2x faster free finetuning.  
WARNING[XFORMERS]: xFormers can't load C++/CUDA extensions. xFormers was built for:  
    PyTorch 2.6.0+cu124 with CUDA 1204 (you have 2.5.1+cu121)  
    Python  3.11.11 (you have 3.11.10)  
  Please reinstall xformers (see https://github.com/facebookresearch/xformers#installing-xformers)  
  Memory-efficient attention, SwiGLU, sparse and more won't be available.  
  Set XFORMERS_MORE_DETAILS=1 for more details

因为大模型相关的开源项目都在飞速迭代中,产品化还在非常早期,很少有项目是能开箱即用的,总会遇到各种各样的小问题。

有时不光要尝试找出各种包版本能work的正确组合,还要注意包的安装顺序。因为python pip的尿性,有时安装一个包,会把依赖的相关包自动升级或降级。这样不同的安装顺序会产生不同的结果。再加上有些包安装中是有编译动作的,顺序不对虽然版本看起来都对,实际上已经不work了。

这些问题全部解决后,再加上数据集本地化处理等,终于能跑起来了。微调日志摘要如下:

  
🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.  
🦥 Unsloth Zoo will now patch everything to make training faster!  
==((====))==  Unsloth 2025.5.6: Fast Qwen3 patching. Transformers: 4.51.3.  
   \\   /|    NVIDIA GeForce RTX 4090. Num GPUs = 1. Max memory: 23.65 GB. Platform: Linux.  
O^O/ \_/ \    Torch: 2.5.1+cu121. CUDA: 8.9. CUDA Toolkit: 12.1. Triton: 3.1.0  
\        /    Bfloat16 = TRUE. FA [Xformers = 0.0.29.post1. 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%|██████████| 17/17 [00:47<00:00,  2.80s/it]  
Unsloth 2025.5.6 patched 64 layers with 64 QKV layers, 64 O layers and 64 MLP layers.  
======= Model loaded =======  
PeftModelForCausalLM(  
  (base_model): LoraModel(  
    (model): Qwen3ForCausalLM(  
      (model): Qwen3Model(  
        (embed_tokens): Embedding(151936, 5120, padding_idx=151643)  
   。。。  
  
   ======= Datasets loaded =======  
Unsloth: Tokenizing ["text"] (num_proc=128): 100%|██████████| 24065/24065 [03:50<00:00, 104.27 examples/s]  
==((====))==  Unsloth - 2x faster free finetuning | Num GPUs used = 1  
   \\   /|    Num examples = 24,065 | Num Epochs = 1 | Total steps = 3,008  
O^O/ \_/ \    Batch size per device = 1 | Gradient accumulation steps = 8  
\        /    Data Parallel GPUs = 1 | Total batch size (1 x 8 x 1) = 8  
 "-____-"     Trainable parameters = 268,435,456/32,000,000,000 (0.84% trained)  
GPU = NVIDIA GeForce RTX 4090. Max memory = 23.65 GB.  
19.105 GB of memory reserved.  
Unsloth: Will smartly offload gradients to save VRAM!  
{'loss': 0.5524, 'grad_norm': 0.1144917905330658, 'learning_rate': 0.0, 'epoch': 0.0}  
{'loss': 0.6219, 'grad_norm': 0.13642410933971405, 'learning_rate': 4e-05, 'epoch': 0.0}  
...  
{'loss': 0.413, 'grad_norm': 0.06141193211078644, 'learning_rate': 2.664002664002664e-07, 'epoch': 1.0}  
{'loss': 0.3392, 'grad_norm': 0.10163340717554092, 'learning_rate': 1.9980019980019982e-07, 'epoch': 1.0}  
{'loss': 0.3909, 'grad_norm': 0.06341423094272614, 'learning_rate': 1.332001332001332e-07, 'epoch': 1.0}  
{'loss': 0.4235, 'grad_norm': 0.0992300733923912, 'learning_rate': 6.66000666000666e-08, 'epoch': 1.0}  
{'train_runtime': 66102.7823, 'train_samples_per_second': 0.364, 'train_steps_per_second': 0.046, 'train_loss': 0.3769816627597159, 'epoch': 1.0}  

我们在输出目录中执行

  
tensorboard --logdir=./unsloth\_training\_checkpoints/ --port=7874 --host=0.0.0.0

可以在浏览器中看到图表:

picture.image

picture.image

可以看到这次训练的 loss 并没有明显收敛, 梯度范数(grad_norm)震荡剧烈,说明模型参数更新时梯度幅度不稳定。可能是学习率设置太大,出现了过拟合,也可能是数据模式太复杂, 训练样本的梯度方向差异较大,模型学习时无所适从。接下来就是超参数优化和训练数据优化的事情了。

总之用最新版 unsloth 在单卡 RTX4090 上,对最新的 Qwen3-32B 模型做微调训练是可以行得通的。这可能是成本最低,性价比最高的垂域模型训练方法了,非常适合中小创业公司用来做低成本试错。

详细的 实操步骤,包括模型下载、数据准备、镜像构建、训练脚本编写、训练执行等等,参见上一篇《RTX4090单卡微调Qwen3-32B完整步骤

0
0
0
0
评论
未登录
暂无评论