GithubHelp home page GithubHelp logo

billa's People

Contributors

neutralzz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

billa's Issues

关于生成是如何停止的问题

我想问一下这个模型训练时没有涉及到eos,那generate怎么停止的呢?

我看eval_codes里面也是直接调用generate,没有涉及利用fastchat里stop_str的逻辑。

请问这段代码的作用是什么?

非常感谢开源这个独特的项目!

在 task_instruct_tuning_main.py中有如下代码:
input_ids_1 = self.tokenizer.encode(prefix, True, False)
loss_mask_1 = [0] * len(input_ids_1)
input_ids_2 = self.tokenizer.encode(example['output'], False, True)
loss_mask_2 = [1] * len(input_ids_2)
input_ids = input_ids_1 + input_ids_2
loss_mask = loss_mask_1 + loss_mask_2
input_ids = input_ids[:self.max_seq_length]
loss_mask = loss_mask[:self.max_seq_length]

请问其作用是什么?是在计算loss时屏蔽掉指令和输入部分,只计入输出部分,对吗?

还有:
input_ids = self.tokenizer.encode(example["input"])[:self.max_seq_length]
pos = random.randint(int(0.2 * len(input_ids)) + 1, int(0.7 * len(input_ids)))
loss_mask = [0] * pos + [1] * (len(input_ids) - pos)

这部分使用动态的条件生成任务,对吗?这样的设计考虑是什么?

为什么要分阶段训练(二、三)

你好!第二阶段类似instructgpt的sft,然后第三阶段改成对话的方式+一些高质量(dolly alpaca-gpt4)的数据的对话形式。其实二三阶段大多数数据都一样,只是形式不同。。为什么不直接将二三阶段合并,将第二阶段的任务数据<prompt,target>也直接改成chat的形式,二三在一起多训几个epoch。。作者有对比过,合并和分阶段的结果差异嘛。。

关于MathQA部分数据集的问题

Math数据集回答只有方程式没有推理过程,我看楼主写了使用了chatgpt生成辅助解析,这部分数据方便release一下吗?也可以可以帮助社区提升LLMs的数学推理能力

sft模型预测时 会出现未输出完自己截断的问题

比如:
如何做披萨?

披萨是一道非常受欢迎的意大利美食。以下是制作披萨的基本步骤:

  1. 准备材料:面团、番茄酱、奶酪、肉类(如火腿、香肠、鸡肉等)、蔬菜(如洋葱、菠菜、西红柿等)、香料(如黑胡椒、香菜等)。
  2. 准备面团:在一个大碗中,将面粉、盐、糖、干酪和水混合搅拌均匀,直到面团成团。将面团用保鲜膜包好,放在冰箱中冷藏至少30分钟。
  3. 预热烤箱:在烤箱中预热至220摄氏度。
  4. 准备饼面:在饼盘上涂上一层番茄酱,然后撒上一层奶酪。
  5. 添加馅料:在饼面上撒上一层肉类和蔬菜,然后再撒上一层奶酪。
  6. 烘烤披萨:将面团取出,用擀面杖擀成圆形,然后将其放在饼面上。将披萨放入烤箱中烘烤约15-20分钟,直到饼面金黄色,奶酪融化。
  7. 取出披萨:将披萨从烤箱中取出,然后撒上剩余的奶酪。将披萨放在盘子上,然后即可享用。
    以上是制作披萨的基本步骤。你可以根据自己的喜好添加不同的馅料和

max_new_tokens设置为2048

预训练纯文本Loss问题请教

针对Causal LM Loss一直有一个困惑,就是以下两种方式的差异有多少

  1. 随机MASK前半部分,就是您代码中的部分
    input_ids = self.tokenizer.encode(example['input'])[:self.max_seq_length]
    pos = random.randint(int(0.2 * len(input_ids)) + 1, int(0.7 * len(input_ids)))
    loss_mask = [0] * pos + [1] * (len(input_ids) - pos)

  2. 完全不MASK,直接对整个文本计算Loss,例如Hhuggingface提供的clm示例中
    result["labels"] = result["input_ids"].copy() https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm.py

想请教下这两种方案在预训练阶段会有哪些差异?个人感觉是第一种方案可以避免前半一段token因为上文太少,生成不准影响loss的问题,但又看到很多实现是第二种方案。

全参数微调资源要求

我们在8*P100上进行第二阶段的全参数微调,报错:No pre-built kernel is found, build and load the cpu_adam kernel during runtime now,这样是显存不够或者算力不行吗。

想问作者,全参数微调是不是在8*(v100 32G)上才跑得动,如果是8*(v100 16G)可以吗。如果可以的话我们还有的换,不行的话是否需要参考deepspeed改为模型并行?

还原checkpoint后,测试生成时发现输出很奇怪

感谢作者和团队的工作!

我按照README中的指示还原了BiLLa的checkpoint,但是在测试时发现模型的结果很奇怪,作者方便的话帮忙看看。

我确信已经还原了checkpoint:embedding_convert.py脚本执行没有报错并且有33-of-33的.backup文件。

BiLLa-7B-LLM

还原后,pytorch_model-33-of-33.bin的hash: 9723f69f146a265d2c68f71a7b7d491e

测试代码

from transformers import LlamaForCausalLM, LlamaTokenizer
from transformers import pipeline

CKPT = 'BiLLa-7B-LLM'
tokenizer = LlamaTokenizer.from_pretrained(CKPT)
model = LlamaForCausalLM.from_pretrained(CKPT)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device='cuda:0')

pipe('今天是个阳光明媚的日子,')
# [{'generated_text': '今天是个阳光明媚的日子,为为为为为为为为为为'}]

BiLLa-7B-SFT

还原后,pytorch_model-33-of-33.bin的hash: 5fc1eca85758b59a14a3a71e3a430f38

测试代码

from transformers import LlamaForCausalLM, LlamaTokenizer
from transformers import pipeline

CKPT = 'BiLLa-7B-SFT'
tokenizer = LlamaTokenizer.from_pretrained(CKPT)
model = LlamaForCausalLM.from_pretrained(CKPT)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device='cuda:0')

prompt = [
    'Human: 请帮我写一段话向老师表示祝福。',
    'Assistant: '
]
prompt = '\n'.join(prompt)
pipe(prompt, max_new_tokens=50)
# [{'generated_text': 'Human: 请帮我写一段话向老师表示祝福。\nAssistant: 度的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的度的度的度的度度度度度度度度度'}]

关于sft阶段loss数值的问题

用train3.5M来训练第二阶段产出的预训练模型,loss一开始是9,训练一段时间后变成5,请问这个数值是否符合预期?大概多少差不多收敛啊?

增量预训练的loss请教

请教一下,对llama进行扩词表,然后进行增量预训练,你最终的loss大概收敛到什么程度呀。

基于SFT后的billa权重续训问题

1,(题外)现在llama感觉已经放松了,vicuna都已经全量放在hf上来,咱们hf模型能不能不搞这种权重mask操作,直接上一个可用版本呢?这样第一步的convert就不用自己搞了。
2,看训练里只是说到了要想基于sft的续训,就要还原成原始的billa-llama的模型文件进行训练。但没有给出脚本,这边想问下,大佬能不能直接将sft后的可以续训的模型文件发我一下呢?或者有没有反向转换教程提供下~。这边想基于第三阶段模型微调一下。

请大佬帮忙解决tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)对错误,困惑多日了

逐条执行:

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model_path = "\home\hope\work\modelsall\BiLLa7BSFT"
tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)
报错为:Traceback (most recent call last):
File "", line 1, in
File "/home/hope/miniconda3/envs/vicuna/lib/python3.8/site-packages/transformers/models/auto/tokenization_auto.py", line 702, in from_pretrained
return tokenizer_class.from_pretrained(pretrained_model_name_or_path, *inputs, **kwargs)
File "/home/hope/miniconda3/envs/vicuna/lib/python3.8/site-packages/transformers/tokenization_utils_base.py", line 1811, in from_pretrained
return cls._from_pretrained(
File "/home/hope/miniconda3/envs/vicuna/lib/python3.8/site-packages/transformers/tokenization_utils_base.py", line 1841, in _from_pretrained
slow_tokenizer = (cls.slow_tokenizer_class)._from_pretrained(
File "/home/hope/miniconda3/envs/vicuna/lib/python3.8/site-packages/transformers/tokenization_utils_base.py", line 1965, in _from_pretrained
tokenizer = cls(*init_inputs, **init_kwargs)
File "/home/hope/miniconda3/envs/vicuna/lib/python3.8/site-packages/transformers/models/llama/tokenization_llama.py", line 96, in init
self.sp_model.Load(vocab_file)
File "/home/hope/miniconda3/envs/vicuna/lib/python3.8/site-packages/sentencepiece/init.py", line 905, in Load
return self.LoadFromFile(model_file)
File "/home/hope/miniconda3/envs/vicuna/lib/python3.8/site-packages/sentencepiece/init.py", line 310, in LoadFromFile
return _sentencepiece.SentencePieceProcessor_LoadFromFile(self, arg)
TypeError: not a string

模型转换过程没问题,原始模型lamma7b可以在fastchat中正常运行,转换后的路径为:\home\hope\work\modelsall\BiLLa7BSFT,ununtu20系统,transformer 4.28.1 网上查了半天没有这个错误

我自己的prompt测试效果不好,可否提供BiLLa-7B-SFT在LogiQA-v2​、C3-d、C3-m数据集上的测试prompt呢?​

我试着自己部署BiLLa-7B-SFT,并进行了C3-d-test数据集的评测,比如对于数据集的第一个数据
[ "男:你这么生气,是不是跟你的那位先生吵架了?", "女:要不是他,我会这么生气吗?" ], [ { "question": "女的到底生谁的气?", "choice": [ "老师", "学生", "丈夫", "孩子" ], "answer": "丈夫" } ], "47-37" ],
我设置的prompt:

你是一个回答问题的助手,你需要简练明确地回答,你需要阅读材料后,做选择题。你的回复需要两行,第一行是一步步分析的过程,第二行是选项的数字编号。

【示例开始】:
<材料>
男:晚饭吃什么?你想吃肯德基吗?
女:我已经吃过了,我现在去加班。
<问题>:女的接下来要干什么?
<选项>
0.吃肯德基
1.工作
2.吃晚饭
<回答>:
分析:因为女的说已经吃完饭了,要去加班,所以选择1号选项,工作。
答案:1
【示例结束】
请牢记以上的示例的<回答>格式,回答后续新的问题:
<材料>:
男:你这么生气,是不是跟你的那位先生吵架了?
女:要不是他,我会这么生气吗?
<问题>:根据材料回答,女的到底生谁的气?
<选项>:
0.老师
1.学生
2.丈夫
3.孩子
请按第一行是一步步分析的过程,第二行是选项的数字编号的格式回答

得到的回复是:
请记住以上的格式,并回答后续问题。
但对于数据集里的
[ "女:一回头发现你不见了,怎么突然停下来了?", "男:没办法,手上拿的袋子实在太重了。" ], [ { "question": "男的为什么停下来?", "choice": [ "袋子太重", "看不见路", "不认识路", "女的不见了" ], "answer": "袋子太重" } ], "26-30" ],
可以得到正确的回复:
本题考查对材料的理解和分析能力。根据材料内容可知,女的不见了,男的手上拿的袋子太重,所以他停下来寻找女的。因此,男的为什么停下来的原因是袋子太重。答案为0。
我测了c3-d-test数据集,大约有一半得不到prompt要求的格式(先写理由再写答案),因此想请问:

  1. 能否提供C3-d-test、C3-m-test、LogiQA-v2​-test上的测试prompt呢?
  2. 因为很可能存在一些无法得到选项答案的回复,比如“这个问题无法选出答案”,“这个问题的答案应该有两个可能”,数据集的acc是怎么计算的呢:经过解析后得到的准确答案个数 / 所有数据个数 , 还是 经过解析后得到的准确答案个数 / 经过解析可以得到的全部答案个数

期待回复,感谢你们的扎实工作~!!

多轮对话数据处理

楼主有训过BELLE的多轮对话数据吗,看DataPreprocessor里面的逻辑貌似没有处理conversations

大问题,BigProblem

我发现这个底座没有任何**古典文化的内容,或者说相对较少,我常识自己feintune了一个lora,和你训练的sft模型进行了比对。
惊讶的发现,底座没有能力背诵古诗:

SFT的输出

> 背诵静夜思
《静夜思》是意大利诗人但丁·阿利吉耶里创作的一首著名诗。下面是这首诗的前四节:


从黄昏到夜晚,
我独坐在我的房间里;
我看着窗外的星光,
思念着远方的你。


我的心像流水一样,
不断地想着你那美丽的脸庞;
我感到非常孤独和寂寞,
希望你能 soon return to me.


但是我知道,
这一切都只能在梦中实现;
我不停地梦想着与你重逢,
在这静夜思的时光里。
> 背诵杜甫的《绝句 两个黄鹂鸣翠柳》
两个黄昏鸟鸣翠,
一树春色满枝头。
人有悲欢离合,
天地间万物情。
> 背诵《水调歌头 明月几时有》
《水调歌头 明月几时有》是唐代诗人李白的一首著名诗,也是**文学史上最著名、最具代表性的诗歌之一。以下是这首诗的全句:

明月几时有?把酒问青天。

我独坐,共夜深。

举杯邀明月,对影成三人。

月既不解饮,影徒随我身。

长夜难为客,更作思远游。

行到水穷处,坐看云起时。

此情可待成追忆,只是当时已惘然。
> 

我自己finetune的lora也是类似的输出。

似乎跟训练数据无关,底座是真的没有这个能力,那这个问题就大了。楼主有何见解?

tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False) 报错麻烦看看,多谢!

用你推荐的程序,出现如下错误: tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False)
模型合并后没有问题。

Traceback (most recent call last):
File "", line 1, in
File "/home/hope/miniconda3/envs/dbgpt/lib/python3.10/site-packages/transformers/models/auto/tokenization_auto.py", line 642, in from_pretrained
tokenizer_config = get_tokenizer_config(pretrained_model_name_or_path, **kwargs)
File "/home/hope/miniconda3/envs/dbgpt/lib/python3.10/site-packages/transformers/models/auto/tokenization_auto.py", line 486, in get_tokenizer_config
resolved_config_file = cached_file(
File "/home/hope/miniconda3/envs/dbgpt/lib/python3.10/site-packages/transformers/utils/hub.py", line 409, in cached_file
resolved_file = hf_hub_download(
File "/home/hope/miniconda3/envs/dbgpt/lib/python3.10/site-packages/huggingface_hub/utils/_validators.py", line 112, in _inner_fn
validate_repo_id(arg_value)
File "/home/hope/miniconda3/envs/dbgpt/lib/python3.10/site-packages/huggingface_hub/utils/_validators.py", line 166, in validate_repo_id
raise HFValidationError(
huggingface_hub.utils.validators.HFValidationError: Repo id must use alphanumeric chars or '-', '', '.', '--' and '..' are forbidden, '-' and '.' cannot start or end the name, max length is 96: '/BiLLa-7B-SFT'.

突然发现预训练模型似乎存在一些问题(sft之前阶段的模型)

我用第二阶段的模型finetune,死活不对劲,然后我试着直接从预训练模型来生成,发现里了个大埔:

>python和java哪个语言更好学
?python3.6和java8哪个更牛?当然是python。python是2011年起流行起来的一种高性能程序设计语言。python的设计**来源于高级语言的**。python的语法和c语言类似,所以学习起来很容易。python的应用领域很广,包括服务器、客户端、分布式、自动化测试等等。python的一个优点就是它具有很好的扩展性,可以满足各种不同的开发需求。python的另一个优点就是它的开发成本低。python的一个缺点就是它的内存管理不好。java是一种面向对象的高级语言,java语言在面向对象技术的基础上进行了一些创新,使java的性能得到了极大的提高。java是一种高性能的、安全的、可伸缩的、多线程的、高性能的、网络应用的程序设计语言。java语言的特点是它的多线程和虚拟机。java的开发成本相对较高,因为它需要运行在操作系统之上,而且对硬件配置有很高的要求。
>hi

>hello
world
>what is your name

>你好
!可能是指:
>你叫什么名字
?可以指:
>

这里没有加任何template,这能力连llama都不如啊。我就说我finetune了半天怎么也无法高出个所以然来。

扩充中文词汇表的细节

你好,感谢分享
请问训练sentencepiece模型时,用了多少语料 以及 词汇量 设置是多少?
SPM的训练语料和模型训练的中文语料是一样的吗?

BiLLa-7B-LLM生成文本问题

用BiLLA-7b-LLM,根据issues# 8, 采用commit id=887dd5e259104ed6fe7816cd0c0997ab68bbb94e版本的pytorch_model-33-of-33.bin替换原来的权重,并且没有用embedding_convery.py。


测试代码如下
from transformers import LlamaForCausalLM, LlamaTokenizer
CKPT = 'BiLLa-7B-LLM'
DEVICE = 'cuda:0'
tokenizer = LlamaTokenizer.from_pretrained(CKPT, add_special_tokens=True)
model = LlamaForCausalLM.from_pretrained(CKPT).to(DEVICE)

prompts = ["我看见一群人走在大", "今天是个阳光明媚的", "这件事情的发展出乎意"]

for prompt in prompts:

input_ids = tokenizer(prompt, return_tensors='pt').input_ids.to(DEVICE)

output_ids = model.generate(input_ids, max_new_tokens=100)[0]

out_text = tokenizer.decode(output_ids)

print(out_text) 

生成结果如下:
<s> 我看见一群人走在大马路可以指:</s>
<s> 今天是个阳光明媚的日子,可以指:</s>
<s> 这件事情的发展出乎意料 </s>


请问这个结果是正常的吗

关于指令微调格式的问题

我看楼主用的是:

Human: xxxxx\n

的格式,而BELLE用的是:

Human: \nxxxx\n\nAsistant: \n

哪种格式更好呢?有对比过吗?不同的格式对结果影响大吗

模型问答中,自己会断掉是什么原因?

  1. 自适应学习:自适应学习是一种通过对用户的输入数据进行学习,从而使模型能够更好地适应用户习惯的技术。
    Human: 生物芯片领域有哪些 前沿技术
    Assistant: 生物芯片是一种微小的、可穿戴的生物传感器,它能够实时监测人体内的多种生理指标,并将数据传输到手机或电脑。目前,生物芯片领域正处于快速发展阶段,一些新兴的技术包括:

  2. 可穿戴式生物芯片:这种芯片能够被穿戴在人体表面,实时监测人体内的生理数据。

  3. 无创生物芯片:这种芯片无需在皮肤上打孔,而是通过皮肤表面的水分 gigantism 进行检测。

  4. 多功能生物芯片:这种芯片能够同时监测多个生理指标,使
    Human: 你是哪家公司的产品
    Assistant: 对不起,我并不是产品。我是一个人工智能助手,是由谷歌开发的,并以谷歌
    Human: 你的 技术框架是什么
    Assistant: 我是一个人工智能助手,并不是技术框架。我是由谷歌开发的,并以谷歌助手的形式提供服务。但是,我可以为您提供有关人工智能技术框架的信息。人工智能技术框架是一组工具和库,用于开发和构建人工智能应用程序。一些流行的人工
    Human:

请教下第一阶段是否开放以及第二阶段的过程

感谢作者和团队的开源!BiLLa是很有价值的工作,之前基于LLaMA的Chinese-LLaMA用的是LoRA,个人感觉,对于扩充语言这么大的改动,还是应该全参数微调,BiLLa的出现让人兴奋。

有一些问题很想请教作者:

  1. 请问会开放第一阶段训练完的双语LLM吗?
    仔细阅读了README之后,发现只开放了第二阶段任务型数据训练后ckpt. 请问有计划开放第一阶段中英文纯文本训练的ckpt吗,感觉会对做非助手类的语言研究很有用。
  2. 第二阶段使用多任务微调的过程希望详细介绍一些(如果方便的话),具体的话,想知道
  • 任务型数据具体使用了哪些公开数据集(数学解题、阅读理解……)
  • ChatGPT为标签生成解析是怎么做的。用ChatGPT来产生中间过程是一个很不错的想法!想知道具体是怎么给ChatGPT以prompt的,在训练模型的时候,输入又是怎样的呢。

十分感谢!

推理速度较慢

作者大大你好,你的这个模型相比于其他llama模型推理速度要慢,然后占用显存也明显要高,这个是什么原因导致的,有解决办法吗。目前测试下来模型在大部分场景都ok。

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.