SavarusAlbert / ChatGLM-LoRA-RLHF-from-trl

Apache License 2.0
4 stars 0 forks source link

RLHF 里面的 model_name 对应的目录是不是要把 sft 生成的 .bin 和原始的底座模型合并后地址? #1

Open diaojunxian opened 1 year ago

diaojunxian commented 1 year ago

你好,请教一下。

RLHF 里面的 model_name 对应的目录是不是要把 sft 生成的 .bin 和原始的底座模型合并后地址?

SavarusAlbert commented 1 year ago

你好,请教一下。

RLHF 里面的 model_name 对应的目录是不是要把 sft 生成的 .bin 和原始的底座模型合并后地址?

建议将sft训练的参数保存为 .pth 文件,由参数 data_args.sft_params 来读取。 trl读取底座模型本身就容易出bug,所以model_args.model_name_or_path这里传入的与AutoModel.from_pretrained所传入的模型地址是一致的,是本地的原始模型的路径,不包括sft生成的参数文件。

diaojunxian commented 1 year ago

你好,请教一下。 RLHF 里面的 model_name 对应的目录是不是要把 sft 生成的 .bin 和原始的底座模型合并后地址?

建议将sft训练的参数保存为 .pth 文件,由参数 data_args.sft_params 来读取。 trl读取底座模型本身就容易出bug,所以model_args.model_name_or_path这里传入的与AutoModel.from_pretrained所传入的模型地址是一致的,是本地的原始模型的路径,不包括sft生成的参数文件。

如果我保存成 bin,是否在 rlhf.py 中用 peft 加载也行呢?

主要是我不知道怎么在 main.py 中保存成 pth 文件。

SavarusAlbert commented 1 year ago

你好,请教一下。 RLHF 里面的 model_name 对应的目录是不是要把 sft 生成的 .bin 和原始的底座模型合并后地址?

建议将sft训练的参数保存为 .pth 文件,由参数 data_args.sft_params 来读取。 trl读取底座模型本身就容易出bug,所以model_args.model_name_or_path这里传入的与AutoModel.from_pretrained所传入的模型地址是一致的,是本地的原始模型的路径,不包括sft生成的参数文件。

如果我保存成 bin,是否在 rlhf.py 中用 peft 加载也行呢?

主要是我不知道怎么在 main.py 中保存成 pth 文件。

你可以参考下面的代码来保存sft训练的参数:

def save_tuned_parameters(model, path):
    saved_params = {
        k: v.to(device)
        for k, v in model.named_parameters()
        if v.requires_grad
    }
    torch.save(saved_params, path)

model是sft模型,path是保存的路径及文件名,以 .pt 或 .pth 为后缀的文件。

diaojunxian commented 1 year ago

你好,请教一下。 RLHF 里面的 model_name 对应的目录是不是要把 sft 生成的 .bin 和原始的底座模型合并后地址?

建议将sft训练的参数保存为 .pth 文件,由参数 data_args.sft_params 来读取。 trl读取底座模型本身就容易出bug,所以model_args.model_name_or_path这里传入的与AutoModel.from_pretrained所传入的模型地址是一致的,是本地的原始模型的路径,不包括sft生成的参数文件。

如果我保存成 bin,是否在 rlhf.py 中用 peft 加载也行呢? 主要是我不知道怎么在 main.py 中保存成 pth 文件。

你可以参考下面的代码来保存sft训练的参数:

def save_tuned_parameters(model, path):
    saved_params = {
        k: v.to(device)
        for k, v in model.named_parameters()
        if v.requires_grad
    }
    torch.save(saved_params, path)

model是sft模型,path是保存的路径及文件名,以 .pt 或 .pth 为后缀的文件。

你好,我执行 rlhf.py 的时候报这个错。

 raise ValueError(f"Some specified arguments are not used by the HfArgumentParser: {remaining_args}")
ValueError: Some specified arguments are not used by the HfArgumentParser: ['--mini_batch_size', '1', '--batch_size', '1', '--early_stopping', 'None', '--target_kl', '0.1', '--ppo_epochs', '1']

看起来是 training_args.py 中没有这些参数,是因为 trl 版本的原因吗,因为我已经降 transformers 的库到 4.28.1 还是不行。

SavarusAlbert commented 1 year ago

你好,请教一下。 RLHF 里面的 model_name 对应的目录是不是要把 sft 生成的 .bin 和原始的底座模型合并后地址?

建议将sft训练的参数保存为 .pth 文件,由参数 data_args.sft_params 来读取。 trl读取底座模型本身就容易出bug,所以model_args.model_name_or_path这里传入的与AutoModel.from_pretrained所传入的模型地址是一致的,是本地的原始模型的路径,不包括sft生成的参数文件。

如果我保存成 bin,是否在 rlhf.py 中用 peft 加载也行呢? 主要是我不知道怎么在 main.py 中保存成 pth 文件。

你可以参考下面的代码来保存sft训练的参数:

def save_tuned_parameters(model, path):
    saved_params = {
        k: v.to(device)
        for k, v in model.named_parameters()
        if v.requires_grad
    }
    torch.save(saved_params, path)

model是sft模型,path是保存的路径及文件名,以 .pt 或 .pth 为后缀的文件。

你好,我执行 rlhf.py 的时候报这个错。

 raise ValueError(f"Some specified arguments are not used by the HfArgumentParser: {remaining_args}")
ValueError: Some specified arguments are not used by the HfArgumentParser: ['--mini_batch_size', '1', '--batch_size', '1', '--early_stopping', 'None', '--target_kl', '0.1', '--ppo_epochs', '1']

看起来是 training_args.py 中没有这些参数,是因为 trl 版本的原因吗,因为我已经降 transformers 的库到 4.28.1 还是不行。

你试一下把rlhf.py里面的这段替换一下:

parser = HfArgumentParser((ModelArguments, DataTrainingArguments, Seq2SeqTrainingArguments))
    model_args, data_args, training_args = parser.parse_args_into_dataclasses()

换为:

model_args, data_args, training_args, script_args = ModelArguments(model_name_or_path=model_name_or_path),  DataTrainingArguments(), Seq2SeqTrainingArguments(output_dir="./", do_train=False, do_eval=True), ScriptArguments()

加我微信:Savarus,有时间交流一下。