当前位置: 首页 > article >正文

向量数据库Milvus源码开发贡献实践

5d0f241544a3d141372f96ff6afe3017.png

625fed0d8f9aed26d7d7c8fcceeaebca.png

Milvus 是一款云原生的开源向量数据库,广泛应用于高维向量数据的管理和人工智能驱动的相似性搜索。无论是在构建智能搜索引擎还是开发数据驱动的应用,Milvus 都能提供强大的支持。我们将一起从头开始实践 Milvus 的标准开发流程,包括如何搭建开发环境、构建 Milvus、运行测试以及如何将您的代码贡献给 Milvus。

01

Hello Milvus

想要成为Milvus开发者为开源社区贡献,首先要做的就是为Milvus设置开发环境。由于Milvus有一些特定版本的第三方依赖项,如果你是使用linux系统,那么恭喜你不太会遇到编译问题。如果是mac 系统,尤其是M1可能会遇到一些编译上的问题,没有关系,我们在这里整理了常见几大类问题,方便社区开发者查阅,更多内容可以参考

https://github.com/milvus-io/milvus/blob/master/DEVELOPMENT.md

86b8ea64d5726e19ef535187e58054a7.png

本地构建

如果你想在本地构建Milvus,Milvus已经将所有要求放入install_deps.sh文件中。只需运行以下命令即可安装所有第三方依赖项:

# Install third-party dependencies.
$ cd milvus/
$ ./scripts/install_deps.sh


# Compile Milvus.
$ make

Docker环境构建

有两种方法,一种是在构建的Docker容器中运行命令,另一种是进入开发容器进行开发。

# method 1: run a command in a built docker container
build/builder.sh make


# method 2: get into a dev container to make milvus
./scripts/devcontainer.sh up
 docker-compose -f docker-compose-devcontainer.yml ps
 docker exec -ti milvus-builder-1 bash
 make milvus

02

常见的坑

  • Brew: Unexpected Disconnect while reading sideband packet

在使用Homebrew时,可能会遇到意外断开连接的问题,解决方法为加大postBuffer容量。

==> Tapping homebrew/core
remote: Enumerating objects: 1107077, done.
remote: Counting objects: 100% (228/228), done.
remote: Compressing objects: 100% (157/157), done.
error: 545 bytes of body are still expected.44 MiB | 341.00 KiB/s
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: index-pack failed
Failed during: git fetch --force origin refs/heads/master:refs/remotes/origin/master
myuser~ %
git config --global http.postBuffer 1M

如果安装后出现“Brew: command not found”错误,请配置Git用户信息:

git config --global user.email xxxgit config --global user.name xxx
  • Docker: error getting credentials - err: exit status 1, out: ``

处理方法是从~/.docker/config.json中删除“credsStore”字段。

f32d9a8f910f100e41b8e3cd76067bdf.png

  • Python: No module named 'imp'

    Python 3.12已移除imp模块,目前需要降级到Python 3.11。

53c5ac2961d667f4b1eac1e6d6e4dd92.png

  • Conan: Unrecognized arguments: --install-folder conan

    请将Conan版本更改为1.61。

e2c0bd33ebbbddeee850d50bc77f1040.png

  • Conan command not found

    通过在bash中导出Python的bin路径来解决

    export PATH="/path/to/python/bin:$PATH"
  • Llvm: use of undeclared identifier 'kSecFormatOpenSSL'

ec728d4874786a0e3588f17368ab45ab.png

重新安装 llvm@15

brew reinstall llvm@15
export LDFLAGS="-L/opt/homebrew/opt/llvm@15/lib"
export CPPFLAGS="-I/opt/homebrew/opt/llvm@15/include"

03

Vscode设置

使用Vscode将C++和Go集成在一起非常方便,只要将user.settings文件替换为以下配置即可。

{
    "go.toolsEnvVars": {
        "PKG_CONFIG_PATH": "/Users/zilliz/milvus/internal/core/output/lib/pkgconfig:/Users/zilliz/workspace/milvus/internal/core/output/lib64/pkgconfig",
        "LD_LIBRARY_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64",
        "RPATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64"
    },
    "go.testEnvVars": {
        "PKG_CONFIG_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib/pkgconfig:/Users/zilliz/workspace/milvus/internal/core/output/lib64/pkgconfig",
        "LD_LIBRARY_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64",
        "RPATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64"
    },
    "go.buildFlags": [
        "-ldflags=-r /Users/zilliz/workspace/milvus/internal/core/output/lib"
    ],
    "terminal.integrated.env.linux": {
        "PKG_CONFIG_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib/pkgconfig:/Users/zilliz/workspace/milvus/internal/core/output/lib64/pkgconfig",
        "LD_LIBRARY_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64",
        "RPATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64"
    },
    "go.useLanguageServer": true,
    "gopls": {
        "formatting.gofumpt": true
    },
    "go.formatTool": "gofumpt",
    "go.lintTool": "golangci-lint",
    "go.testTags": "dynamic",
    "go.testTimeout": "10m"
}

04

构建Milvus

有两种模式来构建Milvus:Milvus Standalone和Milvus Cluster。两者都包括三个组件:

  • Milvus:核心功能组件。

  • Etcd:元数据引擎,访问和存储Milvus内部组件的元数据。

  • MinIO:存储引擎,负责Milvus的数据持久化。

Milvus Cluster包括额外的组件 — Pulsar,用于通过Pub/Sub机制进行分布式处理。

Milvus Standalone

Milvus Standalone独立运行为单个实例。

sudo docker-compose -f deployments/docker/dev/docker-compose.yml up -d
bash ./scripts/start_standalone.sh

Milvus Cluster

Milvus Cluster跨多个节点运行。所有Milvus实例聚合在一起,形成一个统一的系统,以支持更大的数据量和更高的流量负载。

我们可以使用Milvus Operator来安装Milvus Cluster,它帮助我们将完整的Milvus服务堆栈部署和管理到K8s中,直接参考这篇就可以了。

https://milvus.io/docs/install_cluster-milvusoperator.md

Milvus Standalone

Milvus Standalone以单一instance独立运行。

05

运行E2E测试

无论是构建Milvus Standalone还是Milvus Cluster,我们都可以运行E2E测试。详细步骤如下:

https://github.com/milvus-io/milvus/blob/master/DEVELOPMENT.md#e2e-tests

cd tests/python_client
pip install -r requirements.txt
pytest --tags=L0 -n auto

06

最后一步 - 提交代码

恭喜你如果通过了所有单元测试和E2E测试。如果没有就修复修改并重新编译。通常第一次编译会比较久,但是后面会很快的,所以不要担心!

在通过所有测试后,我们可以最终提交更改。请注意,所有的Milvus Pull Request需要与Milvus Issue相关联,可以先去社区搜索是否存在相关的issue

https://github.com/milvus-io/milvus/issues

如果没有的话,就需要先创建一个与更改相关的新问题。

  • Fork Milvus到你的仓库

  • 克隆到本地并切出新分支

  • 提交你的代码:通过在提交中添加“signed-off-by”信息进行提交

git commit -m "Commit of your change" -s

更多详细信息,请查看

https://github.com/milvus-io/milvus/blob/master/CONTRIBUTING.md

07

最后的最后

Milvus提供了丰富的SDK(Python、Java、Go、Node.js),用户友好,易于上手。如果能成为Milvus开发者是一件非常酷的事情!期待你一起贡献Milvus代码!也希望这篇文章能够简化你的贡献过程。

作者介绍

fcc6204f669e964e4804b5749e2312cb.png

推荐阅读

1f9bccd6e6cf14d4fd37eaf391b9f3ff.png

ef104dfb5047ca2ab9b89d9d7db4390d.png

1d16f70bd4244109cbf3b4645279fa91.png

068da96b850ca26e493feb711c2b77e3.png


http://www.kler.cn/news/284435.html

相关文章:

  • UE5学习笔记18-使用FABRIK确定骨骼的左手位置
  • 《C++与新兴数据库技术的完美交互:开启高效数据处理新时代》
  • sort,uniq,wc,awk命令 (数据整理
  • 【软件测试专栏】认识软件测试、测试与开发的区别
  • Linux——命令行文件的管理(创建,复制,删除,移动文件,硬链接与软链接)
  • 纷享销客CRM渠道分销之多维度数据分析介绍
  • STM32 - 笔记3
  • mysql启动失败问题汇总
  • 黑马点评——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装
  • ES(Elasticsearch)可视化界面-浏览器插件
  • python-春游
  • 【Qt窗口】—— 对话框
  • 操作系统面试真题总结(二)
  • Mac下的压缩包和Win看到的不一样怎么办 Mac压缩后Win电脑看文件名会乱码
  • 利用Leaflet.js创建交互式地图:多种形状单个区域绘制
  • 揭秘!糖尿病:从绝望到希望的治愈之路
  • mysql实用系列:coalesce函数的使用
  • 【GIT】idea中实用的git操作,撤回commit,撤回push、暂存区使用
  • 一些好用的网站和api合集
  • 【Python机器学习】NLP词频背后的含义——隐性狄利克雷分布(LDiA)
  • JavaWeb - Maven
  • GMS——利用 ChatGPT 和扩散模型进行制造业革命
  • css-functions-图形函数
  • 08:Logic软件原理图添加元件
  • 【Java设计模式】指挥官模式:轻松编排复杂命令
  • zookeeper命令 及 ACL控制
  • 什么是计算机视觉?
  • IOS 14 封装网络请求框架
  • 银河麒麟高级服务器操作系统(Host版)V10 安装
  • Java算法之梳排序(Comb Sort)