iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
生成式 AI

從系統設計切入,探索 GenAI 在企業中的實踐系列 第 12

[Day12] 微服務與容器化:可以讓產品規模擴大的 RAG 架構

  • 分享至 

  • xImage
  •  

在過去的 GenAI 開發經驗中,微服務與容器化的應用有效提升了開發效率與系統的可擴展性。這兩個概念幫助我更靈活地管理不同功能模塊,實現了獨立的開發與部署,減少了功能之間的相互干擾。在這次的課程中,作者同樣將整個服務拆解成數個子服務,這不僅使得各個子服務互不影響,還在未來進行替換或優化時避免了系統的中斷。

從單體式到微服務

微服務架構的好處在於將大型應用分解為多個可獨立開發、部署和維護的服務,這每個服務都能專注於特定的功能模塊,提升了系統的靈活性和可擴展性。這種架構特別適合快速迭代和頻繁更新的項目,例如生成式 AI 的開發。與單體式應用相比,微服務允許不同的團隊同時開發、測試和部署不同的服務,減少了部署風險,並提高了應用的可維護性。當某一服務需要升級或修正時,其他服務不會受到影響,這使得系統在大規模產品開發和協作中表現更加穩定和高效。

以 GenAI 開發為例,我整理了過去幾次開發的拆解與設計經驗,可以作為課程架構圖的簡化版:

  1. 資料庫:如 AWS S3 負責檔案存放、MongoDB 可以儲存 meta data、pgvector 作向量資料庫等。
  2. 資料處理服務:分成爬蟲工具、資料清洗以及數據切塊與轉向量,可獨立設定定時執行或追蹤指定變更。
  3. 模型服務:獨立運行 LLM 和 embedding 模型,便於因應新模型的推出或不同的 fine-tune 策略。
  4. 前端介面:與使用者交互的平台,負責呈現數據和提供直觀操作。
  5. API gateway:統一管理外部請求,處理認證、負載均衡、以及流量控制等功能。
  6. RAG 服務:專門處理核心功能,包括知識庫檢索和答案生成,確保 GenAI 的實時響應能力。

Docker:統一環境、簡化部署的利器

在 GenAI 開發過程中,Docker 不僅解決了環境一致性的問題,還大大簡化了部署流程。然而隨著服務規模的擴大,我們可能會遇到映像過大或構建時間過長等挑戰。為了應對這些問題,這裡列出了過去整理的 Dockerfile 的範例、image 優化策略,以及在日常開發中常用的 Docker 命令。

Dockerfile 範例

# 使用官方 Python 運行時作為父映像
FROM python:3.11-slim

# 設置工作目錄
WORKDIR /app

# 將當前目錄內容複製到容器中的 /app
COPY . /app

# 安裝必要的套件
RUN pip install --no-cache-dir -r requirements.txt

# 安裝特定版本的 PyTorch 和 transformers
RUN pip install torch==1.9.0+cpu torchvision==0.10.0+cpu torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
RUN pip install transformers==4.11.3

# 暴露應用程序執行的端口
EXPOSE 8000

# 運行應用程序
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Dockerfile 優化策略

優化目標:減少層數(即使在後面層數刪除 cache,安裝該層的仍會保留)、減少 cache 或安裝檔(在安裝那層就要清除)

  • 選擇輕量的 base image,例如 alpine , python:3.10-slim
  • 選擇客製化 base image,只安裝基本的套件
  • 合併指令,避免每個指令都創建一個新層
  • 刪除不必要 cache 或安裝檔:
    • apt-get clean
    • pip install <package> --no-cache-dir
    • rm -rf /.../*
  • 其他輔助工具
    • 使用 .dockerignore 檔案來排除不需要的檔案
    • 使用 docker-slim 工具來自動化減少映像大小。這個工具會分析映像並刪除不必要的部分
  • 使用多階段構建 方法,詳細作法請參考這篇文章

docker 開發常用的指令

  1. 構建映像:docker build -t rag-service:latest .
  2. 運行容器:docker run -d -p 8000:8000 --name rag-container rag-service:latest
  3. 進入運行中的容器:docker exec -it rag-container /bin/bash
  4. 掛載本地目錄:docker run -d -p 8000:8000 -v $(pwd):/app rag-service:latest

上一篇
[Day11] 系統設計課程開始!ML pipeline 介紹
下一篇
[Day13] 從單打獨鬥到團隊協作:Git 流程規範制定
系列文
從系統設計切入,探索 GenAI 在企業中的實踐27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言