Coder Social home page Coder Social logo

Comments (30)

ymourenya avatar ymourenya commented on June 18, 2024

你好大哥,你们预训练完后lora模块正常吗,我预训练完后才48B,你们是改动其他地方了吗,能不能指点以下,谢谢大哥

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

你的问题里出现了[32000, 4096][55296, 4096][90894, 4096]三个tokenizer大小,看不懂问题出在哪儿。

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

你的问题里出现了[32000, 4096][55296, 4096][90894, 4096]三个tokenizer大小,看不懂问题出在哪儿。

我知道这个问题,这里32000是原始llama2的词汇表大小,55296为扩充后的词汇表大小,但是训练正常、合并权重后重新加载训练新的任务时出现以上问题。所以存在什么问题?需要手工改词汇表config中的大小么?

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

@ymcui 催老师这个怎么处理呢?

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

你前面说针对llama2-7b做增量词汇表扩充且做了增量预训练,这个词表大小为[90894, 4096],后面又出现了chinese-llama-2的词表[55296, 4096],但是你每一步的脚本也没列出来,只有最后一句的出错信息,判断不出来哪里的问题。所以把详细命令列一下,合并前的模型和需要合并的lora权重都是谁?

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

是这样的,前面做的词汇表扩充是我自己训练的一个词汇表,大小为90894。出现类似的错误。
然后我完全按照您的教程处理,没有加载自己的词汇表,而是加载您训练好的词汇表,其大小为55296,训练后,进行合并,然后加载时发现同样的错误。

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

合并时有没有出现报错?合并后继续训练,具体的训练脚本是什么?

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

合并时有没有出现报错?合并后继续训练,具体的训练脚本是什么?

合并时没有出现错误,然后当我加载合并的模型想继续做sft时出现如上错误

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

合并时有没有出现报错?合并后继续训练,具体的训练脚本是什么?

不管是做sft,还是用run_clm_pt_with_peft.py不制定词汇表路径(不扩充词汇表方式),做继续预训练,都出现以上错误。

from chinese-llama-alpaca-2.

ymcui avatar ymcui commented on June 18, 2024

我建议你一步一步说明(每一步输入是什么输出是什么),贴出相应命令。
有些部分你自己就省略了,我们就更不知道你到底做了哪些操作。

另外,根据上面的描述,已经出现三个不同的词表大小了,有理由怀疑你文件存放是否出现错乱(比如模型中的词表大小是A,但tokenizer的大小是B,诸如此类),自己多排查一下吧。

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

第一步,配置环境: path/python -m pip install -r requirements.txt
第二步,下载llama-2-hf
第三步,下载https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/tree/main/scripts/tokenizer
第四步,用https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/blob/main/scripts/training/run_pt.sh启动,
具体参数仅仅修改了
pretrained_model=path/to/hf/llama-2/dir为第二步下载的文件
chinese_tokenizer_path=path/to/chinese-llama-2/tokenizer/dir为第三步下载的文件

以上训练完毕后,
https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/blob/main/scripts/merge_llama2_with_chinese_lora_low_mem.py进行合并,
传入的参数分别为
--base_model path/to/hf/llama-2/dir为第二步下载的文件
--lora_model ${output_dir}/pt_lora_model
--output_type huggingface
--output_dir path_to_output_dir

随后重新用https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/blob/main/scripts/training/run_pt.sh启动,
此时参数
pretrained_model=为合并的模型路径
chinese_tokenizer_path=设置为空,不需要扩充词汇表,别的没变,
然后出现异常了呢

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

chinese_tokenizer_path如果为空,训练代码会报错,L445-L453这段代码您怎么修改的相关逻辑?

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

chinese_tokenizer_path如果为空,训练代码会报错,L445-L453这段代码您怎么修改的相关逻辑?

这里我直接指定新合并后的词汇表
#if model_args.tokenizer_name:
# tokenizer = AutoTokenizer.from_pretrained(model_args.tokenizer_name, **tokenizer_kwargs)

elif model_args.tokenizer_name_or_path:

  #  tokenizer = LlamaTokenizer.from_pretrained(model_args.tokenizer_name_or_path, **tokenizer_kwargs)

tokenizer = LlamaTokenizer.from_pretrained("合并后的路径", **tokenizer_kwargs)

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

你上面修改代码就很容易出现问题,例如你实际传入的模型权重和tokenizer手动修改的路径不对应,建议你进一步自查一下。

另外,从你列出的信息,你还修改了代码的内部逻辑,我仍然无法提供准确的建议,因为具体的脚本命令、参数还是没有。

你第一步到第四步以及合并权重都没有出错,训练的逻辑已经在第四步走通了,合并后的模型进一步训练反而出了问题,是不是你合并的权重本身有问题呢?打印一下embedding_size看看吧。

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

你上面修改代码就很容易出现问题,例如你实际传入的模型权重和tokenizer手动修改的路径不对应,建议你进一步自查一下。

另外,从你列出的信息,你还修改了代码的内部逻辑,我仍然无法提供准确的建议,因为具体的脚本命令、参数还是没有。

你第一步到第四步以及合并权重都没有出错,训练的逻辑已经在第四步走通了,合并后的模型进一步训练反而出了问题,是不是你合并的权重本身有问题呢?打印一下embedding_size看看吧。

训练基本没问题,模型合并后重新用如下脚本加载也会出现同样的错误。

from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer

from transformers import LlamaTokenizer
from typing import TYPE_CHECKING, Any, Dict, Tuple


model_name_or_path="merge_llama2_with_chinese_lora"

llama_tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path)# 原生LLaMA分词模型
print(len(llama_tokenizer))


def _get_init_kwargs(model_args: "ModelArguments") -> Dict[str, Any]:
    return {
        "trust_remote_code": True,
        "cache_dir": "./",
        "revision": "1.2",
        "token": "11",
    }

init_kwargs = _get_init_kwargs("ModelArguments")
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, **init_kwargs)
tokenizer_vocab_size = len(tokenizer)
print(tokenizer_vocab_size)
config = AutoConfig.from_pretrained(model_name_or_path, **init_kwargs)
print(config.vocab_size)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, config=config, **init_kwargs)
#print(mode.vocab_size)

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

你上面修改代码就很容易出现问题,例如你实际传入的模型权重和tokenizer手动修改的路径不对应,建议你进一步自查一下。
另外,从你列出的信息,你还修改了代码的内部逻辑,我仍然无法提供准确的建议,因为具体的脚本命令、参数还是没有。
你第一步到第四步以及合并权重都没有出错,训练的逻辑已经在第四步走通了,合并后的模型进一步训练反而出了问题,是不是你合并的权重本身有问题呢?打印一下embedding_size看看吧。

训练基本没问题,模型合并后重新用如下脚本加载也会出现同样的错误。

from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer

from transformers import LlamaTokenizer
from typing import TYPE_CHECKING, Any, Dict, Tuple


model_name_or_path="merge_llama2_with_chinese_lora"

llama_tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path)# 原生LLaMA分词模型
print(len(llama_tokenizer))


def _get_init_kwargs(model_args: "ModelArguments") -> Dict[str, Any]:
    return {
        "trust_remote_code": True,
        "cache_dir": "./",
        "revision": "1.2",
        "token": "11",
    }

init_kwargs = _get_init_kwargs("ModelArguments")
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, **init_kwargs)
tokenizer_vocab_size = len(tokenizer)
print(tokenizer_vocab_size)
config = AutoConfig.from_pretrained(model_name_or_path, **init_kwargs)
print(config.vocab_size)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, config=config, **init_kwargs)
#print(mode.vocab_size)

我合并的模型是:
pt_lora_model下的:
adapter_config.json adapter_model.bin special_tokens_map.json tokenizer_config.json tokenizer.model

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

model_name_or_path改为我们的chinese-llama-2试试,你要先确认自己的代码没有问题再替换成你自己的模型。

  • 如果chinese-llama-2运行这段代码也有问题,则你这段代码有bug。
  • 如果原版模型运行你这段代码没有问题,则你训练过程或者合并权重有问题,你就需要往回找某一步的错误。

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

model_name_or_path改为我们的chinese-llama-2试试,你要先确认自己的代码没有问题再替换成你自己的模型。

  • 如果chinese-llama-2运行这段代码也有问题,则你这段代码有bug。
  • 如果原版模型运行你这段代码没有问题,则你训练过程或者合并权重有问题,你就需要往回找某一步的错误。

我加载了原始llama2进行了测试,没问题。确保代码没问题。
问题出现在这个合并后模型没法用,具体不清楚这个合并时哪里出现了错误:
我的训练命令如下:

# 运行脚本前请仔细阅读wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh)
# Read the wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh) carefully before running the script

lr=2e-4
lora_rank=64
lora_alpha=128
lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
modules_to_save="embed_tokens,lm_head"
lora_dropout=0.05

pretrained_model=per_models/Llama-2-7b-hf
chinese_tokenizer_path=tokens_cym
dataset_dir=./data
data_cache=temp_data_cache_dir
per_device_train_batch_size=1
gradient_accumulation_steps=8
block_size=512
output_dir=output_dir

deepspeed_config_file=ds_zero2_no_offload.json


#torchrun --nnodes 1 --nproc_per_node 1
python -m torch.distributed.run --nnodes 1 --nproc_per_node 1 run_clm_pt_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --data_cache_dir ${data_cache} \
    --validation_split_percentage 0.001 \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --do_train \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.05 \
    --weight_decay 0.01 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --save_steps 200 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --block_size ${block_size} \
    --output_dir ${output_dir} \
    --overwrite_output_dir \
    --ddp_timeout 30000 \
    --logging_first_step True \
    --lora_rank ${lora_rank} \
    --lora_alpha ${lora_alpha} \
    --trainable ${lora_trainable} \
    --lora_dropout ${lora_dropout} \
    --modules_to_save ${modules_to_save} \
    --torch_dtype float16 \
    --load_in_kbits 16 \
    --save_safetensors False \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

model_name_or_path改为我们的chinese-llama-2试试,你要先确认自己的代码没有问题再替换成你自己的模型。

  • 如果chinese-llama-2运行这段代码也有问题,则你这段代码有bug。
  • 如果原版模型运行你这段代码没有问题,则你训练过程或者合并权重有问题,你就需要往回找某一步的错误。

我加载了原始llama2进行了测试,没问题。确保代码没问题。 问题出现在这个合并后模型没法用,具体不清楚这个合并时哪里出现了错误: 我的训练命令如下:

# 运行脚本前请仔细阅读wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh)
# Read the wiki(https://github.com/ymcui/Chinese-LLaMA-Alpaca-2/wiki/pt_scripts_zh) carefully before running the script

lr=2e-4
lora_rank=64
lora_alpha=128
lora_trainable="q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
modules_to_save="embed_tokens,lm_head"
lora_dropout=0.05

pretrained_model=per_models/Llama-2-7b-hf
chinese_tokenizer_path=tokens_cym
dataset_dir=./data
data_cache=temp_data_cache_dir
per_device_train_batch_size=1
gradient_accumulation_steps=8
block_size=512
output_dir=output_dir

deepspeed_config_file=ds_zero2_no_offload.json


#torchrun --nnodes 1 --nproc_per_node 1
python -m torch.distributed.run --nnodes 1 --nproc_per_node 1 run_clm_pt_with_peft.py \
    --deepspeed ${deepspeed_config_file} \
    --model_name_or_path ${pretrained_model} \
    --tokenizer_name_or_path ${chinese_tokenizer_path} \
    --dataset_dir ${dataset_dir} \
    --data_cache_dir ${data_cache} \
    --validation_split_percentage 0.001 \
    --per_device_train_batch_size ${per_device_train_batch_size} \
    --do_train \
    --seed $RANDOM \
    --fp16 \
    --num_train_epochs 1 \
    --lr_scheduler_type cosine \
    --learning_rate ${lr} \
    --warmup_ratio 0.05 \
    --weight_decay 0.01 \
    --logging_strategy steps \
    --logging_steps 10 \
    --save_strategy steps \
    --save_total_limit 3 \
    --save_steps 200 \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --preprocessing_num_workers 8 \
    --block_size ${block_size} \
    --output_dir ${output_dir} \
    --overwrite_output_dir \
    --ddp_timeout 30000 \
    --logging_first_step True \
    --lora_rank ${lora_rank} \
    --lora_alpha ${lora_alpha} \
    --trainable ${lora_trainable} \
    --lora_dropout ${lora_dropout} \
    --modules_to_save ${modules_to_save} \
    --torch_dtype float16 \
    --load_in_kbits 16 \
    --save_safetensors False \
    --gradient_checkpointing \
    --ddp_find_unused_parameters False

合并模型的参数为:

python merge_llama2_with_chinese_lora_low_mem.py \
  --base_model per_models/Llama-2-7b \
  --lora_model output_dir/pt_lora_model \
  --output_type huggingface \
  --output_dir ./merge_llama2_with_chinese_lora/ 

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

命令本身没有问题,前提是你没修改开源的代码。那你检查看看output_dir/pt_lora_model下保存的模型权重有没有问题,打印一下各个key及大小。
实在不行你把所有步骤推翻,不要用你修改的代码、你自己训练的tokenizer,你先把我们llama-2到chinese-alpaca-2的流程跑通再训你自己的模型。因为我能保证我们的代码、权重等都是没有问题的。

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

命令本身没有问题,前提是你没修改开源的代码。那你检查看看output_dir/pt_lora_model下保存的模型权重有没有问题,打印一下各个key及大小。 实在不行你把所有步骤推翻,不要用你修改的代码、你自己训练的tokenizer,你先把我们llama-2到chinese-alpaca-2的流程跑通再训你自己的模型。因为我能保证我们的代码、权重等都是没有问题的。

1、打印一下各个key及大小,没有问题。大概13G
2、我没用我训练的词汇表,而是用你们的词汇表训练的;我仅仅变的是训练数据集;
3、就是合并后,重新在用你的代码开始训练,出现这个问题、然后我自己写的这个代码来测试也出现同样的问题。

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

所以基本判定是合并权重有问题。而且我说的是output_dir/pt_lora_model下的adapter_model.bin的key,你搞错了。

from chinese-llama-alpaca-2.

iMountTai avatar iMountTai commented on June 18, 2024

还要清楚一点,你开始训练没有问题,合并后训练才有问题,说明你训练本身生成的lora权重有问题或者合并步骤有问题,你要逐一去排查,并且用正确的权重去排除代码问题。

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

所以基本判定是合并权重有问题。而且我说的是output_dir/pt_lora_model下的adapter_model.bin的key,你搞错了。

-rw-r--r-- 1 root root  502 Apr  8 15:05 adapter_config.json
-rw-r--r-- 1 root root  443 Apr  8 15:05 adapter_model.bin
-rw-r--r-- 1 root root  549 Apr  8 15:05 special_tokens_map.json
-rw-r--r-- 1 root root 1.1K Apr  8 15:05 tokenizer_config.json
-rw-r--r-- 1 root root 825K Apr  8 15:05 tokenizer.model

此外我用如下脚本打印时直接没结果:

import torch
import os
lora_model_path="./output_dir/pt_lora_model"
lora_state_dict = torch.load(os.path.join(lora_model_path,'adapter_model.bin'),map_location='cpu')
print(len(lora_state_dict))
for key in lora_state_dict.items():
    print(key)

输出为:

0

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

还要清楚一点,你开始训练没有问题,合并后训练才有问题,说明你训练本身生成的lora权重有问题或者合并步骤有问题,你要逐一去排查,并且用正确的权重去排除代码问题。

生成的output_dir/pt_lora_model下的结果为:

-rw-r--r-- 1 root root  502 Apr  8 15:05 adapter_config.json
-rw-r--r-- 1 root root  443 Apr  8 15:05 adapter_model.bin
-rw-r--r-- 1 root root  549 Apr  8 15:05 special_tokens_map.json
-rw-r--r-- 1 root root 1.1K Apr  8 15:05 tokenizer_config.json
-rw-r--r-- 1 root root 825K Apr  8 15:05 tokenizer.model

这怎么定位呢?

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

还要清楚一点,你开始训练没有问题,合并后训练才有问题,说明你训练本身生成的lora权重有问题或者合并步骤有问题,你要逐一去排查,并且用正确的权重去排除代码问题。

生成的output_dir/pt_lora_model下的结果为:

-rw-r--r-- 1 root root  502 Apr  8 15:05 adapter_config.json
-rw-r--r-- 1 root root  443 Apr  8 15:05 adapter_model.bin
-rw-r--r-- 1 root root  549 Apr  8 15:05 special_tokens_map.json
-rw-r--r-- 1 root root 1.1K Apr  8 15:05 tokenizer_config.json
-rw-r--r-- 1 root root 825K Apr  8 15:05 tokenizer.model

这怎么定位呢?

另外,你们用此脚本先增量预训练、然后合并模型再微调过么?我这仅仅加了自己的一个训练数据集、别的啥也没改,可就是出现问题。

from chinese-llama-alpaca-2.

ymcui avatar ymcui commented on June 18, 2024

你保存的adapter_model.bin 只有443B大小。
你参考:ymcui/Chinese-LLaMA-Alpaca#711 里面的讨论解决吧。
我们没法一步步帮你找问题,有一些问题其他人之前碰到过,可以善用搜索查找解决方案。
再不济,你可以用其他兼容llama的训练工具,模型结构都是一样的,都能适配。

from chinese-llama-alpaca-2.

Shajiu avatar Shajiu commented on June 18, 2024

我建议你一步一步说明(每一步输入是什么输出是什么),贴出相应命令。 有些部分你自己就省略了,我们就更不知道你到底做了哪些操作。

另外,根据上面的描述,已经出现三个不同的词表大小了,有理由怀疑你文件存放是否出现错乱(比如模型中的词表大小是A,但tokenizer的大小是B,诸如此类),自己多排查一下吧。

hi ,催老师,方便发下训练词汇表的全部参数么?
我的如下:

spm.SentencePieceTrainer.train(
        input='token.txt',                           # 输入训练文件路径
        model_prefix='token_model',       # 模型存储路径以及前缀
        shuffle_input_sentence=False,                # 是否打乱句子
        train_extremely_large_corpus=True,           
        max_sentence_length=16384,                   # 句子最大长度
        pad_id=3,
        model_type="unigram",                        # 模型类型 bpe、char、word、unigram(gram)
        vocab_size=25000,
        split_digits=True,
        split_by_unicode_script=True,
        byte_fallback=True,
        allow_whitespace_only_pieces=True,
        character_coverage=0.9995,
        remove_extra_whitespaces=False,
        normalization_rule_name="nfkc",
    )

from chinese-llama-alpaca-2.

github-actions avatar github-actions commented on June 18, 2024

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your consideration.

from chinese-llama-alpaca-2.

github-actions avatar github-actions commented on June 18, 2024

Closing the issue, since no updates observed. Feel free to re-open if you need any further assistance.

from chinese-llama-alpaca-2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.