windos下搭建paddlenlp 语义检索系统
之前搭建paddleocr的时候,创建了paddle的虚拟环境,顺便也装了paddlenlp的库,就想着直接用这个,然后语义检索模型本身没有问题了,可以正常推理了。但在搭建pipline的时候出现问题,application启动不起来。浪费了半天时间查看库的版本,和配置问题。paddlenlp这个库安装的比较久了,也忘了版本冲突,重新下了一遍,更新了paddle的版本之后,还是有问题。
比如grpcio这个库版本没办法避免,一个要求小于1.33.2,另一个paddle的库要求大于1.47.1,click这个库同样。
然后看了这个csdn参考帖子,以及官方给出的文档,官方文档,其中有一个针对windos安装的视频:视频地址。
视频和参考帖子都是重新create一个虚拟环境,避免库的版本冲突。大概我也是这个问题。当然,模型推理没问题,pipline出现的问题可以自己重写避免。
1 环境配置
1.1 在Anaconda下重新创建虚拟环境,并进入虚拟环境:
conda create -n paddlepipline python=3.9
conda activate paddlepipline
1.2 安装paddle:paddle主页
根据自己电脑安装所需版本,我自己安装cpu版本。
pip install paddlepaddle==2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
1.3 安装paddle-pipelines
pip install --upgrade paddle-pipelines -i https://pypi.tuna.tsinghua.edu.cn/simple
1.4 下载paddlenlp源码,piplines源码包含在paddlenlp这个仓库中
git clone https://github.com/PaddlePaddle/PaddleNLP.git
1.5 进入到piplines目录,官方文档提示后续所有流程都只用在pipelines根目录下进行就行
cd PaddleNLP/piplines
1.6 查看语义检索推理效果,官方预置DuReader-Robust数据集的验证集中的1417条数据。
python examples/semantic-search/semantic_search_example.py --device cpu \
--search_engine faiss
使用gpu自行设置就行,search_engine默认是faiss,也可以不设置,另一个可选是milvus。
2 构建Web可视化语义检索系统
主要包括三个方面:基于ElasticSearch的ANN服务;基于RestAPI的构建模型服务;基于Streamlit构建WebUI。我之前一直在RestAPI,application挂不起来,可能因为版本冲突。
2.1 启动ANN服务
下载Elasticsearch并解压,官方文档给的是8.3.2版本,piplines里面requirements里给的是7.7-7.11的版本。
实测,8.7.1和7.11版本都可以,这里用的是8.7.1版本,下载安装教程可以参考我另一篇blog。
启动服务前,修改config中elasticsearch.yml配置,将xpack.security.enabled设置我false,默认是true。
xpack.security.enabled: false
看视频8.3.2和7.11的版本,都没有这条,可以自行加上。
es服务默认的端口是9200,其他详情参考我另一篇blog。
bin目录下,双击elasticsearch.bat,启动服务。
2.2 文档数据写入ANN索引库
# 以DuReader-Robust 数据集为例建立 ANN 索引库
python utils/offline_ann.py --index_name dureader_robust_query_encoder \
--doc_dir data/dureader_dev \
--search_engine elastic \
--embed_title True \
--delete_index
参数说明
index_name
: 索引的名称doc_dir
: txt文本数据的路径host
: ANN索引引擎的IP地址port
: ANN索引引擎的端口号search_engine
: 选择的近似索引引擎elastic,milvus,默认elasticdelete_index
: 是否删除现有的索引和数据,用于清空es的数据,默认为falseembed_title
: 是否需要对标题建索引,默认为false,标题默认为文件名
2.3 启动RestAPI模型服务
指定环境变量,重写pipline服务的话,可以把这个写到参数里,总感觉这样不方便。
另外以前一直用Anaconda Prompt,但用Anaconda Powershell Prompt会更方便,多出了很多linux命令,比如,ls,不像在Anaconda Prompt里面要用dir。
另外Command shell是Windos内置的第一个shell,用于自动执行常规任务。PowerShell是Command shell的功能扩展,可以运行名为cmdlet的PowerShell命令,cmdlet是windos命令的拓展,Command shell只能运行Windows命令。
使用Anaconda Powershell Prompt的话:
$env:PIPELINE_YAML_PATH='rest_api/pipeline/semantic_search.yaml'
使用Anaconda Prompt:
set PIPELINE_YAML_PATH=rest_api/pipeline/semantic_search.yaml
然后,使用端口8891启动服务。
python rest_api/application.py 8891
哭了,之前浪费半天,看是不是es版本,或者其他代码的问题,结果就真的只是库版本冲突。
启动之后可以使用curl命令,验证是否成功运行,重新开一个cmd,进行验证:
直接复制官方文档的curl命令会报错:
curl -X POST -k http://localhost:8891/query -H 'Content-Type: application/json' -d '{"query": "范冰冰身高是多少?","params": {"Retriever": {"top_k": 5}, "Ranker":{"top_k": 5}}}'
正确的形式,这是因为windows的command.exe命令不支持单引号,所以要处理一下命令,先转义双引号,然后把单引号改为双引号。
curl -X POST -k http://localhost:8891/query -H "Content-Type:application/json" -d "{\"query\": \"范冰冰身高是多少?\", \"params\": {\"Retriever\": {\"top_k\": 5}, \"Ranker\":{\"top_k\": 5}}}"
同一个问题,通过es搜索之后,精度降低了?有两个评价指标,一个es_ann_score和score。看排序是根据score排的,但实际根据es_ann_score的话,和范冰冰相关那条0.9093是最高的。(代码还没有看)
2.4 启动WebUI
配置模型服务地址,重新开一个Anaconda Powershell Prompt:
$env:API_ENDPOINT='http://127.0.0.1:8891'
在端口8502启动WebUI。
python -m streamlit run ui/webapp_semantic_search.py --server.port 8502
启动成功,启动界面内置了一条。
看上去还挺准,还是范冰冰身高问题。
相关性比较差,模型推理的时候是没问题,那么可能跟es检索有关。