THUDM / CodeGeeX2

CodeGeeX2: A More Powerful Multilingual Code Generation Model
https://codegeex.cn
Apache License 2.0
7.62k stars 532 forks source link

使用Java语言编写冒泡排序,出现问题 #29

Open Zz-dong opened 1 year ago

Zz-dong commented 1 year ago

我尝试使用Python、Java、Javascript、Ruby、Go、PHP语言编写冒泡排序。我按照README使用每个语言各自注释风格编写prompt。只有Java语言出现问题,其他语言正常。代码如下:

from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True, device='cuda')
model = model.eval()

# remember adding a language tag for better performance
prompt = "// language: Java\n//write a bubble sort function\n"
inputs = tokenizer.encode(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(inputs, max_length=256, top_k=1)
response = tokenizer.decode(outputs[0])

print(response)

结果为没有任何输出

[2023-07-29 03:42:17,286] [INFO] [real_accelerator.py:110:get_accelerator] Setting ds_accelerator to cuda (auto detect)
Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████████████████| 7/7 [00:28<00:00,  4.03s/it]
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
// language: Java
//write a bubble sort function

此处省略几十行空格

不知道有人是否遇到相同的问题

yug2023 commented 1 year ago

prompt = "// language: Java\n#write a bubble sort function\n" 你的prompt改错了,用这个可以正常返回

Zz-dong commented 1 year ago

@yug2023 我个人的想法是这个prompt是写了两行注释 然后通过注释生成代码 所以我认为 prompt 应该是 "// language: Java\n //write a bubble sort function\n" 而且其他语言的prompt我也是按照这一想法修改的 都没有问题。 所以我不太清楚prompt的正确格式应该是什么样的。 你有尝试过其他语言只修改最前面的注释字符token。 @Stanislas0 您好,请问可以在这方面详细说明一下吗?

Stanislas0 commented 1 year ago

@yug2023 我个人的想法是这个prompt是写了两行注释 然后通过注释生成代码 所以我认为 prompt 应该是 "// language: Java\n //write a bubble sort function\n" 而且其他语言的prompt我也是按照这一想法修改的 都没有问题。 所以我不太清楚prompt的正确格式应该是什么样的。 你有尝试过其他语言只修改最前面的注释字符token。 @Stanislas0 您好,请问可以在这方面详细说明一下吗?

你的prompt没有写错,CodeGeeX2是一个基座模型,prompt格式就是按照正常编程习惯来写。这里出现空行比较奇怪,我试了是可以正常出东西的,估计是精度原因导致,不知道你的模型是否经过了量化。如果要更好的引导模型生成函数体,只需要再加上一些关键字就行了,比如“public”,模型就会继续完成函数体。

toufunao commented 1 year ago

你好,我也是用java生成冒泡排序失败。两种prompt都尝试过,“// language: Java\n //write a bubble sort function\n”,“prompt = "// language: Java\n#write a bubble sort function\n"”。都是打印大量空行,没有任何内容。使用的是单卡32G V100,模型没有经过量化。

Zz-dong commented 1 year ago

@toufunao Stanislas0 提到可能是模型精度问题。

你的prompt没有写错,CodeGeeX2是一个基座模型,prompt格式就是按照正常编程习惯来写。这里出现空行比较奇怪,我试了是可以正常出东西的,估计是精度原因导致,不知道你的模型是否经过了量化。如果要更好的引导模型生成函数体,只需要再加上一些关键字就行了,比如“public”,模型就会继续完成函数体。

V100机器不支持bfloat16,所以需要按照README中的教程修改代码

如果显卡不支持bfloat16格式,将会输出错误的内容,需要将模型转换成float16格式:

model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True).half().cuda()

我没有进行尝试,如果你成功了希望你可以回复一下

toufunao commented 1 year ago

@Zz-dong 你好,我刚刚尝试过了,可以输出Java代码,但仍存在大量的空行。 而且还会出现以下提示:“The attention mask and the pad token id were not set. As a sequence, you may observe unexpected behavior. Please pass your inputs's 'attention_mask' to obtain reliable results. Setting 'pad_token_id' to 'eos_token_id':2 for open-ended generation. ”

ps: 我下一步会考虑进行微调,有相关微调数据预处理的教程吗?

Zz-dong commented 1 year ago

@toufunao 我似乎也遇到过这样的warning,或许这就是空行存在的原因,可以请教一下@Stanislas0 。 #47 和 #16 中都有提到微调的需求但是官方似乎没有提供相应的教程,这也是我的需求。希望官方可以更新一下,期待 !

zhouenxian commented 1 year ago

我也出现了大量空行,还有warning提示 The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's attention_mask to obtain reliable results. Setting pad_token_id to eos_token_id:2 for open-end generation. 并且原封不动的吧Prompt的内容打印出来,最奇怪的是代码一个字也没生成。我没有对模型进行量化。 image

AnitaSherry commented 5 months ago

我的显卡不支持bfloat16,也出现了大量空行,输出的啥也不是