什么是 Executor
Executor 是一個獨立的 gRPC 微服務,它可以在 DocumentArray 上執行任務。Executor Hub 上有大量預構建的 Executor 可供選擇,包含了各種常見的任務,如文本分類,圖像識別、目標檢測等。
ExecutorHub:cloud.jina.ai/executors
為了讓你能夠更輕松地部署和管理微服務,我們正將 Executor 從 Flow 中分離出來。同時,也方便你更好地利用 Jina 的其他強大功能,比如:
利用 gRPC 和 protobuf 實現高效的網絡傳輸和序列化,更快地處理數據和模型之間的通信;
使用 DocArray 更準確、靈活地表示多模態數據,以滿足不同場景下的需求;
“Array-first”概念,將輸入數據分批進行模型推理,可以大幅提高吞吐量,使你的模型處理更加高效;
輕松地將 ML 模型部署到生產環境中,享受云原生所帶來的便利和絲滑。
此外,請密切關注即將推出的 Jina AI Cloud(cloud.jina.ai),在 Jina Cloud 上免費運行模型部署。
Jina 吉祥物
前段時間,我們在周五一起喝酒聊天的時候,突然聊到要不要給 Jina 選一個可愛的吉祥物,就像米其林輪胎人一樣。
酒后頭腦風暴之后,我們最終的決定是「彩虹獨角獸蝴蝶小貓」,考慮到基因改造工程的復雜度,要怎么真正創造出這樣一個神奇的新生物呢?我們決定先動手畫張圖:
但想一想,還有什么比使用 Jina 本身更好的方式來生成 Jina 的吉祥物呢?考慮到這一點,我們立馬開發了一個圖像生成的 Executor 和 Deployment。因此,在這篇文章中,我們將介紹如何將模型構建成 Executor、部署它、擴展它以及與全世界共享它。
構建 Executor
需要一個 GPU 才能在本地運行和部署這個 Executor。但你也可以調整代碼,使用 Executor Hub Sandbox 版本,托管在 Jina AI Cloud上。
在 Jina 中部署服務時總是以 Executor 的形式進行。Executor是一個Python類,用于轉換和處理 Document??梢詫⑽谋?圖像編碼為向量、OCR、從 PDF 中提取表格等等,不僅限于圖像生成。
當然如果你只是想把它用起來,而不是從頭開始構建它,可以直接跳到 Executor Hub 部分。
在本教程中,我們將重點關注 Executor 和 Deployment,而不會深入研究 Stable Diffusion 模型的復雜性。我們希望本教程適用于任何微服務或模型,而不是只適用特定用例。
以下大致就是我們希望 Executor 看起來的樣子。用戶傳入提示詞,Executor 使用該提示詞生成圖像,然后將該圖像傳回給用戶:
先決條件
您需要安裝 Hugging Face Diffusers,pip install diffusers[torch]。
現在,讓我們從整體上看一下 Executor 代碼,然后逐節分析:
我們將從創建開始 text_to_image.py:
from docarray import DocumentArray from jina import Executor, requests import numpy as np class TextToImage(Executor): def __init__(self, **kwargs): super().__init__(**kwargs) import torch from diffusers import StableDiffusionPipeline self.pipe = StableDiffusionPipeline.from_pretrained( "CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16 ).to("cuda") @requests def generate_image(self, docs: DocumentArray, **kwargs): # image here is in PIL format images = self.pipe(docs.texts).images for i, doc in enumerate(docs): doc.tensor = np.array(images[i])
Imports
from docarray import DocumentArray from jina import Executor, requests import numpy as np
注:Documents 和 DocumentArrays 是 Jina 的原生 IO 格式。
Executor 類
class TextToImage(Executor): def __init__(self, **kwargs): super().__init__(**kwargs) import torch from diffusers import StableDiffusionPipeline self.pipe = StableDiffusionPipeline.from_pretrained( "CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16 ).to("cuda")
所有 Executor 都是從 Jina 的 Executor 類創建的。用戶可定義的參數是方法中定義的參數__init__()。
Requests 裝飾器
@requests def generate_image(self, docs: DocumentArray, **kwargs): # image here is in PIL format images = self.pipe(docs.texts).images for i, doc in enumerate(docs): doc.tensor = np.array(images[i])
當你在一個 Executor 中定義了一個方法,并使用了@requests 裝飾器,那么你就可以通過端點調用這個方法。當你沒有指定端點路徑時,那么這個方法會成為默認處理程序。
這里我們沒有像@requests(on='/foo') 這樣指定端點路徑,只是使用了裸的@requests,所以當調用 Executor 時,generate_image() 方法會成為默認處理程序。
部署我們的微服務
那么,現在我們有了 Executor,下一步當然就是部署啦!通過 Deployment,你可以運行和擴展 Executor,添加 replicas(副本), shards(分片) 和 dynamic batching(動態批處理)。此外,部署到 Kubernetes 或 Docker Compose 也很容易,我們將在本文后面介紹。
1. Deploy via Python API
運行 python deployment.py
from jina import Deployment from text_to_image import TextToImage with Deployment(uses=TextToImage, timeout_ready=-1, install_requirements=True) as dep: dep.block()
2. Deploy via YAML
使用 CLI 運行 YAML 部署:jina deployment --uses deployment.yml
jtype: Deployment with: port: 12345 uses: TextToImage py_modules: - text_to_image.py # name of the module containing Executor timeout_ready: -1 install_requirements: True And run the YAML Deployment with the CLI: jina deployment --uses deployment.yml
無論您運行哪種 Deployment,您都會看到以下輸出:
──────────────────────────────────────── Deployment is ready to serve! ───────────────────────────────────────── ╭────────────── Endpoint ───────────────╮ │ Protocol GRPC │ │ Local 0.0.0.0:12345 │ │ Private 172.28.0.12:12345 │ │ Public 35.230.97.208:12345 │ ╰──────────────────────────────────────────╯
與我們的微服務通信
我們可以使用 Jina Client 通過 gRPC 向我們的服務發送請求。如前所述,我們使用 Document 作為基本的 IO 格式:
運行 client.py 獲得我們的夢中精靈貓。
from docarray import Document from jina import Client image_text = Document(text='rainbow unicorn butterfly kitten') client = Client(port=12345) # use port from output above response = client.post(on='/', inputs=[image_text]) response[0].display()
擴展我們的微服務
Jina 有開箱即用的可擴展功能,如副本、分片和動態批處理。這使您可以輕松增加應用程序的吞吐量。
讓我們部署 Deployment,并使用副本和動態批處理對其進行擴展。我們將:
創建兩個副本,每個副本分配一個 GPU。
啟用動態批處理以并行處理傳入同一模型的請求。
這是 Deployment 的原始(未擴展)deployment.yml:
jtype: Deployment with: timeout_ready: -1 uses: jinaai://jina-ai/TextToImage install_requirements: true
現在讓我們擴大規模:
jtype: Deployment with: timeout_ready: -1 uses: jinaai://jina-ai/TextToImage install_requirements: true env: CUDA_VISIBLE_DEVICES: RR replicas: 2 uses_dynamic_batching: # configure dynamic batching /default: preferred_batch_size: 10 timeout: 200
我們通過 CUDA_VISIBLE_DEVICES添加了 GPU 支持,使用了兩個副本(每個副本分配一個 GPU)和動態批處理,可以累積并批處理請求,再發送到 Executor。
假設您的機器有兩個 GPU,使用擴展后的 Deployment YAML 會比普通部署獲得更高的吞吐量。
感謝 YAML 語法,你可以直接注入部署配置,不用修改 Executor 代碼。當然了,所有這些也可以通過 Python API 完成。
Kubernetes, Docker Compose andOpenTelemetry
使用 Kubernetes 和 Jina 很容易
jina export kubernetes deployment.yml ./my-k8s kubectl apply -R -f my-k8s
同樣的,Docker Compose 也很容易
jina export docker-compose deployment.yml docker-compose.yml docker-compose up
甚至,使用 OpenTelemetry 進行 tracing(跟蹤) 和 monitoring (監視) 也很簡單。
from docarray import DocumentArray from jina import Executor, requests class Encoder(Executor): @requests def encode(self, docs: DocumentArray, **kwargs): with self.tracer.start_as_current_span( 'encode', context=tracing_context ) as span: with self.monitor( 'preprocessing_seconds', 'Time preprocessing the requests' ): docs.tensors = preprocessing(docs) with self.monitor( 'model_inference_seconds', 'Time doing inference the requests' ): docs.embedding = model_inference(docs.tensors)
您可以集成 Jaeger 或任何其他分布式跟蹤工具,來收集和可視化請求級別和應用級別的服務操作屬性。這有助于分析請求-響應生命周期、應用程序行為和性能。要使用 Grafana,你可以下載這個 JSON 文件并導入 Grafana:
共享你的 Executor
使用 Executor Hub 共享你的 Executors 或使用公共/私有 Executors,幾乎不需要擔心依賴關系。
創建 Hub-ready Executor:
jina hub new
將其推送到 Executor Hub:
jina hub push
您可以通過 Python 在 Deployment 中使用 Hub Executor:
Deployment(uses='jinaai://jina-ai/TextToImage', install_requirements=True) # download and run locally Deployment(uses='jinaai+docker://jina-ai/TextToImage') # run in Docker container Deployment(uses='jinaai+sandbox://jina-ai/TextToImage') # run in hosted sandbox
或者 YAML:
uses: jinaai://jina-ai/TextToImage # download and run locally install_requirements: true uses: jinaai+docker://jina-ai/TextToImage # run in Docker container uses: jinaai+sandbox://jina-ai/TextToImage # run in hosted sandbox
Executor Hub 管理后端的所有內容,包括:
云端自動構建;
高效且經濟地存儲、部署和交付 Executor;
自動解決版本沖突和依賴;
通過 Sandbox 即時交付任何 Executor,而無需將任何內容 pull 到本地;
將微服務串聯成pipeline 中
有時你可能希望將微服務串聯成一個 pipeline。這就是 Flow 的用武之地。我們將在以后的博客中更深入地介紹如何構建 Flow,目前您可以查看我們的 README。
Readme: get.jina.ai
總結
正如用 Executor 和 Deployment 包裝微服務或模型一樣,我們也必須總結這篇文章??偨Y一下我們所涵蓋的內容:
使用 Jina,你可以將模型包裝為 Executor,通過 Deployment 可以直接部署這些 Executor,或者將他們串聯成 pipeline 作為 Flow 去部署。
Jina 與 Kubernetes、Docker Compose 和 OpenTelemetry 集成輕而易舉。
你可以在 Executor Hub 輕松找到和共享所有內容。
如果您想繼續深入了解,請查看我們的文檔以獲取有關 Executors 和 Deployments 的更多信息,或者使用 Jina Flows 查看 pipeline。您還可以聯系我們的 Slack 社區jina.ai/community。
多多和我們互動吧!這樣我們才更加有動力分享出更多好文章,未來我們將發布更多文章深入探討作為人人可用的多模態數據平臺,如何利用 Jina 地云原生,MLOps 和 LMOps 技術,讓每個企業和開發者都能享受到最好的搜索和生成技術。
Jina 吉祥物之彩虹獨角獸蝴蝶小貓排行榜
像所有圖像生成一樣,我們花了很長時間才生成一只完美的可愛小貓。
審核編輯:劉清
-
gpu
+關注
關注
28文章
4743瀏覽量
128985 -
執行器
+關注
關注
5文章
378瀏覽量
19368 -
CLI
+關注
關注
1文章
79瀏覽量
8564 -
YAML
+關注
關注
0文章
21瀏覽量
2332
原文標題:如何用 Jina 部署深度學習模型
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論