接入 NVIDIA A100、吞吐量提高 10 倍!Milvus GPU 版本使用指南

Milvus 2.3 正式支持 NVIDIA A100!

作为为数不多的支持 GPU 的向量数据库产品,Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化,尤其是与此前的 CPU 版本相比,不仅吞吐量提高了 10 倍,还能将延迟控制在极低的水准。

不过,正如我前面提到的,鲜有向量数据库支持 GPU,这其中除了有技术门槛较高的因素外,还涉及诸多不确定性的问题。那么,Milvus 为什么要做一件充满挑战的事情?

回想 Milvus 决定支持 GPU 的场景,很多细节仍旧历历在目。当时,随着 LLM 的兴起,用户对于向量数据库的性能提出了更高的要求,尤其是在一些对性能、延迟有着极高要求的场景,只通过 CPU 索引来支撑的难度越来越高,而 GPU 有着非常强大的并行处理能力。

因此,我们决定在 Milvus 2.3 版本中支持 GPU。幸运的是,来自 NVIDIA 的小伙伴给予了我们诸多支持,他们主动给我们提供了Rapid Raft GPU 索引接入 Milvus 的支持代码。在 NVIDIA 和 Milvus 团队的共同努力下,Milvus GPU 版本如约而至。

接下来,我们就来看看如何使用 Milvus GPU 版本。

01.CUDA 驱动安装

首先,在我们的宿主机环境中,需要检查系统中是否已经正确的识别 NVIDIA 显卡,在命令行中输入:

复制代码
lspci

在输出的设备中,看到 NVIDIA 字段,则说明该系统中已经安装了 NVIDIA 显卡。

复制代码
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma]
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.3 Non-VGA unclassified device: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:03.0 VGA compatible controller: Amazon.com, Inc. Device 1111
00:04.0 Non-Volatile memory controller: Amazon.com, Inc. Device 8061
00:05.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)
00:1e.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
00:1f.0 Non-Volatile memory controller: Amazon.com, Inc. NVMe SSD Controller

以上是我的环境中的输出,可以看到其中识别到一张 NVIDIA T4 显卡。

接下来,可以去 NVIDIA 官方网站,添加 repo installer。

复制代码
https://developer.nvidia.com/cuda-downloads

以 ubuntu 20.04 为例:

复制代码
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update

这里需要注意,如果宿主机没有 cuda 的需要,可以不安装 cuda;如果是 server 版本的操作系统,可以安装 headless 版本驱动;如果是 desktop 版本的系统,可以安装普通版本。

  • server

    sudo apt install nvidia-headless-535
    sudo apt install nvidia-utils-535

  • desktop

    sudo apt install nvidia-driver-535
    sudo apt install nvidia-utils-535

安装完成之后,需要重启一下系统,使得驱动生效。重启完成,可以输入:

复制代码
nvidia-smi

如果可以看到详细的显卡状态,即表示驱动安装 OK。

Milvus GPU 版本镜像使用 cuda 11.8 打包,如果是 NVIDIA Tesla 系列专业显卡,需要的最小驱动版本>=450.80.02;如果是游戏显卡,需要驱动版本>=520.61.05。

Milvus GPU 镜像支持 Compute Capability 为 6.1、7.0、7.5、8.0 的 NVIDIA 显卡,查看显卡型号对应的Compute Capability,请参阅 https://developer.nvidia.com/cuda-gpus。NVIDIA Container Toolkit 安装则参考 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

02.Milvus GPU 可配环境变量

Milvus GPU 版本目前仅支持单个 Milvus 进程单个显卡,Milvus GPU 版本默认使用 device 0 显卡。如果需要使用多卡,可以通过启动多个 Milvus 进程或者容器,然后配合 CUDA_VISIBLE_DEVICES 环境变量来实现多卡部署。

容器环境下,可以通过 -e 来设置该环境变量:

复制代码
sudo docker run --rm -e NVIDIA_VISIBLE_DEVICES=3 milvusdb/milvus:v2.3.0-gpu-beta

在 docker-compose 环境中,可以通过 device_ids 字段来设置,参考 https://docs.docker.com/compose/gpu-support/

注意,为单个 Milvus 进程或者单个容器配置了多张卡可见,Milvus 也只能使用其中的一张卡。

KNOWHERE_STREAMS_PER_GPU 环境变量可以用来设置 cuda stream 的并发数。适当的调大此参数,有可能获得更好的性能,但是,也会带来更多的显存开销。

KNOWHERE_GPU_MEM_POOL_SIZE 环境变量可以用来设置显存池大小。如果不设置改环境变量,Milvus 会自动分配当前 GPU 的一半内存作为显存池,如果在服务的过程中,出现显存池容量不足,那么 Milvus 会自动尝试再次增加显存池大小,默认上限是整个显存大小。

复制代码
export KNOWHERE_GPU_MEM_POOL_SIZE=2048;4096

以上设置显存池初始大小为 2048 MB,最大显存池大小为 4096 MB。

如果在一张卡上部署 2 个 Milvus进程,那么,此环境变量一定需要合理的分配,否则 Milvus 会出现显存竞争崩溃的情况。

03.Milvus GPU 编译

本地编译 Milvus GPU 版本需要依赖英伟达提供的 cuda-toolkit,在安装 cuda-toolkit 请先完成 NVIDIA 驱动的安装:

复制代码
sudo apt install --no-install-recommends cuda-toolkit 

本地编译 Milvus GPU 之前,我们需要先安装部分依赖软件以及工具:

复制代码
sudo apt install python3-pip libopenblas-dev libtbb-dev pkg-config

安装 conan:

复制代码
pip3 install conan==1.59.0 --user
expoprt PATH=$PATH:~/.local/bin

安装较新版本的 cmake>=3.23,参考 https://apt.kitware.com。golang 的安装可以参考 https://go.dev/doc/install

复制代码
make milvus-gpu

启动 milvus standalone 模式:

复制代码
cd bin
sudo ./milvus run standalone

在配置好 nvidia-docker 或者 docker 替代品的情况下,可以很方便地使用 Milvus 提供的 docker-compose.yml 文件来完成容器化部署。

用户可以从 milvus repo 中获取 docker-compose.yml 文件,地址 https://github.com/milvus-io/milvus/blob/master/deployments/docker/gpu/standalone/docker-compose.yml

复制代码
 docker-compose up -d

至此,便可完成 standalone 模式的 Milvus 部署。

如果用户宿主机有多张显卡,可以通过修改 docker-compose.yml 中的 device_ids 字段来修改映射到 Milvus 的显卡。

以上就是关于 Milvus GPU 版本使用说明的全部内容,大家有任何疑问都可以与我们交流。下一篇文章,我们将详解 Knowhere 2.0,欢迎阅读!

🌟「寻找 AIGC 时代的 CVP 实践之星」 专题活动即将启动!

Zilliz 将联合国内头部大模型厂商一同甄选应用场景, 由双方提供向量数据库与大模型顶级技术专家为用户赋能,一同打磨应用,提升落地效果,赋能业务本身。

如果你的应用也适合 CVP 框架,且正为应用落地和实际效果发愁,可直接申请参与活动,获得最专业的帮助和指导!联系邮箱为 business@zilliz.com

本文由mdnice多平台发布

相关推荐
程序员东岸2 天前
C语言入门指南:字符函数和字符串函数
c语言·笔记·学习·程序人生·算法
武子康3 天前
AI-调查研究-76-具身智能 当机器人走进生活:具身智能对就业与社会结构的深远影响
人工智能·程序人生·ai·职场和发展·机器人·生活·具身智能
zyt05023 天前
四、计算机网络与分布式系统(中)
linux·计算机网络·程序人生
郝学胜-神的一滴3 天前
深入探索 Python 元组:从基础到高级应用
运维·服务器·开发语言·python·程序人生
贝塔实验室3 天前
两种常用的抗单粒子翻转动态刷新方法
论文阅读·经验分享·笔记·科技·学习·程序人生·fpga开发
H1004 天前
拉帮结派下的制造麻烦
程序人生
郝学胜-神的一滴4 天前
Linux命令行的核心理念与实用指南
linux·运维·服务器·开发语言·程序人生
孤廖4 天前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
郝学胜-神的一滴5 天前
深入浅出 C++20:新特性与实践
开发语言·c++·程序人生·算法·c++20
孤廖5 天前
从 “模板” 到 “场景”,用 C++ 磨透拓扑排序的实战逻辑
开发语言·c++·程序人生·算法·贪心算法·动态规划·学习方法