API 與 Python SDKs 詳解


✏️ 編者按:

API 是什麼?Python SDKs 又是什麼?熟悉 Milvus 數據庫的朋友們應該會立刻聯想到 Milvus protocol API 和 PyMilvus。本期內容能幫助你以一個全新的視角看待 Milvus 和 Milvus 開源社區。

講師簡介:

楊璇,pymilvus-admin 和 Milvus contributor,負責維護 PyMilvus 項目以及研發 Milvus 的 DataNode 模塊。開源社區的狂熱粉絲,積極參與各種開源活動,是 GDG 上海核心志願者成員。武漢大學軟件工程碩士,在 Zilliz 除了擔任軟件開發工程師,還是一個讓部門所有人棄 vscode 轉 vim 的 vim 小學生。


視頻版講解請戳 👇

本期分享分爲三個部分:

1. PyMilvus 和 Milvus protocol API 背景介紹

2. Protocol API 使用方法

3. PyMilvus 代碼深入

  背景介紹

讓我們把 Milvus 當作一個黑盒子。下面這張圖代表了 SDKs 通過 gRPC 與 Milvus 交互的過程, gRPC 使用的是 Protocol buffers 作爲接口定義語言來描述服務端的接口,以及它們傳遞消息的信息結構。Protocol buffers 的語言文件通常以 proto 作爲結尾。所以,Milvus 這個黑盒子的所有行爲實際上都是在 protocol API 裏面進行定義。

PyMilvus protocol API 的具體內容分別爲:

1. milvus.proto

2. common.proto

3. schema.proto
如果 SDKs 想要正常工作,都需要使用這三個 proto 文件與 Milvus 進行交互。本次分享的 Milvus API 便是對這三個文件進行初步解讀。
感興趣的小夥伴可以查閱 Milvus 2.0 SDK roadmap:https://milvus.io/docs/v2.0.0/roadmap.md#SDK
同時,PyMilvus 2.0 版本引入了一套全新的接口——object relational mapping(ORM),它與之前版本的接口非常不同,今天,我們也會聊一聊 ORM 接口的特點以及 PyMilvus 接下來的發展路徑。

  Milvus protocol API

milvus.proto

Milvus protocol API 中最主要的是 milvus.proto,它定義了 MilvusService,而 MilvusService 繼續定義了 Milvus 所有的 RPC 接口。因此,在與 Milvus 進行交互的過程中,這裏需要重點注意。
下圖中的 RPC 接口參數爲 CreatePartitionRequest ,兩個主要參數爲 string 類型的 collection_name 與   partition_name ,基於這幾點就可以創建 collection partition。
這個 protocol 到底長什麼樣子?進入到 PyMilvus 的倉庫(https://github.com/milvus-io/pymilvus/blob/master/pymilvus/grpc_gen/proto/milvus.proto)中,可以在第 19 行找到上方提到的例子:
我們可以在該文件中找到 CreatePartitionRequest 的定義:
如果大家需要開發新功能,或者開發新 SDK,PyMilvus 倉庫可以幫助你查找 Milvus 通過 RPC 對外提供的接口。
common.proto
顧名思義,common.proto 部分是一些 common 的類型。這部分的結構包括了常用的 ErrorCode Status 等:
Schema.proto
在傳參數的時候,需要的 schema 都在這個部分進行定義。 Collection Schema  的示例如下:
上述三個 proto 組合在一起,共同構成了 Milvus 對外的 API,可以在其中找到所有 Milvus 對外的行爲。
你可以閱讀源碼,觀察 create_index() 發現,像 create_index 這樣的對外接口,實際上調用了   describe_collection describe_index 等多個 RPC 接口。總結起來,Milvus 中很多對外接口實際上是由多個 RPC 接口組合而成的功能。
所以,當你理解了這些 RPC 的行爲後,就可以在 SDK 層面通過組合創造新的功能。歡迎大家在這個部分發揮自己的創造力和想象力,爲 Milvus 社區添磚加瓦!

  PyMilvus 2.0

Object-relational mapping(ORM)

ORM 用一句話簡單表述便是:對本地對象操作會影響服務端點一個對象。PyMilvus 的 ORM 接口有以下三個特點:

1. Operate directly on objects. 直接作用於對象。

2. Isolate business logic and data access details. 隔離業務邏輯和數據訪問詳細信息。

3. Hide the implementation complexity, same codes everywhere. 隱藏實現的複雜,一套代碼可以到處跑。
第三點對於 Milvus 而言,無論是作爲 DBS,還是本地的 library,亦或者是 cloud service,無論中間實現的過程是 RPC 還是 python,只要使用 ORM 風格的代碼,那麼這些代碼無需改變就可以適用多種 Milvus server 的狀態。這就是 ORM 抽象出來的好處。
ORM style API
ORM 風格的 API 最大的特點,便是可以控制對 Milvus 的連接。例如,可以添加多個 Milvus server 別名,選擇使用別名去連接或關閉其中的一臺服務。也可以通過刪除本地的 server address,精確控制哪一些對象使用的是哪一臺機器、哪一個連接。
第二個特點是,所有的操作都是直接面向對象進行的操作,對象包括 collection、partition 和 index。當三個對象被抽象出來後,所有對他們的操作都可以直接在對象上進行。
例如,我們想要提取一個 collection 對象,無論這個 collection 是新創建的,還是 Milvus server 裏面已經存在的,都可以通過 collection 這個接口去創建一個對象出來。還可以給對象綁定 connection ,將 films 這個對象用 DEV 別名指代Milvus server,films 在本地會有一些狀態,我們可以對這個對象直接進行各種操作。
如果想要構建一個 partition 對象的話,有兩種方法。這裏只提供了一種:我們可以通過 films 這個 collection 對象去創建一個 partition,拿到了這個 adventure 之後,partition 也會有自己的一些 states。我們可以像對 collection 一樣對 partition 進行同樣的操作。這裏還有一個對象Index。和 partition 類似,我們也可以通過這個 collection 對象 films 去創建一個 index,進行後續的操作。
除了創建新的 addition 和新的 index 這些方法,如果 films 這個 collection 裏面已經存在了 partition 或者是 index 的話,也可以通過 films 這個 collection 對象去提取。


  更多幫助

推薦大家通過 PyMilvus 文檔,真正並深入瞭解使用方法。PyMilvus 文檔由兩部分組成,第一部分是在 API doc-strings 裏面自動生成的,第二部分就是由 PyMilvus contributors 撰寫的、基於用戶使用的角度文檔,非常實用。
大家可以在這裏查看我們所有的文檔:https://milvus.io/docs
PyMilvus 的文檔源代碼查看地址:pymilvus/docs at master · milvus-io/pymilvus




Z i l l i z  
Zilliz  Milvus Milvus  LF AI & Data  用。

閱讀原文,解鎖更多應用場景

本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章