使用 BentoML 部署 Hugging Face 模型:DeepFloyd IF 實戰

釋出於 2023 年 8 月 9 日
在 GitHub 上更新

Hugging Face 提供了一個 Hub 平臺,讓您可以輕鬆上傳、分享和部署模型。它為開發人員節省了從頭訓練模型所需的時間和計算資源。然而,在實際生產環境或雲原生方式中部署模型仍然可能帶來挑戰。

這就是 BentoML 的用武之地。BentoML 是一個用於機器學習模型服務和部署的開源平臺。它是一個統一的框架,用於構建、交付和擴充套件生產就緒的 AI 應用程式,包括傳統模型、預訓練模型、生成模型以及大型語言模型。以下是從高層次角度使用 BentoML 框架的方式:

  1. 定義模型:在使用 BentoML 之前,您需要一個機器學習模型(或多個模型)。這個模型可以使用 TensorFlow 和 PyTorch 等機器學習庫進行訓練。
  2. 儲存模型:訓練好模型後,將其儲存到 BentoML 本地模型儲存中,該儲存用於本地管理所有訓練好的模型並訪問它們進行服務。
  3. 建立 BentoML 服務:您建立一個 service.py 檔案來封裝模型並定義服務邏輯。它指定了用於模型大規模推理的 Runner,並公開了 API 來定義如何處理輸入和輸出。
  4. 構建 Bento:透過建立一個 YAML 配置檔案,您可以將所有模型和 Service 打包成一個 Bento,這是一個可部署的artifact,包含所有程式碼和依賴項。
  5. 部署 Bento:Bento 準備就緒後,您可以將 Bento 容器化以建立 Docker 映象並在 Kubernetes 上執行。或者,直接將 Bento 部署到 Yatai,一個開源的端到端解決方案,用於自動化和大規模執行 Kubernetes 上的機器學習部署。

在這篇部落格文章中,我們將演示如何透過遵循上述工作流程將 DeepFloyd IF 與 BentoML 整合。

目錄

DeepFloyd IF 簡介

DeepFloyd IF 是一種最先進的開源文字到影像模型。它憑藉其獨特的執行策略和架構,與 Stable Diffusion 等潛在擴散模型截然不同。

DeepFloyd IF 具有高度的照片真實感和複雜的語言理解能力。與 Stable Diffusion 不同,DeepFloyd IF 直接在畫素空間中工作,利用包含凍結文字編碼器和三個級聯畫素擴散模組的模組化結構。每個模組在過程中扮演著獨特的角色:Stage 1 負責建立 64x64 畫素的基礎影像,然後透過 Stage 2 和 Stage 3 逐步將其升級到 1024x1024 畫素。DeepFloyd IF 獨特性中的另一個關鍵方面是它集成了大型語言模型(T5-XXL-1.1)來編碼提示,這提供了對複雜提示的卓越理解。有關更多資訊,請參閱這篇 關於 DeepFloyd IF 的 Stability AI 部落格文章

為了確保您的 DeepFloyd IF 應用程式在生產環境中以高效能執行,您可能需要明智地分配和管理資源。在這方面,BentoML 允許您為每個階段獨立擴充套件 Runner。例如,您可以為 Stage 1 Runner 使用更多 Pod 或為其分配更強大的 GPU 伺服器。

環境準備

此 GitHub 儲存庫儲存了本專案所需的所有檔案。要在本地執行此專案,請確保您具備以下條件:

  • Python 3.8+
  • 已安裝 pip
  • 至少 2x16GB 視訊記憶體 GPU 或 1x40GB 視訊記憶體 GPU。本專案使用了 Google Cloud 的 n1-standard-16 型機器,外加 64GB 記憶體和 2 塊 NVIDIA T4 GPU。請注意,雖然可以在單塊 T4 上執行 IF,但生產級服務不建議這樣做。

滿足先決條件後,將專案儲存庫克隆到本地計算機並導航到目標目錄。

git clone https://github.com/bentoml/IF-multi-GPUs-demo.git
cd IF-multi-GPUs-demo

在構建應用程式之前,讓我們簡要了解一下此目錄中的關鍵檔案:

  • import_models.py:定義 IFPipeline 各階段的模型。您可以使用此檔案將所有模型下載到本地機器,以便將它們打包成一個 Bento。
  • requirements.txt:定義本專案所需的所有包和依賴項。
  • service.py:定義了一個 BentoML 服務,其中包含使用 to_runner 方法建立的三個 Runner,並公開了一個用於生成影像的 API。該 API 接收一個 JSON 物件作為輸入(即提示和負面提示),並透過使用一系列模型返回一個影像作為輸出。
  • start-server.py:透過 service.py 中定義的服務啟動 BentoML HTTP 伺服器,並建立一個 Gradio Web 介面供使用者輸入提示以生成影像。
  • bentofile.yaml:定義要構建的 Bento 的元資料,包括 Service、Python 包和模型。

我們建議您為依賴隔離建立一個虛擬環境。例如,執行以下命令啟用 myenv

python -m venv venv
source venv/bin/activate

安裝所需的依賴項

pip install -r requirements.txt

如果您以前沒有使用命令列從 Hugging Face 下載過模型,則必須先登入

pip install -U huggingface_hub
huggingface-cli login

將模型下載到 BentoML 模型儲存

如上所述,您需要下載 DeepFloyd IF 各階段使用的所有模型。設定好環境後,執行以下命令將模型下載到本地模型儲存中。此過程可能需要一些時間。

python import_models.py

下載完成後,檢視模型儲存中的模型。

$ bentoml models list

Tag                                                                 Module                Size       Creation Time
sd-upscaler:bb2ckpa3uoypynry                                        bentoml.diffusers     16.29 GiB  2023-07-06 10:15:53
if-stage2:v1.0                                                      bentoml.diffusers     13.63 GiB  2023-07-06 09:55:49
if-stage1:v1.0                                                      bentoml.diffusers     19.33 GiB  2023-07-06 09:37:59

啟動 BentoML 服務

您可以使用 start-server.py 檔案直接執行 BentoML HTTP 伺服器,該伺服器帶有由 Gradio 提供支援的 Web UI。這是此應用程式的入口點。它提供了各種選項,用於自定義執行和管理不同階段之間的 GPU 分配。您可以根據您的 GPU 設定使用不同的命令:

  • 對於視訊記憶體超過 40GB 的 GPU,所有模型都在同一個 GPU 上執行。

    python start-server.py
    
  • 對於兩個各有 15GB 視訊記憶體的 Tesla T4,將 Stage 1 模型分配給第一個 GPU,將 Stage 2 和 Stage 3 模型分配給第二個 GPU。

    python start-server.py --stage1-gpu=0 --stage2-gpu=1 --stage3-gpu=1
    
  • 對於一個擁有 15GB 視訊記憶體的 Tesla T4 和兩個視訊記憶體較小的額外 GPU,將 Stage 1 模型分配給 T4,Stage 2 和 Stage 3 模型分別分配給第二和第三個 GPU。

    python start-server.py --stage1-gpu=0 --stage2-gpu=1 --stage3-gpu=2
    

要檢視所有可自定義選項(例如伺服器埠),請執行:

python start-server.py --help

測試伺服器

伺服器啟動後,您可以訪問 Web UI:https://:7860。BentoML API 端點也可透過 https://:3000 訪問。以下是一個提示和負面提示的示例。

提示

橙色和黑色,一個女人站在路燈下的頭像特寫,暗黑主題,弗蘭克·米勒風格,電影感,超現實,氛圍感,細節極其豐富,超現實主義,8k 解析度,照片級真實感,高紋理,複雜細節

負面提示

平鋪,手部繪製不佳,腳部繪製不佳,臉部繪製不佳,超出框架,變異,突變,多餘肢體,多餘腿,多餘手臂,毀容,變形,斜視,身體超出框架,模糊,糟糕的藝術,糟糕的解剖結構,模糊,文字,水印,顆粒感

結果

Output image

構建並提供 Bento 服務

現在您已成功在本地執行 DeepFloyd IF,可以透過在專案目錄中執行以下命令將其打包到 Bento 中。

$ bentoml build

Converting 'IF-stage1' to lowercase: 'if-stage1'.
Converting 'IF-stage2' to lowercase: 'if-stage2'.
Converting DeepFloyd-IF to lowercase: deepfloyd-if.
Building BentoML service "deepfloyd-if:6ufnybq3vwszgnry" from build context "/Users/xxx/Documents/github/IF-multi-GPUs-demo".
Packing model "sd-upscaler:bb2ckpa3uoypynry"
Packing model "if-stage1:v1.0"
Packing model "if-stage2:v1.0"
Locking PyPI package versions.

██████╗░███████╗███╗░░██╗████████╗░█████╗░███╗░░░███╗██╗░░░░░
██╔══██╗██╔════╝████╗░██║╚══██╔══╝██╔══██╗████╗░████║██║░░░░░
██████╦╝█████╗░░██╔██╗██║░░░██║░░░██║░░██║██╔████╔██║██║░░░░░
██╔══██╗██╔══╝░░██║╚████║░░░██║░░░██║░░██║██║╚██╔╝██║██║░░░░░
██████╦╝███████╗██║░╚███║░░░██║░░░╚█████╔╝██║░╚═╝░██║███████╗
╚═════╝░╚══════╝╚═╝░░╚══╝░░░╚═╝░░░░╚════╝░╚═╝░░░░░╚═╝╚══════╝

Successfully built Bento(tag="deepfloyd-if:6ufnybq3vwszgnry").

在本地 Bento 儲存中檢視 Bento。

$ bentoml list

Tag                               Size       Creation Time
deepfloyd-if:6ufnybq3vwszgnry     49.25 GiB  2023-07-06 11:34:52

現在 Bento 已準備好在生產環境中提供服務。

bentoml serve deepfloyd-if:6ufnybq3vwszgnry

要以更雲原生的方式部署 Bento,請執行以下命令生成 Docker 映象:

bentoml containerize deepfloyd-if:6ufnybq3vwszgnry

然後您可以在 Kubernetes 上部署模型。

接下來

BentoML 提供了一種強大而直接的方式來部署 Hugging Face 模型用於生產。憑藉其對各種 ML 框架的支援和易於使用的 API,您可以立即將模型投入生產。無論您是使用 DeepFloyd IF 模型還是 Hugging Face Model Hub 上的任何其他模型,BentoML 都可以幫助您將模型變為現實。

檢視以下資源,瞭解您可以使用 BentoML 及其生態系統工具構建什麼,並繼續關注 BentoML 的更多資訊。

社群

註冊登入 發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.