使用嵌入式Milvus来即时安装和运行Milvus与Python

1,066 阅读5分钟

使用嵌入式Milvus来即时安装和运行Milvus与Python

Milvus 2.1.0引入了嵌入式Milvus,使更多的Python开发人员在安装和使用Milvus这个矢量数据库时有能力。

Milvus是一个用于AI应用的开源矢量数据库。它提供了多种安装方法,包括从源代码构建和用Docker Compose/Helm/APT/YUM/Ansible安装Milvus。用户可以根据自己的操作系统和偏好,选择其中一种安装方法。然而,在Milvus社区中,有许多数据科学家和人工智能工程师使用Python工作,他们渴望有一个比目前可用的安装方法更简单的方法。

因此,我们在Milvus 2.1中发布了嵌入式Milvus,一个用户友好的Python版本,以增强我们社区中更多的Python开发人员。这篇文章介绍了什么是嵌入式Milvus并提供了如何安装和使用它的说明。

嵌入式Milvus的概述

嵌入式Milvus使你能够快速安装和使用Milvus与Python。它可以快速调出一个Milvus实例,并允许你随时启动和停止Milvus服务。即使你停止嵌入Milvus,所有的数据和日志也会持续存在。

嵌入式Milvus本身没有任何内部依赖,不需要预先安装和运行任何第三方依赖,如etcd、MinIO、Pulsar等。

你用嵌入式Milvus做的所有事情和你为它写的每一段代码都可以安全地迁移到其他Milvus模式--独立、集群、云版本等。这反映了嵌入式Milvus最独特的特点之一--

"一次编写,随处运行"

什么时候使用嵌入式Milvus?

嵌入式Milvus和PyMilvus是为不同的目的构建的。你可以考虑在以下情况下选择嵌入式Milvus。

  • 你想在不安装Milvus的情况下使用Milvus,在这里提供的任何方式。
  • 你想使用Milvus而不在你的机器中保留一个长期运行的Milvus进程。
  • 你想快速使用Milvus,而不启动单独的Milvus进程和其他必要的组件,如etcd、MinIO、Pulsar等。

建议你不要使用嵌入式Milvus:

  • 在生产环境中。(要在生产中使用Milvus,请考虑Milvus集群或Zilliz云,这是一个完全管理的Milvus服务。)
  • 如果你对性能有很高的要求。(相对来说,嵌入式Milvus可能不会提供最好的性能。)

Milvus的不同模式的比较

下表比较了Milvus的几种模式:独立、集群、嵌入式Milvus和Zilliz云,一个完全管理的Milvus服务。


嵌入式Milvus

独立的Milvus

Milvus集群

Zilliz云

(一个完全管理的Milvus服务)

生产准备好了吗?

不建议用于生产

是的

是的

是的

特点

Milvus 2.1的所有功能

所有Milvus 2.1的功能

所有Milvus 2.1的功能

所有Milvus 2.1的功能

支持SDK

蟒蛇


Python、Java、Go

Python、Java、Go

Python、Java、Go

需要Docker吗?

不需要

需要

是的,需要

是的,需要

需要Kubernetes吗?


不需要

不需要

不需要,但强烈建议

是的

是否需要像MinIO那样的外部S3?

不需要

需要

是的

是的

需要外部的etcd吗?

不需要(etcd是嵌入式的)。

需要外部的Pulsar/Kafka吗?

不需要

不需要

是的

绩效

非常高

非常高

非常高

可用性

中等

高(不含kubernetes)

非常高(有kubernetes)。

非常高


可扩展性

非常高

如何安装嵌入式Milvus?

在安装嵌入式Milvus之前,你需要首先确保你已经安装了Python 3.6或更高版本。嵌入式Milvus支持以下操作系统:

  • Ubuntu 18.04
  • Mac x86_64 >= 10.4
  • Mac M1 >= 11.0

如果满足这些要求,你可以运行$ python3 -m pip install milvus ,安装嵌入式Milvus。你也可以在命令中加入版本来安装特定版本的嵌入式Milvus。例如,如果你想安装2.1.0版本,运行$ python3 -m pip install milvus==2.1.0 。而以后,当嵌入式Milvus的新版本发布时,你也可以运行$ python3 -m pip install --upgrade milvus ,将嵌入式Milvus升级到最新版本。

如果你是Milvus的老用户,之前已经安装了PyMilvus,想要安装嵌入式Milvus,你可以运行$ python3 -m pip install --no-deps milvus

运行安装命令后,你需要在/var/bin/e-milvus 下为嵌入式Milvus创建一个数据文件夹,运行以下命令。

sudo mkdir -p /var/bin/e-milvus
sudo chmod -R 777 /var/bin/e-milvus

启动和停止嵌入式Milvus

当安装成功后,你可以启动该服务。

如果你是第一次运行嵌入式Milvus,你需要先导入Milvus并设置好嵌入式Milvus:

$ python3
Python 3.9.10 (main, Jan 15 2022, 11:40:53)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import milvus
>>> milvus.before()
please do the following if you have not already done so:
1. install required dependencies: bash /var/bin/e-milvus/lib/install_deps.sh
2. export LD_PRELOAD=/SOME_PATH/embd-milvus.so
3. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/local/lib:/var/bin/e-milvus/lib/
>>>

如果你之前已经成功启动了嵌入式Milvus,并且回来重新启动它,你可以在导入Milvus后直接运行milvus.start()

$ python3Python 3.9.10 (main, Jan 15 2022, 11:40:53)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwinType "help", "copyright", "credits" or "license" for more information.
>>> import milvus
>>> milvus.start()
>>>

如果你已经成功启动了嵌入式Milvus服务,你会看到下面的输出:

---Milvus Proxy successfully initialized and ready to serve!---

服务启动后,你可以启动另一个终端窗口,运行"Hello Milvus"的例子代码,来玩玩嵌入式Milvus!

# Download hello_milvus script
$ wget https://raw.githubusercontent.com/milvus-io/pymilvus/v2.1.0/examples/hello_milvus.py
# Run Hello Milvus 

另外,你也可以在同一个终端窗口中运行milvus.start() ,然后立即导入并运行PyMilvus脚本:

$ python3
Python 3.9.10 (main, Jan 15 2022, 11:40:53)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import milvus
--- if you are running Milvus for the first time, type milvus.before() for pre-run instructions ---
--- otherwise, type milvus.start() ---
>>>
>>> milvus.start()
---Milvus Proxy successfully initialized and ready to serve!---
>>>
>>>
>>> import random
>>> from pymilvus import (
...     connections,
...     utility,
...     FieldSchema, CollectionSchema, DataType,
...     Collection,
... )
>>> connections.connect("default", host="localhost", port="19530")
>>> has = utility.has_collection("hello_milvus")
>>> fields = [
...     FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False),
...     FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=8)
... ]
>>> schema = CollectionSchema(fields, "hello_milvus is the simplest demo to introduce the APIs")
>>> hello_milvus = Collection("hello_milvus", schema, consistency_level="Strong")
>>> num_entities = 3000
>>> entities = [
...     [i for i in range(num_entities)], # provide the pk field because `auto_id` is set to False
...     [[random.random() for _ in range(8)] for _ in range(num_entities)],  # field embeddings
... ]
>>> insert_result = hello_milvus.insert(entities)
>>> index = {
...     "index_type": "IVF_FLAT",
...     "metric_type": "L2",
...     "params": {"nlist": 128},
... }
>>> hello_milvus.create_index("embeddings", index)
>>> hello_milvus.load()
>>> vectors_to_search = entities[-1][-2:]
>>> search_params = {
...     "metric_type": "l2",
...     "params": {"nprobe": 10},
... }
>>> result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=3)
>>> for hits in result:
...     for hit in hits:
...         print(f"hit: {hit}")
...
hit: (distance: 0.0, id: 2998)
hit: (distance: 0.1088758111000061, id: 2345)
hit: (distance: 0.12012234330177307, id: 1172)
hit: (distance: 0.0, id: 2999)
hit: (distance: 0.0297045037150383, id: 2000)
hit: (distance: 0.16927233338356018, id: 560)
>>> utility.drop_collection("hello_milvus")
>>> 

当你使用完嵌入式Milvus后,我们建议优雅地停止它,并通过运行以下命令或按Ctrl-D来清理环境变量:

>>> milvus.stop()
if you need to clean up the environment variables, run:
export LD_PRELOAD=
export LD_LIBRARY_PATH=
>>>
>>> exit()