modelscope / swift

ms-swift: Use PEFT or Full-parameter to finetune 250+ LLMs or 35+ MLLMs. (Qwen2, GLM4, Internlm2, Yi, Llama3, Llava, MiniCPM-V, Deepseek, Baichuan2, Gemma2, Phi3-Vision, ...)
https://github.com/modelscope/swift/blob/main/docs/source/LLM/index.md
Apache License 2.0
2.13k stars 205 forks source link

只使用deepspeed不使用torchrun 训练 报错 #1188

Open AlbertBJ opened 1 week ago

AlbertBJ commented 1 week ago

不使用torch的ddp分布式,因为需要在每个机器上都执行脚本,如果 使用deepspeed的话,只需要在 master节点执行就行,

使用 torch ddp跑以下脚本 nproc_per_node=2

export PYTHONPATH=../../.. export CUDA_VISIBLE_DEVICES=0,1

torchrun \ --nproc_per_node=$nproc_per_node \ --master_port 29500 \ llm_sft.py \ 省略参数 --deepspeed xxxx.json 可以跑成功;

但是 去除torchrun 只使用deepspeed就不行,目前还是在 单机双卡 测试: export PYTHONPATH=../../.. export CUDA_VISIBLE_DEVICES=0,1 deepspeed llm_sft.py \ 其他参数和上面一致, 运行报错: File "/mnt/swift/examples/pytorch/llm/llm_sft.py", line 7, in output = sft_main() File "/mnt/swift/swift/utils/run_utils.py", line 21, in x_main args, remaining_argv = parse_args(args_class, argv) File "/mnt/swift/swift/utils/utils.py", line 114, in parse_args args, remaining_args = parser.parse_args_into_dataclasses(argv, return_remaining_strings=True) File "/opt/conda/lib/python3.10/site-packages/transformers/hf_argparser.py", line 338, in parse_args_into_dataclasses obj = dtype(**inputs) File "", line 172, in init File "/mnt/swift/swift/llm/utils/argument.py", line 883, in __post_init__ raise ValueError('DeepSpeed is not compatible with MP. ' ValueError: DeepSpeed is not compatible with MP. n_gpu: 2, local_world_size: 1. [INFO:swift] Using DDP + MP(device_map) [INFO:swift] Using DDP + MP(device_map) [INFO:swift] Successfully registered /mnt/swift/swift/llm/data/dataset_info.json

torch:2.1.2 swift版本:2.2.0.dev0 transformers:4.38.2 deepspeed info ................... 0.12.6 torch cuda version ............... 12.1

AlbertBJ commented 1 week ago

在脚本中 添加了 export LOCAL_WORLD_SIZE=2, 上面这个问题: DeepSpeed is not compatible with MP. 消失了,但是 又有 新的问题,报 参数问题 raise ValueError(f'remaining_argv: {remaining_argv}') ValueError: remaining_argv: ['--local_rank=0'] raise ValueError(f'remaining_argv: {remaining_argv}') ValueError: remaining_argv: ['--local_rank=1'] [2024-06-20 16:36:39,296] [INFO] [launch.py:315:sigkill_handler] Killing subprocess 7269 [2024-06-20 16:36:39,297] [INFO] [launch.py:315:sigkill_handler] Killing subprocess 7270

因为ds启动训练 会为每个进程 的启动参数 都增加 一个 local_rank的参数,我看 swift中,会对 这块 校验,为什么呢?

AlbertBJ commented 1 week ago

又加了 ignore_args_error=True的参数,不报错了,看看能不能run

tastelikefeet commented 1 week ago

保证DDP数量和可见显卡数量一致,在DDP不等于显卡数量时,swift会使用device_map,这个技术和deepspeed不兼容

AlbertBJ commented 5 days ago

保证DDP数量和可见显卡数量一致,在DDP不等于显卡数量时,swift会使用device_map,这个技术和deepspeed不兼容

会支持 deepspeed么?还有就是 我现在在 单机上测试,ds,可以run起来,就是 把 LOCAL_WORLD_SIZE设置成 可见卡的数量,后续我再测试下 多机多卡

AlbertBJ commented 5 days ago

保证DDP数量和可见显卡数量一致,在DDP不等于显卡数量时,swift会使用device_map,这个技术和deepspeed不兼容

多机多卡的时候,还是使用ds更方便一些

AlbertBJ commented 3 days ago

保证DDP数量和可见显卡数量一致,在DDP不等于显卡数量时,swift会使用device_map,这个技术和deepspeed不兼容

会支持 deepspeed么?还有就是 我现在在 单机上测试,ds,可以run起来,就是 把 LOCAL_WORLD_SIZE设置成 可见卡的数量,后续我再测试下 多机多卡

使用ds 多机多卡 启动失败 ,就算 我强制 把每个机器中环境变量LOCAL_WORLD_SIZE设置为可见卡数量,还是 报 DeepSpeed is not compatible with MP;看来只能使用 torchrun方式了

AlbertBJ commented 3 days ago

保证DDP数量和可见显卡数量一致,在DDP不等于显卡数量时,swift会使用device_map,这个技术和deepspeed不兼容

后续会支持 ds么?感觉还是 ds好用