使用指导

生成算子

安装Index SDK后,需要依照本章节的指导,设置算子相关的环境变量,并生成算法所需要的算子。

Note

  • AscendIndexFlat算法L2和IP距离支持在线算子转换,如果环境变量MX_INDEX_USE_ONLINEOP设置为1(设置命令:export MX_INDEX_USE_ONLINEOP=1),则会在线转换算子并调用,不需要按照本章节生成离线算子。使用在线算子需要用户在应用程序的最后显式调用(void)aclFinalize()(需要包含头文件:#include "acl/acl.h")。
  • 对于不支持在线算子的算法,如果设置了环境变量MX_INDEX_USE_ONLINEOP=1,会导致程序运行失败。

操作步骤

  1. 进入安装目录“mxIndex-{version}”,目录及文件名称如表 Index SDK目录及文件名介绍所示。

    cd mxIndex-{version}
    

    表 1 Index SDK目录及文件名介绍

    目录或文件名称 说明
    device 包含IndexIL算法的动态库和头文件。
    filelist.txt 软件包文件列表。
    host 检索动态库,进行特征检索时,请链接此文件夹下的动态库。
    include API头文件。
    lib 检索动态库,链接到host/lib。
    modelpath 算子om文件存放目录。编译好算子之后,可将om文件放置于此文件夹。(可选)
    ops 包含custom_opp_<arch>.run脚本,用于检索算法算子安装。
    script 包含卸载脚本uninstall.sh,用于卸载Index SDK安装包。
    tools 包含用于算子生成python脚本。
    version.info 包含版本相关信息。
  2. 进入“ops”目录,编译算子前需要设置“ASCEND_HOME”、“ASCEND_VERSION”和“ASCEND_OPP_PATH”环境变量,默认分别为~/Ascend、~/ascend-toolkit/latest和~/Ascend/ascend-toolkit/latest/opp。

    export ASCEND_HOME=~/Ascend
    export ASCEND_VERSION=~/Ascend/ascend-toolkit/latest
    export ASCEND_OPP_PATH=~/Ascend/ascend-toolkit/latest/opp
    
    • “ASCEND_HOME”表示CANN-toolkit软件安装后文件存储路径。
    • “ASCEND_VERSION”表示当前使用的Ascend版本,如果ATC工具安装路径是“/usr/local/Ascend/ascend-toolkit/latest”则无需设置“ASCEND_HOME”和“ASCEND_VERSION”。
    • “ASCEND_OPP_PATH”表示算子库根目录,用户需要该目录的写权限。

    Note

    “MAX_COMPILE_CORE_NUMBER”环境变量用于指定图编译时可用的CPU核数,在算子运行时使用,当前默认为“1”,用户无需设置。

  3. 根据实际系统架构执行对应脚本。

    • ARM架构:

      ./custom_opp_aarch64.run
      
    • x86_64架构:

      ./custom_opp_x86_64.run
      

    执行脚本命令时,支持同时输入可选参数,如表 custom_opp_{arch}.run参数说明所示。

    表 2 custom_opp_{arch}.run参数说明

    参数名称 说明
    --help | -h 查询帮助信息。
    --info 查询包构建信息。
    --list 查询文件列表。
    --check 查询包完整性。
    --quiet|-q 可选参数,表示静默安装。减少人机交互的信息的打印。
    --nox11 废弃接口,无实际作用。
    --noexec 解压软件包到当前目录,但不执行安装脚本。配套--extract=<path>使用,格式为:--noexec --extract=<path>。
    --extract=<path> 解压软件包中文件到指定目录。可配套--noexec参数使用。
    --tar arg1 [arg2 ...] 对软件包执行tar命令,使用tar后面的参数作为命令的参数。例如执行--tar xvf命令,解压run安装包的内容到当前目录。

    Note

    以下参数未展示在--help参数中,用户请勿直接使用。

    • --xwin:使用xwin模式运行。
    • --phase2:要求执行第二步动作。
  4. 进入“tools”目录,生成所需算子。生成算子之前,需要先确认已经安装CANN的相关依赖。

    • 只生成使用的算法所需要的算子:先参考算法介绍章节,确认算法所需要生成的算子后,再参考自定义算子介绍章节,生成对应的算子。

    • 批量生成所有算法的算子,方法如表 批量生成算子所示。

      表 3 批量生成算子

      用法 python3 run_generate_model.py -m <mode> -t <npu_type> -p <pipeline> -pool <pool_size>
      参数名称 <mode>:算法模式,<mode>支持ALL以及Flat,SQ8,IVFSQ8,INT8中的一种或多种,多种之间用逗号隔开,如:python3 run_generate_model.py -m Flat,IVFSQ8。默认全选,可以直接执行python3 run_generate_model.py
      <npu_type>:npu_type表示芯片名称。
    • 对于Atlas 推理系列产品,可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,将查询到的“Name”最后一位数字删除,即是npu_type的取值。
    • 对于Atlas 800I A2 推理服务器,可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,查询到的“Name”即是npu_type的取值。
    • 对于Atlas 800I A3 超节点服务器,可以通过npu-smi info -t board -i 0 -c 0命令进行查询,获取NPU Name信息,910_NPU Name即是npu_type的取值。

    • <pipeline>:是否使用多线程并行流水生成算子模型,默认为true。设置为true时,使用默认的pool_size的值为32。
      <pool_size>:批量生成算子多进程调度的进程池大小。
      --help | -h:查询帮助信息。
      说明
    • 执行此命令,用户可以得到多组算子模型文件。执行命令前,用户需要更改当前目录下的para_table.xml文件,将所需的参数填入表中。
    • 1 ≤ pool_size ≤ 32
    • Note

      算子生成说明表格中的约束说明,代表业务中经常涉及的参数组合,使用其他参数运行异常请参见《CANN ATC离线模型编译工具用户指南》。

  5. 准备算子模型文件。

    • 可以将算子模型文件目录配置为环境变量“MX_INDEX_MODELPATH”(环境变量支持以~开头的路径、相对路径和绝对路径,路径中不能包含软链接;使用该变量时将统一转化为绝对路径)。

      mv op_models/* $PWD/../modelpath
      export MX_INDEX_MODELPATH=`realpath $PWD/../modelpath`
      
    • 如未使用环境变量进行配置,需将算子模型文件移动到当前目录的“modelpath”目录下。

    算子生成后,请妥善保管相关om文件并确保文件不被篡改。

    Note

    生成算子时如果出现报错:Failed to import Python module,请参照NumPy的数据类型np.float_ 已被移除解决。

算法介绍

Note

标准态部署主要使用AI CPU,Ctrl CPU和AI CPU的最佳推荐配比如下。

  • 使用Atlas 推理系列产品,建议设置为1:7。 具体设置命令参考npu-smi命令

全量检索

全量检索算法介绍

全量检索(Brute-force Search)是指对底库中的所有向量逐一计算距离,返回与查询向量距离最近的TopK结果。全量检索不进行任何剪枝或近似处理,因此检索精度最高,但计算量与底库规模成正比,适用于对精度要求严格、底库规模适中的场景。

算法(API参考) 算法使用场景 需要生成的算子 样例链接
AscendIndexInt8Flat
  • 特征类型:int8
  • 特征维度:64, 128, 256, 384, 512, 768, 1024
  • 距离类型:L2和IP
  • 计算精度:高
  • Device内存占用:较低
  • 适应场景:精度要求高的暴力检索场景
  • INT8Flat
  • AICPU
  • 链接
    AscendIndexFlat
  • 特征类型:FP32、FP16
  • 特征维度:32, 64, 128, 256, 384, 512, 768, 1024, 1408, 1536, 2048, 3072, 3584, 4096
  • 距离类型:L2和IP
  • 计算精度:高
  • Device内存占用:高
  • 适应场景:精度要求高的暴力检索场景;IP距离推荐在dim > 128的场景下使用。
  • Flat
  • AICPU
  • 链接
    AscendIndexSQ
  • 特征类型:FP32
  • 特征维度:64, 128, 256, 384, 512, 768
  • 距离类型:L2和IP
  • 计算精度:高
  • Device内存占用:较低(已量化为int8)
  • 适应场景:精度要求较高的暴力检索场景
  • SQ8
  • AICPU
  • 链接
    AscendIndexCluster
  • 特征类型:FP32
  • 特征维度:32, 64, 128, 256, 384, 512
  • 距离类型:IP
  • 计算精度:高
  • Device内存占用:较高
  • 适应场景:只计算距离的聚类场景
  • 仅支持Atlas 推理系列产品
  • Flat
  • AICPU
  • 链接
    IndexIL 需要运行在Device上,安装部署复杂,暂不推荐使用
  • Flat
  • 参考IndexILFlat
    AscendIndexILFlat
  • 特征类型:FP16、FP32
  • 特征维度:32, 64, 128, 256, 384, 512
  • 距离类型:IP
  • 计算精度:高
  • Device内存占用:较高
  • 适应场景:只计算距离的聚类场景
  • 仅支持Atlas 推理系列产品
  • Flat
  • AICPU
  • 链接

    近似检索

    近似检索算法介绍

    近似检索(Approximate Nearest Neighbor Search)通过聚类、量化、图索引等方式对底库进行预处理或压缩,检索时仅计算部分向量距离,以牺牲少量精度换取显著的性能提升和内存节省。适用于亿级大库容、对时延敏感、可接受一定精度损失的场景。

    算法(API参考) 算法使用场景 需要生成的算子 样例链接
    AscendIndexIVFSP
  • 特征类型:FP32
  • 特征维度:64, 128, 256, 512, 768
  • 距离类型:L2
  • 计算精度:中
  • Device内存占用:低(压缩特征)
  • 适应场景:适用于亿级底库(大库容),对性能要求较高,对精度损失有容忍的近似检索场景。
  • 仅支持Atlas 推理系列产品
  • IVFSP业务算子
  • IVFSP AICPU算子
  • IVFSP训练算子(仅在需要通过训练生成码本文件时才使用到)

  • 请参见IVFSP
    链接
    AscendIndexIVFSQ
  • 特征类型:FP32
  • 特征维度:64, 128, 256, 384, 512
  • 距离类型:L2和IP
  • 计算精度:中
  • Device内存占用:较低(量化为int8)
  • 适应场景:IVFSQ算法作为性能-精度调节器,适用于对精度损失有容忍,但是对性能要求比较高的场景。
  • IVFSQ8
  • AICPU
  • FlatAT(仅在参数useKmeansPP设置为true的时候需要生成FlatAT算子)
  • 链接
    AscendIndexIVFSQT
  • 特征类型:FP32
  • 特征维度:256
  • 距离类型:IP
  • 计算精度:中
  • Device内存占用:低(量化和降维)
  • 适应场景:AscendIndexIVFSQT包含降维算法的三级检索IVFSQ算法,适用于亿级底库(大库容),对性能要求较高,对精度损失有容忍的近似检索场景。
  • IVFSQT
  • FlatAT
  • AICPU
  • FlatInt8AT(在Atlas 推理系列产品上时需要生成)
  • 链接
    AscendIndexBinaryFlat
  • 特征类型:uint8二值化特征
  • 特征维度:256, 512, 1024
  • 距离类型:Hamming和IP
  • 计算精度:高
  • Device内存占用:低
  • 适应场景:AscendIndexBinaryFlat类继承自Faiss的IndexBinary类,用于二值化特征检索。对内存占用要求较低,性能要求较高的场景。
  • 仅支持Atlas 推理系列产品
  • BinaryFlat
  • AICPU
  • 链接
    AscendIndexVStar
  • 特征类型:FP32
  • 特征维度:128, 256, 512, 1024
  • 距离类型:L2
  • 计算精度:中
  • Device内存占用:低(压缩特征)
  • 适应场景:适用于千万级底库(大库容),对性能要求较高,对精度损失有容忍的近似检索场景。
  • 仅支持Atlas 推理系列产品
  • VStar业务算子
  • VStar AICPU算子
  • VStar训练算子(仅在需要通过训练生成码本文件时才使用到)

  • 请参见VSTAR
    链接
    AscendIndexGreat
  • 特征类型:FP32
  • 特征维度:128, 256, 512, 1024
  • 距离类型:L2
  • 计算精度:中
  • Device内存占用:低(压缩特征)
  • 适应场景:适用于千万级底库(大库容),对性能要求较高,对精度损失有容忍的近似检索场景。
  • 仅支持Atlas 推理系列产品。(当mode为AKMode时,才需要生成算子)
  • VStar业务算子
  • VStar AICPU算子
  • VStar训练算子(仅在需要通过训练生成码本文件时才使用到)

  • 请参见VSTAR
    链接
    AscendIndexIVFFlat
  • 特征类型:FP32
  • 特征维度:128
  • 距离类型:IP
  • 计算精度:中
  • Device内存占用:中
  • 适应场景:适用于亿级底库(大库容),对性能要求较高,对精度损失有容忍的近似检索场景。
  • 仅支持Atlas A2 推理系列产品, Atlas A3 推理系列产品和Ascend 950 系列产品
  • AICPU
  • IVFFLAT
  • 链接
    AscendIndexIVFPQ
  • 特征类型:FP32
  • 特征维度:128
  • 距离类型:L2
  • 计算精度:中(近似检索)
  • Device内存占用:低(基于PQ编码压缩向量)
  • 适应场景:适用于亿级底库(大库容),对吞吐和时延要求较高,可接受一定精度损失的近似检索场景。
  • 仅支持Ascend 950 系列产品
  • AICPU
  • IVFPQ
  • 链接
    AscendIndexIVFRaBitQ
  • 特征类型:FP32
  • 特征维度:128
  • 距离类型:L2 & IP
  • 计算精度:中
  • Device内存占用:低(压缩特征)
  • 适应场景:适用于亿级底库(大库容),对性能要求较高,对精度损失有容忍的近似检索场景。
  • 仅支持Atlas A2 推理系列产品, Atlas A3 推理系列产品 和Ascend 950 系列产品
  • AICPU
  • IVFRaBitQ
  • 链接
    AscendIndexCagra
  • 特征类型:FP32
  • 特征维度:64, 128, 256, 512
  • 距离类型:L2
  • 计算精度:中
  • Device内存占用:低(RabitQ量化压缩)
  • 适应场景:基于图检索的近似最近邻搜索,适用于亿级底库(大库容),对性能要求较高,对精度损失有容忍的近似检索场景。
  • 仅支持Ascend 950 系列产品
  • Cagra
  • 链接

    属性过滤检索

    属性过滤检索算法介绍

    属性过滤检索是指在向量检索的基础上,结合业务属性(如时间、空间、附加属性、自定义属性等)进行过滤,仅对满足属性条件的向量执行距离计算和排序,实现时空联合检索。适用于需要同时满足相似性和属性约束的场景。

    算法(API参考) 算法使用场景 需要生成的算子 样例链接
    AscendIndexTS
  • 特征类型:uint8二值化特征、int8、FP32(具体算法不同而不同)
  • 特征维度:具体算法不同而不同
  • 距离类型:Hamming、Cos、IP、L2
  • 计算精度:较高
  • Device内存占用:较高
  • 适应场景:需要过滤属性的时空库场景
  • Cos和IP支持Atlas 推理系列产品,Atlas A2 推理系列产品,Atlas A3 推理系列产品
  • Hamming距离仅支持Atlas 推理系列产品
  • Mask
  • BinaryFlat
  • Int8Flat
  • Flat
  • AICPU
  • 链接

    多Index批量检索

    多Index批量检索介绍

    多Index批量检索允许在单个Device上同时管理多个Index实例,通过一次调用对多个Index执行检索,减少Host与Device之间的交互次数,提升多库并发检索的整体吞吐。

    接口(API参考) 接口使用场景 可以使用本接口的算法 样例链接
    Search 单Device进行多个Index检索。
  • AscendIndexSQ
  • AscendIndexFlat
  • AscendIndexIVFSP
  • 链接
    Search 单Device进行多个AscendIndex检索。
  • AscendIndexSQ
  • AscendIndexFlat
  • AscendIndexIVFSP
  • 链接
    Search 单Device进行多个AscendIndexInt8检索。
  • AscendIndexInt8Flat
  • 链接
    SearchWithFilter 单Device进行多个Index带属性过滤(单filter)检索。
  • AscendIndexSQ
  • AscendIndexIVFSP
  • 链接
    SearchWithFilter 单Device进行多个AscendIndex带属性过滤(单filter)检索。
  • AscendIndexSQ
  • AscendIndexIVFSP
  • 链接
    SearchWithFilter 单Device进行多个Index带过滤属性(多filter)检索。
  • AscendIndexSQ
  • AscendIndexIVFSP
  • 链接
    SearchWithFilter 单Device进行多个AscendIndex带过滤属性(多filter)检索。
  • AscendIndexSQ
  • AscendIndexIVFSP
  • 链接

    其他功能

    算法介绍

    算法(API参考) 算法需求(性能、场景差异) 如何调用 样例链接
    IReduction IReduction是特征检索组件中降维方法的统一接口,目前支持PCARNN两种降维算法。 通过ReductionConfig初始化,调用CreateReduction创建降维对象,然后进行train和reduce。 链接
    AscendNNInference 通过神经网络进行推理。 通过AscendNNInference创建NN降维对象,然后进行infer降维。 链接
    AscendCloner Index SDK提供了将NPU上的检索Index资源拷贝到CPU侧Faiss的操作,拷贝过程发生在内存中,原始NPU的Index上加载的数据会被拷贝到CPU侧的内存中,方便用户在CPU上使用相同的底库执行检索。 index_ascend_to_cpu将AscendIndex拷贝生成一个CPU上的Index,index_cpu_to_ascend将CPU上的Index拷贝生成一个AscendIndex。

    自定义算子介绍

    自定义算子简介

    特征检索方案使用TIK算子开发实现特征距离计算逻辑,包含以下的自定义算子。

    • Flat距离计算算子:得到特征底库数据和待检索的特征向量之间的距离(L2/IP)。
    • SQ8距离计算算子:得到SQ量化的特征底库数据和待检索的未量化特征向量之间的距离(L2/IP)。
    • IVFSQ8算子:得到IVFSQ8算法所需要的算子。
    • INT8Flat距离计算算子:得到INT8量化的特征底库数据和待检索的INT8量化特征向量之间的距离(L2/COS)。
    • IVFSQT算子:得到IVFSQT算法一二三级所需的距离算子。
    • FlatAT算子:主要用于在IVF场景,减少train和add的耗时,其中“code_num”等于“nlist”。
    • FlatInt8AT算子:优化在Atlas 推理系列产品下IVFSQT中train、add与update的耗时。
    • AICPU算子:调度昇腾AI处理器的CPU完成排序等计算,充分利用硬件性能。
    • BinaryFlat算子:得到二值化算法所需算子。
    • Mask算子:得到时空库属性过滤算法所需的Mask算子。
    • IVFSP算子:得到IVFSP算法所需的业务算子、AICPU算子,以及训练生成IVFSP码本时所需的训练算子。
    • VStar算子:得到VStar算法所需的业务算子、AICPU算子。
    • IVFFLAT:得到IVFFLAT算法一级二级所需的距离算子。
    • IVFPQ算子:得到IVFPQ算法一级二级三级所需的距离算子。
    • IVFRaBitQ算子: 得到IVFRaBitQ所需的算子。
    • Cagra算子:得到Cagra图检索算法所需的算子。

    算子生成说明

    Flat

    用法

    python3 flat_generate_model.py -d <dim> --cores <core_num> -p <process_id> -pool <pool_size> -t <npu_type>

    参数名称

    <dim>:特征向量维度D,默认值为“512”。

    <core_num>:昇腾AI处理器AI Core的个数,默认值为“8”。无需设置。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“10”

    <npu_type>:硬件形态,当前<npu_type>支持Atlas 推理系列产品,Atlas A2 推理系列产品,Atlas A3 推理系列产品,默认值为"310P"。

    • 对于Atlas 推理系列产品,可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,将查询到的“Name”最后一位数字删除,即是npu_type的取值
    • 对于Atlas 800I A2 推理服务器可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,查询到的“Name”即是npu_type的取值
    • 对于Atlas 800I A3 超节点服务器,可以通过npu-smi info -t board -i 0 -c 0命令进行查询,获取NPU Name信息,910_NPU Name即是npu_type的取值。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组距离计算算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 推理系列产品 生成512维算子:python3 flat_generate_model.py -d 512 -t 310P

    约束说明

    • dim ∈ {32, 64, 128, 256, 384, 512, 768, 1024, 1408, 1536, 2048, 3072, 3584, 4096}
    • 1 ≤ pool_size ≤ 32

    涉及算法

    SQ8

    Note

    INT8Flat和SQ8的区别主要在于:INT8由外部进行量化,Index的输入特征是INT8类型,SQ8由Index内部量化,Index的输入特征是Float32类型。

    用法

    python3 sq8_generate_model.py -d <dim> --cores <core_num> -p <process_id> -pool <pool_size> -t <npu_type>

    参数名称

    <dim>:特征向量维度D,默认值为“128”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“8”。不指定该值时,根据<npu_type>配置:当npu_type配置为310P时,<core_num>配置为8。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“10”

    <npu_type>:硬件形态,当前<npu_type>支持Atlas 推理系列产品,取值为:310P,默认为“310P”

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组SQ8距离计算算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 推理系列产品 生成512维算子:python3 sq8_generate_model.py -d 512 -t 310P

    约束说明

    • dim ∈ {64, 128, 256, 384, 512, 768}
    • 1 ≤ pool_size ≤ 32

    涉及算法

    IVFSQ8

    用法

    python3 ivfsq8_generate_model.py -d <dim> -c <coarse_centroid_num> --cores <core_num> -p <process_id> -pool <pool_size> -t <npu_type>

    参数名称

    <dim>:特征向量维度D,默认值为“128”。

    <coarse_centroid_num>:L1簇聚类中心个数,默认值为“16384”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“8”。不指定该值时,根据<npu_type>配置:当npu_type配置为310P时,<core_num>配置为8。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“10”

    <npu_type>:硬件形态,当前<npu_type>支持Atlas 推理系列产品,取值为:310P,默认为“310P”

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 推理系列产品 生成512维,nlist为1024算子:python3 ivfsq8_generate_model.py -d 512 -c 1024 -t 310P

    约束说明

    • dim ∈ {64, 128, 256, 384, 512}
    • coarse centroid num ∈ {1024, 2048, 4096, 8192, 16384, 32768}
    • 1 ≤ pool_size ≤ 32

    涉及算法

    AscendIndexIVFSQ

    INT8Flat

    Note

    INT8Flat和SQ8的区别主要在于:INT8由外部进行量化,Index的输入特征是INT8类型,SQ8由Index内部量化,Index的输入特征是Float32类型。

    用法

    python3 int8flat_generate_model.py -d <dim> --cores <core_num> -p <process_id> -pool <pool_size> -t <npu_type> -code <code_num>

    参数名称

    <dim>:特征向量维度D,默认值为“512”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“8”。无需设置。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“10”

    <npu_type>:硬件形态,当前<npu_type>支持Atlas A2 推理系列产品、Atlas A3 推理系列产品,默认值为“310P”。

    • 对于Atlas 推理系列产品,可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,将查询到的“Name”最后一位数字删除,即是npu_type的取值
    • 对于Atlas 800I A2 推理服务器可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,查询到的"Name"即是npu_type的取值

    <code_num>:算子调用时底库分块大小,默认值为“262144”,不设置时默认生成所有code_num值的算子。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 推理系列产品 生成512维算子:python3 int8flat_generate_model.py -d 512 -t 310P

    约束说明

    • dim ∈ {64, 128, 256, 384, 512, 768, 1024}
    • 1 ≤ pool_size ≤ 32
    • code_num ∈ {16384, 32768, 65536, 131072, 262144}

    涉及算法

    IVFSQT

    Note

    为了减少train和add的耗时,需要生成FlatAT算子。其中,Flat的<dim>需与IVFSQT的<dim_in>相同,Flat的<code_num>与IVFSQT的<coarse_centroid_num>一致。

    用法

    python3 ivfsqt_generate_model.py --cores <core_num> -d <dim_in> -r <compress_ratio> -c <coarse_centroid_num> -p <process_id> -pool <pool_size> -t <npu_type>

    参数名称

    <dim_in>:输入特征向量维度,默认值为“256”。

    <compress_ratio>:输入与输出维度的比值,默认值为“4”。取值范围:compress_ratio≥1。

    <coarse_centroid_num>:L1簇聚类中心个数,默认值为“16384”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“8”。不指定该值时,根据<npu_type>配置:当npu_type配置为310P时,<core_num>配置为8。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“32”。取值范围:1≤pool_size≤32。

    <npu_type>:硬件形态,当前<npu_type>支持Atlas 推理系列产品,取值为:310P,默认为“310P”

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件。例如对于Atlas 推理系列产品 生成输入256维,输出64维,nlist1024算子:python3 ivfsqt_generate_model.py -d 256 -r 4 -c 1024 -t 310P

    约束说明

    • <dim_in> ∈ {256}
    • <compress_ratio> ∈ {2, 4, 8}
    • <coarse_centroid_num> ∈ {1024, 2048, 4096, 8192, 16384, 32768}
    • <dim_in>可以被<compress_ratio>整除。

    涉及算法

    AscendIndexIVFSQT

    FlatAT

    Note

    当前FlatAT算子配合IVF类型的算子使用,用来加速IVF类型算子的add、train等过程,不支持直接调用FlatAT算子。当前的add/train加速功能通过IVF中AscendIndexIVFConfig.useKmeansPP进行指定,此时仅支持训练规模在7,000,000以下的训练。

    用法

    python3 flat_at_generate_model.py --cores <core_num> -d <dim> -c <code_num> -p <process_id> -t <npu_type>

    参数名称

    <dim>:输入特征向量维度,默认值为“64”。

    <code_num>:与输入特征作对比的底库特征数,默认值为“8192”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“8”。不指定该值时,根据<npu_type>配置:当npu_type配置为310P时,<core_num>配置为8。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <npu_type>:硬件形态,当前<npu_type>支持Atlas 推理系列产品,取值为:310P,默认为“310P”

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件。例如对于Atlas 推理系列产品 生成256维,nlist1024算子: python3 flat_at_generate_model.py -d 256 -c 1024 -t 310P

    FlatAT算子主要用于在IVF场景,减少train和add的耗时。

    约束说明

    • dim ∈ {64, 128, 256}
    • code_num ∈ {1024, 2048, 4096, 8192, 16384, 32768}

    涉及算法

    FlatInt8AT

    用法

    python3 flat_at_int8_generate_model.py --cores <core_num> -d <dim> -c <code_num> -p <process_id> --soc-version <soc_version> -t <npu_type>

    参数名称

    <core_num>:昇腾AI处理器AI Core的个数,默认为“8”

    <dim>:输入特征向量维度,默认值为“256”。

    <code_num>:与输入特征作对比的底库特征数,默认值为“16384”。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <soc_version>:昇腾AI处理器的型号,默认为“Ascend310P3”,无需设置。

    <npu_type>:硬件形态,当前支持Atlas 推理系列产品,默认为“310P”,无需设置。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件。例如对于Atlas 推理系列产品 生成256维,nlist1024算子: python3 flat_at_int8_generate_model.py -d 256 -c 1024 -t 310P

    FlatInt8AT优化Atlas 推理系列产品使用场景下,IVFSQT中train、add与update的耗时。

    约束说明

    • dim ∈ {256}
    • code_num ∈ {1024, 2048, 4096, 8192, 16384, 32768}
    • soc_version ∈ {Ascend310P3}

    涉及算法

    AscendIndexIVFSQT

    AICPU

    用法

    python3 aicpu_generate_model.py --cores <core_num> -p <process_id> -t <npu_type>

    参数名称

    <core_num>:昇腾AI处理器AI Core的个数,默认为“2”。(预留参数,暂不使用)

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <npu_type>:硬件形态,当前<npu_type>支持Atlas 推理系列产品Atlas A2 推理系列产品、Atlas A3 推理系列产品,默认为“310P”。如果无法确定具体的npu_type,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,将查询到的“Name”最后一位数字删除,即是npu_type的取值。对于Atlas 800I A3 超节点服务器,可以通过npu-smi info -t board -i 0 -c 0命令进行查询,获取NPU Name信息,910_NPU Name即是npu_type的取值。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件。例如对于Atlas 推理系列产品 生成aicpu算子:python3 aicpu_generate_model.py -t 310P

    AICPU算子模型文件只需生成一次,会全部生成所有算法的算子。

    涉及算法

    BinaryFlat

    用法

    python3 binary_flat_generate_model.py -d <dim> -q <query_type> -p <process_id> -pool <pool_size>

    参数名称

    <dim>:二值化特征向量维度,dim ∈ { 256, 512,1024 },默认值为“512”。

    <query_type>:检索类型,默认为“uint8”,当AscendIndexBinaryFlat算法的search接口进行性能提升时,需要设置为“float”

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认为16。

    --help | -h:查询帮助信息。

    说明

    例如对于Atlas 推理系列产品 生成256维 uint8类型算子:python3 binary_flat_generate_model.py -d 256。

    涉及算法

    Mask

    用法

    python3 mask_generate_model.py -token <max_token_cnt> -p <process_id> -pool <pool_size> -t <npu_type>

    参数名称

    <max_token_cnt>:算子生成token的最大值,默认为2500,建议设置范围为[1, 300000]。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认为16。

    <npu_type>:硬件形态,当前<npu_type>支持Atlas 推理系列产品,Atlas A2 推理系列产品、Atlas A3 推理系列产品,默认值为“310P”。

    • 对于Atlas 推理系列产品,可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,将查询到的“Name”最后一位数字删除,即是npu_type的取值
    • 对于Atlas 800I A2 推理服务器可在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,查询到的“Name”即是npu_type的取值
    • 对于Atlas 800I A3 超节点服务器,可以通过npu-smi info -t board -i 0 -c 0命令进行查询,获取NPU Name信息,910_NPU Name即是npu_type的取值。

    --help | -h:查询帮助信息。

    说明

    例如对于Atlas 推理系列产品 生成token数量为300000的算子:python3 mask_generate_model.py -token 300000 -t 310P。

    涉及接口

    AscendIndexTS

    IVFSP

    IVFSP检索当前支持硬件形态“910B4”,涉及以下几种类型的模型文件生成:

    IVFSP业务算子模型文件生成

    用法

    python3 ivfsp_generate_model.py --cores <core_num> -d <dim> -nonzero_num <low_dim> -nlist <k> -handle_batch <handle_batch> -code_num <code_num> -p <process_id> --pool <pool_size>

    参数名称

    <core_num>:AI Core的个数,默认值为“8”,无需设置。

    <dim>:特征向量维度,默认值为“256”。

    <low_dim>:特征向量压缩后非零维度个数,默认值为“32”。

    <k>:簇聚类中心个数。与IVFSP训练算子模型文件生成中的<k>保持一致,默认值为“1024”。

    <handle_batch>:检索时每次下发计算的候选桶数量,默认值为“32”。

    <code_num>:检索时每次下发计算的每个桶的最大样本数量,若桶太大,程序会自动根据code_num将桶拆成多次算子下发计算距离。与IVFSP训练算子模型文件生成中的<codebook_batch_size>保持一致,默认值为“32768”。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“16”。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组用于IVFSP检索时的AI Core算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 推理系列产品 生成256维,压缩后维度为32,聚类中心为1024,桶数量为32,样本数量为32768的算子:python3 ivfsp_generate_model.py -d 256 -nonzero_num 32 -nlist 1024 -handle_batch 32 -code_num 32768

    约束说明

    • 当dim ∈ {64, 128, 256}时,k∈ {256, 512, 1024, 2048, 4096, 8192, 16384};当dim ∈ {512, 768}时,k∈ {256, 512, 1024, 2048}。
    • low_dim需为16的倍数且小于等于min(128, dim)。
    • handle_batch需为16的倍数,且16 ≤ handle_batch ≤ 240。
    • 1 ≤ pool_size ≤ 32。

    IVFSP AICPU算子模型文件生成

    用法

    python3 ivfsp_aicpu_generate_model.py --cores <core_num> -p <process_id>

    参数名称

    <core_num>:AI Core的个数,默认值为“8”,无需设置。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组用于IVFSP检索时的AICPU算子模型文件。例如对于Atlas 推理系列产品 生成aicpu算子:python3 ivfsp_aicpu_generate_model.py --cores 8。

    IVFSP训练算子模型文件生成

    用法

    python3 ivfsp_generate_pyacl_model.py --cores <core_num> -d <dim> -nonzero_num <low_dim> -nlist <k> -batch_size <batch_size> -code_num <codebook_batch_size> -p <process_id>

    参数名称

    <core_num>:AI Core的个数,默认值为“8”,无需设置。

    <dim>:特征向量维度,默认值为“256”。

    <low_dim>:特征向量压缩后非零维度个数,默认值为“32”。

    <k>:簇聚类中心个数。与IVFSP业务算子模型文件生成中的<k>保持一致,默认值为“1024”。

    <batch_size>:训练时以batch_size大小执行训练,默认值为“32768”。

    <codebook_batch_size>:训练时每次最大按codebook_batch_size样本数量操作码本,必须为2的幂次。与IVFSP业务算子模型文件生成中的<code_num>保持一致,默认值为“32768”。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组用于IVFSP检索时的算子模型文件,用户需要自行修改命令中的参数。生成的IVFSP训练算子模型文件,保存在当前目录的子目录op_models_pyacl下。例如对于Atlas 推理系列产品 生成256维 压缩后维度为32,nlist聚类中心1024,查询数量为32768,样本数量为32768算子:python3 ivfsp_generate_pyacl_model.py -d 256 -nonzero_num 32 -nlist 1024 -batch_size 32768 -code_num 32768

    约束说明

    • 当dim ∈ {64, 128, 256}时,k∈ {256, 512, 1024, 2048, 4096, 8192, 16384};当dim ∈ {512, 768}时,k∈ {256, 512, 1024, 2048}。
    • low_dim需为16的倍数且小于等于min(128, dim)。
    • batch_size需为16的倍数。
    • codebook_batch_size需为16的倍数。

    VSTAR

    VSTAR检索当前只支持Atlas 推理系列产品,涉及VSTAR业务算子模型文件(vstar_generate_models.py)生成,具体请参见VSTAR

    算子生成环境需要跟码本生成保持一致,具体请参见总体说明

    VSTAR业务算子模型文件生成

    用法

    python3 vstar_generate_models.py --dim <dim> --nlistL1 <nlist1> --subDimL1 <sub_dim1> --nProbeL1 <nprobe1> --nProbeL2 <nprobe2> --segmentNumL3 <segment> --pool <pool_size>

    参数名称

    <dim>:特征向量维度,默认值为“256”。

    <nlist1>:一级簇聚类中心个数。默认值为“1024”。

    <nprobe1>:检索时每次下发计算时的一级候选桶数量,默认值为“[72]”。

    <nprobe2>:检索时每次下发计算时的二级候选桶数量,默认值为“[64, 296]”。

    <sub_dim1>:检索时一级降维后的维度大小,默认值为“32”。

    <segment>:检索时从nprobe2中用于搜索数据段数,默认值“[512, 1000, 1504]”。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认“16”。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组用于VSTAR检索时的AI Core和AICPU算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 推理系列产品 生成256维 nlist聚类中心为1024,一级候选桶nprobe1为72,二级候选桶nprobe2为64,降维后32,搜索段segment512的算子:python3 vstar_generate_models.py --dim 256 --nlistL1 1024 --subDimL1 32 --nProbeL1 72 --nProbeL2 64 --segmentNumL3 512

    约束说明

    • dim ∈ {128, 256, 512, 1024}。
    • nlist1 ∈ {256, 512, 1024}。
    • sub_dim1 ∈ {32,64,128}。sub_dim1必须小于dim。
    • nprobe1 ∈ (16, nlist1]。nprobe1是int类型的列表,且列表中的数值必须是8的整数倍。
    • nprobe2 ∈ [16, nprobe1 * n]。当dim为1024时n为16,其余维度n为32,nprobe2是int类型的列表,且列表中的数值必须是8的整数倍。
    • segment ∈ (100, 5000]。segment是int类型的列表,且segment必须是8的整数倍。
    • pool_size∈[1, 32]。运行脚本前请先确定宿主机最大能支持的进程数量合理设置。

    涉及算法

    AscendIndexVStar

    AscendIndexGreat

    IVFFLAT

    用法

    python3 ivfflat_generate_model.py -d <dim> -c <coarse_centroid_num> --cores <core_num> -p <process_id> -pool <pool_size> -t <npu_type>

    参数名称

    <dim>:特征向量维度,默认值为“128”。

    <coarse_centroid_num>:一级簇聚类中心个数。默认值为“1024”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“40”。不指定该值时,根据<npu_type>配置:当<npu_type>配置为910B3时,<core_num>配置为40。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“10”。

    <npu_type>:硬件形态,当前<npu_type>支持Atlas A2 推理系列产品,Atlas A3 推理系列产品和Ascend 950 系列产品,默认值为“910B4”。如果无法确定具体的npu_type,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,将查询到的“Name”最后一位数字删除,即是npu_type的取值。对于Atlas 800I A3 超节点服务器,可以通过npu-smi info -t board -i 0 -c 0命令进行查询,获取NPU Name信息,910_NPU Name即是npu_type的取值。对于 Ascend 950 超节点服务器请将npu_type设置为“Ascend950PR”。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 800I A2 生成256维,聚类中心nlist为1024算子:python3 ivfflat_generate_model.py -c 1024 -t 910B4

    约束说明

    • dim ∈ {64, 128, 256, 384, 512}。
    • <coarse_centroid_num> ∈ {1024, 2048, 4096, 8192, 16384, 32768}
    • 1 ≤ <pool_size> ≤ 32

    涉及算法

    AscendIndexIVFFlat

    IVFPQ

    用法

    python3 ivfpq_generate_model.py -d <dim> -c <nlist> --cores <core_num> -m <m> -n <nbit> -topK <topK> -b <blockNum> -p <process_id> -t <npu_type>

    参数名称

    <dim>:特征向量维度,默认值为“128”。

    <nlist>:一级簇聚类中心个数。默认值为“1024”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“40”。不指定该值时,根据<npu_type>配置。

    <m>:子空间个数,默认值为“4”。

    <nbit>:每个子空间量化中心比特数,默认值为“8”,无需设置。同时会决定码本聚类中心数量ksub = 1 << nbit,当nbit为8时,ksub为256

    <topK>:针对每条查询向量所返回的最相近候选向量的个数,默认值为“320”,无需设置。

    <blockNum>:所处理候选向量block的个数,默认值为“128”,无需设置。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <npu_type>:硬件形态,当前<npu_type>仅支持Ascend950 系列产品,默认值为“Ascend950PR”,无需设置。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件,用户需要自行修改命令中的参数。例如生成128维,聚类中心nlist为1024,子空间个数4,比特数8算子:python3 ivfpq_generate_model.py -d 128 -c 1024 -m 4 -n 8

    约束说明

    • dim ∈ {128}
    • nlist ∈ {1024, 2048, 4096, 8192, 16384, 262144, 524288}
    • m ∈ {2, 4, 8, 16, 32}
    • n ∈ {8}

    涉及算法

    AscendIndexIVFPQ

    IVFRaBitQ

    用法

    python3 ivfrabitq_generate_model.py -d <dim> -c <coarse_centroid_num> --cores <core_num> -p <process_id> -pool <pool_size> -t <npu_type> -m <metric_type>

    参数名称

    <dim>:特征向量维度,默认值为“128”。

    <coarse_centroid_num>:一级簇聚类中心个数。默认值为“16384”。

    <core_num>:昇腾AI处理器AI Core的个数,默认为“40”。不指定该值时,根据<npu_type>配置:当<npu_type>配置为910B3时,<core_num>配置为40。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为“0”,无需设置。

    <pool_size>:批量生成算子多进程调度的进程池大小,默认值为“10”。

    <npu_type>:硬件形态,当前<npu_type>支持Atlas A2 推理系列产品,Atlas A3 推理系列产品,默认值为“910B4”。如果无法确定具体的npu_type,则在安装昇腾AI处理器的服务器执行npu-smi info命令进行查询,将查询到的“Name”最后一位数字删除,即是npu_type的取值。对于Atlas 800I A3 超节点服务器,可以通过npu-smi info -t board -i 0 -c 0命令进行查询,获取NPU Name信息,910_NPU Name即是npu_type的取值。

    <metric_type>:向量计算方式,用于显式指定使用“L2”还是“IP”距离进行计算,默认为“L2”。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件,用户需要自行修改命令中的参数。例如对于Atlas 800I A2 生成128维,聚类中心nlist1024,L2距离算子:python3 ivfrabitq_generate_model.py -d 128 -c 1024 -t 910B4 -m L2

    约束说明

    • dim ∈ {128}
    • <coarse_centroid_num> ∈ {1024, 2048, 4096, 8192, 10048, 16384, 32768}
    • 1 ≤ <pool_size> ≤ 32

    涉及算法

    AscendIndexIVFRaBitQ

    运行时诊断(开发调试)

    排查 coarse centroid 上传或 L1 粗排异常时,可通过调试环境变量分阶段定位故障点(默认关闭,不影响性能)。环境变量说明见《附录》,操作步骤与日志解读见《常用操作 — IVFRaBitQ 运行时诊断》。

    Cagra

    用法

    python3 cagra_generate_model.py -d <dim> -data_base <data_base> -degree <degree> -topK <topK> -p <process_id> -t <npu_type>

    参数名称

    <dim>:特征向量维度,默认值为"128"。

    <data_base>:底库数据量,默认值为"1000000"。

    <degree>:图度数,默认值为"64"。

    <topK>:检索返回的最近邻个数,默认值为"64"。

    <process_id>:批量生成算子多进程调度的进程ID,默认值为"0",无需设置。

    <npu_type>:硬件形态,默认值为"Ascend950PR"。

    --help | -h:查询帮助信息。

    说明

    执行此命令,用户可以得到一组算子模型文件,用户需要自行修改命令中的参数。例如对于Ascend 950 系列产品 生成128维,底库100万,图度数64,topK 64的算子:python3 cagra_generate_model.py -d 128 -data_base 1000000 -degree 64 -topK 64 -t Ascend950PR

    约束说明

    • 仅支持Ascend 950 系列产品
    • dim ∈ {64, 128, 256, 512}
    • degree ∈ {64, 128, 256, 512}
    Cagra构图脚本

    环境配置

    环境依赖库参见如下:

    • joblib(version ≥ 1.3.0)

    可通过pip install命令安装,命令执行参考如下。

    pip install joblib
    

    训练脚本执行

    Cagra构图脚本 "graph_build.py" 用于构建CAGRA图检索算法所需的图文件(脚本位于安装目录下的"tools/train"文件夹中)。

    命令参考

    python3 graph_build.py --input_filepath <input_filepath> --output_filepath <output_filepath> --graph_degree <graph_degree> --intermediate_degree <intermediate_degree> --nn_descent_niter <nn_descent_niter> --eval_samples <eval_samples>

    参数名称

    <input_filepath>:输入目录路径,需包含"sift_base.fvecs"(底库数据)和"sift_query.fvecs"(查询数据)。该参数为必填项。

    <output_filepath>:输出目录路径,生成的KNN图文件存储在该目录下。该参数为必填项。

    <graph_degree>:最终图的出度,建议与搜索算子的GRAPH_DEGREE保持一致。类型为int,默认值为"64"。要求大于0。

    <intermediate_degree>:中间图的出度,必须大于等于<graph_degree>。若该值不是32的倍数,将自动向上取整为最近的32的倍数。类型为int,默认值为"128"。

    <nn_descent_niter>:NN-Descent迭代次数。迭代次数越大,图质量越高但构建时间越长。建议设置足够的迭代次数使得R@1/10/32/64均不低于0.995。类型为int,默认值为"10"。要求大于0。

    <eval_samples>:评估图质量时使用的采样点数。设为"0"则跳过评估。类型为int,默认值为"1000"。

    --help | -h:查询帮助信息。

    使用说明

    • 执行此命令,在<output_filepath>对应的目录下生成以下文件:knn_graph.bin(KNN图文件)、data_ptr.bin(底库数据文件)、visited_map.bin(访问标记文件)和queries.bin(查询数据文件)。
    • 当输出文件存在时,将执行覆盖写,此种情况程序执行用户应该是文件的属主。
    • <intermediate_degree>必须大于等于<graph_degree>,否则程序将报错。
    • 构建过程中会打印每次迭代后的R@1/10/32/64召回率,建议持续迭代直至召回率稳定(建议R@1/10/32/64均不低于0.995)。
    • 构图过程中会占用较多CPU和内存资源,建议在内存充足的环境下执行。

    调用示例

    python3 graph_build.py --input_filepath /home/user/data/sift_origin --output_filepath /home/user/output/iter_64_192 --graph_degree 64 --intermediate_degree 128 --nn_descent_niter 10

    涉及算法

    AscendIndexCagra

    VSTAR生成码本文件

    总体说明

    环境配置

    环境依赖库参见如下:

    • nnae(version >= 8.0.0, 8.5.0 及以后由 toolkit 包收编)

    • python(version >= 3.9)

    • torch(version >= 2.0.1)

    • torch_npu(version >= 2.0.1.post4)

    • numpy(version >= 1.26.4)

    • scikit-learn(version >= 1.4.1.post1)

    • tqdm(version >= 4.66.1)

    torch、TorchNPU、numpy、scikit-learn和tqdm可通过pip install命令安装,执行命令参考如下。

    pip install numpy tqdm scikit-learn torch_npu torch
    

    CANN 8.5.0之前版本需要单独安装nnae。具体安装步骤如下:

    1. 下载nnae软件包。

    2. 执行如下命令,增加可执行权限。

      chmod u+x ./Ascend-cann-nnae_{version}_linux-{arch}.run
      
    3. 执行如下命令,进行安装。

      ./Ascend-cann-nnae_{version}_linux-{arch}.run --install
      
    4. 按照安装提示信息设置环境变量。

      source /{nnae_installation_path}/nnae/set_env.sh
      

    注意事项

    • 若import torch,TorchNPU遇到下面的错误:

      .../libgomp.so: cannot allocate memory in static TLS block
      

      请执行export LD_PRELOAD=.../libgomp.so(报错中出现的libgomp.so路径)

    • 若安装numpy出现pip无法安装如下依赖时:

      ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behavior is the source of the following dependency conflicts.
      auto-tune 0.1.0 requires decorator, which is not installed.
      dataflow 0.0.1 requires jinja2, which is not installed.
      opc-tool 0.1.0 requires attrs, which is not installed.
      opc-tool 0.1.0 requires decorator, which is not installed.
      opc-tool 0.1.0 requires psutil, which is not installed.
      schedule-search 0.0.1 requires absl-py, which is not installed.
      schedule-search 0.0.1 requires decorator, which is not installed.
      te 0.4.0 requires attrs, which is not installed.
      te 0.4.0 requires cloudpickle, which is not installed.
      te 0.4.0 requires decorator, which is not installed.
      te 0.4.0 requires ml-dtypes, which is not installed.
      te 0.4.0 requires psutil, which is not installed.
      te 0.4.0 requires scipy, which is not installed.
      te 0.4.0 requires tornado, which is not installed.
      

      请执行以下命令。

      pip install attrs cloudpickle decorator jinja2 ml-dtypes psutil scipy tornado absl-py
      
    • 若训练码本遇到以下问题:

      OpenBLAS warning: precompiled NUM_THREADS exceeded, adding auxiliary array for thread metadata.
      Segmentation fault (core dumped)
      

      请执行:

      export OPENBLAS_NUM_THREADS=1
      

      该环境变量可能影响性能,码本训练完成后,建议设置回预设值。

    • --useOfflineCompile选项详细说明:

      在线算子编译耗时相比离线算子编译耗时较长。--useOfflineCompile选项用于控制是否使用离线算子编译,使用预先编译好的离线算子包执行。该方式需要用户提前安装单算子包。算子包安装指导如下:

      1. 下载算子软件包

      2. 执行如下命令,增加可执行权限。

        • CANN 8.5.0之前版本

          chmod u+x ./Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run
          
        • CANN 8.5.0及之后版本

          chmod u+x ./Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run
          
      3. 执行如下命令,进行安装。

        • CANN 8.5.0之前版本

          ./Ascend-cann-kernels-{chip_type}_{version}_linux-{arch}.run --install
          
        • CANN 8.5.0及之后版本

          ./Ascend-cann-{chip_type}-ops_{version}_linux-{arch}.run --install
          
      4. 按照安装提示信息设置环境变量。

        • CANN 8.5.0之前版本

          source /{kernels_installation_path}/kernels/set_env.sh
          
        • CANN 8.5.0及之后版本

          source /usr/local/Ascend/cann/set_env.sh
          
    码本训练脚本

    训练涉及“vstar_train_codebook.py”脚本(训练脚本位于安装目录下的“tools/train”文件夹中),注意Python版本为3.9。

    命令参考

    python3 vstar_train_codebook.py --dataPath <data_path> --dim <dim> --codebookPath <codebook_output_dir> --nlistL1 <nlist1> --subDimL1 <sub_dim1> --device <device> --batchSize <batch_size> --sample <sample> --useOfflineCompile

    参数名称

    <data_path>:需要训练码本的原始数据路径,需要保证数据真实存在。该参数为必填项。

    <dim>:特征向量维度。与VSTAR训练算子模型文件生成的<dim>保持一致,默认值为“256”

    <codebook_output_dir>:最终生成的码本文件所存储的路径,生成的码本文件输出到的目录,用户应该保证此目录存在,且程序的执行用户对此目录具有写权限。出于安全加固考虑,目录层级中不能含有软链接。

    <nlist1>:一级簇聚类中心个数。与VSTAR训练算子模型文件生成的<nlist1>保持一致,默认值为“1024”。

    <sub_dim1>:检索时一级降维后的维度大小,与VSTAR训练算子模型文件生成的<sub_dim1>保持一致,默认值为“32”。

    <device>:设备逻辑ID,在指定的Device上执行训练,默认值为“1”。

    <batch_size>:训练时以batch_size大小执行训练,参数范围(0,10240],默认值为“10240”

    <sample>:训练用原始样本的采样率,0 < sample ≤ 1.0,默认为“1.0”

    --useOfflineCompile:控制是否选择依赖算子包,使用离线算子编译,以获得性能提升。默认不开启。若开启,在命令行结尾增加该选项即可。详细说明请参见:VSTAR生成码本文件-总体说明- --useOfflineCompile选项详细说明。

    --help | -h:查询帮助信息。

    使用说明

    • <data_path>原始数据大小需≤一千万1024维数据,即10,000,000 * 1024 * 4 = 40,960,000,000。
    • 执行此命令,在<codebook_output_dir>对应的目录下生成新目录codebook_<dim>_<nlist1>_<sub_dim1>.bin,即为AscendIndexVStar和AscendIndexGreat所需使用到的码本文件。
    • 当码本文件存在时,将执行覆盖写,此种情况程序执行用户应该是文件的属主。
    • 在执行训练生成码本前,请先参考VSTAR,生成训练算子模型文件。

    (可选)Python方式生成码本文件

    IVFSP训练脚本

    环境配置

    环境依赖库参见如下:

    • numpy(version > 1.16.0)
    • tqdm(version ≥ 4.65.0)
    • faiss-cpu(version = 1.10.0)

    可通过pip install命令安装,命令执行参考如下。

    pip install numpy tqdm faiss-cpu==1.10.0
    

    执行训练脚本前,先执行如下命令设置环境变量。

    source /usr/local/Ascend/ascend-toolkit/set_env.sh
    

    训练脚本执行

    Index SDK提供两种训练脚本方式:

    • 使用IVFSP算法的trainCodeBook接口进行训练(推荐使用该方式)。
    • 使用“ivfsp_train_codebook.py”脚本进行训练。训练脚本位于安装目录下的“tools/train”文件夹中,注意Python版本为3.9.11。为了用户执行方便,提供了“ivfsp_train_codebook_example.sh”样例脚本(脚本位于安装目录下的“tools/train”文件夹中),用户可在此文件上根据实际场景修改参数值,然后执行此脚本生成码本文件。

    命令参考

    python3 ivfsp_train_codebook.py --dim <dim> --nonzero_num <nonzero_num> --nlist <nlist> --num_iter <num_iter> --device <device> --batch_size <batch_size> --code_num <code_num> --ratio <ratio> --learn_data_path <learn_data_path> --codebook_output_dir <codebook_output_dir> --train_model_dir <train_model_dir>

    参数名称

    <dim>:特征向量维度。与IVFSP训练算子模型文件生成的<dim>保持一致,要求大于0。

    <nonzero_num>:特征向量压缩后非零维度个数,与IVFSP训练算子模型文件生成的<low_dim>保持一致,要求大于0。

    <nlist>:簇聚类中心个数。与IVFSP训练算子模型文件生成的<k>保持一致,要求大于0。

    <num_iter>:训练迭代次数参数,默认为20。迭代次数设置过大,会导致训练时长增加,要求大于0。

    <device>:设备逻辑ID,在指定的Device上执行训练,默认值为“0”。

    <batch_size>:训练时以batch_size大小执行训练。与IVFSP训练算子模型文件生成的<batch_size>保持一致,要求大于0,小于等于32768,默认值为“32768”

    <code_num>:每次最大按code_num样本数量操作码本,必须为2的幂次。与IVFSP训练算子模型文件生成的<codebook_batch_size>保持一致,要求大于0,小于等于32768,默认值为“32768”

    <ratio>:训练用原始样本的采样率,0 < ratio ≤ 1.0,默认为1.0。

    <learn_data_path>:训练用的原始特征文件路径,支持bin、npy格式,bin存储方式为行优先,数据类型为float32。

    <codebook_output_dir>:生成的码本文件输出到的目录,用户应该保证此目录存在,且程序的执行用户对此目录具有写权限;出于安全加固的考虑,此目录层级中不能含有软链接。

    <train_model_dir>:IVFSP训练算子模型文件所在目录。

    --help | -h:查询帮助信息。

    使用说明

    • 执行此命令,在<codebook_output_dir>对应的目录下生成文件codebook_<dim>_<nonzero_num>_<nlist>.bin和codebook_<dim>_<nonzero_num>_<nlist>.npy,codebook_<dim>_<nonzero_num>_<nlist>.bin即为AscendIndexIVFSP所需使用到的码本文件。
    • 当码本文件存在时,将执行覆盖写,此种情况程序执行用户应该是文件的属主。
    • 在执行训练生成码本前,请先参考IVFSP训练算子模型文件生成,生成训练算子模型文件。
    • learn_data_path指定的数据大小必须大于等于nonzero_num * nlist * sizeof(float32) 字节。
    降维训练脚本

    环境依赖

    • 安装Python3.9(支持Python3.9、Python3.10和Python3.11,推荐使用Python3.9)。

    • 安装Faiss 1.10.0。可通过pip install命令安装,命令执行参考如下。

      pip install faiss-cpu==1.10.0
      
    • 安装torch_cpu和TorchNPU。安装方法参见链接。请根据版本配套表,选择对应版本安装。

    训练模型

    本章节涉及的脚本的默认存放路径为:“tools/train/reduction”。

    1. 训练模型。

      python3 call_train.py --dataset_dir=Dataset_Dir --val_dataset_dir=./valid --generate_val=True --save_path=./modelsDr --dim=512 --npu=0 --ratio=4 --metric=L2 --mode=train --train_size=100000 --epochs=20 --train_batch_size=8192 --infer_batch_size=128 --learning_rate=0.0005 --log_stride=500 --construct_neighbors=100 --queries_validation=1000
      
      参数 说明
      dataset_dir 数据集路径,类型为string,必须设置。目前实现默认读取base.npy,query.npy和gt.npy。若数据集为其他名称,可以自行实现数据集读取,并对该脚本get_train_data所在行做对应修改。例如。原代码为:
      # load dataset demo before training, modify here if you want to load your own dataset ##################################################################### learn, base = get_train_data(args.dataset_dir, args.train_size) #####################################################################
      可修改为:
      # load dataset demo before training, modify here if you want to load your own dataset ##################################################################### # learn, base = get_train_data(args.dataset_dir, args.train_size) learn = np.fromfile(YOUR_LEARN_DATASET_DIR, dtype=np.float32).reshape((-1, YOUR_DATA_DIM)) base = np.fromfile(YOUR_BASE_DATASET_DIR, dtype=np.float32).reshape((-1, YOUR_DATA_DIM)) #####################################################################
      val_dataset_dir generate_val为True时有效,生成验证集的存放路径,类型为string,默认值为./validation/。
      generate_val 是否生成验证集。首次训练请设置为True。类型为bool,默认为False。
      save_path 模型存放路径。类型为string,必须设置。
      dim 可选,数据集维度。取值范围:[96, 128, 200, 256, 512, 2048]。类型为int,默认值为512。
      npu 训练所用的DeviceId,即设备号。类型为int。仅支持单卡训练,不指定时默认使用CPU训练。
      ratio 可选,降维比例。取值范围:[2, 4, 8, 16]。类型为int,默认值为8。
      metric 训练模型时的距离度量标准,可选L2或IP。类型为string,默认值为L2。
      mode 可选,范围为[“train”,“infer”,“test”],但当前仅支持“train”,默认为“train”,无需修改。
      train_size 训练集大小,取值范围小于整个数据集样本个数。用于读取数据集时随机采样部分数据进行训练。类型为int。若自行实现数据集读取,请根据train_size进行采样以防止训练速度过慢。默认值为100000,修改时要求该值大于0。
      epochs 训练迭代轮数。类型为int。迭代次数设置过大,会显著增加训练时长。默认为30,修改时要求该值大于0。
      train_batch_size 训练时的batch大小,默认为“8192”,类型为int。修改时要求该值大于0。
      infer_batch_size 推理时的batch大小,默认为“128”。类型为int。修改时要求该值大于0。
      learning_rate 学习率大小,默认为“0.0005”。类型为float。修改时要求该值大于0。
      log_stride 训练日志打印间隔(step),默认为“500”。类型为int。修改时要求该值大于0。
      construct_neighbors 构造训练集时所取的近邻的范围,用于构造降维所需的特殊训练集结构,默认为“100”。应根据数据集中每个人所对应的人脸数修改。类型为int。修改时要求该值大于0。
      queries_validation 构造验证集时所需查询向量的数量,类型为int。默认为“1000”,修改时要求该值大于0。
      --help | -h 查询帮助信息。
    2. 生成OM模型。

      执行训练脚本前,先执行如下命令设置环境变量(根据CANN软件包的实际安装路径修改)。

      source /usr/local/Ascend/ascend-toolkit/set_env.sh
      export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/driver:$LD_LIBRARY_PATH
      
      1. 生成精度为32的om模型。

        bash atc.sh {save_path} {om_name} {input_shape}
        
      2. 生成精度为16的om模型

        bash atc_16.sh {save_path} {om_name} {input_shape}
        
      • {save_path}:必选,表示模型存储的路径。路径中文件名需要以".onnx"或".pb"结尾,否则脚本会获取环境变量"framework"、"input_format"等值,导致脚本执行异常。
      • {om_name}:可选,表示生成OM模型的名字,默认与onnx模型名字相同。
      • {input_shape}:可选,默认为onnx模型的输入维度,格式为actual_input_1:infer_batch_size,dim,建议使用默认值,不建议修改。
      • bash atc.shbash atc_16.sh仅支持Atlas 推理系列产品。