百度统计
一面之猿网
让这个世界,因为我,有一点点的不一样
纯序员给你介绍图化框架的简单实现——距离计算

大家好,我是不会写代码的纯序员——Chunel Feng,有一阵子没写我的技术博客了,大家是不是很急着看段子了!!!今天的段子特别多,希望大家慢慢看。。。

之前跟大家提过,我们之所以写CGraph这个项目,主要是为了对再早些我们写的一款向量检索引擎——caiss,做技术架构升级,全面支持图化和可插拔开发。写着写着,不断衍生出有很多实用的功能——比如,分块治理,元素切面,调度优化等——都是刚开始的时候,没曾想过的。

就这样,一直断断续续的写了近一年——毕竟平日还是要正常上班的嘛,只有周末休息的时间才有空写。这一年因为做开源项目,认识了很多新的朋友,也有了一些自己的成长和收获,这些都不一一说了。不过无论怎样,我们还是不忘初心,在这个时间点,开启了针对Ann向量检索领域的定制化支持,同时也开启了CGraph-v2.0.0版本的新阶段。

image

在Ann领域中,距离计算是必不可少的话题。这篇文章中,我会跟大家聊聊CGraph中距离计算组件的实现和扩展方法,并且说说一下我们对Ann领域,做的一些定制化开发和贡献。

我们还是照例,先上代码连接:CGraph 中距离计算组件 源码

整体思路

在做CGraph的距离计算库之前,我粗略的扫了一下几个主流的向量算法的实现方法。有些是默认支持float方法的;更多的一些呢,其实是支持template 传入具体类型,然后通过添加工厂注册的方法来判断需要计算的距离类型。

template<typename T>
void* createDistFactory<T>(int distType) {
    // 工厂方法,创建新的距离,需要实现新的Dist类,并修改工厂创建的代码
    void* dist = nullptr;
    switch (distType) {
        case 1: dist = new DistCos<T>();
        case 2: dist = new DistEuc<T>();
        case 3: dist = new DistMht<T>();
        // 添加新的距离计算方式,需要在原有主流程代码中做改动
        case 4: dist = new DistMyFunc<T>();
        default: dist = nullptr;
    }

    return dist;
}

我必须严(为)肃(锤)声(而)明(锤)一下,添加工厂元素,是要入侵式的修改主流程代码好么?作为在恋爱咨询领域有丰富经验的资深专家,我一直认为:代码入侵这种东西吧,跟出轨一样,不要关注多少次,只要关注有或者没有

image

还有,除了完成正常的计算工作之外,还能做一点什么方面的提升和优化(让我文章有内容可以写)呢?想了一下,我们主要在以下几点做改进:

  • 支持任意类型距离的计算,支持快速无入侵的添加自己的距离计算库
  • 支持任何数据类型的计算(int,float,double啥的自由切换,别跟我说string了)
  • 支持各种校验逻辑、归一化逻辑的扩展
  • 代码简洁易懂,可维护性强,使用简单,可扩展性强
  • 支持各种simd、cuda等加速计算功能(todo)

距离计算库

具体实现的思路和代码逻辑结构,我就不说了哈——这也不是我们这篇文章的主旋律。大家有兴趣的话,直接去看一下 CGraph距离计算库 源码 吧,欢迎review && commit。

image.png

总之,结果是,实现了一个以下类型的UDistance子类之后,就可以通过 UDistanceCalculator类,实现向量计算逻辑了。使用的过程,一共就是上图中划红框的两句话。

code.png

插件引入

讲到这里,简单的提两句,因为是完全无入侵的方式实现的逻辑,也推荐大家来贡献一下AI领域比较常见的距离计算库的实现类哈,特别是各种加速计算的版本哈。简单的实现demo参考链接:自定义距离计算 源码

image.png

大家有兴趣的话,可以自行去实现自己设计的距离,然后复用CGraph提供的计算功能。目前除了以上所说的逻辑之外,还支持了自校验、标准化、batch计算等功能,并且以上功能都支持无入侵的三方扩展的。

期待有机会跟大家一起完成一些共建工作。

本章小节

好吧好吧,上面说了这么多,主要是为了引出来这一小节的话题——那就是我们的CGraph成功出圈了,已经有了第一个开源的兄弟项目:GraphANNS 。我们之所以要升级到CGraph-v2.0.0版本,抽象DomainAnn结构,并且实现基础版本的距离组件,就是为了更好的支持这次出圈的合作共建。

最近,杭电&之江实验室的同学,通过复写CGraph的算子和参数类,实现了对Ann传统算法的细粒度拆解,拼装,逐层调优和调度逻辑,简直就是mini版的blink + faiss的组合。今后也会基于此方法实现更多的算子,并完成相关实验,得到更优的结果。

希望在这个不断优化过程中,CGraph调度和组合功能,对实验人员有所帮助。也希望整个工程,今后在行业内有自己的影响力。具体工程的链接:GraphANNS 源码地址当然了,我们也会不断升级和优化CGraph的功能,并且提供尽可能多的定向支持,使得框架 配得上、帮得到、撑得住、玩得转 高大上的AI领域研究

image

工程的作者是一位在Anns领域有丰富经验的研究人员,即将去浙大读博。也时刻关注最新的Anns算法,并且长期更新自己的博客专栏 程序员王同学 in CSDN,git主页 whenever5225 in Github 里,还有一些其他论文和对应的工程实现,欢迎大家来关注和支持一波,一起交流和分享相关技术。

PS:比某些天天在技术交流群里卖茶叶的浙大混混,不知道强到哪里去了。

在此,我们也一并感谢技术交流群里给项目提供xmake编译脚本、搭建code review服务、帮忙贡献代码和提意见的童鞋。最后的最后哈,欢迎大家添加我的个人微信,大家经常交流,互相学习,共同进步哈。

image

                              [2022.04.10 by Chunel]

推荐阅读


个人信息

微信: ChunelFeng
邮箱: chunel@foxmail.com
个人网站:www.chunel.cn
github地址: https://github.com/ChunelFeng

image