亮點 • 概述 • 安裝 • 入門 • 中心 • 文件 • 教學 • 貢獻 • 發行說明 • 博客
GNES [ jee-nes ] 是Generic Neural Elastic Search ,一個基於深度神經網路的雲端原生語義搜尋系統。
GNES 支援文字到文字、圖像到圖像、影片到影片以及任意到任意內容形式的大規模索引和語義搜尋。
?要了解有關 GNES 關鍵原則的更多信息,請閱讀這篇博文
☁️雲端原生和彈性 | ?方便使用 | ?最先進的 |
---|---|---|
GNES 是全微服務!編碼器、索引器、預處理器和路由器都在自己的容器中運作。它們透過版本化 API 進行通信,並在 Docker Swarm/Kubernetes 等編排下進行協作。 | 部署僅涉及切換 VGG 層的變更需要多長時間?在 GNES 中,這只是 YAML 檔案中的一行變更。我們將編碼和索引邏輯抽象化為 YAML 配置,以便您可以更改或堆疊編碼器和索引器,甚至無需觸及程式碼庫。 | 利用快速發展的 AI/ML/NLP/CV 社區,我們從最佳深度學習模型中學習並將其插入 GNES,確保您始終享受最先進的性能。 |
?通用和通用 | ?模型作為插件 | ?最佳實踐 |
搜尋文字、圖像甚至短影片?使用Python/C/Java/Go/HTTP作為客戶端?無論您擁有哪種內容形式或使用哪種語言,GNES 都可以處理它們。 | 當內建模型無法滿足您的要求時,只需使用 GNES Hub 建立自己的模型即可。將您的模型打包為 docker 容器並將其用作插件。 | 我們喜歡從社區學習最佳實踐,幫助我們的 GNES 實現更高水準的可用性、彈性、性能和耐用性。如果您有任何想法或建議,請隨時貢獻。 |
GNES Hub 將 AI/ML 模型作為 Docker 容器提供,並使用 Docker 容器作為插件。它提供了一種乾淨且可持續的方式將外部演算法(帶有依賴項)移植到 GNES 框架中。 GNES Hub 託管在 Docker Hub 上。 |
有兩種方式取得 GNES,要么是 Docker 映像,要么是 PyPi 包。對於雲端用戶,我們強烈建議透過 Docker 使用 GNES 。
docker run gnes/gnes:latest-alpine
此命令下載最新的 GNES 映像(基於 Alpine Linux)並在容器中運行它。當容器運行時,它會列印一條資訊性訊息並退出。
除了針對該空間最佳化的alpine
映像之外,我們還提供基於 Buster (Debian 10.0)、Ubuntu 18.04 和 Ubuntu 16.04 的映像。下表總結了所有可用的 GNES 標籤。可以用latest
、 stable
或v0..xx
填入{ver}
。 latest
指的是該儲存庫的最新 master ,它可能不穩定。我們建議您透過將latest
版本變更為版本號(例如v0.0.24
來使用官方版本,或簡單地使用stable
作為最後一個版本,例如gnes:stable-ubuntu
標籤 | 尺寸和層數 | 描述 |
---|---|---|
{ver}-alpine | 基於Alpine Linux; 沒有深度學習庫; 極其輕巧便攜,甚至可以在邊緣設備上快速擴展。 | |
{ver}-buster | 基於Debian 10.0; 沒有深度學習庫; 推薦用於建置或擴展 GNES-Hub 映像。 | |
{ver}-ubuntu18 | 基於Ubuntu 18.04; 沒有深度學習庫。 | |
{ver}-full | 基於Ubuntu 16.04; python-3.6.8、cuda-10.0、tf1.14、pytorch1.1、faiss、多個預訓練模型; 沉重但獨立,可用於端對端測試 GNES。 |
️ 自2019年10月21日起,我們已停止託管騰訊雲端公有鏡像。舊的 Docker 映像仍然存在,但騰訊雲端上不會再有新的映像檔可用。
我們也提供公共鏡像Github包。選擇最適合您的鏡子。
docker login --username=xxx docker.pkg.github.com/gnes-ai/gnes # login to github package so that we can pull from it
docker run docker.pkg.github.com/gnes-ai/gnes/gnes:latest-alpine
下表顯示了建置管道的狀態。
登記處 | 建置狀態 |
---|---|
碼頭工人中心gnes/gnes:[tag] | |
Github 包docker.pkg.github.com/gnes-ai/gnes/gnes:[tag] |
pip
安裝 GNES您也可以透過以下方式將 GNES 安裝為Python3套件:
pip install gnes
請注意,這只會安裝 GNES 的「準系統」版本,包含執行 GNES 的最小相依性。不會安裝第三方預訓練模型、深度學習/NLP/CV包。我們將此設定作為預設安裝行為,因為 NLP 工程師感興趣的模型可能對 CV 工程師不感興趣。在 GNES 中,模型充當 Docker 插件。
? Tensorflow、Pytorch 和 torchvision 不屬於 GNES 安裝的一部分。根據您的型號,您可能需要提前安裝它們。
儘管不推薦,您可以透過以下方式安裝具有完整依賴項的 GNES:
pip install gnes[all]
pip 安裝 gnes[bert] | bert-serving-server>=1.8.6,bert-serving-client>=1.8.6 |
pip install gnes[風格] | 天賦>=0.4.1 |
pip install gnes[煩人] | 惹惱==1.15.2 |
pip install gnes[中文] | 結壩 |
pip install gnes[願景] | opencv-python>=4.0.0,imagehash>=4.0 |
pip install gnes[leveldb] | plyvel>=1.0.5 |
pip install gnes[測試] | pylint、memory_profiler>=0.55.0、psutil>=5.6.1、gputil>=1.4.0 |
pip install gnes[變形金剛] | pytorch-變形金剛 |
pip 安裝 gnes[onnx] | 運行時 |
pip 安裝 gnes[音訊] | 圖書館>=0.7.0 |
pip 安裝 gnes[scipy] | scipy |
pip 安裝 gnes[nlp] | bert-serving-server>=1.8.6、pytorch-transformers、flair>=0.4.1、bert-serving-client>=1.8.6 |
pip 安裝 gnes[cn_nlp] | pytorch-transformers、bert-serving-client>=1.8.6、bert-serving-server>=1.8.6、jieba、flair>=0.4.1 |
pip 安裝 gnes[全部] | pylint、psutil>=5.6.1、pytorch-transformers、annoy==1.15.2、bert-serving-client>=1.8.6、gputil>=1.4.0、bert-serving-server>=1.8.6、imagehash >=4.0、onnxruntime、memory_profiler>=0.55.0、jieba、flair>=0.4.1、librosa>=0.7.0、scipy、plyvel>=1.0.5、opencv-python>=4.0.0 |
挑選依賴項的好方法是遵循 GNES Hub 中的範例並建立您自己的 GNES 映像。
無論哪種方式,如果您最終在$ gnes
或$ docker run gnes/gnes
之後閱讀以下訊息,那麼您就可以開始了!
在開始之前,我先介紹GNES中兩個重要的概念:微服務和工作流程。
對於不熟悉雲端原生和微服務概念的機器學習工程師和資料科學家來說,可以將微服務想像成智慧型手機上的應用程式。每個應用程式獨立運行,並且一個應用程式可以與其他應用程式協作來完成任務。在 GNES 中,我們有四個基本應用程式。微服務,它們是:
在GNES中,我們實作了數十個預處理器、編碼器、索引器來處理不同的內容形式,例如影像、文字、影片。插入您自己的實現也非常容易,我們將在續集中看到一個範例。
現在我們有了一堆應用程序,我們期望它們做什麼?典型的搜尋系統有兩個基本任務:索引和查詢。索引是儲存文檔,查詢是搜尋文檔。在神經搜尋系統中,人們可能面臨另一項任務:訓練,其中根據資料分佈微調編碼器/預處理器,以實現更好的搜尋相關性。
這三個任務對應 GNES 中的三個不同工作流程。
自
v0.0.46
起,GNES Flow 已成為 GNES 的主介面。 GNES Flow 提供了一種Pythonic且直覺的方法來實現工作流程,使用戶能夠在本地電腦上運行或調試 GNES。預設情況下,GNES Flow 使用多執行緒或多進程後端編排所有微服務,它還可以匯出到 Docker Swarm/Kubernetes YAML 配置,從而允許將 GNES 交付到雲端。
?完整的範例和相應的 Jupyter Notebook 可以在此處找到。
在此範例中,我們將使用新的gnes.flow
API(需要gnes >= 0.0.46
)建立一個玩具影像搜尋系統,用於根據花朵的相似性進行索引和檢索。
讓我們先定義索引工作流程:
from gnes . flow import Flow
flow = ( Flow ( check_version = False )
. add_preprocessor ( name = 'prep' , yaml_path = 'yaml/prep.yml' )
. add_encoder ( yaml_path = 'yaml/incep.yml' )
. add_indexer ( name = 'vec_idx' , yaml_path = 'yaml/vec.yml' )
. add_indexer ( name = 'doc_idx' , yaml_path = 'yaml/doc.yml' , recv_from = 'prep' )
. add_router ( name = 'sync' , yaml_path = 'BaseReduceRouter' , num_part = 2 , recv_from = [ 'vec_idx' , 'doc_idx' ]))
在這裡,我們使用 inceptionV4 預訓練模型作為編碼器和內建索引器來儲存向量和文件。該流程應該是非常不言自明的,如果不是,您可以隨時將其轉換為 SVG 圖像並查看其視覺化效果:
flow . build ( backend = None ). to_url ()
為了索引我們的花數據,我們需要一個迭代器來產生bytes
字串並將這些bytes
字串輸入到定義的流中。
def read_flowers ( sample_rate = 1.0 ):
with tarfile . open ( '17flowers.tgz' ) as fp :
for m in fp . getmembers ():
if m . name . endswith ( '.jpg' ) and random . random () <= sample_rate :
yield fp . extractfile ( m ). read ()
我們現在可以透過多進程後端進行索引:
with flow ( backend = 'process' ) as fl :
fl . index ( bytes_gen = read_flowers (), batch_size = 64 )
這將需要幾分鐘的時間,具體取決於您的機器。
我們簡單地採樣 20 個花卉圖像作為查詢,並蒐索它們的前 10 個相似圖像:
num_q = 20
topk = 10
sample_rate = 0.05
# do the query
results = []
with flow . build ( backend = 'process' ) as fl :
for q , r in fl . query ( bytes_gen = read_flowers ( sample_rate )):
q_img = q . search . query . raw_bytes
r_imgs = [ k . doc . raw_bytes for k in r . search . topk_results ]
r_scores = [ k . score . value for k in r . search . topk_results ]
results . append (( q_img , r_imgs , r_scores ))
if len ( results ) > num_q :
break
這是結果,其中查詢位於第一行。
人們可以透過以下方式輕鬆地將Flow
物件轉換為 Docker Swarm/Kubernetes YAML 撰寫檔案:
flow . build ( backend = None ). to_swarm_yaml ()
version : ' 3.4 '
services :
Frontend0 :
image : gnes/gnes:latest-alpine
command : frontend --port_in 56086 --port_out 52674 --port_ctrl 49225 --check_version
False --ctrl_with_ipc True
prep :
image : gnes/gnes:latest-alpine
command : preprocess --port_in 52674 --port_out 65461 --host_in Frontend0 --socket_in
PULL_CONNECT --socket_out PUB_BIND --port_ctrl 49281 --check_version False --ctrl_with_ipc
True --yaml_path yaml/prep.yml
Encoder0 :
image : gnes/gnes:latest-alpine
command : encode --port_in 65461 --port_out 50488 --host_in prep --socket_in SUB_CONNECT
--port_ctrl 62298 --check_version False --ctrl_with_ipc True --yaml_path yaml/incep.yml
vec_idx :
image : gnes/gnes:latest-alpine
command : index --port_in 50488 --port_out 57791 --host_in Encoder0 --host_out
sync --socket_in PULL_CONNECT --socket_out PUSH_CONNECT --port_ctrl 58367 --check_version
False --ctrl_with_ipc True --yaml_path yaml/vec.yml
doc_idx :
image : gnes/gnes:latest-alpine
command : index --port_in 65461 --port_out 57791 --host_in prep --host_out sync
--socket_in SUB_CONNECT --socket_out PUSH_CONNECT --port_ctrl 50333 --check_version
False --ctrl_with_ipc True --yaml_path yaml/doc.yml
sync :
image : gnes/gnes:latest-alpine
command : route --port_in 57791 --port_out 56086 --host_out Frontend0 --socket_out
PUSH_CONNECT --port_ctrl 51285 --check_version False --ctrl_with_ipc True --yaml_path
BaseReduceRouter --num_part 2
要部署它,只需將生成的 YAML 設定複製到檔案my-gnes.yml
中,然後執行
docker stack deploy --compose-file my-gnes.yml gnes-531
在此範例中,我們將使用 GNES 建立語義詩歌搜尋引擎。與先前的花搜尋範例不同,這裡我們將每個服務作為獨立的 Docker 容器運行,然後透過 Docker Swarm 編排它們。它代表了雲端設定中的常見場景。您將學習如何使用 GNES 中心中強大且客製化的 GNES 影像。
?請查看此存儲庫以了解詳細資訊並按照說明進行複製。
讓我們簡短回顧一下我們所學到的知識。
GNES 的官方文件託管在 doc.gnes.ai 上。它會在每個新版本中自動建置、更新和存檔。
?教程仍在建設中。敬請關注!同時,我們真誠歡迎您貢獻自己的GNES學習經驗/案例!
PyTorch-Transformers
移植到 GNES 中bert-as-service
遷移我們設定此儲存庫來追蹤不同 GNES 版本的網路延遲。作為 CICD 管道的一部分,當 GNES 主版本更新或發布新的 GNES 版本時,此儲存庫會自動更新。
❤️開始總是最難的。但不用擔心,即使您發現拼字錯誤、缺少文件字串或單元測試,您也可以透過提交 GNES 來簡單地修正它們。步驟如下:
fix-gnes-typo-1
fix(readme): improve the readability and move sections
fix(readme): improve the readability and move sections
幹得好! PR 合併後,接下來會發生以下事情:
-latest
標籤的 Docker 映像將在一小時內自動更新。您可以在這裡查看其建築狀態-stable
標籤的 Docker 映像都會相應更新。更多詳細資訊可以在貢獻者指南中找到。
如果您在學術論文中使用 GNES,我們非常歡迎您進行引用。以下是引用 GNES 的兩種方式:
footnote{https://github.com/gnes-ai/gnes}
@misc{tencent2019GNES,
title={GNES: Generic Neural Elastic Search},
author={Xiao, Han and Yan, Jianfeng and Wang, Feng and Fu, Jie and Liu, Kai},
howpublished={ url {https://github.com/gnes-ai}},
year={2019}
}
如果您已下載 GNES 二進位檔案或原始程式碼的副本,請注意,GNES 二進位檔案和原始程式碼均根據 Apache 授權版本 2.0 授權。
騰訊很高興透過提供 GNES 來支持開源社群。