ChatGLM-Tuning
ChatGLM-Tuning copied to clipboard
代码基本已经验证成功了,但会输出无关问题
@mymusise 首先非常感谢您的代码,我已经基本跑通。V100由于开不了int8推理,所以只设置batch_size=2。 我采用的数据的json格式如下: {"context": "[Round 0]\n问:你的名字\n答:", "target": "我叫大山,是一个代表我的虚拟身份的名称。\n"} 即照搬chatglm的输入格式。
我采用了一个只有16个对话的极小数据集,经过我的测试,有一个小问题,就是虽然在finetune.py中您在label中多加入了一个eos_token_id,但针对训练集上的问题进行推理,不但有正确答案,还和其他问题和回答一起输出。
所以我又在tokenize_datasets_row.py第16行又加入一个eos_token_id,即:
input_ids = promopt_ids + target_ids + [tokenizer.eos_token_id]*2
输出结果就正常了,我也不知道为什么。可能原程序并没有预测出eos。
@archwolf118 请问下,你这个16轮对话,是每一轮对话的context都是一句话吗?还是会将之前的对话拼接起来呢?
每一轮对话的context都是一问一答。 不会做拼接,所以每次输入只按第0轮算。 json格式如下:
{"context": "[Round 0]\n问:你的生日?\n答:", "target": "我的生日是2023年3月16日\n"}
{"context": "[Round 0]\n问:你的年龄?\n答:", "target": "我的生日是2023年3月16日,所以我的年龄是0岁\n"}
{"context": "[Round 0]\n问:你多大了?\n答:", "target": "我的生日是2023年3月16日,所以我的年龄是0岁\n"}
.
.
.
@archwolf118 确实可以了,现在infer您这边可以使用模型的chat接口嘛?
@archwolf118请问您的v100显存是多少呢?cuda版本又是多少呢? 我用单卡v100进行fine-tune训练时,会报错RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasGemmEx
@onair1314 V100显存是32G,torch版本1.13.1+cu116,cuda版本是11.6,可以自把cuda安装到自定义目录,在bashrc中指定cuda路径。 @js0316 还没试chat接口。
#60 应该是一个问题
@archwolf118 hello,我这边训练完后,用训练集问题作为输入,他回答的和训练集答案差别很大。怀疑可能是没有正确训练,可以参考下你的训练参数配置吗,以及是否改了其他代码,感谢!
#60
@mymusise 首先非常感谢您的代码,我已经基本跑通。V100由于开不了int8推理,所以只设置batch_size=2。 我采用的数据的json格式如下: {"context": "[Round 0]\n问:你的名字\n答:", "target": "我叫大山,是一个代表我的虚拟身份的名称。\n"} 即照搬chatglm的输入格式。
我采用了一个只有16个对话的极小数据集,经过我的测试,有一个小问题,就是虽然在finetune.py中您在label中多加入了一个eos_token_id,但针对训练集上的问题进行推理,不但有正确答案,还和其他问题和回答一起输出。
所以我又在tokenize_datasets_row.py第16行又加入一个eos_token_id,即:
input_ids = promopt_ids + target_ids + [tokenizer.eos_token_id]*2
输出结果就正常了,我也不知道为什么。可能原程序并没有预测出eos。
这个有什么理论依据吗?我看官方的Ptuning 的代码里,在结尾只有一个eos_token_id (130005),padding token 是用的默认的3。 但是有的代码结尾是2个有的代码eos_token_id (130005),padding token 也是用的eos_token_id(130005),而不是3。 关键一个eos_token_id的部分代码,确实是效果有问题,但是有的代码一个eos_token_id 的情况就没事,很让人疑惑啊