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

有一个代码上的问题 #212

Closed
wujohns opened this issue May 6, 2023 · 5 comments
Closed

有一个代码上的问题 #212

wujohns opened this issue May 6, 2023 · 5 comments

Comments

@wujohns
Copy link

wujohns commented May 6, 2023

在本工程中采用了以下方式重写 Trainer 的 save_model 方法:

class ModifiedTrainer(Trainer):
    def compute_loss(self, model, inputs, return_outputs=False):
        return model(
            input_ids=inputs["input_ids"],
            labels=inputs["labels"],
        ).loss

    def save_model(self, output_dir=None, _internal_call=False):
        from transformers.trainer import TRAINING_ARGS_NAME

        os.makedirs(output_dir, exist_ok=True)
        torch.save(self.args, os.path.join(output_dir, TRAINING_ARGS_NAME))
        saved_params = {
            k: v.to("cpu") for k, v in self.model.named_parameters() if v.requires_grad
        }
        torch.save(saved_params, os.path.join(output_dir, "adapter_model.bin"))

但依据 peft 的实现原理,应该也可以采用以下更简便的方式来对 Trainer 的 save_mode 方法做重写:

class ModifiedTrainer(Trainer):
    def compute_loss(self, model, inputs, return_outputs=False):
        return model(
            input_ids=inputs["input_ids"],
            labels=inputs["labels"],
        ).loss

    def save_model(self, output_dir=None, _internal_call=False):
        self.model.save_pretrained(output_dir)

这边想问一下这两者有什么区别吗,手动采取 torch 来存储 lora 模型参数和配置是由于这个场景下 save_pretrained 表现会有异常?
PS: 这里按照 self.model.save_pretrained(output_dir) 的方式(即第二种方式)跑了一下,发现没有训练部分以及训练后的推理都没有出现异常,所以比较好奇想问一下

@mymusise
Copy link
Owner

mymusise commented May 8, 2023

应该几乎等价,后者应该更好,每个checkpoint里面还会存下config.json

@wujohns
Copy link
Author

wujohns commented May 8, 2023

应该几乎等价,后者应该更好,每个checkpoint里面还会存下config.json

OK,感谢说明,lora 的训练效果还是挺不错的,loss 降低到 1 ~ 3 时风格迁移挺明显的,训练速度也挺快,不过对数据集的要求还是挺高的

@wujohns wujohns closed this as completed May 8, 2023
@dongteng
Copy link

借楼,请问这个class ModifiedTrainer(Trainer): def compute_loss(self, model, inputs, return_outputs=False): return model( input_ids=inputs["input_ids"], labels=inputs["labels"], ).loss
loss的具体计算方式该怎么看呀

@wujohns
Copy link
Author

wujohns commented May 18, 2023

借楼,请问这个class ModifiedTrainer(Trainer): def compute_loss(self, model, inputs, return_outputs=False): return model( input_ids=inputs["input_ids"], labels=inputs["labels"], ).loss loss的具体计算方式该怎么看呀

这块逻辑貌似是在 chatglm 的源码实现中来做的,具体应该可以看下 chatglm 的 huggingface 版本的 model 代码部分

@ssgg-code
Copy link

非常奇怪的一点,我直接改用self.model.save_pretrained(output_dir)有效,但是用源代码重写的save_model()保存的adapter.bin去加载lora模型,其生成结果和chatglm本身没有差距。 我发现有不少人都遇到了相同的问题,不太能理解这种问题为什么对部分人存在。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants