生成完整的ScaNN
KScaNN依赖基于鲲鹏优化的开源ScaNN以提供完整的功能。因此安装KScaNN后需自行获取基于鲲鹏优化的开源ScaNN代码,以编译生成完整的ScaNN的Python安装包及动态库文件。
操作步骤
- 从GitCode获取KScaNN软件包BoostKit-boostsra-kscann_2.2.0.zip,解压后得到二进制RPM包。
软件包构成如下所示。
1 2 3
├── boostsra-kscann-xxxx.aarch64.rpm ├── 鲲鹏应用使能套件BoostKit用户许可协议 2.0.txt └── Kunpeng BoostKit User License Agreement 2.0.txt
其中,boostkit-sra_kscann-xxxx.aarch64.rpm包含KScaNN的头文件、动态库文件与静态库文件,xxxx表示KScaNN软件包的版本号。
- 安装RPM包。
1rpm -ivh boostsra-kscann-xxxx.aarch64.rpm
安装结束后,自动追加环境变量LD_LIBRARY_PATH到“/etc/profile”中,即KScaNN的动态库文件与静态库文件所在目录“/usr/local/sra_kscann/lib/”与“/usr/local/sra_kscann/lib/sve”。
上述命令中涉及的xxxx代表版本号。
- 从Gitee仓下载基于鲲鹏优化的开源ScaNN源代码,标签为v2.2.0。保存在编译机器可访问的路径中,假设位于“/path/to/kscann-build”。
mkdir /path/to/kscann-build && cd /path/to/kscann-build git clone --branch v2.2.0 --single-branch https://gitee.com/openeuler/sra_scann_adapter.git
- 获取google-research的开源代码,其中包含ScaNN v1.2.10代码。假设代码存放于“/path/to/kscann-build”。
cd /path/to/kscann-build git clone https://github.com/google-research/google-research.git cd google-research git reset --hard 03c4c851a28dffe0244c65089e68d6cbf73c730b cp -r scann/ ../sra_scann_adapter
- 合入ScaNN v1.2.10使能KScaNN所需的补丁文件0001-boostsra-kscann-adapter.patch。
cd /path/to/kscann-build/sra_scann_adapter patch -p1 < 0001-boostsra-kscann-adapter.patch
- ScaNN依赖AVX2KI库,因此需要通过以下步骤安装AVX2KI的RPM包。
- 安装AVX2KI之前请先从鲲鹏社区获取软件包,再进行软件包校验,确保与网站上的原始软件包一致,用户解压zip文件后可获取RPM安装包。
- 从华为企业业务网站获取校验工具和校验方法。
- 请参见6.b中下载的《OpenPGP签名验证指南》进行软件包完整性检查。
- 安装AVX2KI的RPM包。
1rpm -ivh boostkit-ksl-xxxx.aarch64.rpm
安装结束后,自动追加环境变量LD_LIBRARY_PATH到“/etc/profile”中,即AVX2KI的动态库文件所在目录“/usr/local/ksl/lib”。
上述命令中的xxxx代表版本号。
- 执行source命令或重新登录终端使AVX2KI环境变量生效。
1source /etc/profile
- 查看环境变量LD_LIBRARY_PATH是否包含AVX2KI的安装路径“/usr/local/ksl/lib”。
1env | grep LD_LIBRARY_PATH
如果变量包含安装路径,说明安装成功。
安装成功后在安装路径(默认路径是“/usr/local/ksl”)下生成相应文件,其中,“include”文件夹包含AVX2KI的头文件,“lib”文件夹包含了AVX2KI的动态库文件。
- 安装OpenJDK 11。
1yum install java-11-openjdk java-11-openjdk-devel
检查OpenJDK 11是否安装成功。
1java -version如果回显包含openjdk version "11.x.x",则表示安装成功。若OpenJDK版本低于此版本,则后续编译Bazel可能会发生错误,导致无法正常构建Bazel。
若执行上述命令发现版本不匹配,请按以下步骤配置环境变量。
1find / -name java
找到安装目录后,配置环境变量,假设安装目录为“/usr/lib/jvm/java-11-openjdk-11.0.23.9-2.oe2203sp3.aarch64”。1 2
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.9-2.oe2203sp3.aarch64 export PATH=/usr/lib/jvm/java-11-openjdk-11.0.23.9-2.oe2203sp3.aarch64/bin:$PATH
- 安装Bazel 5.4.0。
- 下载Bazel 5.4.0源码,假设路径为“/path/to/bazel”。
1wget https://github.com/bazelbuild/bazel/releases/download/5.4.0/bazel-5.4.0-dist.zip --no-check-certificate
- 执行以下命令解压并编译Bazel。
1 2 3
unzip bazel-5.4.0-dist.zip -d bazel-5.4.0 cd bazel-5.4.0 env EXTRA_BAZEL_ARGS="--tool_java_runtime_version=local_jdk" bash ./compile.sh
- 构建成功后,生成的可执行文件bazel在“/path/to/bazel/bazel-5.4.0/output”路径中,将该路径配置在环境变量PATH中,以便后续编译ScaNN使用。
1export PATH=/path/to/bazel/bazel-5.4.0/output:$PATH
- 执行以下命令验证。
1bazel --version如果回显包含bazel 5.4.0- (@non-git),则表示安装成功。
- 下载Bazel 5.4.0源码,假设路径为“/path/to/bazel”。
- 安装GCC 12.3.1与GCC-C++ 12.3.1。
- 安装编译依赖。
1yum install python python3-devel python3-pip rsync libomp libuuid-devel
确保KScaNN位于“/usr/local/sra_recall/lib/kscann”,AVX2KI位于“/usr/local/ksl/lib”。
- 配置合适的pip源。
- 运行以下指令以进行必要的依赖安装。
1 2
cd /path/to/scann sh project.sh --prepare
- 指定KScaNN的安装目录。
export KSCANN_PATH=/usr/local/sra_kscann
- 运行以下指令以开始ScaNN的Python安装包的构建。
1sh project.sh --build_whl
- 构建完的Python安装包scann-1.2.10-cp39-cp39-linux_aarch64.whl位于“/path/to/kscann-build/scann”下。
- 运行以下指令以开始ScaNN的动态库文件的构建。
1sh project.sh --build_scann_cc_sve
构建完的动态库文件libscann_cc.so位于“/path/to/kscann-build/scann”下。
project.sh中包含以下编译选项,可根据需求进行选择:
- --prepare:进行Python依赖安装。
- --build_whl:构建完整的ScaNN的Python安装包。
- --build_scann_cc_sve:构建SVE指令版本的完整的ScaNN的动态库文件。
- --build_scann_cc_neon:构建NEON指令版本的完整的ScaNN的动态库文件。
- --build_scann_cc_sve_milvus:构建适用于Milvus场景的SVE指令版本的完整的ScaNN的动态库文件。
- --build_scann_cc_neon_milvus:构建适用于Milvus场景的构建NEON指令版本的完整的ScaNN的动态库文件。
若环境搭建过程中提示“unable to find valid certification path to requested target”,请参见《ScaNN 移植指南》中的编译ScaNN过程中提示找不到证书路径的解决办法章节解决。
- 运行以下指令以进行必要的依赖安装。
- 安装whl。
1pip install scann-1.2.10-cp39-cp39-linux_aarch64.whl
- 执行pip show命令确认scann==1.2.10已安装。
1pip show scann
如果输出包含Name: scann Version: 1.2.10,则已安装成功。
RPM包卸载
若不再需要使用KScaNN,可卸载KScaNN。卸载KScaNN将会影响您正在执行的业务流,建议先停止正在执行的业务流再进行卸载操作。若操作过程中使用了RPM包管理工具支持但本文档中未说明的参数,可能会引入未定义行为,请谨慎操作。
- 执行rpm -e命令卸载RPM安装包。
1rpm -e boostsra-kscann
- 确认安装目录“/usr/local/sra_kscann”被删除。
- 确认“/etc/profile”文件中无“/usr/local/sra_kscann”相关环境变量。
whl卸载
- 执行pip uninstall命令卸载whl文件。
1pip uninstall scann
- 执行pip show命令确认scann==1.2.10已卸载。
1pip show scann
如果输出包含WARNING: Package(s) not found: scann,则已卸载成功。