CodeGeeX2
CodeGeeX2 copied to clipboard
使用Java语言编写冒泡排序,出现问题
我尝试使用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
此处省略几十行空格
不知道有人是否遇到相同的问题
prompt = "// language: Java\n#write a bubble sort function\n" 你的prompt改错了,用这个可以正常返回
@yug2023 我个人的想法是这个prompt是写了两行注释 然后通过注释生成代码 所以我认为 prompt 应该是 "// language: Java\n //write a bubble sort function\n"
而且其他语言的prompt我也是按照这一想法修改的 都没有问题。 所以我不太清楚prompt的正确格式应该是什么样的。 你有尝试过其他语言只修改最前面的注释字符token。 @Stanislas0 您好,请问可以在这方面详细说明一下吗?
@yug2023 我个人的想法是这个prompt是写了两行注释 然后通过注释生成代码 所以我认为 prompt 应该是
"// language: Java\n //write a bubble sort function\n"
而且其他语言的prompt我也是按照这一想法修改的 都没有问题。 所以我不太清楚prompt的正确格式应该是什么样的。 你有尝试过其他语言只修改最前面的注释字符token。 @Stanislas0 您好,请问可以在这方面详细说明一下吗?
你的prompt没有写错,CodeGeeX2是一个基座模型,prompt格式就是按照正常编程习惯来写。这里出现空行比较奇怪,我试了是可以正常出东西的,估计是精度原因导致,不知道你的模型是否经过了量化。如果要更好的引导模型生成函数体,只需要再加上一些关键字就行了,比如“public”,模型就会继续完成函数体。
你好,我也是用java生成冒泡排序失败。两种prompt都尝试过,“// language: Java\n //write a bubble sort function\n”,“prompt = "// language: Java\n#write a bubble sort function\n"”。都是打印大量空行,没有任何内容。使用的是单卡32G V100,模型没有经过量化。
@toufunao Stanislas0 提到可能是模型精度问题。
你的prompt没有写错,CodeGeeX2是一个基座模型,prompt格式就是按照正常编程习惯来写。这里出现空行比较奇怪,我试了是可以正常出东西的,估计是精度原因导致,不知道你的模型是否经过了量化。如果要更好的引导模型生成函数体,只需要再加上一些关键字就行了,比如“public”,模型就会继续完成函数体。
V100机器不支持bfloat16,所以需要按照README中的教程修改代码
如果显卡不支持bfloat16格式,将会输出错误的内容,需要将模型转换成float16格式:
model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True).half().cuda()
我没有进行尝试,如果你成功了希望你可以回复一下
@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: 我下一步会考虑进行微调,有相关微调数据预处理的教程吗?
@toufunao 我似乎也遇到过这样的warning,或许这就是空行存在的原因,可以请教一下@Stanislas0 。 #47 和 #16 中都有提到微调的需求但是官方似乎没有提供相应的教程,这也是我的需求。希望官方可以更新一下,期待 !
我也出现了大量空行,还有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的内容打印出来,最奇怪的是代码一个字也没生成。我没有对模型进行量化。
我的显卡不支持bfloat16,也出现了大量空行,输出的啥也不是