当前位置: 首页 > 工具软件 > AnyQ > 使用案例 >

百度AnyQ的编译部署

娄学文
2023-12-01

AnyQ 在Linux上的编译

一.系统下载及环境安装

(1)源码下载到对应的位置

git clone https://github.com/baidu/AnyQ.git

 

(2)cmake3安装

1)安装gcc/g++的软件依赖

yum install -y gcc gcc-c++ make automake

2)下载cmake源代码包(推荐3.3.2),

可以去官网查看最新版的下载地址:https://cmake.org/download/

wget https://cmake.org/files/v3.3/cmake-3.3.2.tar.gz

解压cmake源码包

tar -zxvf cmake-3.3.2.tar.gz

进入目录,设置,编译,链接

cd cmake-3.3.2/

./bootstrap --prefix=/usr --datadir=share/cmake --docdir=doc/cmake && make

make install

cmake --version 检查cmake版本

 

 

(3)bison 3.0安装

方式1(yum,推荐此方法):

yum install bison

bison -V

返回结果

bison (GNU Bison) 3.0.4

方式2(源码安装,不推荐):

cd /usr/local/src

wget http://ftp.gnu.org/gnu/bison/bison-3.5.tar.gz

tar -zxvf bison-3.5.tar.gz

cd bison-3.5

./configure

make

make install

检查

bison -V

可能会出现command not found的报错。所以不推荐。这是因为环境路径没添加上导致的。

 

yum install automake

 

(4)open jdk 8安装

 

yum install java-1.8.0-openjdk-devel

 

java -version 检测是否安装成功

 

二.系统编译

(1)最快的成功编译方案

系统及环境下载安装完以后,进入安装包目录,开始进行编译

cd /data/xiaoyichao/projects/AnyQ

mkdir build && cd build

cmake ..

下边写的那些报错全会出,都直接修改就可以了。别浪费时间了。如果你想节省时间,可以使用我修改好的cmake配置文件,直接这个/data/project/AnyQ/cmake/路径下的external整个替换掉就可以了。我把所有修改好的cmake配置文件都放在external里了。相信我的配置,有时候git 的网速超慢,也不要杀掉编译程序,等就行了。你要是觉得慢可以尝试把git搞得快一点,但是配置文件没有问题的,我多次复现,而且这些源没有需要翻墙的。国内的网就可以全部下载,慢是因为git 下载资源慢。

我修改好的external文件链接:https://pan.baidu.com/s/1lDLKwZcvtzgG9jXbFw3h4Q  密码:e0se

 

 

 

然后:

git config http.postBuffer 64288000

这是为了防治长时间下载,git默认给的buffer不足,导致不能下载成功。

接下来:

make

(mac ) CXX=g++-9 make

 

如果这些修改都做完了,如果还是报错(例如资源下载失败或是其他像是cmake导致的报错而不是我们的cmake配置文件不对导致的报错),就make -i进行编译,如果这样的方式没有生成run_server文件,再使用make编译一下。

如果需要放在后台进行,参考如下的指令,但是一般不需要使用这个方式,跳板机的设计是30分钟无响应自动断开与服务器的连接,正常的情况下,编译的过程会一直print日志到终端,所以不会断开与服务器的连接而导致编译失败。但是网速不好的时候就会断开连接,所以可以用下边的这句话。

 

nohup cmake .. && make > /data/xiaoyichao/projects/AnyQ/build/logs.log 2>&1 &

 

查看nohup的进程

jobs -l

 

注意事项:在编译过程中,会遇到多次git clone下载慢的情况,此时只需等待即可。啥也不用做,除非报错,你才需要重新make,网上说慢就杀掉程序,这是解决不了问题的,你重新来,还是慢!所以正确的方案是waitjust wait

 

(2)为什么要修改cmake文件

cmake

如果报错

make[3]: *** [all] 错误 2
make[2]: *** [third_party/paddle/src/extern_paddle-stamp/extern_paddle-build] 错误 2
make[1]: *** [CMakeFiles/extern_paddle.dir/all] 错误 2
make: *** [all] 错误 2

 

尝试(1)

  1. 如果是paddle编译时有问题,可以尝试把文件/data/xiaoyichao/projects/AnyQ/cmake/external/paddle.cmake中的如下代码片断中:

ExternalProject_Add(

    extern_paddle

    ${EXTERNAL_PROJECT_LOG_ARGS}

    GIT_REPOSITORY       "https://github.com/PaddlePaddle/Paddle.git"

    GIT_TAG              "release/0.14.0" #这里,这里

    PREFIX               ${PADDLE_SOURCES_DIR}

    CONFIGURE_COMMAND    mkdir -p ${PADDLE_INSTALL_DIR} && cd ${PADDLE_INSTALL_DIR} && ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${PADDLE_INSTALL_DIR}

                         -DCMAKE_BUILD_TYPE=Release -DWITH_PYTHON=OFF -DWITH_MKL=ON -DWITH_MKLDNN=OFF -DWITH_GPU=OFF -DWITH_FLUID_ONLY=ON <SOURCE_DIR>

    BUILD_COMMAND        cd ${PADDLE_INSTALL_DIR} && make -j16

    INSTALL_COMMAND      cd ${PADDLE_INSTALL_DIR} && make inference_lib_dist

    UPDATE_COMMAND       ""

)

GIT_TAG的值改为"v0.14.0"

GIT_TAG              "v0.14.0"
因为paddle仓库的tag里面,反正我是没有找到"release/0.14.0"。但是这样下载也可以成功,有人曾经成功了。因为在那个项目的分支里有release/0.14.0

 

  1. 如果是xgboost安装失败,则可以尝试把文件/data/xiaoyichao/projects/AnyQ/cmake/external/xgboost.cmake中的如下片断中:

ExternalProject_Add(

    extern_xgboost

    ${EXTERNAL_PROJECT_LOG_ARGS}

    DOWNLOAD_DIR ${XGBOOST_SOURCES_DIR}/src/

    DOWNLOAD_COMMAND git clone --recursive https://github.com/dmlc/xgboost.git #这里需要指定版本

    DOWNLOAD_NO_PROGRESS  1

    PREFIX          ${XGBOOST_SOURCES_DIR}

    BUILD_COMMAND         ""

    UPDATE_COMMAND ""

    CONFIGURE_COMMAND ""

    INSTALL_COMMAND  cd ${XGBOOST_INSTALL_DIR} && make -j4

    BUILD_IN_SOURCE 1

)

DOWNLOAD_COMMAND 值改为git clone -b v0.90  --recursive https://github.com/dmlc/xgboost.git && cd xgboost && git checkout v0.90

 

修改后:

DOWNLOAD_COMMAND  git clone -b v0.90  --recursive https://github.com/dmlc/xgboost.git && cd xgboost && git checkout v0.90

如果多次编译开始报错:/data/xiaoyichao/projects/AnyQ/build/third_party/xgboost 的文件夹不为空这样的信息,则需要手动删除一下这个文件下的内容。

 

 

尝试(2)

/data/xiaoyichao/projects/AnyQ/cmake/external路径下

然后修改如下两个文件(paddle.cmake, xgboost.cmake),使之以单线程编译即可

make -j 后边不等于的变为1

如果想要配置多线程,这两项不要修改为1。

xgboost.cmake
INSTALL_COMMAND cd ${XGBOOST_INSTALL_DIR} && make -j1
paddle.cmake
BUILD_COMMAND cd ${PADDLE_INSTALL_DIR} && make -j1

 

 

如果报错

make[2]: *** No rule to make target 'libanyq.a', needed by 'run_server'. Stop. 

[100%] Built target run_server

 

我这里定位到问题是
编译错误

${XGBOOST_INSTALL_DIR}/dmlc-core/include/* ${XGBOOST_INSTALL_DIR}/rabit/include/*

 

Header files of dmlc in rabit should not be copy to the target directory, which will overwrite the right one.

解决方法是修改/data/xiaoyichao/projects/AnyQ/cmake/external/xgboost.cmake文件

##原始内容

COMMAND cp -r ${XGBOOST_INSTALL_DIR}/dmlc-core/include/* ${XGBOOST_INSTALL_DIR}/rabit/include/* third_party/include/

##修改为

COMMAND cp -r ${XGBOOST_INSTALL_DIR}/dmlc-core/include/* ${XGBOOST_INSTALL_DIR}/rabit/include/rabit third_party/include/

 

 

多次编译,如果提示xgboost文件下已存在且不为空的是时候,根据给出的路径手动删一下。

 

如果报错

error: RPC failed; result=18, HTTP code = 200MiB | 16.00 KiB/s  

这是因为git 的缓存设置的太小。

使用如下指令,再make

git config http.postBuffer 64288000
 

 

(3)编译成功的标准是什么?

如果还出现了其他cmake导致的报错,请使用 make -i来替换make指令,不一定要让make -i这个指令跑完就行,跑一段时间可以杀掉,然后继续使用make指令,因为make -i编译出来的文件会缺少run_server文件,所以最后一次编译成功一定要使用make才可以。

最后显示如下,即为编译成功.正确生成了run_server文件。

[100%] Linking CXX executable run_server

[100%] Built target run_server

三、构建索引、配置及Web服务的安装

 

系统编译成功以后,在AnyQ/build目录下,执行下面的命令

获取AnyQ定制solrAnyQ示例配置

cp ../tools/anyq_deps.sh .

 

需要切换到python2 的环境中,因为这个项目的python代码是基于py2写的

 

conda activate xiaoenv2

 

sh anyq_deps.sh

 

启动solr, 依赖python-json, jdk>=1.8JDK的安装请参考:https://www.linuxidc.com/Linux/2016-09/134941.htm

 

 

cp ../tools/solr -rp solr_script

sh solr_script/anyq_solr.sh solr_script/sample_docs

 

 

四.系统运行及监控

上面步骤执行成功以后,即可在build目录下运行系统,代码如下:

./run_server

系统运行成功后,即可通过http://IP:8999访问系统运行界面

 

 

五、启动HTTP-Server

在build路径下

./run_server

 

# 请求示例:

http:${host}:${port}/anyq?question=XXX

例如

 

http://172.16.10.10:8999/anyq?question=%22%E6%B3%A8%E5%86%8C%E7%99%BE%E5%BA%A6%E8%B4%A6%E6%88%B7%E6%97%B6%E6%94%B6%E4%B8%8D%E5%88%B0%E9%AA%8C%E8%AF%81%E7%A0%81%E6%80%8E%E4%B9%88%E5%8A%9E%22

 

solr页面举例:

http://172.16.10.10:8900/solr/#/collection1/query

 

 

 

六、添加语义索引

1)语义索引库构建

 

  1. 将灌库文件faq_file(utf8编码)转换成Json格式:
cd /data/xiaoyichao/projects/AnyQ/build/
cp -pf solr_script/sample_docs  ../tools/solr/
输入y
cp -rp ../tools/solr ./solr_script
mkdir -p faq
python solr_script/make_json.py solr_script/sample_docs faq/schema_format faq/faq_json
  1. Json文本添加索引id
awk -F "\t" '{print ++ind"\t"$0}' faq/faq_json > faq/faq_json.index
  1. anyq词典配置dict.conf增加语义表示模型的插件:
dict_config{
     name: "fluid_simnet"
     type: "PaddleSimAdapter"
     path: "./simnet"
}
  1. analysis.conf中增加query语义表示的插件:
analysis_method {
     name: "method_simnet_emb"
     type: "AnalysisSimNetEmb"
     using_dict_name: "fluid_simnet"
     dim: 128
     query_feed_name: "left" 
     cand_feed_name: "right" 
     embedding_fetch_name: "tanh.tmp"
}
  1. 生成语义索引库:
./annoy_index_build_tool example/conf/ example/conf/analysis.conf faq/faq_json.index 128 10 semantic.annoy 1>std 2>err

(2)语义索引库使用

  1. 把带索引idfaq库文件和语义索引库放到anyq配置目录下
cp faq/faq_json.index semantic.annoy example/conf
  1. dict.conf中配置faq库文件的读取
dict_config {
     name: "annoy_knowledge_dict"
     type: "String2RetrievalItemAdapter"
     path: "./faq_json.index"
}
  1. retrieval.conf中配置语义检索插件
retrieval_plugin {
     name : "semantic_recall"
     type : "SemanticRetrievalPlugin"
     vector_size : 128
     search_k : 10000 
     index_path : "./example/conf/semantic.annoy"
     using_dict_name: "annoy_knowledge_dict"
     num_result : 10
}

 

 

参考文献

https://github.com/baidu/AnyQ/issues/192

 

https://blog.stormbirds.cn/articles/2019/04/09/1554797567784.html

 

https://rqsir.github.io/2019/04/10/%E7%99%BE%E5%BA%A6anyQ-%E7%BC%96%E8%AF%91%E9%94%99%E8%AF%AF/

 

http://www.hongxuejing.com/linux/linux_bison-23.html

 

 

 类似资料: