使用 BentoML 部署 Hugging Face 模型:DeepFloyd IF 實戰
Hugging Face 提供了一個 Hub 平臺,讓您可以輕鬆上傳、分享和部署模型。它為開發人員節省了從頭訓練模型所需的時間和計算資源。然而,在實際生產環境或雲原生方式中部署模型仍然可能帶來挑戰。
這就是 BentoML 的用武之地。BentoML 是一個用於機器學習模型服務和部署的開源平臺。它是一個統一的框架,用於構建、交付和擴充套件生產就緒的 AI 應用程式,包括傳統模型、預訓練模型、生成模型以及大型語言模型。以下是從高層次角度使用 BentoML 框架的方式:
- 定義模型:在使用 BentoML 之前,您需要一個機器學習模型(或多個模型)。這個模型可以使用 TensorFlow 和 PyTorch 等機器學習庫進行訓練。
- 儲存模型:訓練好模型後,將其儲存到 BentoML 本地模型儲存中,該儲存用於本地管理所有訓練好的模型並訪問它們進行服務。
- 建立 BentoML 服務:您建立一個
service.py
檔案來封裝模型並定義服務邏輯。它指定了用於模型大規模推理的 Runner,並公開了 API 來定義如何處理輸入和輸出。 - 構建 Bento:透過建立一個 YAML 配置檔案,您可以將所有模型和 Service 打包成一個 Bento,這是一個可部署的artifact,包含所有程式碼和依賴項。
- 部署 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 解析度,照片級真實感,高紋理,複雜細節
負面提示
平鋪,手部繪製不佳,腳部繪製不佳,臉部繪製不佳,超出框架,變異,突變,多餘肢體,多餘腿,多餘手臂,毀容,變形,斜視,身體超出框架,模糊,糟糕的藝術,糟糕的解剖結構,模糊,文字,水印,顆粒感
結果
構建並提供 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 的更多資訊。
- OpenLLM - 一個用於在生產環境中操作大型語言模型(LLM)的開放平臺。
- StableDiffusion - 使用任何擴散模型建立您自己的文字到影像服務。
- Transformer NLP 服務 - 用於 Transformer NLP 模型的線上推理 API。
- 加入 Slack 上的 BentoML 社群。
- 在 Twitter 和 LinkedIn 上關注我們。