在過去的 GenAI 開發經驗中,微服務與容器化的應用有效提升了開發效率與系統的可擴展性。這兩個概念幫助我更靈活地管理不同功能模塊,實現了獨立的開發與部署,減少了功能之間的相互干擾。在這次的課程中,作者同樣將整個服務拆解成數個子服務,這不僅使得各個子服務互不影響,還在未來進行替換或優化時避免了系統的中斷。
微服務架構的好處在於將大型應用分解為多個可獨立開發、部署和維護的服務,這每個服務都能專注於特定的功能模塊,提升了系統的靈活性和可擴展性。這種架構特別適合快速迭代和頻繁更新的項目,例如生成式 AI 的開發。與單體式應用相比,微服務允許不同的團隊同時開發、測試和部署不同的服務,減少了部署風險,並提高了應用的可維護性。當某一服務需要升級或修正時,其他服務不會受到影響,這使得系統在大規模產品開發和協作中表現更加穩定和高效。
根據過去的開發經驗,以下是我整理出的 GenAI 開發架構設計簡化版,這也可以作為課程架構圖的參考:
在 GenAI 開發過程中,Docker 不僅解決了環境一致性的問題,還大大簡化了部署流程。然而隨著服務規模的擴大,我們可能會遇到映像過大或構建時間過長等挑戰。為了應對這些問題,這裡列出了過去整理的 Dockerfile 的範例、image 優化策略,以及在日常開發中常用的 Docker 命令。
# 使用官方 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"]
優化目標:減少層數(即使在後面層數刪除 cache,安裝該層的仍會保留)、減少 cache 或安裝檔(在安裝那層就要清除)
alpine
, python:3.10-slim
apt-get clean
pip install <package> --no-cache-dir
rm -rf /.../*
.dockerignore
檔案來排除不需要的檔案docker-slim
工具來自動化減少映像大小。這個工具會分析映像並刪除不必要的部分docker build -t rag-service:latest .
docker run -d -p 8000:8000 --name rag-container rag-service:latest
docker exec -it rag-container /bin/bash
docker run -d -p 8000:8000 -v $(pwd):/app rag-service:latest