本篇文章接上一篇,继续聊聊向量数据库领域,知名的开源技术项目:Milvus,在不同 CPU 架构的 macOS 环境下的编译安装。
如果你在寻找如何从源码编译安装,如何在 x86 和 ARM 两种架构的 macOS 上折腾 Milvus,那么这篇文章应该是最为详细的教程向参考内容啦。
写在前面
关于 Milvus 这个项目的背景知识,以及项目目前的一些现存问题,我在上一篇文章《从零开始构建向量数据库:Milvus 的源码编译安装(一)》中有提到过。所以,就不再做展开了,如果你希望做一些了解,可以自行翻阅之前的内容。
目前,软件可以在 Linux、macOS、Windows 上完成编译,考虑到不少工程师都是使用(或被迫选择)macOS 作为图形界面系统,所以本篇文章仅介绍如何在 macOS 环境下从源码构建 Milvus。
接下来,我们还是先从编译入手,从零到一的开始了解这个项目。
前置准备
在正式折腾编译构建之前,还是先分别从操作系统、开发环境、源码获取等几个方面来展开聊聊要做哪些准备工作。
操作系统
本文选择的 macOS 版本是最新版 12.4,一般情况下,我们只要打开系统更新,然后让设备自己更新到最新版本,就完成了 80% 的系统环境相关的准备工作啦。
如果你希望在一个全新的环境中进行安装,避免所有的潜在干扰,可以参考苹果官方文档对系统进行重装(绝大多数情况下,不需要这样操作):
- 《重新安装 macOS》
- 《如何创建可引导的 macOS 安装器》
对于完成剩余 20% 的工作,我们需要借助 Homebrew。由于 Homebrew 使用了海外的 CDN 服务,所以我们在国内进行软件下载,可能会受到一些网络因素的影响,导致软件下载过程中断或失败。
如果你希望能够避免这类网络的影响,可以尝试使用国内的“清华源镜像”来尝试安装这些软件。
如果你能够直接完成依赖和工具的下载,那么就不需要配置“镜像”,因为镜像的同步机制,存在数据同步不完整的情况,在这个情况下,我们进行依赖安装,可能会出现部分依赖失败。解决这个问题也很简单,只需要在安装进行不下去的时候,“unset” 掉“镜像”,切换为官方源即可。
Golang 和 C 开发环境
在上一篇文章中,我们就提到过,Milvus 中绝大多数代码是由 Golang 编写的,但是核心的部分又包含了一大堆 C 的内容(internal/core/src),所以我们需要同时确保两种语言的运行环境。
为了让 Golang 环境的折腾能省点劲,我曾写过两篇文章介绍简单可行的方案:
- 如何在 Linux 环境中《搭建可维护的 Golang 开发环境》(同样适用于 macOS)
- 以及在《M1 芯片 Mac 上更好的 Golang 使用方案》(同样适用于 Intel 芯片的 x86 架构)
经过实际测试,只需要按照文章中的步骤,一步一步 “CTRL C / CTRL V”,这个方案一定能够让你在十分钟内,快速的用上新鲜热乎的 Golang。
关于 C 环境的准备,我们会在下文中详细的展开,这里就先不赘述啦。
源码获取
关于如何快速获取源代码,以及避免因为代码仓库过大,容易受到一些国内经常会遇到的网络质量影响而“拉(pull)”不下来数据的问题,我在上一篇文章中的相同的小节“源码获取”小节中有提到过,你可以直接参考文中提到的解决方案。为了节约篇幅,这里就不再展开啦。
准备基础依赖库:OpenBLAS
OpenBLAS 作为泛 AI 领域中,经常能够看到的科学计算开源库,自然也是要安装的。(据说未来版本中,会变成可选项)
在之前的文章《走进向量计算:从源码编译 OpenBLAS》中,我详细的介绍了如何进行 OpenBLAS 的编译安装,你可以参考文中的内容,来获取 OpenBLAS 的编译产物,并自行完成编译产物的有效性验证。
如果你是使用 brew
安装的:
openblas is keg-only, which means it was not symlinked into /usr/local,
because macOS provides BLAS in Accelerate.framework.
For compilers to find openblas you may need to set:
export LDFLAGS="-L/usr/local/opt/openblas/lib"
export CPPFLAGS="-I/usr/local/opt/openblas/include"
For pkg-config to find openblas you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/openblas/lib/pkgconfig"
准备构建依赖:cmake
想要构建包含 C 组件的项目,CMake 必不可少。
Milvus 官方项目要求 CMake 的版本是大于等于 3.18,在上一篇文章中,我们有提到了“尽量和官方构建使用相同版本”的建议,不过因为下面的现实问题,完全保持一致的版本比较难,也没有意义:
- Mac M1 芯片设备退出时间点较晚,Milvus 立项时间较早,这导致很多项目使用的软件版本不支持 M1 设备(ARMv64 设备)
- HomeBrew 和 macOS 新版本所预构建的工具的版本号都比较新,安装旧版本非常折腾,且不保证能够通过测试
- 我们很少会使用 macOS 作为生产环境,更多的时候,macOS 会被用来做开发环境,所以我们也并没有必要严格要求这个环境下的组件版本和 Linux 环境下完全一致
但是考虑到过程的严谨,期望构建产物少一些预料之外的问题。在这里,我们还是分别聊聊两种芯片架构的 macOS 设备。
Intel x86 芯片的 macOS 设备
虽然在 CMake 官方网站,我们没有找到预构建程序,但是在 CMake 的 GitHub 仓库发布页面中,我们能够找到和 Milvus 官方 CI 使用版本一致的软件包:3.18.6 版本的 CMake。
将文件下载之后,放到可执行文件目录(/usr/local/bin/
),或者类似我们上文中安装 gvm
的时候,把包含 cmake
的路径添加到环境变量中即可完成预构建的 CMake 的安装。
安装完毕之后,我们同样可以使用 cmake --version
命令,来简单验证安装是否正确:
cmake --version
cmake version 3.18.6
CMake suite maintained and supported by Kitware (kitware.com/cmake).
当然,这里也可以使用 brew install cmake
来直接安装更新版本的 CMake 程序,简化安装过程。
M1 ARMv64 芯片的 macOS
因为直到 3.19.3 以上版本的 cmake 才提供了 ARMv64 支持,所以我们和 macOS 环境中构建 OpenBLAS 小节中遇到了一样的问题:无法在 macOS 环境下,使用和 Milvus 官方仓库中一致版本号的 cmake
。
我们同样有两个选择,一个是参考前文中处理 Intel 芯片 macOS 环境中 CMake 的处理方式,只选择官方开始支持 ARMv64 的软件版本,完成预构建程序的安装。
另外一个方案,则是直接使用 brew install cmake
安装 cmake
最新的 “stable” 版本,因为两种方式本质都使用了较高的新版本 cmake,并没有本质差别,所以我更推荐使用后者,安装 “stable” 版本的软件:
brew install cmake
==> Downloading https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/cmake-3.23.2.arm64_monterey.bottle.tar.gz
######################################################################## 100.0%
==> Pouring cmake-3.23.2.arm64_monterey.bottle.tar.gz
==> Caveats
To install the CMake documentation, run:
brew install cmake-docs
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-lisp/cmake
==> Summary