第66回 実務で回すAIのSLOとコスト管理 — Pythonで作るSLI計測・予算アラート・自動スケール運用

デプロイ後に「品質は大丈夫か」「費用が膨らんでいないか」と心配になっていませんか。モデル監視やCI/CDは重要ですが、現場で日々の判断を支えるのはSLO(サービス品質目標)とそれを支える計測・自動化の仕組みです。本記事では、AIとPythonを実務に落とし込む観点から、最小限の実装パターンと現場で使えるテンプレートを提示します。シリーズ「AIとPythonの実務」向けの、すぐ試せる設計ガイドです。

SLOが必要な理由(モデル監視・CI/CDと何が違うか)

SLOは「期待される品質を数値で合意し、運用行動を決める仕組み」です。モデル監視はデータや挙動を検知する手段、CI/CDは安全にデプロイする仕組みであり、SLOはその上で「いつ」「誰が」「どう対応するか」を定義します。違いを端的にまとめると:

  • モデル監視:異常の検知(データドリフト、精度低下など)
  • CI/CD:変更を安全に本番へ届ける仕組み
  • SLO:現場の合意(例:p95レイテンシ < 500ms、成功率 > 99%)に基づき、監視結果を運用アクションへ結び付ける

SLI候補と定義方法

まず計測対象を絞ります。以下は実務で使いやすいSLI候補と計測式、サンプルしきい値です。

指標 計測式(例) サンプルしきい値(実務向け)
レイテンシ p95 レイテンシ = 95パーセンタイルの応答時間 p95 < 500ms、p99 < 1.5s
成功率 / エラー率 成功率 = 正常レスポンス数 / 総リクエスト数 成功率 ≥ 99%(業務重要度に応じて調整)
モデル品質(参照セット) F1 = 2 * (precision * recall) / (precision + recall) 参照セットF1 ≥ 0.85、または相対低下 < 5%
説明可能性チェック 重要特徴の寄与度が訓練時と大きく乖離している割合 寄与度乖離割合 < 10%
コスト指標 リクエスト単位コスト = トークン数×単価 + GPU秒×単価 日次予算:プロジェクトごとに上限設定(例:¥10,000/日)

しきい値は業務重要度やSLA(顧客向け契約)に合わせて合意します。まずは「p95レイテンシ + 成功率 + 日次コスト」の最小実装から始めるのが現場では有効です。

計測の実装パターン(Python中心)

実務では既存の監視基盤に接続することが現実的です。以下は代表的パターンとPythonでの実装例の概略です。

Prometheus + prometheus_client によるメトリクス公開

アプリケーションやAPIでメトリクスをエクスポートし、Prometheusで収集します。Pythonの例(概略):

from prometheus_client import Summary, Counter, start_http_server

REQUEST_LATENCY = Summary('request_latency_seconds', 'Request latency')
REQUEST_COUNT = Counter('request_count', 'Total requests', ['status'])

def handle_request(req):
    with REQUEST_LATENCY.time():
        # リクエスト処理
        pass
    REQUEST_COUNT.labels(status='200').inc()

if __name__ == '__main__':
    start_http_server(8000)  # /metrics を公開

OpenTelemetryでトレースとメトリクスを連携

トレース情報とメトリクスを同時に収集して、障害時のRoot Cause分析をスムーズにします。ライブラリを使ってサーバーサイドでSpanとカスタムメトリクスを出力します。

定期バッチでの品質SLI(黄金データ検査)

本番から定期的にサンプルを取り、黄金データ(reference set)でモデルの精度を評価します。日次バッチはCloud Schedulerやcronで回し、結果をメトリクスやアラートに変換します。簡単な流れ:

  • 本番からN件サンプルを抜粋
  • モデル推論を行い、黄金データと比べて精度を集計
  • 精度が閾値を下回ればアラートを発火

コスト計測と割当方法

コストはリクエスト単位で推定し、テナントやプロジェクトへ帰属させます。基本式と実務パターンは以下の通りです。

項目 計算式 / 手順 備考
リクエスト単位コスト トークン数×モデルトークン単価 + GPU秒×GPU単価 API課金モデルではトークン数が主要なドライバ
プロジェクト帰属 リクエストにプロジェクトID/テナントIDを付与して集計 ログ/トレースと結合して請求APIと突合
クラウド請求の集計 AWS/Azure/GCPの請求APIを定期取得して、タグやラベルで分配 PythonでAPIを叩き、日次でプロジェクト別に集計するのが実務的

Pythonの集計パターンは、リクエストログの集計(トークン数合計 × 単価)とクラウド請求APIの仕訳(タグベース)を突合する流れです。

アラートと自動対応の設計

SLO違反や予算超過時は段階的に対応します。一般的なワークフロー:

  • 警告(通知) — Slack/メールで担当者へ通知
  • 軽度自動対応 — レート制限やキューイングで負荷緩和
  • 中度自動対応 — 軽量モデルへルーティング(モデルフェイルオーバー)
  • 重度自動対応 — 新規リクエスト停止、オペレーション介入待ち

Pythonでの自動化戦略(概略):監視 → 判定ロジック → アクション呼び出し。例:

def check_slo(metrics):
    if metrics['p95_latency'] > 0.5:
        trigger_action('route_to_light_model')
    if metrics['daily_cost'] > budget:
        trigger_action('throttle_requests')

def trigger_action(action):
    # Kubernetes API を叩いてデプロイを切り替える、
    # またはサービスメッシュのルーティングを更新する
    pass

重要なのは「自動化して終わり」ではなく、手動判断に移す時のエスカレーション手順を明確にすることです。

CI/CDとの結合点

  • モデルデプロイ前のSLO回帰テスト:新モデルを参照セットで評価し、SLOを満たすか自動判定
  • プルリクでのコスト予測チェック:変更がコストに与える影響を簡易見積もり(トークン増加予測など)
  • CIパイプラインで閾値チェック:パフォーマンス/精度/コストの自動判定を通さないとマージできないルール

運用ドキュメントとRunbook連携

SLO違反時に誰が何をするかを明記したRunbookは必須です。テンプレート例:

項目 内容(例)
検知条件 p95 レイテンシ > 500ms を 5分間継続
一次対応者 オンコール担当(Slackチャンネルへの通知)
一次対応手順 1. モニタで該当ホストを確認 2. ログでエラー傾向を確認 3. 自動ルーティングを一時解除
エスカレーション 15分以内に改善しない場合はエンジニアリングリードへ報告
復旧後チェック 原因分析(ポストモーテム)とSLO/閾値の見直し

失敗しやすい点と実務チェックリスト

よくある落とし穴と対処法:

  • 過度に細かいSLO設定:まずは最小実装から始める(p95, 成功率, 日次コスト)
  • 指標の測り方のブレ:メトリクス定義をドキュメント化し、サンプリングルールを固定する
  • コストメトリクスの遅延:日次集計を採用し、リアルタイムは概要アラートに留める
  • アラート疲れ:多段階アラートと抑制ルール(同一イベントの抑制期間)を設定

実務チェックリスト(まず試す):

  • p95レイテンシの計測をPrometheusで開始
  • 成功率のカウントをアプリに埋め込む
  • 日次コスト集計スクリプトを用意してSlack通知
  • 簡単なRunbookを1ページで用意してオンコールに共有

サンプルリソースと次の一歩

短いPythonコードテンプレート(概略):メトリクス公開、日次コスト集計、閾値判定の例です。

# prometheus_client による最小メトリクス公開 (前述)

# 日次コスト集計の概略
import datetime

def daily_cost_sum(logs, token_price):
    today = datetime.date.today()
    total_tokens = sum(entry['tokens'] for entry in logs if entry['date'] == today)
    return total_tokens * token_price

最小ダッシュボード構成(Prometheus + Grafana):

  • パネル1:p95/p99 レイテンシ(API別)
  • パネル2:成功率(時間推移)
  • パネル3:日次コストと予算残(プロジェクト別)

次に試すべきトピック:SLOに基づく自動コンテナスケーリング、容量予測、より細かいテナント別課金の自動化など。

まとめ

SLOは単なる観測ではなく、現場の判断と行動を数値で支える仕組みです。まずは「p95レイテンシ・成功率・日次コスト」の最小実装から始め、Prometheusや簡易スクリプトで計測・集計して運用ルール(Runbook)に落とし込みましょう。段階的な自動対応とCI/CDでの前倒しチェックを組み合わせることで、信頼性と費用のバランスを保ちながら現場運用が楽になります。次回はこのSLOに基づく自動スケール運用の具体例を扱います。

(参考)Manage AI シリーズ「AIとPythonの実務」: 記事一覧は https://manageai.online をご覧ください。