在我們進行部署之前,,為了要能夠透過 API 進行使用,所以我們又加上了 Python Flask 作為我們的框架,Flask 是一個輕量級的 Web 應用程式框架,能夠提供我們簡易的 RESTful API 進行操作。
(這部分很簡單,而且也不是我們的重點,所以我們就一一不贅述囉~)
而在完成後,我們就要將我們的 RAG 問答系統進行 Kubernets 的部署啦!
但在這之前我們需要將我們的程式包成正確的 image,才能進行部署~
Dockerfile 是一個文本檔案,包含了一系列指令(commands),這些指令告訴 Docker 如何構建一個 Docker Image。透過這些指令,我們可以指定基礎映像、安裝所需的軟體、設定環境變數、複製應用程式的程式碼、以及定義應用程式的啟動方式等。
以下就是我們的 Dockerfile 的內容:
FROM python:3.10-slim
# Setup Ollama
RUN apt-get update && apt-get install curl -y
RUN curl -fsSL https://ollama.com/install.sh | sh
# 安裝 Ollama
RUN bash -c "ollama serve &"
# 拉取所需的模型
RUN ollama pull gemma2
WORKDIR /src
# 複製應用程式檔案
COPY llm.py /src/llm/llm.py
COPY requirements.txt /src/llm/requirements.txt
COPY entrypoint.sh /src/entrypoint.sh
# 安裝 Python 依賴
RUN pip install -r /src/llm/requirements.txt
# 賦予啟動腳本執行權限
RUN chmod +x /src/entrypoint.sh
# 暴露應用程式 port
EXPOSE 5000
# 使用啟動腳本作為容器入口點
ENTRYPOINT ["/src/entrypoint.sh"]
而由於我們要同時啟動 Ollama 服務和 Flask 應用程式,所以我有在建立一個 Shell Script 檔來進行啟動:
#!/bin/bash
# 啟動 Ollama 服務
ollama serve &
# 等待 Ollama 服務啟動
sleep 5
# 啟動 Flask 應用程式
exec python /src/llm/llm.py
在我們完成 Dockerfile 的撰寫後,就可以用 docker build 的指令將映像檔建立起來,並且再透過 docker push 將我們的 image push 到我們自己的 Docker Hub。
(如果還想知道更多 Docker 相關內容,可以看 Docker 官方文件)
docker build -t demo/image-name:v1 .
docker push demo/image-name:v1
接下來我們就可以進行我們 Kubernetes 的部署啦!
我是在 Ubuntu 22.04 的環境下,在 Kubernetes v1.28.11 上創建 Deployment 與 Service 來進行部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-deployment
labels:
app: llm-app
spec:
replicas: 3 # 可以根據需要調整副本數量
selector:
matchLabels:
app: llm-app
template:
metadata:
labels:
app: llm-app
spec:
containers:
- name: llm-container
image: demo/image-name:v1 # 替換為自己的 Docker Image
ports:
- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
name: llm-service
spec:
type: NodePort
selector:
app: llm-app
ports:
- protocol: TCP
port: 80 # 外部訪問的 port
targetPort: 5000 # 容器內部應用運行的 port
最後再進行部署:
kubectl apply -f llm-deployment.yaml
kubectl apply -f llm-service.yaml
這樣就完成 Kubernetes 的部署啦!
我們可以自己透過打 API 的方式進行詢問囉~