Open zejunwang1 opened 3 years ago
精度可以到小数点后两位
精度可以到小数点后两位
我使用electra的bert模型进行推理,发现精度有点下降:
[-2.28732795e-01 6.75604939e-01 -4.36096016e-05 -1.55787677e-01 1.01697122e-04 2.64978588e-01 1.07041633e+00 -9.58646238e-02 2.08994150e-01 2.78842412e-02 -7.49029890e-02 1.40876785e-01 ......
上面这个是在tensorflow下的结果。 下面是在TurboTransformers c++推理得到的结果: -0.218206 0.685999 -3.69157e-06 -0.155642 0.000119527 0.26852 1.07638 -0.102435 0.226186 0.0320726 -0.105529 0.145614
前12个比较发现,精度有点下降
turbo单测会比较每个kernel的精度,跟我我的经验,问题可能出在
矩阵乘法实现,GPU会默认使用tensor core计算 更改如下文件 https://github.com/Tencent/TurboTransformers/blob/master/turbo_transformers/layers/kernels/mat_mul.cpp#L80 参数配置改成如下 auto cublas_algo = CUBLAS_GEMM_DEFAULT; //CUBLAS_GEMM_DEFAULT_TENSOR_OP; auto cublas_match_mode = CUBLAS_DEFAULT_MATH; //CUBLAS_TENSOR_OP_MATH; 不用tensor core计算精度会提升
去源代码里检查一下softmax,layernorm的超参数 比如除法为了防止除0会加一个eps,这个可能和tf的参数不一样。
BTW,你比较一下tf和pytorch的精度有差异么?
BTW,你比较一下tf和pytorch的精度有差异么?
hi 我比较了pytorch的bert-base-uncased模型与TurboTransformers c++版本的bert-base-uncased推理,发现精度是类似的。 下面这个是pytorch版本的结果: [-3.1108e-02, 4.5749e-01, 3.5974e-02, 1.7493e-02, -1.7767e-01, 2.1110e-01, 1.3598e-01, -3.7370e-01, -7.2889e-01, -5.2631e-01, 3.6267e-01, 4.6182e-01, -2.8690e-01, 3.1322e-01, 2.0028e-01, 5.3880e-01, 2.4759e-01, -2.4060e-01, -7.5732e-02, -1.4053e-01,......
下面这个是TurboTransformers的结果: -0.0248861 0.459299 0.0371649 0.0211423 -0.178632 0.206175 0.132897 -0.374994 -0.727005 -0.531851 0.362114 0.464208 -0.279358 0.310514 0.203247 0.532688 0.246854 -0.239616 -0.0746352 -0.137173
参数配置改成下面 auto cublas_algo = CUBLAS_GEMM_DEFAULT; //CUBLAS_GEMM_DEFAULT_TENSOR_OP; 对于推理结果没有影响。
还有我为什么找不到 auto cublas_match_mode = CUBLAS_DEFAULT_MATH; //CUBLAS_TENSOR_OP_MATH; 这个cublas_match_mode?
那行代码是意义,你可以搜关键字替换 CUBLAS_TENSOR_OP_MATH -> CUBLAS_DEFAULT_MATH 既然turbo和torch一样,那和tf的差异就是框架的原因的。
那行代码是意义,你可以搜关键字替换 CUBLAS_TENSOR_OP_MATH -> CUBLAS_DEFAULT_MATH 既然turbo和torch一样,那和tf的差异就是框架的原因的。
turbo和torch的精度差异和tensorflow类似哈
你用哪个脚本测试的呢?你这个差异看起来已经远远超出可接受范围。 example/python/bert_example.py 用这个程序测试一下?
我用的是bert_model_example.cpp,上面这个差异在0.01以内
你的意思是不是: bert_model_example.cpp 差异很大 bert_example.py 差异可以接受?
你的意思是不是: bert_model_example.cpp 差异很大 bert_example.py 差异可以接受?
不是,turbo的python版本我没装起来。我意思是bert_model_example.cpp 差异在0.01以内
你用了自己的数据,然后发现差异很大?你都用的是统一版本的bert-base-uncased?
你用了自己的数据,然后发现差异很大?你都用的是统一版本的bert-base-uncased?
我使用turbo_transformers的python api,发现当seq_length为128的时候,每次推理出来的结果都不一样,问一下这个是什么情况?
你用了自己的数据,然后发现差异很大?你都用的是统一版本的bert-base-uncased?
我使用turbo_transformers的python api,发现当seq_length为128的时候,每次推理出来的结果都不一样,问一下这个是什么情况?
根据你对现象的描述,我猜测一个合理的解释是,你的网络中某些层的参数没有加载,是随机的。
你用了自己的数据,然后发现差异很大?你都用的是统一版本的bert-base-uncased?
我使用turbo_transformers的python api,发现当seq_length为128的时候,每次推理出来的结果都不一样,问一下这个是什么情况?
根据你对现象的描述,我猜测一个合理的解释是,你的网络中某些层的参数没有加载,是随机的。
注释掉这个后正常了
你用了自己的数据,然后发现差异很大?你都用的是统一版本的bert-base-uncased?
我使用turbo_transformers的python api,发现当seq_length为128的时候,每次推理出来的结果都不一样,问一下这个是什么情况?
根据你对现象的描述,我猜测一个合理的解释是,你的网络中某些层的参数没有加载,是随机的。
turbo_transformers.set_num_threads(4)
注释掉这个后正常了
你用的是CPU版本还是GPU?这个语句不会影响精度的。
你用了自己的数据,然后发现差异很大?你都用的是统一版本的bert-base-uncased?
我使用turbo_transformers的python api,发现当seq_length为128的时候,每次推理出来的结果都不一样,问一下这个是什么情况?
根据你对现象的描述,我猜测一个合理的解释是,你的网络中某些层的参数没有加载,是随机的。
turbo_transformers.set_num_threads(4)
注释掉这个后正常了
你用的是CPU版本还是GPU?这个语句不会影响精度的。
嗯嗯 CPU版本的这句需要注释掉,否则seq_length=128的输出结果不稳定;GPU版本需要这句代码
你用了自己的数据,然后发现差异很大?你都用的是统一版本的bert-base-uncased?
我使用turbo_transformers的python api,发现当seq_length为128的时候,每次推理出来的结果都不一样,问一下这个是什么情况?
根据你对现象的描述,我猜测一个合理的解释是,你的网络中某些层的参数没有加载,是随机的。
turbo_transformers.set_num_threads(4)
注释掉这个后正常了
你用的是CPU版本还是GPU?这个语句不会影响精度的。
嗯嗯 CPU版本的这句需要注释掉,否则seq_length=128的输出结果不稳定;GPU版本需要这句代码 这个语句对GPU没用,是针对CPU的
v0.6.0版本的GPU实现的GEMM运算不使用tensor core了,精度会和CPU版本对齐。
作者你好:
我想问一下使用TurboTransformers进行bert模型推理时,输出的精度会有损失吗?