Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

单机多卡训练 #101

Open
kg-nlp opened this issue Sep 20, 2023 · 5 comments
Open

单机多卡训练 #101

kg-nlp opened this issue Sep 20, 2023 · 5 comments
Assignees
Labels
bug Something isn't working

Comments

@kg-nlp
Copy link

kg-nlp commented Sep 20, 2023

🐛 bug 说明

请问微调模型是否支持单机多卡

Python Version

None

@kg-nlp kg-nlp added the bug Something isn't working label Sep 20, 2023
@wangyuxinwhy
Copy link
Owner

支持的,各种单机多卡的策略都可以支持

@Bannerli
Copy link

大佬您好,我想问下可以单击多卡进行finetuing吗,我在FineTuner这个类没有找到gpu设置的参数项。

@wangyuxinwhy
Copy link
Owner

单机多卡的 finetuning 是通过 accelerate 包来支持的,你需要参考 accelerate 的方式来使用

@yangxudong
Copy link

单机多卡的 finetuning 是通过 accelerate 包来支持的,你需要参考 accelerate 的方式来使用

你好,请问给出一个单机多卡的 finetuning 的Demo代码吗?谢谢!

@zazd
Copy link

zazd commented Jun 26, 2024

@yangxudong 提供一个参考案例给你,希望有帮助, 因为只是简单体验uniem,可能有理解不对的地方。假设你已经跑通单机finetune的情况下,

  1. 通过accelerate启动多卡:
    a.生成一个config.yaml文件,复制以下配置: (其中num_processes:4 --表示4卡跑任务,其他配置自行查找accelerate配置)
    compute_environment: LOCAL_MACHINE
    distributed_type: MULTI_GPU
    downcast_bf16: 'no'
    gpu_ids: all
    machine_rank: 0
    main_training_function: main
    mixed_precision: fp16
    num_machines: 1
    num_processes: 4
    rdzv_backend: static
    same_network: true
    tpu_env: []
    tpu_use_cluster: false
    tpu_use_sudo: false
    use_cpu: false
    b. 执行命令: accelerate launch --config_file your_dir/config.yaml your_py_file.py
    因为我是别人提供gpu集群,我提交任务的方式,所以到此就可以跑起来了,你如果不是,可能需要研究一下gpu多卡启动;

  2. 但是到这里还是无法跑起来,主要原因后面会遇到报错,如:
    Parameter indices which did not receive grad for rank 2: 197 198 , 类似https://www.cnblogs.com/fireinstone/p/17352130.html 这个。原因是你定义的模型layer没有全部参与到loss计算,在单机下可以跑,但是分布式,涉及多卡更新,所以会catch这个情况并且报错;
    简单看了下uniem的代码实现,主要问题是在:
    embedder = create_uniem_embedder('uer/chinese_roberta_L-12_H-128', pooling_strategy='cls')
    这里pooling用的是cls,而bert/roberta的最后一层,可能是BertPooler层,uniem的几个pooling策略,好像都是用的cls的输出(也有其他的),但是最后BertPooler没有用,从而导致分布式更新时候有问题,具体可以看

    class ClsEmbedder(UniemEmbedder):

    因此为了可以分布式跑起来,要么把BertPooler去掉,要么计算loss时候用上BertPooler的输出,也就是pooler_output。
    我用的是后者,参考代码:
    a.PoolingStrategy加入新的策略pooler_output
    class PoolingStrategy(str, Enum):
    cls = 'cls'
    last_mean = 'last_mean'
    first_last_mean = 'first_last_mean'
    embedding_last_mean = 'embedding_last_mean'
    last_weighted = 'last_weighted'
    pooler_output = 'pooler_output'
    b. 在uniem/model.py添加新的类
    class PoolerOutput(UniemEmbedder):
    pooling_strategy: ClassVar[PoolingStrategy] = PoolingStrategy.pooler_output

    def forward(self, input_ids: torch.Tensor, attention_mask: torch.Tensor | None = None) -> torch.Tensor:
    if attention_mask is None:
    attention_mask = create_attention_mask_from_input_ids(input_ids, self.pad_token_id)
    embeddings = self.encoder(input_ids, attention_mask=attention_mask).pooler_output
    return embeddings
    c.embedder = create_uniem_embedder('uer/chinese_roberta_L-12_H-128', pooling_strategy='pooler_output')

到这里应该能跑起来了,当然你可能还会遇上pytorch版本问题,分布式跑也可能有坑,见招拆招吧。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

5 participants