设置android SDK和NDK路径
export SDK_PATH=/root/codes/my_sdk/sdk/
export NDK_PATH=/root/codes/my_sdk/sdk/ndk/24.0.8215888/
sdk和ndk下载方法参考:
tflite本地构建和调用_Luchang-Li的博客-CSDN博客_tensflow tflite model如何调用
设置好环境变量,把下面的build.sh放在代码目录直接执行即可,在build目录内部相应位置会生成so文件。
编译openblas
git clone --recursive -b v0.3.21 https://github.com/xianyi/OpenBLAS.git
可以在-b设置需要的版本。
build.sh
#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
mkdir ${SCRIPT_DIR}/build
cd ${SCRIPT_DIR}/build
# please set SDK_PATH, NDK_PATH, etc. by env
# require download cmake, etc. by sdkmanager "cmake;3.18.1" "ndk;24.0.8215888" --channel=0 --sdk_root=./sdk_path
# require ndk >= 24.0.8215888
# for example:
# export SDK_PATH=/root/codes/my_sdk/sdk/
# export NDK_PATH=/root/codes/my_sdk/sdk/ndk/24.0.8215888/
if [ ! -d ${SDK_PATH} ] ; then
echo "ERROR: please set valid sdk path by env SDK_PATH"
exit 1
if [ ! -d ${SDK_PATH}/cmake/3.18.1/ ] ; then
echo "ERROR: please download cmake 3.18.1 for sdk"
exit 1
if [ ! -d ${NDK_PATH} ] ; then
echo "ERROR: please set valid ndk path by env NDK_PATH"
exit 1
if [ -z ${ANDROID_ABI} ] ; then
ANDROID_ABI=arm64-v8a
if [ -z ${MINSDKVERSION} ] ; then
MINSDKVERSION=29
echo "SDK_PATH:" $SDK_PATH
echo "NDK_PATH:" $NDK_PATH
echo "ANDROID_ABI:" $ANDROID_ABI
echo "MINSDKVERSION:" $MINSDKVERSION
# -DBUILD_SHARED_LIBS=ON \
${SDK_PATH}/cmake/3.18.1/bin/cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=${ANDROID_ABI} \
-DANDROID_NDK=${NDK_PATH} \
-DANDROID_PLATFORM=android-${MINSDKVERSION} \
-DCMAKE_ANDROID_ARCH_ABI=${ANDROID_ABI} \
-DCMAKE_ANDROID_NDK=${NDK_PATH} \
-DCMAKE_MAKE_PROGRAM=${SDK_PATH}/cmake/3.18.1/bin/ninja \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=${MINSDKVERSION} \
-DANDROID_STL=c++_static \
-DCMAKE_CXX_FLAGS_RELEASE="-s" \
-DBUILD_STATIC_LIBS=ON \
-GNinja \
if [ $? -ne 0 ]; then
echo "ERROR: cmake failed"
exit 1
${SDK_PATH}/cmake/3.18.1/bin/ninja
if [ $? -ne 0 ]; then
echo "ERROR: build failed"
exit 1
编译faiss
git clone --recursive -b v1.7.2 https://github.com/facebookresearch/faiss.git
#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
mkdir ${SCRIPT_DIR}/build
cd ${SCRIPT_DIR}/build
# please set SDK_PATH, NDK_PATH, etc. by env
# require download cmake, etc. by sdkmanager "cmake;3.18.1" "ndk;24.0.8215888" --channel=0 --sdk_root=./sdk_path
# require ndk >= 24.0.8215888
# for example:
# export SDK_PATH=/root/codes/my_sdk/sdk/
# export NDK_PATH=/root/codes/my_sdk/sdk/ndk/24.0.8215888/
if [ ! -d ${SDK_PATH} ] ; then
echo "ERROR: please set valid sdk path by env SDK_PATH"
exit 1
if [ ! -d ${SDK_PATH}/cmake/3.18.1/ ] ; then
echo "ERROR: please download cmake 3.18.1 for sdk"
exit 1
if [ ! -d ${NDK_PATH} ] ; then
echo "ERROR: please set valid ndk path by env NDK_PATH"
exit 1
if [ -z ${ANDROID_ABI} ] ; then
ANDROID_ABI=arm64-v8a
if [ -z ${MINSDKVERSION} ] ; then
MINSDKVERSION=29
echo "SDK_PATH:" $SDK_PATH
echo "NDK_PATH:" $NDK_PATH
echo "ANDROID_ABI:" $ANDROID_ABI
echo "MINSDKVERSION:" $MINSDKVERSION
${SDK_PATH}/cmake/3.18.1/bin/cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=${ANDROID_ABI} \
-DANDROID_NDK=${NDK_PATH} \
-DANDROID_PLATFORM=android-${MINSDKVERSION} \
-DCMAKE_ANDROID_ARCH_ABI=${ANDROID_ABI} \
-DCMAKE_ANDROID_NDK=${NDK_PATH} \
-DCMAKE_MAKE_PROGRAM=${SDK_PATH}/cmake/3.18.1/bin/ninja \
-DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_SYSTEM_VERSION=${MINSDKVERSION} \
-DANDROID_STL=c++_static \
-DCMAKE_BUILD_TYPE=Release \
-DFAISS_ENABLE_GPU=OFF \
-DFAISS_ENABLE_PYTHON=OFF \
-DBUILD_TESTING=OFF \
-DBUILD_SHARED_LIBS=ON \
-DBLA_VENDOR=OpenBLAS \
-DMKL_LIBRARIES=/root/codes/faiss/OpenBLAS/build/lib/libopenblas.so \
-DCMAKE_CXX_FLAGS_RELEASE="-s" \
-GNinja \
if [ $? -ne 0 ]; then
echo "ERROR: cmake failed"
exit 1
${SDK_PATH}/cmake/3.18.1/bin/ninja
if [ $? -ne 0 ]; then
echo "ERROR: build failed"
exit 1
注意这里面DMKL_LIBRARIES设置了openblas的so路径,以及其他cmake选项。
上面采用了静态链接的方式,使得最终编译的libfaiss.so不依赖额外的libopenblas.so而且so体积比较小。动态链接的方式libopenblas.so需要额外30M的空间。
原始文章: : (日语)
$ git clone https://github.com/yubessy/faiss-recommender-api-example.git
$ cd faiss-recommender-api-example
$ docker build -t faiss-recommender-api-example . # takes quite a long time...
$ docker run -p 5000:5000 faiss-recommender-api-example
关于数据集
movielens-small下的文件是从下载的
运行pip install haystack
安装最新版本的pyinstaller
运行pyinstaller --onedir app.spec --clean --distpath distAPP
运行./distAPP/app/app
您现在应该得到错误:
03/26/2021 22:23:58 - INFO - faiss - Loading faiss with AVX2 support.
03/26/2021 22:23:58 - INFO - faiss - Loading faiss.
然后在环境变量中指定编译链的位置就可以开始使用了
NDK编译链和linux gcc编译链有不同之处,就是NDK使用的是clang和clang++不是gcc和g++可以使用符号链接进行等价代换
文件查找命令fing、grep
1.Faiss的概念
faiss是一个Facebook AI团队开源的库,全称为Facebook AI Similarity Search,该开源库针对高维空间中的海量数据(稠密向量),提供了高效且可靠的相似性聚类和检索方法,可支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。
官方资源地址https://github.com/facebookresearch/faiss
2.Faiss基础依赖
1)矩阵计算框架:Faiss与计算资源之间需要一个外部依赖框架,这个框架是一个矩阵计算框架,官方默
openssl可以编译成ARM下面的二进制代码(动态库或者静态库),方便APP使用,APP在使用的时候,需要使用JNI来进行调用。
本文章参考官方文档https://wiki.openssl.org/index.php/Android进行总结。
编译步骤:
1.下载NDK
2.下载openssl和setenv-android.sh
3.设置环境变量,配置openssl
4....
Faiss 是由 Facebook AI Research(FAIR)开发的一个用于有效的相似性搜索(similarity search)和稠密矢量聚类(clustering of dense vectors)的库。它包含了在任何大小的向量集合里进行搜索的算法,向量集合的大小甚至可以达到装不进 RAM。它还包含了用于评估和参数调优的支持代码。Faiss
是用 C ++编写的,带有 Python
MediaStore里有个file表,里面有个列提供文件所在目录的索引号(见官网http://developer.android.com/reference/android/provider/MediaStore.Files.FileColumns.html#PARENT ),
虽然不知道这个索引号是来干什么的,但它却是目录的唯一标示,可以用它来统计信息。
以检索音频为例,使用这条select...
Ubuntu16.04 编译 OpenBLAS for Android(更新版)
本文是https://blog.csdn.net/lj402159806/article/details/85691400这篇OpenBLAS编译部分的更新版
编译版本
openblas-0.3.6
ndk-r20
编译环境
首先需要安装sdk tools,然后通过sdkmanager安装cmake和nd...