LLaMA-Factory icon indicating copy to clipboard operation
LLaMA-Factory copied to clipboard

Why does it take such a long time to perform SFT using LoRA?

Open FloSophorae opened this issue 7 months ago • 16 comments

Reminder

  • [x] I have read the above rules and searched the existing issues.

System Info

  • llamafactory version: 0.9.3.dev0
  • Platform: Linux-5.4.250-2-velinux1u1-amd64-x86_64-with-glibc2.31
  • Python version: 3.10.16
  • PyTorch version: 2.6.0+cu124 (GPU)
  • Transformers version: 4.51.3
  • Datasets version: 3.5.0
  • Accelerate version: 1.6.0
  • PEFT version: 0.15.1
  • TRL version: 0.9.6
  • GPU type: NVIDIA A800-SXM4-80GB
  • GPU number: 8
  • GPU memory: 79.35GB
  • DeepSpeed version: 0.16.6
  • vLLM version: 0.8.4
  • Git commit: d07983dcebad00c90f36918bdc9c9095443ae414

Reproduction

I wonder if anyone knows why it takes so long to perform SFT using LoRA in Llama Factory.I have 230k data samples, with an epoch of 3, and I'm using 8 A800 GPUs with 80G memory each. Both per_device_train_batch_size and gradient_accumulation_steps are set to 1. And the model is LLaVA-NEXT 8B. The data type is a VQA JSON format file. But why does it show that it will take over 2000 hours?

想问一下,有人知道这个llama factory 使用lora进行sft的时候,为什么时间贼长吗?230k的数据,epoch为3,8卡A800显存每块80G,per_device_train_batch_size和gradient_accumulation_steps都是1,模型是LLaVa-NEXT 8B,数据类型是VQA的json格式文件,但是为什么230k的数据显示需要两千个小时呢?

Image

Others

No response

FloSophorae avatar Apr 30 '25 13:04 FloSophorae

nvidia-smi 看下 GPU 利用率

hiyouga avatar Apr 30 '25 13:04 hiyouga

GPU的利用率如下:

Image

而且GPU的memory利用情况如下:

Image

还有一个问题就是,我开的另外一个sft,模型是Qwen2.5VL-7B-Instruct, 其他设置和数据是一样的,但是那个久没有训这么久,那个大约显示时间为六七天,而且我有个疑问就是那个的GPU memory的使用情况如下: 它为什么是一直呈现增长的趋势? Image

FloSophorae avatar Apr 30 '25 13:04 FloSophorae

并且,我执行ps aux | grep llamafactory 结果显示出现了22个名称是我执行的llamafactory命令的进程,这是正常的吗?

就是类似这样的指令 my_local_path/miniconda3/envs/hzj_llama_factory/bin/python -u my_local_path/LLaMA-Factory/src/llamafactory/launcher.py --stage sft --do_train True --model_name_or_path my_local_path/model/llava-v1.6-vicuna-7b-hf --preprocessing_num_workers 64 --finetuning_type lora --template llava_next --flash_attn auto --dataset_dir my_local_path/vts/train/sft/LLaMA-Factory/data --dataset remained_dataset_verision_2 --cutoff_len 79990 --learning_rate 5e-05 --num_train_epochs 3.0 --max_samples 10000000 --per_device_train_batch_size 1 --gradient_accumulation_steps 1 --lr_scheduler_type cosine --max_grad_norm 1.0 --logging_steps 20 --save_steps 200 --warmup_steps 0 --packing False --report_to wandb --run_name llava_next_sft_230k_multisteps_20240430_removeddata --output_dir my_local_path/vts/train/sft/LLaMA-Factory/saves/LLaVA-NeXT-7B-Chat/lora/sft_llava_next_230k_20250430 --bf16 True --plot_loss True --trust_remote_code True --ddp_timeout 180000000 --include_num_input_tokens_seen True --optim adamw_torch --lora_rank 8 --lora_alpha 16 --lora_dropout 0 --lora_target all --deepspeed my_local_path/vts/train/sft/LLaMA-Factory/cache/ds_z3_config.json

FloSophorae avatar Apr 30 '25 13:04 FloSophorae

cc @BUAADreamer

hiyouga avatar Apr 30 '25 13:04 hiyouga

而且我发现,我把我训练的进程ctrl+C结束掉之后,这22个进程,还剩下12个,GPU的利用率还有100%,memory倒是下降了,变成了下面的这样,是不是llamafactory启动的时候会多启动什么进程没办法结束?

Image

FloSophorae avatar Apr 30 '25 13:04 FloSophorae

应该是你的使用问题,不是框架的问题。保证启动时候 GPU 上没有任何训练进程

hiyouga avatar Apr 30 '25 13:04 hiyouga

是的,我在启用前确保了GPU上没有任何进程, 而且我刚才试了,如果我训练的时候,把那些进程关掉,训练也会结束

Image

FloSophorae avatar Apr 30 '25 13:04 FloSophorae

而且我发现,重新启动训练脚本之后,在执行ps aux | grep llamafactory会出现的进程只有10个了,也就是刚才我第一次启动的时候执行出现的22个与停止训练进程之后的12个之间的差值,所以我怀疑是tokenizing过程泄露了12个进程?因为重新启动不需要tokenizing,并且我在第一遍tokenizing是时候花费了半个小时的时间。 或者是第一次启动脚本是泄露了什么别的进程,而那些进程在训练的时候占用了我的GPU利用率。现在我重新启动之后仍然需要花费很多时间,需要400多个小时。请问您能回答一下这个问题吗? @hiyouga

FloSophorae avatar Apr 30 '25 14:04 FloSophorae

你的启动命令看起来不太对,用 llamafactory-cli 启动

hiyouga avatar Apr 30 '25 14:04 hiyouga

使用的启动指令,是执行llamafactory-cli webui 之后调整参数之后生成的指令,具体如下:

export WANDB_API_KEY=my_wandb_api_key
llamafactory-cli train \
    --stage sft \
    --do_train True \
    --model_name_or_path my_local_path/model/llava-v1.6-vicuna-7b-hf \
    --preprocessing_num_workers 64 \
    --finetuning_type lora \
    --template llava_next \
    --flash_attn fa2 \
    --dataset_dir my_local_path/LLaMA-Factory/data \
    --dataset my_dataset_name \
    --cutoff_len 79990 \
    --learning_rate 5e-05 \
    --num_train_epochs 3.0 \
    --max_samples 10000000 \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 20 \
    --save_steps 200 \
    --warmup_steps 0 \
    --packing False \
    --report_to wandb \
    --run_name my_run_name \
    --output_dir my_local_path/LLaMA-Factory/saves/LLaVA-NeXT-7B-Chat/lora/sft_llava_next_230k_20250430 \
    --bf16 True \
    --plot_loss True \
    --trust_remote_code True \
    --ddp_timeout 180000000 \
    --include_num_input_tokens_seen True \
    --optim adamw_torch \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_dropout 0 \
    --lora_target all \
    --deepspeed my_local_path/LLaMA-Factory/cache/ds_z3_config.json

@hiyouga

FloSophorae avatar Apr 30 '25 14:04 FloSophorae

lora为啥要开z3,看你也不缺显存吧

Kuangdd01 avatar Apr 30 '25 15:04 Kuangdd01

但是我训练的时候还是会oom,而且batch size只能都设置成1了,数据太长了,cutoff len都设置成65536才行,请教一下,这种情况下也不需要开z3吗?

lora为啥要开z3,看你也不缺显存吧

@Kuangdd01

FloSophorae avatar Apr 30 '25 15:04 FloSophorae

噢噢 对于这么长的序列那确实需要开,如果怀疑是进程有问题的话把这些问题pid记录一下用py-spy看看具体在执行什么呢

Kuangdd01 avatar Apr 30 '25 18:04 Kuangdd01

噢噢 对于这么长的序列那确实需要开,如果怀疑是进程有问题的话把这些问题pid记录一下用py-spy看看具体在执行什么呢

你好,我按照你的方法,使用py-spy来查看这些进程是在做什么,结果如下:

Image

这个并没有在执行任务,但是我的nvidia-smi执行显示GPU利用率都是100%,然后我kill掉这些进程之后再执行nvidia-smi就会发现GPU被释放了,没有进程在执行了,所以能确定就是这些进程在占用我的GPU。

现在的情况是,当我第一次开启训练时,然后就会多出很多的进程,而且当我ctrl+C结束掉我的训练进程之后,还是会有很多进程依然存在,导致我的GPU利用一直是100%,我怀疑是库的代码中导致了多启动了很多的进程?或者是对数据预处理之后没有正确关闭处理进程? 请问你们能确认一下是不是有这个问题吗?谢谢 @Kuangdd01 @hiyouga

FloSophorae avatar May 02 '25 13:05 FloSophorae

而且当我结束第一次训练进程之后,把残存的进程都kill,再从checkpoint重启我的训练,发现并没有那么多的进程了,而且这个时候再使用ctrl+C结束训练进程,就不会仍然存有进程了,

FloSophorae avatar May 02 '25 13:05 FloSophorae

sudo fuser -v /dev/nvidia* 查一下这些进程是不是都挂在你gpu上了

Kuangdd01 avatar May 02 '25 17:05 Kuangdd01

大佬后面解决了吗

edc3000 avatar Jul 29 '25 01:07 edc3000

而且我发现,我把我训练的进程ctrl+C结束掉之后,这22个进程,还剩下12个,GPU的利用率还有100%,memory倒是下降了,变成了下面的这样,是不是llamafactory启动的时候会多启动什么进程没办法结束?

Image

This happened to me as well. Using ctrl + c to quit only kills half of the processes. I had the manually use kill or nvtop to kill the other half.

jsu-sc avatar Aug 10 '25 22:08 jsu-sc