netease-youdao / BCEmbedding

Netease Youdao's open-source embedding and reranker models for RAG products.
Apache License 2.0
1.5k stars 100 forks source link

embedding、rerank模型加速推理 #70

Open deku0818 opened 5 months ago

deku0818 commented 5 months ago

使用了BCE很长时间,但是希望有更好的性能,看了此项目的Issues,发现有很多加速框架,但是没有这方面基础 不知道有没有这方面的教程,非常想学习一下 https://github.com/netease-youdao/BCEmbedding/issues/9#issuecomment-1905319760

shenlei1020 commented 5 months ago

感谢您的反馈~

  1. 首先bce的两个模型都是bert base规模,比其他large规模的模型,效率高大约3倍;

  2. 关于这两个模型高效推理,我们最近release出了一个版本(推理框架onnxruntime-gpu):

  1. 如果在集成上述高效推理方案有任务问题,欢迎在此issue提出!
deku0818 commented 5 months ago

感谢您的反馈~

  1. 首先bce的两个模型都是bert base规模,比其他large规模的模型,效率高大约3倍;
  2. 关于这两个模型高效推理,我们最近release出了一个版本(推理框架onnxruntime-gpu):
  1. 如果在集成上述高效推理方案有任务问题,欢迎在此issue提出!

感谢!这部分代码已经跑起来了,我发现推理的结果是不一样的,是因为模型转换丢失精度吗?

deku0818 commented 5 months ago

sentences = ["This is a test sentence.", "Another sentence for embedding."] image image 我进行了简单的测试,发现onnx 推理比SentenceTransformer还慢是为什么?

shenlei1020 commented 5 months ago

1、你的onnx模型是自己转的,还是直接下载我们开源的onnx模型? 2、如果是下载我们在qanything开源的onnx模型,是没问题的。注意是qanything最新放出来的embedding和reranker的onnx模型。 3、onnx和torch的结果稍许差异是正常的,看一下cos相似度是不是0.99,是的话就没问题。 4、推理慢的原因可能是:a、你的onnxruntime是cpu版本的,解决方案是先卸载onnxruntime,再pip install onnxruntime-gpu;b、确定onnxruntime-gpu的包是对的,用我们的推理代码,应该不会有问题的,注意看一下CUDAExecutionProvider是否成功。

deku0818 commented 5 months ago

1、你的onnx模型是自己转的,还是直接下载我们开源的onnx模型? 2、如果是下载我们在qanything开源的onnx模型,是没问题的。注意是qanything最新放出来的embedding和reranker的onnx模型。 3、onnx和torch的结果稍许差异是正常的,看一下cos相似度是不是0.99,是的话就没问题。 4、推理慢的原因可能是:a、你的onnxruntime是cpu版本的,解决方案是先卸载onnxruntime,再pip install onnxruntime-gpu;b、确定onnxruntime-gpu的包是对的,用我们的推理代码,应该不会有问题的,注意看一下CUDAExecutionProvider是否成功。

感谢指导,已经定位到原因了,应该是是cuda libcublasLt.so.11的问题,导致只使用了CPU

deku0818 commented 5 months ago

image image 快了3倍

deku0818 commented 5 months ago

余弦相似度: 0.9999987920724557

deku0818 commented 5 months ago

image image 快了3倍

后面简单跑了下,平均快了将近20倍

kbaicai commented 4 months ago

1、你的onnx模型是自己转的,还是直接下载我们开源的onnx模型? 2、如果是下载我们在qanything开源的onnx模型,是没问题的。注意是qanything最新放出来的embedding和reranker的onnx模型。 3、onnx和torch的结果稍许差异是正常的,看一下cos相似度是不是0.99,是的话就没问题。 4、推理慢的原因可能是:a、你的onnxruntime是cpu版本的,解决方案是先卸载onnxruntime,再pip install onnxruntime-gpu;b、确定onnxruntime-gpu的包是对的,用我们的推理代码,应该不会有问题的,注意看一下CUDAExecutionProvider是否成功。

请问 QAnything 最新的放出来的是指 docker 版本的(triton)还是python 版本的?还是两个都是最新,只不过一个是 triton 推理,一个是 onnxruntime-gpu 推理?

bash99 commented 3 months ago

image image 快了3倍

你这边onnx比sentence_transformer快,请问都是跑在gpu上的吗?

我部署了 infinity-emb 加速推理框架,似乎inaai/jina-reranker-v2-base-multilingual的onnx的速度还不如torch引擎?

然后本地用netease-youdao/Rerank 下的onnx模型 和 HuggingFace的 maidalun1020/bce-reranker-base_v1模型对比(后者用 sentence_transformer 加载,指定了fp16模式) 执行起来两者速度差不多,是不是因为onnx缺省跑在32bit精度下?

bash99 commented 3 months ago

感谢您的反馈~

  1. 首先bce的两个模型都是bert base规模,比其他large规模的模型,效率高大约3倍;
  2. 关于这两个模型高效推理,我们最近release出了一个版本(推理框架onnxruntime-gpu):
  1. 如果在集成上述高效推理方案有任务问题,欢迎在此issue提出!

这两个高效推理方案有无单独可部署的应用?甚至是支持动态批次的推理加速服务软件?

shenlei1020 commented 3 months ago

bce-embedding高效推理:https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/embedding/embedding_onnx_backend.py

bce-reranker高效推理(包含我们长passages精排方案,被一些其他开源项目采用):https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/rerank/rerank_onnx_backend.py

现成的高效推理代码,直接抄过去就行了

bash99 commented 3 months ago

bce-embedding高效推理:https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/embedding/embedding_onnx_backend.py

bce-reranker高效推理(包含我们长passages精排方案,被一些其他开源项目采用):https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/rerank/rerank_onnx_backend.py

现成的高效推理代码,直接抄过去就行了

我抄过去之后,rerank 本地测试没比sentence_transformer快啊,本地卡是3060,环境是windows 10/wsl2。

修正:换到服务器环境 2080ti + cuda 12.4下,并发到2确实会快(3060上只快一点),不过并发4没太多提升了,可能更好的显卡高并发会更明显。

测试代码单文件 test.py

测试结果:RTX 3060 / wsl2
onnx backend
函数 test_reranker_speed 执行耗时: 5.512723922729492 秒 并发1
函数 test_reranker_speed 执行耗时: 4.440540552139282 秒 并发2
函数 test_reranker_speed 执行耗时: 4.043043375015259 秒 并发4
sentence_transformer backend
函数 test_reranker_speed 执行耗时: 5.733941078186035 秒 并发1
函数 test_reranker_speed 执行耗时: 5.786724328994751 秒 并发2
函数 test_reranker_speed 执行耗时: 5.8787829875946045 秒 并发4

RTX 2080ti / ubuntu 22.04
onnx backend
函数 test_reranker_speed 执行耗时: 4.926323652267456 秒 并发1
函数 test_reranker_speed 执行耗时: 2.642716407775879 秒 并发2
函数 test_reranker_speed 执行耗时: 2.3108112812042236 秒 并发4
sentence_transformer backend
函数 test_reranker_speed 执行耗时: 3.9571597576141357 秒 并发1
函数 test_reranker_speed 执行耗时: 3.4588193893432617 秒 并发2
函数 test_reranker_speed 执行耗时: 4.589118242263794 秒 并发4
shenlei1020 commented 3 months ago

确认一下你用onnx推理是用的onnxruntime-gpu,而不是cpu版本,看一下providers参数

bash99 commented 3 months ago

确认一下你用onnx推理是用的onnxruntime-gpu,而不是cpu版本,看一下providers参数

推理时我观察到 nvidia-smi 显示的gpu usage是99%,没注意cpu占用。

另外sentence_transformer是用torch.float_16 模式加载的,缺省模式会慢一倍多。

lycfight commented 3 months ago

确认一下你用onnx推理是用的onnxruntime-gpu,而不是cpu版本,看一下providers参数

安装onnxruntime-gpu,仍未gpu运行。

[E:onnxruntime:Default, provider_bridge_ort.cc:1480 TryGetProviderInfo_CUDA] /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1193 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcublasLt.so.11: cannot open shared object file: No such file or directory

[W:onnxruntime:Default, onnxruntime_pybind_state.cc:747 CreateExecutionProviderInstance] Failed to create CUDAExecutionProvider. Please reference https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements to ensure all dependencies are met.

缺少cudatoolkit 参考(https://blog.csdn.net/jinxianwei1999/article/details/134705262)

estuday commented 2 months ago

1、你的onnx模型是自己转的,还是直接下载我们开源的onnx模型? 2、如果是下载我们在qanything开源的onnx模型,是没问题的。注意是qanything最新放出来的embedding和reranker的onnx模型。 3、onnx和torch的结果稍许差异是正常的,看一下cos相似度是不是0.99,是的话就没问题。 4、推理慢的原因可能是:a、你的onnxruntime是cpu版本的,解决方案是先卸载onnxruntime,再pip install onnxruntime-gpu;b、确定onnxruntime-gpu的包是对的,用我们的推理代码,应该不会有问题的,注意看一下CUDAExecutionProvider是否成功。

你好,我在qanything上没找到开源的onnx模型,但在huggingface上发现了一个6个月前上传的,可以使用吗

EvanSong77 commented 2 months ago

bce-embedding高效推理:https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/embedding/embedding_onnx_backend.py

bce-reranker高效推理(包含我们长passages精排方案,被一些其他开源项目采用):https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/rerank/rerank_onnx_backend.py

现成的高效推理代码,直接抄过去就行了

您好,我在进行压测的时候发现onnx模型显存会不断增加不会释放,这种情况请问如何解决啊

akai-shuuichi commented 1 month ago

能否再将onnx模型转换为TensorRT再进一步加速呢?

EvanSong77 commented 1 month ago

能否再将onnx模型转换为TensorRT再进一步加速呢?

不建议用TensorRT了,兼容性问题较多,性能提示不是很明显,建议等这个vLLM-encoder分支合并(目前没有合并只支持单线程推理,性能非常好),使用kv cache,性能比onnx好很多

EvanSong77 commented 1 month ago

bce-embedding高效推理:https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/embedding/embedding_onnx_backend.py

bce-reranker高效推理(包含我们长passages精排方案,被一些其他开源项目采用):https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/rerank/rerank_onnx_backend.py

现成的高效推理代码,直接抄过去就行了

您好,我在进行压测的时候发现onnx模型显存会不断增加不会释放,这种情况请问如何解决啊

已解决

Odimmsun commented 1 month ago

bce-embedding高效推理:https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/embedding/embedding_onnx_backend.py

bce-reranker高效推理(包含我们长passages精排方案,被一些其他开源项目采用):https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/rerank/rerank_onnx_backend.py

现成的高效推理代码,直接抄过去就行了

您好,我在进行压测的时候发现onnx模型显存会不断增加不会释放,这种情况请问如何解决啊

已解决

您好,求教如何解决的,我好像也有类似的问题

EvanSong77 commented 1 month ago

bce-embedding高效推理:https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/embedding/embedding_onnx_backend.py

bce-reranker高效推理(包含我们长passages精排方案,被一些其他开源项目采用):https://github.com/netease-youdao/QAnything/blob/qanything-python/qanything_kernel/connector/rerank/rerank_onnx_backend.py

现成的高效推理代码,直接抄过去就行了

您好,我在进行压测的时候发现onnx模型显存会不断增加不会释放,这种情况请问如何解决啊

已解决

您好,求教如何解决的,我好像也有类似的问题

增加一个运行时缓存处理策略,https://github.com/microsoft/onnxruntime/issues/19445 然后最好设置一下最大显存,https://blog.csdn.net/xiao_ling_yun/article/details/139989573 建议你采用固定batch的方式进行推理

Aliang-CN commented 6 days ago

您好,可以提供一下Qanthing开源的onnx模型开源地址吗?我在qanything上找了很久都没找到对应的下载链接。

FengWuFei commented 5 days ago

您好,可以提供一下Qanthing开源的onnx模型开源地址吗?我在qanything上找了很久都没找到对应的下载链接。

https://hf-mirror.com/netease-youdao/embed 看看这个是你需要的不。