服务器环境:
- 8张RTX3090显卡
- Ubuntu 22.04.3 LTS
- 内存256G
一、部署 DeepSeek-VL2运行环境
conda create --name DeepSeek-VL2_fine_tune python=3.10
git clone https://github.com/deepseek-ai/DeepSeek-VL2
pip install -e .
pip install -e .[gradio]
然后运行gradio demo,看看DeepSeek-VL2能不能正常运行:
CUDA_VISIBLE_DEVICES=2 python web_demo.py \
--model_name "deepseek-ai/deepseek-vl2" \
--port 37914
如果出现cuda out of memory,看我上一篇文章解决。
二、部署 swift微调环境
DeepSeek-VL2跟swift版本依赖严重冲突,随意修改依赖库的版本,会出现更多的版本冲突错误,以下为测试没问题的依赖库版本,直接安装即可:
pip install 'ms-swift[all]==3.0.0' -U
pip install timm==1.0.9
pip install xformers==0.0.22.post7 # 默认会卸载 torch 2.6.0,安装torch-2.1.0
pip uninstall torchvision
pip install torchvision==0.16.0 # 安装与torch配套的torchvision
pip install deepspeed==0.14.4
三、修改topk_method参数
训练时如果使用"noaux_tc"策略就会和assert not self.training冲突,所以把可以试一下把
deepseek-ai/deepseek-vl2/config.json、deepseek-ai/deepseek-vl2-small/config.json、deepseek-ai/deepseek-vl2-tiny/config.json文件中的"topk_method"设置为"greedy"。
ps: 官方模型里tiny和small模型中topk_method默认都是“greedy”,而最大模型opk_method默认是“noaux_tc”,记着修改。
四、微调tiny模型
tiny模型用一张RTX3090就能跑起来,训练命令如下:
nproc_per_node=8
NPROC_PER_NODE=$nproc_per_node \
MASTER_PORT=29502 \
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 swift sft \--model ./deepseek-ai/deepseek-vl2-tiny \--train_type lora \--dataset 1.jsonl \--num_train_epochs 3 \--learning_rate 8e-5 \--lora_rank 8 \--lora_alpha 12 \--max_length 4096 \--save_only_model True \--eval_steps 2000 \--save_steps 2000 \--save_total_limit -1 \--output_dir ./deepseek-ai/test/deepseek-vl2-tiny \--deepspeed zero2 \--lazy_tokenize True \--per_device_train_batch_size 2 \--torch_dtype bfloat16 \--logging_steps 5 \--dataloader_num_workers 24
五、微调small模型
small模型如何也用上面的命令去跑,8张卡都跑不动,为了避免cuda out of memory,可通过下面命令去跑:
export PYTORCH_CUDA_ALLOC_CONF="max_split_size_mb:32"
export FLASH_ATTENTION=1nproc_per_node=8
NPROC_PER_NODE=$nproc_per_node \
MASTER_PORT=29502 \
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 swift sft \--model ./deepseek-ai/deepseek-vl2-small \--train_type lora \--dataset 1.jsonl \--num_train_epochs 3 \--learning_rate 8e-5 \--lora_rank 8 \--lora_alpha 12 \--max_length 4096 \--save_only_model True \--eval_steps 2000 \--save_steps 2000 \--save_total_limit -1 \--output_dir ./deepseek-ai/test/deepseek-vl2-small \--deepspeed zero2 \--lazy_tokenize True \--per_device_train_batch_size 2 \--torch_dtype bfloat16 \--logging_steps 5 \--dataloader_num_workers 24
六、微调最大模型
最大模型用8张卡跑起来很难,需要降低--lora_rank、--lora_alpha、--max_length、--deepspeed、--per_device_train_batch_size、--gradient_accumulation_steps、--dataloader_num_workers才能刚好跑起来,虽然跑起来了,但训练速度却非常的慢。
export PYTORCH_CUDA_ALLOC_CONF="max_split_size_mb:32"
export FLASH_ATTENTION=1
nproc_per_node=8
NPROC_PER_NODE=$nproc_per_node \
MASTER_PORT=29502 \
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 swift sft \--model ./deepseek-ai/deepseek-vl2 \--train_type lora \--dataset 1.jsonl \--num_train_epochs 3 \--learning_rate 8e-5 \--lora_rank 4 \--lora_alpha 8 \--max_length 2048 \--save_only_model True \--eval_steps 2000 \--save_steps 2000 \--save_total_limit -1 \--output_dir ./deepseek-ai/test/deepseek-vl2 \--deepspeed zero3 \--lazy_tokenize True \--per_device_train_batch_size 1 \--gradient_accumulation_steps 2 \--torch_dtype bfloat16 \--logging_steps 5 \--dataloader_num_workers 8
七、合并Lora
CUDA_VISIBLE_DEVICES=0 swift export --ckpt_dir deepseek-ai/test/deepseek-vl2-tiny/v0-20250304-161045/checkpoint-3 --merge_lora true
模型合并后,将模型复制到deepseek-vl2/deepseek-ai/目录下,使用deepseek-vl2的web.demo可以跑一下看看运行效果。
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python web_demo.py --model_name "deepseek-ai/deepseek-vl2-tiny" --ip 0.0.0.0 --port 37914
八、自定义数据集
自定义数据集正在研究,空了更新。
参考:DeekSeek-VL2微调报错 · Issue #2805 · modelscope/ms-swift
ms-swift/docs/source/Instruction/命令行参数.md at main · modelscope/ms-swift
Swift微调命令参数 - 岁 - 博客园
ms-swift/docs/source/Multi-Modal/internvl最佳实践.md at release/2.5 · modelscope/ms-swift
Deepseek-vl2微调环境部署及各种报错解决方案_deepseek vl2 微调-CSDN博客
SWIFT 后训练 Deepseek-VL2 参数_deepseek-vl2 ms-swift-CSDN博客