使用嵌入式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()