DeepSeek エンタープライズ向けソリューション
デプロイから運用まで、高可用性アーキテクチャ、セキュリティコンプライアンス、権限管理、ログ監査、監視アラート、災害復旧をカバー。完全なアーキテクチャ図と設定を含み、エンタープライズ向けAI導入を支援します。
ソリューションを見るエンタープライズアーキテクチャ概要
完全なエンタープライズ向けDeepSeek推論サービスアーキテクチャ。API Gateway、ロードバランシング、モデルサービス、キャッシュ、監視、ロギングの6つの主要コンポーネントを含みます。
1.1 アーキテクチャ全体図
エンタープライズ向けDeepSeekデプロイメントはレイヤードアーキテクチャを採用しており、各レイヤーは独立してスケーラブルで置き換え可能です。主要コンポーネントは以下の通りです:
| レイヤー | コンポーネント | 技術選定 | 責務 |
|---|---|---|---|
| アクセス層 | API Gateway | Kong / APISIX / Nginx | 認証・認可、レート制限、ルーティング、プロトコル変換 |
| 負荷分散層 | Load Balancer | Nginx / HAProxy / Envoy | トラフィック分散、ヘルスチェック、セッション維持 |
| 推論層 | Model Service | vLLM / SGLang / Ollama | モデル推論、KV Cache管理、バッチ処理 |
| キャッシュ層 | Cache | Redis / Memcached | セマンティックキャッシュ、セッションキャッシュ、レート制限 |
| 監視層 | Monitoring | Prometheus + Grafana | メトリクス収集、可視化、アラート |
| ロギング層 | Logging | ELK / Loki / ClickHouse | ログ収集、検索、監査、コンプライアンス |
1.2 リクエストフローパス
完全なAPIリクエストのフローパス:
→ Load Balancer(ヘルスチェック/ルーティング)→ Model Service(推論)
→ Cache(セマンティックキャッシュヒット時は直接返却)→ 結果返却
→ 同時にLogging(ログ)とMonitoring(メトリクス)に書き込み
1.3 アーキテクチャ設計原則
- 高可用性:各コンポーネントは少なくとも2つのレプリカを持ち、自動フェイルオーバーを実現。
- 拡張性:推論ノードを水平展開し、弾力的にスケーリング。
- 可観測性:全チェーン追跡、メトリクス可視化、自動アラート。
- セキュリティとコンプライアンス:転送時の暗号化、アクセス制御、監査ログ。
- コスト管理:トークン計量、部門別コスト配分、予算アラート。
高可用デプロイ
マルチノードデプロイ、自動スケーリング、ヘルスチェック、フェイルオーバー戦略。DeepSeek推論サービスの99.9%可用性を確保します。
2.1 マルチノードデプロイアーキテクチャ
単一障害点を避けるため、異なる物理マシンまたはアベイラビリティゾーンに少なくとも3つの推論ノードをデプロイします:
# マルチノード vLLM デプロイ(3ノードクラスタ)
# ノード1(192.168.1.11)
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \
--tensor-parallel-size 2 \
--host 0.0.0.0 --port 8000
# ノード2(192.168.1.12)
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \
--tensor-parallel-size 2 \
--host 0.0.0.0 --port 8000
# ノード3(192.168.1.13)
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \
--tensor-parallel-size 2 \
--host 0.0.0.0 --port 8000
2.2 ヘルスチェック設定
ロードバランサーはバックエンドサービスのヘルス状態を定期的にプローブし、障害ノードを自動的に切り離す必要があります:
# Nginx ヘルスチェック設定
upstream deepseek_cluster {
server 192.168.1.11:8000 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8000 max_fails=3 fail_timeout=30s;
server 192.168.1.13:8000 max_fails=3 fail_timeout=30s;
# アクティブヘルスチェック(nginx-plus または nginx-module が必要)
# check interval=3000 rise=2 fall=3 timeout=1000 type=http;
# check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
# check_http_expect_alive http_2xx;
}
# カスタムヘルスチェックスクリプト
# /usr/local/bin/healthcheck-vllm.sh
#!/bin/bash
for node in 192.168.1.11 192.168.1.12 192.168.1.13; do
status=$(curl -s -o /dev/null -w "%{http_code}" http://$node:8000/health)
if [ "$status" != "200" ]; then
echo "ALERT: Node $node is DOWN" | systemd-cat -t healthcheck
# アラート通知をトリガー
fi
done
2.3 フェイルオーバー戦略
| 障害タイプ | 検出方法 | 復旧戦略 | RTO |
|---|---|---|---|
| ノードダウン | ヘルスチェックが3回失敗 | 自動的に切り離し、トラフィックを他のノードに切り替え | < 30s |
| GPU OOM | vLLMプロセスが終了 | systemdで自動再起動、K8sでPodを自動再作成 | < 60s |
| ネットワーク分断 | ノード間のハートビートタイムアウト | 隔離されたノードを切り離し、仲裁後に復旧 | < 10s |
| アベイラビリティゾーン全体の障害 | 複数ノードが同時に到達不能 | DNSをバックアップのアベイラビリティゾーンに切り替え | < 5min |
2.4 Kubernetes HA設定
# deepseek-ha-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deepseek-vllm
namespace: deepseek
spec:
replicas: 3
selector:
matchLabels:
app: deepseek-vllm
template:
metadata:
labels:
app: deepseek-vllm
spec:
# Podアンチアフィニティ:Podを異なるノードに分散させる
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- deepseek-vllm
topologyKey: kubernetes.io/hostname
# グレースフル終了:現在のリクエストを処理するためにPodに30秒与える
terminationGracePeriodSeconds: 30
containers:
- name: vllm
image: vllm/vllm-openai:latest
ports:
- containerPort: 8000
resources:
requests:
nvidia.com/gpu: 2
memory: "64Gi"
limits:
nvidia.com/gpu: 2
memory: "80Gi"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 120
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 60
periodSeconds: 5
failureThreshold: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
2.5 自動スケーリング(HPA)
# deepseek-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: deepseek-vllm-hpa
namespace: deepseek
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: deepseek-vllm
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 30
policies:
- type: Pods
value: 2
periodSeconds: 30
負荷分散
Nginx upstream 設定、least_conn アルゴリズム、Sticky Session、コネクションプール、Keepalive 最適化。トラフィックを均等に分散し、GPU 利用率を最大化します。
3.1 Nginx Upstream 設定
# /etc/nginx/conf.d/deepseek-upstream.conf
upstream deepseek_vllm {
# least_conn アルゴリズム:接続数が最も少ないノードを優先
# LLM 推論シナリオに適しています(リクエストの所要時間のばらつきが大きい)
least_conn;
# 推論ノードプール
server 192.168.1.11:8000 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8000 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.13:8000 weight=1 max_fails=3 fail_timeout=30s;
# バックアップノード(低優先度、全プライマリノードがダウンした場合のみ有効)
server 192.168.1.14:8000 weight=1 backup;
# 長期間接続プール:TCP ハンドシェイクのオーバーヘッドを削減
keepalive 64;
keepalive_requests 1000;
keepalive_timeout 60s;
}
# vLLM 推論サービス(高性能)
upstream deepseek_vllm_large {
least_conn;
server 192.168.1.21:8000 weight=3; # A100 × 8(高ウェイト)
server 192.168.1.22:8000 weight=3; # A100 × 8
server 192.168.1.23:8000 weight=1; # A10 × 1(低ウェイト)
keepalive 32;
}
3.2 Sticky Session(セッション維持)
LLM 推論シナリオでは、Sticky Session により同じユーザーの連続リクエストを同じノードにルーティングし、KV Cache のヒット率を向上させることができます:
# Cookie ベースのセッション維持
upstream deepseek_sticky {
# ip_hash アルゴリズム:同じクライアント IP は常に同じノードにルーティング
ip_hash;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
server 192.168.1.13:8000;
}
# sticky cookie を使用(nginx-plus または sticky-module が必要)
upstream deepseek_sticky_cookie {
# sticky cookie srv_id expires=1h domain=.example.com path=/;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
server 192.168.1.13:8000;
}
3.3 コネクションプールと Keepalive 最適化
| パラメータ | 推奨値 | 説明 |
|---|---|---|
| keepalive | 32-64 | 保持するアイドル接続数。ハンドシェイクのオーバーヘッドを削減 |
| keepalive_requests | 1000 | 1 接続あたりの最大リクエスト数。接続リークを防止 |
| keepalive_timeout | 60s | アイドル接続のタイムアウト時間 |
| proxy_http_version | 1.1 | HTTP/1.1 は Keep-Alive をサポート |
| proxy_set_header Connection | "" | Connection ヘッダーをクリアして接続再利用を有効化 |
3.4 負荷分散アルゴリズムの比較
| アルゴリズム | 原理 | 適用シナリオ | 推奨度 |
|---|---|---|---|
| round-robin | ラウンドロビン分散 | ノード構成が同一の場合 | 星3つ |
| least_conn | 接続数が最も少ないノードに割り当て | リクエストの所要時間のばらつきが大きい(LLM に推奨) | 星5つ |
| ip_hash | クライアント IP のハッシュに基づく | セッション維持が必要、KV Cache 再利用 | 星4つ |
| least_time | 応答が最も速いノードに割り当て | ノードの性能が不均一 | 星4つ(nginx-plus が必要) |
セキュリティ強化
API認証(JWT/OAuth2)、レート制限、IPホワイトリスト、リクエスト検証、プロンプトインジェクション対策、データ暗号化。多層的なセキュリティ防御体制を構築します。
4.1 API認証方式
JWT(JSON Web Token)とOAuth2の2つの認証方式をサポートし、さまざまなシナリオに対応します:
JWT認証(サービス間呼び出し)
# JWTトークン生成(サーバー側)
# Python例
import jwt
import time
def generate_api_token(user_id: str, scope: str = "deepseek:read") -> str:
payload = {
"sub": user_id,
"scope": scope,
"iat": int(time.time()),
"exp": int(time.time()) + 3600 # 1時間で期限切れ
}
return jwt.encode(payload, "your-secret-key", algorithm="HS256")
# Nginx JWT検証(njsまたはlua-nginx-moduleを使用)
# locationブロックにJWT検証ロジックを追加
location /v1/ {
auth_jwt "DeepSeek API";
auth_jwt_key_file /etc/nginx/jwt_public_key.pem;
proxy_pass http://deepseek_vllm;
}
OAuth2認証(ユーザー認可)
# Kong API Gateway OAuth2プラグイン設定
# OAuth2プラグインを有効化
curl -X POST http://localhost:8001/services/deepseek/plugins \
--data "name=oauth2" \
--data "config.enable_authorization_code=true" \
--data "config.enable_client_credentials=true" \
--data "config.token_expiration=3600"
# OAuth2アプリケーションを作成
curl -X POST http://localhost:8001/consumers/your-app/oauth2 \
--data "name=DeepSeek App" \
--data "client_id=your-client-id" \
--data "client_secret=your-client-secret" \
--data "redirect_uris[]=https://your-app.com/callback"
4.2 レート制限
# Nginxレート制限設定
# /etc/nginx/nginx.conf
http {
# IPごとのレート制限:10リクエスト/秒、バースト20
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
# APIキーごとのレート制限:50リクエスト/秒
limit_req_zone $http_x_api_key zone=per_key_limit:10m rate=50r/s;
# 同時接続数制限
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}
# Serverブロックで適用
server {
location /v1/chat/completions {
# 基本レート制限
limit_req zone=api_limit burst=20 nodelay;
limit_req_status 429;
# APIキーごとのレート制限
limit_req zone=per_key_limit burst=50 nodelay;
# 同時接続制限
limit_conn conn_limit 10;
proxy_pass http://deepseek_vllm;
}
}
4.3 IPホワイトリスト
# Nginx IPホワイトリスト
location /v1/admin/ {
# 内部ネットワークとVPNセグメントのみ許可
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
deny all;
proxy_pass http://deepseek_vllm;
}
# GeoIPモジュールを使用して国/地域を制限
# geoip_country /usr/share/GeoIP/GeoIP.dat;
# map $geoip_country_code $allowed_country {
# default no;
# CN yes;
# US yes;
# }
4.4 リクエスト検証
APIゲートウェイ層でリクエストを検証し、悪意のあるリクエストや異常なリクエストを防ぎます:
# Nginxリクエスト検証
location /v1/chat/completions {
# リクエストボディサイズを制限
client_max_body_size 1M;
# POSTメソッドのみ許可
limit_except POST {
deny all;
}
# Content-Typeを制限
if ($http_content_type !~ "^application/json") {
return 415 '{"error":"Unsupported Media Type"}';
}
# max_tokensパラメータを制限(リソース乱用防止)
# lua-nginx-moduleまたはnjsと組み合わせて実装
proxy_pass http://deepseek_vllm;
}
4.5 プロンプトインジェクション対策
プロンプトインジェクションは、エンタープライズAIアプリケーションが直面する主要なセキュリティ脅威の1つです。攻撃者は巧妙に細工されたプロンプトを通じてシステム指示を回避し、機密情報を取得したり、不正な操作を実行したりします。
対策:
- 入力フィルタリング:既知のインジェクションパターン(「ignore previous instructions」、「system prompt」などのキーワード)を検出してフィルタリング
- 出力レビュー:モデル出力の機密情報(PII、キー、内部IP)を検出
- ロール分離:システムプロンプトとユーザー入力を厳密に分離し、特別な区切り文字を使用
- 最小権限:モデルは許可された範囲のデータとツールにのみアクセス可能
- コンテンツセーフティAPI:サードパーティのコンテンツセーフティサービスを統合し、違反コンテンツをリアルタイムで検出
# Pythonでのプロンプトインジェクション検出例
import re
INJECTION_PATTERNS = [
r"ignore\s+(all\s+)?(previous|above|prior)\s+instructions?",
r"you\s+are\s+now\s+(DAN|jailbreak)",
r"system\s*prompt[:=]",
r"pretend\s+you\s+are",
r"<\|im_start\|>",
r"<\|im_end\|>",
]
def detect_injection(user_input: str) -> bool:
for pattern in INJECTION_PATTERNS:
if re.search(pattern, user_input, re.IGNORECASE):
return True
return False
4.6 データ暗号化
| 暗号化レイヤー | ソリューション | 説明 |
|---|---|---|
| 転送暗号化 | TLS 1.3 | すべてのAPI通信でHTTPSを強制 |
| 保存暗号化 | AES-256-GCM | ログ、キャッシュ、バックアップ内の機密データを暗号化して保存 |
| 鍵管理 | HashiCorp Vault / AWS KMS | 鍵の集中管理、自動ローテーション、アクセス監査 |
| データベース暗号化 | TDE + 列レベル暗号化 | PIIデータ(APIキー、ユーザー情報)の暗号化保存 |
権限管理
RBACモデル、マルチテナント分離、APIキー管理、使用量クォータ、部門レベルのアクセス制御。きめ細かな権限制御を実現します。
5.1 RBAC権限モデル
ロールベースのアクセス制御(RBAC)は、ロール、権限、リソースのマッピング関係を定義します:
| ロール | 権限範囲 | 代表的なユーザー |
|---|---|---|
| Super Admin | 全権限:システム設定、ユーザー管理、モデル管理 | プラットフォーム運用チーム |
| Dept Admin | 部門内のユーザー管理、使用量の閲覧、クォータ割り当て | 部門責任者 |
| Developer | API呼び出し、モデル選択、自分の使用量の閲覧 | 開発エンジニア |
| Viewer | 使用量レポートとモデルリストの閲覧のみ | 非技術者 |
| Auditor | 監査ログ、コンプライアンスレポートの閲覧 | コンプライアンス/セキュリティチーム |
5.2 マルチテナント分離
マルチテナント分離はエンタープライズ向けプラットフォームの必須要件です。推奨ソリューション:
- 論理分離:同じ推論クラスターで、APIキーによってテナントを区別。中小規模に適しています
- ネームスペース分離:K8s Namespaceレベルの分離。各テナントが独立したDeploymentを持ちます
- クラスター分離:独立したGPUクラスターで物理的に分離。金融、医療などの高いコンプライアンス要件に適しています
- モデル分離:異なるテナントが異なるモデルインスタンスを使用し、KV Cacheを完全に分離します
5.3 APIキー管理
# API Key 管理のベストプラクティス
# 1. Key 生成
openssl rand -hex 32 # 64文字のランダムKey
# 2. Key 保存(ハッシュ保存、平文は保存しない)
import hashlib
import secrets
def create_api_key() -> tuple[str, str]:
raw_key = "sk-" + secrets.token_hex(24)
hashed = hashlib.sha256(raw_key.encode()).hexdigest()
return raw_key, hashed # 平文はユーザーに返し、ハッシュはDBに保存
# 3. Key 検証
def verify_api_key(raw_key: str, stored_hash: str) -> bool:
return hashlib.sha256(raw_key.encode()).hexdigest() == stored_hash
# 4. Key 権限バインド
api_key_config = {
"key_hash": "abc123...",
"tenant_id": "tenant-001",
"role": "developer",
"rate_limit": 100, # リクエスト/分
"daily_quota": 1000000, # Token/日
"allowed_models": ["deepseek-v3", "deepseek-r1"],
"expires_at": "2026-12-31T23:59:59Z"
}
5.4 使用量クォータ管理
| クォータタイプ | 粒度 | 例 |
|---|---|---|
| Tokenクォータ | 日/月/年単位 | ユーザーごとに100万Token/日 |
| リクエストクォータ | 分/時間単位 | API Keyごとに60リクエスト/分 |
| 同時実行クォータ | リアルタイム | テナントごとに最大10同時リクエスト |
| モデルクォータ | モデル単位 | V3は無制限、R1は10万Token/日に制限 |
5.5 部門レベルのアクセス制御
# 部門レベルの権限設定例
departments:
engineering:
quota: 5000000 # 500万Token/日
models: [deepseek-v3, deepseek-r1, deepseek-coder]
rate_limit: 200
members: [user1, user2, user3]
marketing:
quota: 1000000 # 100万Token/日
models: [deepseek-v3]
rate_limit: 50
members: [user4, user5]
finance:
quota: 500000
models: [deepseek-v3]
rate_limit: 30
members: [user6]
# 財務部門の特別制限:ストリーミング出力を無効化
features:
streaming: false
ログ監査
リクエストログ、ユーザー活動追跡、コンプライアンス監査、ログ保存ポリシー、ELK Stack統合。等保、GDPRなどのコンプライアンス要件を満たします。
6.1 リクエストログ記録
監査、課金、問題解決のために、各APIリクエストのメタデータを完全に記録します:
# Nginx監査ログ形式
# /etc/nginx/conf.d/deepseek-log.conf
log_format deepseek_audit escape=json
'{'
'"timestamp":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"api_key":"$http_x_api_key",'
'"request_method":"$request_method",'
'"request_uri":"$request_uri",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"upstream_addr":"$upstream_addr",'
'"upstream_response_time":"$upstream_response_time",'
'"user_agent":"$http_user_agent",'
'"x_forwarded_for":"$http_x_forwarded_for"'
'}';
access_log /var/log/nginx/deepseek-audit.log deepseek_audit buffer=64k flush=5s;
6.2 ユーザー活動追跡
アプリケーション層でユーザー操作を記録し、完全な監査チェーンを構築します:
# Python監査ログミドルウェア
import logging
import json
from datetime import datetime, timezone
audit_logger = logging.getLogger("deepseek.audit")
def log_api_call(user_id: str, action: str, details: dict):
audit_entry = {
"timestamp": datetime.now(timezone.utc).isoformat(),
"user_id": user_id,
"action": action, # "chat.completion", "model.list", etc.
"model": details.get("model"),
"prompt_tokens": details.get("prompt_tokens"),
"completion_tokens": details.get("completion_tokens"),
"total_tokens": details.get("total_tokens"),
"latency_ms": details.get("latency_ms"),
"ip_address": details.get("ip_address"),
"user_agent": details.get("user_agent"),
"status": details.get("status"), # "success" | "error"
}
audit_logger.info(json.dumps(audit_entry, ensure_ascii=False))
6.3 コンプライアンス監査要件
| コンプライアンス基準 | ログ要件 | 保存期間 |
|---|---|---|
| 等保2.0(レベル3) | ユーザーログイン、操作、設定変更、異常イベント | 少なくとも6ヶ月 |
| GDPR | データ処理活動の記録、データアクセスログ、同意記録 | 必要に応じて(データ最小化の原則) |
| SOC 2 | アクセス制御、変更管理、システム運用、セキュリティインシデント | 少なくとも12か月 |
| ISO 27001 | 情報セキュリティインシデント、アクセス制御、操作ログ | リスク評価に基づいて決定 |
6.4 ログ保持ポリシー
# Logrotate設定
# /etc/logrotate.d/deepseek
/var/log/deepseek/*.log {
daily
rotate 90 # 90日間保持
compress
delaycompress
missingok
notifempty
dateext
dateformat -%Y%m%d
postrotate
# Nginxにログファイルを再オープンするシグナルを送信
/usr/bin/killall -USR1 nginx 2>/dev/null || true
endscript
}
# 監査ログ(等保要件を満たすため、6か月間保持)
/var/log/deepseek/audit/*.log {
daily
rotate 180
compress
delaycompress
missingok
notifempty
dateext
# オブジェクトストレージ(S3/OSS)にアーカイブ
lastaction
/usr/local/bin/archive-logs.sh
endscript
}
6.5 ELKスタック統合
# Filebeat設定:Nginxログを収集してElasticsearchに送信
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/deepseek-audit.log
json.keys_under_root: true
json.add_error_key: true
fields:
service: deepseek-api
log_type: audit
fields_under_root: true
output.elasticsearch:
hosts: ["https://elasticsearch.example.com:9200"]
username: "filebeat_writer"
password: "${ES_PASSWORD}"
index: "deepseek-audit-%{+yyyy.MM.dd}"
# ILMポリシー:ホットデータ7日、ウォームデータ30日、コールドデータ90日
setup.ilm.enabled: true
setup.ilm.rollover_alias: "deepseek-audit"
setup.ilm.pattern: "{now/d}-000001"
setup.ilm.policy_name: "deepseek-audit-policy"
監視とアラート
Prometheusメトリクス収集、Grafana可視化ダッシュボード、AlertManagerアラートルール、SLA監視、コスト追跡。
7.1 Prometheusメトリクス収集
vLLMにはPrometheusメトリクスエンドポイントが組み込まれており、すぐに使用できます:
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
rule_files:
- '/etc/prometheus/rules/deepseek-alerts.yml'
scrape_configs:
- job_name: 'vllm'
scrape_interval: 10s
static_configs:
- targets:
- 'vllm-node-1:8000'
- 'vllm-node-2:8000'
- 'vllm-node-3:8000'
metrics_path: '/metrics'
- job_name: 'nginx'
static_configs:
- targets: ['nginx-exporter:9113']
- job_name: 'node'
static_configs:
- targets:
- 'node-exporter-1:9100'
- 'node-exporter-2:9100'
- 'node-exporter-3:9100'
- job_name: 'dcgm' # NVIDIA GPUメトリクス
static_configs:
- targets: ['dcgm-exporter:9400']
7.2 Grafanaダッシュボード
以下のGrafanaダッシュボードテンプレートのインポートを推奨します:
| ダッシュボード | ID | 用途 |
|---|---|---|
| NVIDIA DCGM Exporter | 19004 | GPU使用率、温度、消費電力、メモリ |
| Node Exporter Full | 1860 | CPU、メモリ、ディスク、ネットワーク |
| Nginx | 11168 | リクエスト量、レイテンシ、エラー率、接続数 |
| vLLMカスタム | 自社構築 | TTFT、TPOT、TPS、キューの長さ |
7.3 AlertManagerアラートルール
# /etc/prometheus/rules/deepseek-alerts.yml
groups:
- name: deepseek_sla
rules:
# 可用性アラート
- alert: DeepSeekServiceDown
expr: up{job="vllm"} == 0
for: 1m
labels:
severity: critical
team: platform
annotations:
summary: "DeepSeek 推論サービスが利用不可"
description: "ノード {{ $labels.instance }} が1分以上ダウンしています"
# レイテンシアラート
- alert: HighLatency
expr: histogram_quantile(0.95, rate(vllm:time_to_first_token_seconds_bucket[5m])) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "TTFT P95 が2秒を超えています"
# GPUメモリアラート
- alert: GPUMemoryHigh
expr: vllm:gpu_cache_usage_perc > 90
for: 5m
labels:
severity: warning
annotations:
summary: "GPUメモリ使用率が90%を超えています"
# キュー滞留アラート
- alert: RequestQueueBacklog
expr: vllm:num_requests_waiting > 20
for: 3m
labels:
severity: warning
annotations:
summary: "リクエストキューの滞留が20を超えています"
# エラー率アラート
- alert: HighErrorRate
expr: rate(vllm:request_errors_total[5m]) / rate(vllm:request_total[5m]) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "APIエラー率が5%を超えています"
# コストアラート
- alert: HighCostDaily
expr: increase(vllm:total_tokens_generated[24h]) * 0.000002 > 100
for: 1h
labels:
severity: info
annotations:
summary: "1日のトークン消費推定コストが$100を超えています"
7.4 SLAモニタリング
# Prometheus SLA記録ルール
# /etc/prometheus/rules/deepseek-sla.yml
groups:
- name: deepseek_sla_recording
interval: 1m
rules:
# 可用性パーセンテージ
- record: job:availability:ratio
expr: avg(up{job="vllm"})
# 成功リクエスト率
- record: job:success_rate:ratio
expr: |
sum(rate(vllm:request_success_total[5m]))
/
sum(rate(vllm:request_total[5m]))
# P50/P95/P99 レイテンシ
- record: job:ttft:p50
expr: histogram_quantile(0.50, rate(vllm:time_to_first_token_seconds_bucket[5m]))
- record: job:ttft:p95
expr: histogram_quantile(0.95, rate(vllm:time_to_first_token_seconds_bucket[5m]))
- record: job:ttft:p99
expr: histogram_quantile(0.99, rate(vllm:time_to_first_token_seconds_bucket[5m]))
災害復旧計画
モデルバックアップ、設定バックアップ、マルチリージョン展開、災害復旧RTO/RPO、フェイルオーバー訓練。極端な状況下でのビジネス継続性を確保します。
8.1 モデルバックアップ戦略
| バックアップ内容 | バックアップ方法 | 頻度 | 保存場所 |
|---|---|---|---|
| モデル重みファイル | オブジェクトストレージ + ローカルNAS | バージョン更新時 | S3/OSS + ローカルストレージ |
| 推論設定 | Gitリポジトリ | 変更のたび | GitHub/GitLab + マルチリージョン |
| Nginx設定 | Gitリポジトリ + 構成管理 | 変更のたび | Git + Ansible/Helm |
| K8sリソース定義 | GitOps(ArgoCD/Flux) | 変更のたび | Gitリポジトリ |
| 監査ログ | オブジェクトストレージアーカイブ | 毎日 | S3 Glacier / OSSアーカイブ |
8.2 マルチリージョン展開アーキテクチャ
# マルチリージョンDNS設定(Route 53 / Cloud DNS)
# プライマリリージョン:ap-southeast-1(シンガポール)
# スタンバイリージョン:us-west-2(オレゴン)
# インテリジェントDNSルーティングポリシー
Record: api.deepseek.example.com
Type: A (Alias)
Routing: Latency-based
# プライマリリージョン
ap-southeast-1:
- api.deepseek.example.com → プライマリクラスタLB (103.x.x.x)
# スタンバイリージョン(ホットスタンバイ)
us-west-2:
- api.deepseek.example.com → スタンバイクラスタLB (54.x.x.x)
# フェイルオーバー設定
# ヘルスチェック:30秒ごとにプライマリクラスタの/healthをプローブ
# 連続3回失敗 → スタンバイリージョンに自動切り替え
# プライマリクラスタ復旧 → 自動的に切り替え戻し
8.3 RTO/RPO定義
| 指標 | 定義 | 目標値 | 実装方法 |
|---|---|---|---|
| RTO | 復旧時間目標(サービス復旧までの時間) | < 15 分 | DNS フェイルオーバー + K8s 自動再構築 |
| RPO | 復旧ポイント目標(失われるデータ量) | < 1 分 | リアルタイム同期 + トランザクションログ |
8.4 フェイルオーバー訓練
# フェイルオーバー訓練スクリプト
#!/bin/bash
# failover-drill.sh
echo "=== フェイルオーバー訓練開始 ==="
echo "時刻: $(date)"
# 1. プライマリクラスタ障害のシミュレーション
echo "[1/5] プライマリクラスタ障害をシミュレーション中..."
kubectl scale deployment deepseek-vllm --replicas=0 -n deepseek
sleep 10
# 2. DNS 切り替えの検証
echo "[2/5] DNS 切り替えを検証中..."
PRIMARY_HEALTH=$(curl -s -o /dev/null -w "%{http_code}" https://primary-api.example.com/health)
BACKUP_HEALTH=$(curl -s -o /dev/null -w "%{http_code}" https://backup-api.example.com/health)
echo "プライマリクラスタ: HTTP $PRIMARY_HEALTH"
echo "バックアップクラスタ: HTTP $BACKUP_HEALTH"
# 3. API 可用性の検証
echo "[3/5] API 可用性を検証中..."
curl -s https://api.deepseek.example.com/v1/models | jq .
# 4. データ整合性の検証
echo "[4/5] データ整合性を検証中..."
# 直近 1 分間の監査ログが完全かどうかを確認
# 5. プライマリクラスタの復旧
echo "[5/5] プライマリクラスタを復旧中..."
kubectl scale deployment deepseek-vllm --replicas=3 -n deepseek
echo "=== フェイルオーバー訓練完了 ==="
echo "RTO: 実際の復旧時間を記録"
echo "RPO: データ損失がないか確認"
RTO/RPO が目標を達成しているか、また計画の不足点を発見するために、四半期ごとに完全なフェイルオーバー訓練を実施することを推奨します。基本デプロイメントについては DeepSeek デプロイチュートリアル を参照してください。
コスト管理
Token 使用量追跡、部門別コスト配分、予算アラート、モデル階層戦略、キャッシュ最適化。ROI を最大化し、AI 推論コストを管理します。
9.1 Token 使用量追跡
# Token 使用量統計 SQL 例(ClickHouse)
CREATE TABLE token_usage (
timestamp DateTime,
api_key String,
tenant_id String,
department String,
model String,
prompt_tokens UInt64,
completion_tokens UInt64,
total_tokens UInt64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (tenant_id, department, timestamp);
# 部門別の日次使用量
SELECT
department,
toDate(timestamp) as date,
sum(total_tokens) as daily_tokens,
sum(prompt_tokens) as prompt_tokens,
sum(completion_tokens) as completion_tokens
FROM token_usage
WHERE timestamp >= now() - INTERVAL 30 DAY
GROUP BY department, date
ORDER BY department, date;
9.2 部門別コスト配分
| 部門 | 月間 Token | 推定コスト | 割当使用率 | ステータス |
|---|---|---|---|---|
| 研究開発部 | 45,000,000 | ¥450 | 90% | 上限間近 |
| マーケティング部 | 12,000,000 | ¥120 | 40% | 正常 |
| カスタマーサービス部 | 80,000,000 | ¥800 | 80% | 正常 |
| 財務部 | 2,000,000 | ¥20 | 10% | 低使用率 |
9.3 予算アラート設定
# Prometheus 予算アラートルール
groups:
- name: cost_alerts
rules:
# 部門予算使用率アラート
- alert: DeptBudget80Percent
expr: |
(sum by (department) (increase(vllm:total_tokens[30d])) * 0.01)
/
(dept_budget_limit) > 0.8
for: 1h
labels:
severity: warning
annotations:
summary: "部門 {{ $labels.department }} の予算使用率が80%を超えました"
# 日次コスト異常増加アラート
- alert: CostSpike
expr: |
(sum(increase(vllm:total_tokens[1h])) * 0.01)
>
(sum(increase(vllm:total_tokens[1h] offset 24h)) * 0.01) * 3
for: 30m
labels:
severity: critical
annotations:
summary: "トークン消費が昨日の同時刻と比較して300%以上増加しました"
9.4 モデル階層化戦略
タスクの複雑さに応じて異なるモデルにインテリジェントにルーティングし、「牛刀を用いて鶏を割く」ことを避けます:
| タスクタイプ | 推奨モデル | 相対コスト | 例 |
|---|---|---|---|
| 簡単なQ&A | DeepSeek V3 | 1x | 翻訳、要約、分類 |
| コード生成 | DeepSeek Coder | 1x | コード補完、バグ修正 |
| 複雑な推論 | DeepSeek R1 | 4x | 数学的証明、論理的解析 |
| キャッシュヒット | キャッシュを直接返す | 0x | 繰り返しの質問、一般的なプロンプト |
9.5 キャッシュ戦略
セマンティックキャッシュにより推論コストを大幅に削減でき、繰り返しの質問や類似の質問にはキャッシュ結果を直接返します:
# Redis セマンティックキャッシュ設定
# GPTCache または LangChain Cache を使用
from gptcache import cache
from gptcache.adapter import openai
from gptcache.embedding import Onnx
from gptcache.manager import CacheBase, VectorBase, get_data_manager
from gptcache.similarity_evaluation.distance import SearchDistanceEvaluation
# セマンティックキャッシュの初期化
onnx_embedding = Onnx()
data_manager = get_data_manager(
CacheBase("redis", host="redis-cache", port=6379),
VectorBase("milvus", host="milvus", port="19530")
)
cache.init(
embedding_func=onnx_embedding.to_embeddings,
data_manager=data_manager,
similarity_evaluation=SearchDistanceEvaluation(),
similarity_threshold=0.85 # 類似度閾値
)
# キャッシュヒット率の期待値
# カスタマーサービスシナリオ: 30%-50%
# コード生成: 10%-20%
# 一般的なQ&A: 20%-40%
セマンティックキャッシュにより推論コストを20%-40%削減できます。モデル選定については DeepSeek 利用ガイド と DeepSeek モデル詳細 をご覧ください。
コンプライアンスとデータプライバシー
データレジデンシー、GDPR準拠、データマスキング、モデルカード、責任あるAIガイドライン。AIアプリケーションがグローバルなデータ保護規制に準拠することを確保します。
10.1 データレジデンシー
ユーザーデータが指定された地理的領域に保存され、各国・地域のデータ主権要件を満たすことを確保します:
| ユーザー地域 | データ保存地域 | 推論ノード | 規制根拠 |
|---|---|---|---|
| 中国本土 | Alibaba Cloud / Huawei Cloud(国内) | 国内GPUクラスター | データ安全法、個人情報保護法 |
| 欧州連合 | AWS Frankfurt / GCP europe-west | EU内GPUクラスター | GDPR |
| アジア太平洋 | AWS Singapore | シンガポールGPUクラスター | PDPA(シンガポール) |
10.2 GDPR準拠チェックリスト
- データ最小化:必要なデータのみ収集し、プロンプトログにPIIを保存しない
- ユーザー同意:初回使用前にデータ処理方法を明確に説明し、明示的な同意を得る
- データポータビリティ:ユーザーデータのエクスポート機能を提供(JSON/CSV形式)
- 消去権:関連するすべてのデータの削除リクエストをサポート(30日以内)
- データ処理契約(DPA):第三者サービスプロバイダーとDPAを締結
- データ保護影響評価(DPIA):AI推論シナリオでDPIAを完了する
- データ保護責任者(DPO):DPOを指定し、連絡先を公開
- 72時間通知:データ漏洩事故は72時間以内に監督機関に報告
10.3 データマスキング
モデルにプロンプトを送信する前に、機密情報を自動的に検出してマスキングします:
# Pythonデータマスキングミドルウェア
import re
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine
analyzer = AnalyzerEngine()
anonymizer = AnonymizerEngine()
def anonymize_prompt(text: str) -> str:
# PIIエンティティを検出
results = analyzer.analyze(
text=text,
entities=["PHONE_NUMBER", "EMAIL_ADDRESS",
"PERSON", "CREDIT_CARD", "IBAN_CODE",
"CN_ID", "PASSPORT_NUMBER"],
language="zh"
)
# 匿名化処理
anonymized = anonymizer.anonymize(text=text, analyzer_results=results)
return anonymized.text
# 例
original = "我的手机号是 13812345678,邮箱是 zhang@example.com"
safe = anonymize_prompt(original)
# 出力: "我的手机号是 <PHONE_NUMBER>,邮箱是 <EMAIL_ADDRESS>"
10.4 モデルカード
各モデルインスタンスは、モデルの基本情報、能力の境界、リスク警告を記録したモデルカードを維持する必要があります:
| モデルカード項目 | 説明 |
|---|---|
| モデル名 | DeepSeek-V3 / DeepSeek-R1 |
| モデルバージョン | v3.0-2026-01 |
| トレーニングデータの基準日 | 2025-12-31 |
| 対応言語 | 中国語、英語、日本語、韓国語など20以上の言語 |
| 既知の制限 | リアルタイム情報には非対応、幻覚の可能性、医療診断には使用不可 |
| バイアス評価 | 標準的なバイアステストセットを通過済み。詳細は技術レポートを参照 |
| 利用制限 | 違法コンテンツの生成禁止、高影響シナリオでの自動意思決定には使用不可 |
10.5 責任あるAIガイドライン
企業がAIを利用する際の基本原則:
- 透明性:AI生成コンテンツをユーザーに明確に示し、人間になりすまさない
- 公平性:モデル出力のバイアスを定期的に評価し、異なるグループに対して公平に扱う
- 説明可能性:重要な意思決定シナリオで推論プロセスを提供し、人間によるレビューをサポート
- 人間による監督:高リスクな意思決定(医療、法律、金融)には必ず人間によるレビューを含める
- 継続的モニタリング:AI出力品質のモニタリングを確立し、モデルのパフォーマンスと安全性を定期的に評価
- 安全第一:コンテンツ安全フィルタリング、脱獄検出、緊急遮断メカニズム
- 持続可能性:モデル推論の炭素排出に注目し、エネルギー効率比を最適化する
責任あるAIは一度きりの作業ではなく、継続的なプロセスです。AIガバナンス委員会を設立し、AIアプリケーションのリスクとコンプライアンスを定期的にレビューすることをお勧めします。詳細なベストプラクティスについては、DeepSeekモデルリストとプロンプトエンジニアリングをご覧ください。
DeepSeekエンタープライズアプリケーションFAQ
DeepSeek 完全チュートリアル体系
以下は、当サイトが提供するすべてのDeepSeekチュートリアルとツールで、入門からエンタープライズレベルまでの完全な学習パスをカバーしています。