HuangLK / transpeeder

train llama on a single A100 80G node using 🤗 transformers and 🚀 Deepspeed Pipeline Parallelism
Apache License 2.0
208 stars 18 forks source link

loss很快降为0 #4

Closed muou55555 closed 1 year ago

muou55555 commented 1 year ago
image

在训练时,loss很快降为0,配置一样 万分感谢:D

HuangLK commented 1 year ago

用的是alpaca_data_sample_oneline_format.json数据吗?这份数据只有50条,如果需要训完整版还请去官方下载数据并转化格式

muou55555 commented 1 year ago

用的是alpaca_data_sample_oneline_format.json数据吗?这份数据只有50条,如果需要训完整版还请去官方下载数据并转化格式

我一开始也以为是数据量太少的原因,后面增加了很多条和使用把data处理方式换成官方版本,也是不行的。感觉是loss哪里的问题

muou55555 commented 1 year ago

用的是alpaca_data_sample_oneline_format.json数据吗?这份数据只有50条,如果需要训完整版还请去官方下载数据并转化格式

我好像找到问题原因了,您帮忙确认一下是不是这个。 是在data处理里,我们生成label的格式是[-100,...,-100, 真实label, -100, -100....-100]. 改成[-100,...,-100, 真实label, PAD, -PAD....PAD]就可以了。 针对代码就是把 # labels = torch.where(labels == self.tokenizer.pad_token_id, IGNORE_INDEX, labels)给注释掉

但我不知道为什么这样做及是否合理 如果合理,我可以提交PR :)

HuangLK commented 1 year ago

PAD本身就不需要算loss的,因此需要把label设为-100。麻烦确认下用的是不是alpaca_data_sample_oneline_format.json?

muou55555 commented 1 year ago

我使用alpaca_data_sample_oneline_format.json和alpaca_data.json结果都是迭代几步,loss就为0了。 另外,补充信息:transformers的版本我用的是 (https://github.com/zphang/transformers)的llama版本,因为hf的版本和你这目前的代码不匹配,原因在于hf的版本的forward增加了position_idx的参数

muou55555 commented 1 year ago

用的是alpaca_data_sample_oneline_format.json数据吗?这份数据只有50条,如果需要训完整版还请去官方下载数据并转化格式

我好像找到问题原因了,您帮忙确认一下是不是这个。 是在data处理里,我们生成label的格式是[-100,...,-100, 真实label, -100, -100....-100]. 改成[-100,...,-100, 真实label, PAD, -PAD....PAD]就可以了。 针对代码就是把 # labels = torch.where(labels == self.tokenizer.pad_token_id, IGNORE_INDEX, labels)给注释掉

但我不知道为什么这样做及是否合理 如果合理,我可以提交PR :)

这个最终loss也是为0,只是需要更长的step之后

muou55555 commented 1 year ago

补充信息: image

HuangLK commented 1 year ago

补充信息: image

有点奇怪,alpaca的数据集初始loss在1.8左右是正常的,你这个开始就10+,可能得再看看数据本身

muou55555 commented 1 year ago

补充信息: image

有点奇怪,alpaca的数据集初始loss在1.8左右是正常的,你这个开始就10+,可能得再看看数据本身

以下实验结果: transformer版本: [https://github.com/zphang/transformers]的llama版本 数据集:alpaca_data_sample_oneline_format.json ds_config: "train_micro_batch_size_per_gpu": 2, "train_batch_size": 64, "steps_per_print": 1000, "gradient_clipping": 1.0, "lr-decay-style": "cosine", "warmup": 0.03, "optimizer": { "type": "AdamW", "params": { "lr": 1e-5, "betas": [ 0.9, 0.999 ], "eps": 1e-8, "weight_decay": 0 } run config: deepspeed --include localhost:0,1,2,3 --master_port 22384 train.py \ --output_dir ./ckpt_output \ --model_name_or_path decapoda-research/llama-7b-hf \ --data_path ./data/alpaca_data_sample_oneline_format.json \ --max_seq_len 1024 \ --train_steps 60000 \ --eval_steps 1000 \ --save_steps 1000 \ --log_steps 3 \ --pipe_parallel_size 4 \ --model_parallel_size 1 \ --deepspeed_config ./configs/ds_config.json

运行结果:

image

您那边应该也是能复现loss=0的情况吧 @HuangLK 这个问题搞了我好几天了

HuangLK commented 1 year ago

alpaca_data_sample_oneline_format.json 这个测试数据集只有50条,一个batch就喂了64条数据(1.2 epoch),所以几个step之后loss为0.00应该是合理的,这个数据集只是用来调试,比如查看初始loss。 你可以用alpaca官方完整的数据(52k)或者其他sft数据集来训练,正常情况下训练3epoch loss也是0.4左右,不会立马为0。

muou55555 commented 1 year ago

alpaca_data_sample_oneline_format.json 这个测试数据集只有50条,一个batch就喂了64条数据(1.2 epoch),所以几个step之后loss为0.00应该是合理的,这个数据集只是用来调试,比如查看初始loss。 你可以用alpaca官方完整的数据(52k)或者其他sft数据集来训练,正常情况下训练3epoch loss也是0.4左右,不会立马为0。

试了下52K的数据,感觉是合理的

image

在次感谢您的耐心解答!感谢

muou55555 commented 1 year ago

@HuangLK 追加一个问题: 目前--model_parallel_size 1 这个参数只否只能设置为1, > 1的值程序会报错 File "/root/miniconda3/lib/python3.8/site-packages/deepspeed/init.py", line 135, in initialize engine = PipelineEngine(args=args, File "/root/miniconda3/lib/python3.8/site-packages/deepspeed/runtime/pipe/engine.py", line 130, in init params_tensor = torch.LongTensor(data=[num_params, unique_params]).to(self.device) RuntimeError: CUDA error: an illegal memory access was encountered

HuangLK commented 1 year ago

@HuangLK 追加一个问题: 目前--model_parallel_size 1 这个参数只否只能设置为1, > 1的值程序会报错 File "/root/miniconda3/lib/python3.8/site-packages/deepspeed/init.py", line 135, in initialize engine = PipelineEngine(args=args, File "/root/miniconda3/lib/python3.8/site-packages/deepspeed/runtime/pipe/engine.py", line 130, in init params_tensor = torch.LongTensor(data=[num_params, unique_params]).to(self.device) RuntimeError: CUDA error: an illegal memory access was encountered

跑的是30B模型吗?具体pipe_parallel_size和model_parallel_size分别设置为什么?

muou55555 commented 1 year ago

@HuangLK 追加一个问题: 目前--model_parallel_size 1 这个参数只否只能设置为1, > 1的值程序会报错 File "/root/miniconda3/lib/python3.8/site-packages/deepspeed/init.py", line 135, in initialize engine = PipelineEngine(args=args, File "/root/miniconda3/lib/python3.8/site-packages/deepspeed/runtime/pipe/engine.py", line 130, in init params_tensor = torch.LongTensor(data=[num_params, unique_params]).to(self.device) RuntimeError: CUDA error: an illegal memory access was encountered

跑的是30B模型吗?具体pipe_parallel_size和model_parallel_size分别设置为什么?

还是7B的模型,本是想看看model_parallel_size起不起作用。 目前是在4GPU, 分别试了pipe_parallel_size=2,model_parallel_size=2 和 pipe_parallel_size=1,model_parallel_size=4的情况(我不确认这样配置是否正确),出现上述一样的问题。或者您有推荐的设置,我可以在试试。 @HuangLK

HuangLK commented 1 year ago

CUDA error: an illegal memory access was encountered

这个报错其实就是OOM了,4卡 pp=2 mp=2 我之前似乎也跑不起来,但因为我更关注的是30B所以也没多做尝试。其实用A100 80G跑7B的话直接用alpaca的方案(🤗 trainer + fsdp)就挺好的了,后续也有fastchat等可以较好支持单机13B。

muou55555 commented 1 year ago

CUDA error: an illegal memory access was encountered

这个报错其实就是OOM了,4卡 pp=2 mp=2 我之前似乎也跑不起来,但因为我更关注的是30B所以也没多做尝试。其实用A100 80G跑7B的话直接用alpaca的方案(🤗 trainer + fsdp)就挺好的了,后续也有fastchat等可以较好支持单机13B。

@HuangLK 理解,其实我是想学习基于deepsped的PP和MP底层训练框架,正好用7B来测试。 如果要测试MP的话,8卡能跑起来效果吗? 如果可行的话(配置之类的),我在申请卡,试验下MP效果。如果学习完您的代码,并做一些难,后面我可能会接着试30B和65B的模型

muou55555 commented 1 year ago

@HuangLK 给您gmail邮箱发了个邮件,有空可以看看:D

huiyangzhou commented 1 year ago

AttributeError: 'LLaMAModel' object has no attribute 'embed_tokens' @muou55555 大佬,用这个 [https://github.com/zphang/transformers]的llama版本 版本的代码,遇到这个问题是怎么解决的?

zhhao1 commented 1 year ago

AttributeError: 'LLaMAModel' object has no attribute 'embed_tokens' @muou55555 大佬,用这个 [https://github.com/zphang/transformers]的llama版本 版本的代码,遇到这个问题是怎么解决的?

换个版本,或者查看下你这个版本下的modeling_llama的源码,应该是名字错了。