前のセクション「6.0 デプロイとCI/CDの実装」では、LLMアプリケーションを安定的かつ継続的に運用するための全体的なデプロイ戦略と自動化手法について学びました。
| 技術 | 役割 | LLM 運用でのメリット |
|---|---|---|
| Docker | アプリを可搬なコンテナに固める | 依存関係を丸ごと固定できる |
| Kubernetes (K8s) | コンテナ群をクラスタで管理 | 自動スケール・自動復旧 |
| Helm | K8s マニフェストの雛形化 | 環境ごとの差分管理が楽 |
ここからは、実際にスケーラブルな本番環境を構築するための具体的な実装ステップに進みます。このセクションでは、LLMアプリケーションをDockerでコンテナ化し、それをKubernetesで効率的に展開する方法を、設定ファイルや実行コマンドとともに解説します。
6.1 DockerとKubernetesを使ったスケーラブルなデプロイ
LLMアプリケーションは、リソース消費が激しいため、スケーラブルなデプロイ方法が求められます。DockerとKubernetesを使用することで、簡単にコンテナ化し、効率的にデプロイできます。このセクションでは、基本的なDockerfileとKubernetesの設定例を紹介します。
Dockerfileの作成
まずは、アプリケーションをコンテナ化するためにDockerfileを作成します。以下は、PythonベースのLLMアプリケーション用のDockerfileです。
# ベースイメージ
FROM python:3.9-slim
# 作業ディレクトリの設定
WORKDIR /app
# 依存関係のコピーとインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションのコピー
COPY . .
# ポートの公開
EXPOSE 8080
# アプリケーションの起動
CMD ["python", "main.py"]
このDockerfileは、PythonベースのLLMアプリケーションをコンテナ化します。依存関係をインストールし、ポート8080でアプリケーションを起動します。
Kubernetes Deploymentの設定
次に、Kubernetesを使ってLLMアプリケーションをデプロイします。以下は、基本的なKubernetesのデプロイメント設定ファイルです。
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: llm-app
template:
metadata:
labels:
app: llm-app
spec:
containers:
- name: llm-container
image: your-docker-image:latest
ports:
- containerPort: 8080
resources:
limits:
memory: "512Mi"
cpu: "500m"
この設定ファイルは、LLMアプリケーションを3つのレプリカでデプロイし、リソースの制限を設定しています。これにより、アプリケーションのパフォーマンスとリソース使用量がバランスよく管理されます。
Serviceの設定
KubernetesのServiceを設定することで、外部からアプリケーションにアクセスできるようにします。以下は、NodePort型のService設定例です。
apiVersion: v1
kind: Service
metadata:
name: llm-app-service
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30007
selector:
app: llm-app
このService設定により、ポート30007を通じてLLMアプリケーションにアクセスできるようになります。NodePortは、ローカルクラスタでのテストに便利な設定です。
デプロイの実行
設定ファイルが準備できたら、Kubernetesクラスタにデプロイを実行します。以下のコマンドでデプロイとServiceの作成が行えます。
# デプロイメントの作成
kubectl apply -f deployment.yaml
# Serviceの作成
kubectl apply -f service.yaml
# デプロイ状況の確認
kubectl get pods
これで、Kubernetesクラスタ上でLLMアプリケーションが稼働し、外部からアクセスできるようになります。
GPU を使う LLM 推論では、K8s の nvidia.com/gpu リソース要求とノードセレクタを組み合わせ、GPU 付きノードだけに Pod を配置するのが定石です。
まとめ
このセクションでは、LLMアプリケーションをDockerでコンテナ化し、Kubernetesを使用してスケーラブルなデプロイを行う方法を解説しました。DockerとKubernetesを活用することで、効率的かつ柔軟にアプリケーションを運用できます。次のセクションでは、モデルバージョニングとモニタリングについて説明します。
次は「6.2 モデルバージョニングとモニタリング」です。