論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
AI運用
AI Operation
MLOps

🔖 キーワード索引

AI運用MLOpsモデル監視再学習オンライン推論バッチ推論障害対応SLAシャドーモード

本ページは AI 運用(AI Operation)を 12 のセクションで多角的に解説します。 上のチップは検索・関連語の手がかりです。 以下のリンクで各セクションに直接ジャンプできます:

💡 30秒結論📍 文脈🎨 直感📐 数式🔬 数式を言葉で読み解く🧮 実値計算🐍 Python 実装⚠️ 落とし穴🌐 関連手法🔗 関連用語📚 グループ教材

🔖 キーワード索引 — 核となる 14 トピック

AI 運用 (MLOps) の核となる 14 トピックを、 監視・再訓練・ロールバックの観点から整理。 本番運用に必要な「silent failure 検出」「data drift 検出」「SLO 設計」を中心に取り上げます。

🎨 直感 📐 数式 (PSI/KL) 🔬 数式を言葉で読み解く 🧮 PSI 計算 🐍 Python (drift) ⚠️ 落とし穴 📍 文脈 💡 30秒で分かる結論 🌐 関連手法 🔗 関連用語 📚 関連グループ教材 SLO/SLI ロールバック コスト管理

💡 30秒で分かる結論

🍰 まずはやさしく

AI運用は、AIを使い続けるためのメンテナンスです。

AIの性能が落ちないようにするために使います。

スマホアプリを最新の状態に更新する感覚です。

ここでは、AIを監視して作り直す方法を読みます。

本番環境で AI を運用・保守する活動 — 監視・再訓練・ロールバック・ガバナンスを継続する MLOps 中核。

📍 文脈 — どこで使う概念か

🍰 まずはやさしく

AI運用は、開発が終わった後の活動のことです。

AIを本番の環境で動かし続けるために使います。

部活で道具を使いながら手入れをするのと似ています。

ここでは、開発から運用までの流れについて読みます。

AI 運用は 学習済みモデルを本番環境で動かし続ける活動。 推論基盤・監視・再学習・障害対応・脱却計画を含む。 構築フェーズと違い「動き続けること」が至上命題で、 SRE 的観点が中心となる。

📍 あなたが今見ているもの (文脈)

「AI 運用」は AI システム開発下流フェーズに位置し、 デプロイ後に発生する全活動を含みます。 DevOps の AI 版として誕生した MLOps がほぼ同義で、 さらに上位概念として AI ガバナンス があります。 デプロイ前の活動は 機械学習基礎モデル評価 を参照してください。

フェーズ活動関連用語
開発データ収集・特徴量設計・モデル選定・評価AI システム開発
デプロイモデル登録・コンテナ化・A/B テスト・カナリアリリースモデルデプロイ
運用 (本ページ)監視・再訓練・ロールバック・コスト管理AI 運用 / MLOps
退役モデル廃止・データ削除・監査ログ保管AI 退役

🎨 直感で掴む

🍰 まずはやさしく

AIモデルは、賞味期限がある生鮮食品のようなものです。

時間の経過でAIの精度が下がるのを防ぐために使います。

流行が変わると、おすすめの商品が変わるのと同じです。

ここでは、AIが劣化する理由と対策について読みます。

機械学習を本番運用するための工程・基盤。 開発と運用の橋渡しを担います。

AI 運用 (MLOps) の核心は 「学習時に固定した世界」と「本番が直面し続ける動く世界」のギャップ管理。 データドリフト・コンセプトドリフト・特徴量パイプライン故障の 3 つを監視し、 自動再学習・カナリアデプロイ・ロールバックで継続的に整える。 単発の学習プロジェクトと違い、 完了点が存在しない継続営みである点が DevOps と類似する。

🎨 直感で掴む — 具体例で理解する

AI モデルは「放っておくと劣化する生き物」。 学習時点のデータと本番データの分布が日々ズレ(データドリフト)、 ユーザー行動が変わり(コンセプトドリフト)、 上流の特徴量パイプラインが壊れる。 運用とは これらの異変を素早く検知し、 再学習・ロールバック・モデル切替を実施する仕組みを作って回すこと。

🎨 直感で掴む — 「AI モデルは生鮮食品」

AI モデルは 「賞味期限のある生鮮食品」のように扱うべき、 という比喩がよく使われます。 学習時の世界 (data distribution) と、 デプロイ後の世界はじわじわ違ってくる。 これを data drift と呼びます。

3 種類の drift

種類数式表現SSDSE-B での例
Covariate drift$P(X)$ が変化少子高齢化で人口構成が変化
Label drift$P(Y)$ が変化EC 化で小売販売額の分布が変化
Concept drift$P(Y \mid X)$ が変化人口当たり販売額の関係性が変化

核心メッセージ: モデルが返す予測値は同じ形式 (例: float の販売額) なので、 ログを見ても劣化は分からない。 分布を監視する仕組みを別途用意しない限り、 silent failure に陥ります。

SLO/SLI で「許容できる劣化」を定義する

SLI (Service Level Indicator) は実測値、 SLO (Service Level Objective) は目標値、 SLA (Agreement) は契約値。 AI 運用では下記のような SLO 設計が定石。

📐 定義

🍰 まずはやさしく

AI運用とは、本番環境でAIを保守する活動です。

データのズレを測って、AIを正しく動かすために使います。

買い物のデータが変化したときに、AIを調整するイメージです。

ここでは、運用で使う指標や数式について読みます。

本番環境でAIを運用・保守する活動

英語名 AI Operation

🎯 いつ・どこで使うか

📋 前提条件・適用範囲

この用語を理解・使用するときは、 次のような前提を意識してください:

📐 数式・定義

AI 運用を数式 / 形式定義で表す:

$$\text{Drift}(t) = D_{\mathrm{KL}}\!\big(P_{\text{train}} \,\Vert\, P_{\text{prod}}(t)\big)$$

学習データと本番データの分布乖離を KL ダイバージェンスで測る。 一定閾値を超えたら再学習トリガー。

📐 数式: PSI と KL divergence による drift 検出

(1) Population Stability Index (PSI) — 業界標準の drift 指標。 ベース期間 (学習時) の分布 $P$ と現在の分布 $Q$ をビン分割し、 各ビン $i$ の確率質量を比較する。

$$\mathrm{PSI}(P, Q) = \sum_{i=1}^{B} (P_i - Q_i) \ln\frac{P_i}{Q_i}$$

(2) KL divergence — 情報理論的な distance (非対称)。

$$D_{\mathrm{KL}}(P \,\|\, Q) = \sum_{i=1}^{B} P_i \ln\frac{P_i}{Q_i}$$

(3) モデル精度劣化の SLO violation 検出 — 連続 $k$ 期間 SLO 未達なら再訓練トリガ。

$$\mathrm{Trigger} = \mathbb{1}\bigl[\,|\{t : \mathrm{precision}_t < \mathrm{SLO}\}| \geq k\,\bigr]$$

判定基準 (PSI 業界慣習): 0.1 未満=安定、 0.1-0.25=要注意 (調査開始)、 0.25 以上=明確な drift (再訓練必須)。

ロールバックの判断式

新モデル (challenger) と現モデル (champion) を $\rho:1-\rho$ で並走 (canary)、 challenger の指標が champion を下回ったら自動 rollback:

$$\mathrm{Rollback} = \mathbb{1}\bigl[\,\mathrm{KPI}^{\mathrm{challenger}} < \mathrm{KPI}^{\mathrm{champion}} - \delta\,\bigr]$$

$\delta$ はマージン (たとえば 2 ポイント)。 $\rho$ は通常 5%-10% から始め、 異常がなければ段階的に増やす。

🔬 発展トピック

🔬 発展トピック

「AI運用」を入門レベルで習得した次に進むべき発展テーマ:

① 理論的拡張

基本概念を 確率論・情報理論・最適化理論の観点で再定式化すると、 隣接する手法との理論的な関係が見えてきます。 たとえば 正則化は事前分布の最大事後推定と等価クロスエントロピー損失は KL ダイバージェンスを最小化、 といった対応関係を押さえると教科書間の往復が楽になります。

② 実装的拡張

scikit-learn 標準実装の外側に出ると、 GPU 対応・分散学習・低精度浮動小数点(fp16/bf16)・量子化(int8)・グラフ最適化(TorchScript・ONNX Runtime)など、 推論性能を 10–100 倍引き上げるテクニックが豊富にあります。 本番運用では モデル精度と推論コストのトレードオフを意識した実装が鍵。

③ 評価・解釈の拡張

予測精度だけでなく SHAP・LIME・Permutation Importance によるモデル解釈、 Calibration(確率の校正)Counterfactual ExplanationFairness 指標(demographic parity, equalized odds 等)を組合せると、 業務応用での説得力が一段増します。

④ 業界応用

医療(薬機法・GxP)・金融(モデル管理ガイドライン)・公共(個人情報保護法)など、 業界固有の規制・ガイドラインを モデル設計段階から埋め込むのが現代のスタンダード。 「AI運用」を業務適用するときは、 ドメインの専門家・法務との早期コラボレーションが成否を分けます。

PSI と KL の各記号を、 SSDSE-B-2026 の文脈で翻訳します。

記号読み方意味 (SSDSE 文脈)
$P_i$ピー アイ学習時のビン $i$ の確率質量 (例: 「人口 100-200 万人」帯の都道府県比率)
$Q_i$キュー アイ現在 (推論時) のビン $i$ の確率質量。 数年後の同じ集計
$B$ビン数通常 10 (人口区分 10 段階等)
$\ln(P_i/Q_i)$log 比分布のずれを「対数倍率」で測る。 同じなら 0
$\delta$デルタロールバックのマージン (たとえば 2%)
$\rho$ローcanary に送るトラフィック比率 (5-10% から開始)

📖 物語として読むと: 「PSI = $(P-Q) \log(P/Q)$ は、 ビンごとに『どれだけ多く・少なくシフトしたか』を符号付きで集計する。 $P > Q$ なら $(P-Q)>0$ と $\log(P/Q)>0$ で正、 $P < Q$ なら両方負で正 — 結果常に非負になる絶妙な設計。 だから PSI=0 は完全一致、 PSI が大きいほど drift が深刻」。

🔬 数式を言葉で読み解く(AI 運用 — MLOps 4 ステージと SLA/SLO/SLI の実務)

AI 運用 (AI operation) は「学習済みモデルを本番環境で安全に動かし続ける」一連の活動を指す。 ここでは MLOps の 4 ステージ (Build → Deploy → Monitor → Improve) を縦串に、 SLA/SLO/SLI を横串にして、 オンコール体制、 ロールバック、 監視ダッシュボード、 障害対応、 ポストモーテム、 改善計画までを連続した運用サイクルとして読み解く。 SSDSE-B-2026 を用いた人口推計モデルを題材にすると、 学習データ更新 (5 年周期の国勢調査)、 推計人口の確報値・改定値、 平均年齢の丸め桁数変更といった「実データならではの運用イベント」を具体例として扱える。 以下では「数式」よりも「運用方程式」(可用性 = MTBF / (MTBF + MTTR) など) を中心に、 言葉と数値で読み解いていく。

① MLOps 4 ステージ ― Build / Deploy / Monitor / Improve

Build ステージでは、 データ取得・前処理・特徴量設計・学習・評価・パッケージングの 6 工程を「再現可能なパイプライン」として書き下す。 SSDSE-B-2026 の場合、 raw CSV を Git LFS に置くか、 オブジェクトストレージ (S3 / GCS) に置いた上で data_version=2026.04 のようにバージョン管理する。 学習スクリプトは Docker 化し、 ハッシュ値 (Git SHA + データ SHA + 環境ハッシュ) で「学習成果物の指紋」を作る。 これがないと、 後で「なぜこの予測値か」を遡れない。

Deploy ステージは (a) Shadow Deploy → (b) Canary Deploy → (c) Full Rollout → (d) Rollback Ready の 4 段階に分解する。 Shadow ではトラフィックの 100% を新モデルにも流すが、 応答は使わずログだけ取る。 Canary は 1% → 5% → 25% → 100% と段階的に増やす。 SSDSE-B モデルの場合、 47 都道府県を 1% (1 県) → 5% (3 県) → 25% (12 県) → 100% (47 県) と段階展開できる。 Rollback Ready はワンクリックで前バージョンに戻せる状態を維持し続けること、 「巻き戻し対象モデルは 2 世代保持」が運用ルールの常識。

Monitor ステージでは、 5 種の指標 (① データ drift、 ② 予測 drift、 ③ 精度劣化、 ④ レイテンシ p99、 ⑤ 失敗率/null 率) を常時計測する。 SSDSE-B では特に「平均年齢」「推計人口」など年度をまたぐ列で drift が出やすい。 drift の検出は Population Stability Index (PSI) や KL Divergence を週次バッチで計算し、 PSI > 0.2 を黄色信号、 > 0.25 を赤信号として段階的にアラートを上げる。 監視は「閾値突破」だけではなく「閾値突破の継続時間」も同時に見る (突発的スパイクは無視、 30 分連続は通知)。

Improve ステージでは、 monitor で蓄積した障害ログ・drift 履歴・ユーザフィードバックを毎月のレトロスペクティブで読み返し、 (a) データの追加 (新しい SSDSE のリリース年度を吸収)、 (b) 特徴量の見直し (高齢化率と推計人口の二項交互作用を追加)、 (c) アルゴリズムの差替え (Ridge → LightGBM)、 (d) パイプラインの再構築 (Airflow → Prefect 移行) の 4 種の改善を優先度付きでバックログに積む。 これが「単なる維持運用」と「成長する運用」を分ける。

② SLA / SLO / SLI の三層構造

略称意味SSDSE-B 推論 API の例
契約層SLA利用者と約束する外部公約月間 99.5% 可用性、 違反時はクレジット返金
目標層SLO内部チームが目標として狙う基準月間 99.9%、 p99 300ms、 エラー率 0.5% 未満
計測層SLI実際に Prometheus 等で測る生指標/predict の 5xx 率、 応答時間ヒストグラム

運用方程式 (可用性): 可用性 = MTBF / (MTBF + MTTR) で表される。 MTBF (平均故障間隔) を伸ばす施策と、 MTTR (平均修復時間) を縮める施策は別物で、 前者は「冗長化・カオステスト」、 後者は「runbook 整備・自動ロールバック」が効く。 SSDSE-B 推論 API で「月間 99.9% SLO、 月の総時間 43,200 分」と置くと、 許容ダウンタイムは月 43.2 分。 これを「エラーバジェット 43.2 分」と呼ぶ。 エラーバジェットが残っていれば、 多少のリスクを取って新機能をリリースできる。 使い切ったら、 新機能を凍結して安定化に専念する。 これが SRE 流の「リリース速度と信頼性のバランス」だ。

SLI 設計の落とし穴: 「成功率 = (2xx + 3xx) / 全レスポンス」を SLI にすると、 入力欠損で 400 を返すケースもエラーバジェットを消費しないため SLO が達成しやすく見える。 だが利用者から見れば「結果が返ってこない」のは同じ。 SSDSE-B では「正常な都道府県コードだが該当年度のデータがない」ケースを 400 で返してしまうと、 内部 SLO は OK でも実体感は劣化する。 そのため SLI は「ユーザ視点の成功」で測ることが重要だ。

③ オンコール体制と Runbook

オンコール (on-call) は「障害発生時に即座に対応するための当番制」だ。 一般的に Primary (1 次担当)、 Secondary (バックアップ)、 Manager-on-Duty (意思決定者) の 3 役を 1 週間ローテーションで回す。 SSDSE-B モデルのような小規模チーム (3-5 名) でも、 必ず「2 人ペア」にして、 1 人体制を避ける。 1 人だと、 体調不良・睡眠時間ゼロ・判断ミスのリスクが高すぎる。

アラート設計は「P0 = 即時 (5 分以内)」「P1 = 30 分以内」「P2 = 翌営業日」の 3 段階を基本とし、 Slack/PagerDuty の通知先を分ける。 P0 をやたら作ると「アラート疲れ (alert fatigue)」が起こり、 本物のインシデントを見逃す。 SSDSE-B の場合、 (a) 推論 API が完全停止、 (b) drift PSI > 0.5 が 30 分継続、 (c) エラー率 > 5%、 の 3 つに P0 を限定し、 それ以外は P1/P2 に落とす。 これで「夜中の P0」を月 1 回以下に抑えられる。

Runbook は「障害が起きた時、 誰が何を見て、 何を実行するか」を箇条書きで書いた手順書だ。 SSDSE-B の例: 「(1) Datadog ダッシュボード ai-ops-ssdse を開く、 (2) /predict の p99 が 500ms 超過していないか確認、 (3) drift メトリクスを確認、 (4) 直近のデプロイ履歴を確認、 (5) 異常があれば kubectl rollout undo deployment/ssdse-predict で巻き戻す、 (6) Slack の #incident チャンネルに状況を投稿、 (7) Manager-on-Duty に連絡」。 この粒度で書かれていれば、 オンコール初回でも 5 分以内に行動を開始できる。

④ ロールバックの 3 戦略

戦略仕組み復旧時間適用場面
即時ロールバック前バージョンの Docker image を指す Service を切替30 秒以内新モデル不具合
Blue/Green 切替並走する 2 環境のロードバランサ重み変更数分DB スキーマ変更を含む
Canary 縮退新モデルのトラフィック比率を 25% → 0%数分部分的な劣化

ロールバック禁忌: (a) DB スキーマ変更を伴うリリースは「単純な戻し」が破綻するため、 マイグレーションを「前方互換 (forward compatible)」に設計する。 SSDSE-B の例では、 新カラム「人口推計信頼区間」を追加する時に、 旧モデルが読まなくても落ちないよう NULL 許容にしておく。 (b) Feature flag を使う場合、 ロールバックは「コード戻し」ではなく「フラグ OFF」だけで済む設計にすると、 切り戻し時間が 5 秒に短縮できる。

Roll forward vs Roll back の判断軸: 「再現可能性」「修正コスト」「ユーザ影響継続時間」の 3 軸で決める。 例えば、 SSDSE-B 推論 API でレイテンシが 800ms に悪化したとき、 (a) 原因がコード起因で 5 分で fix できるなら roll forward (前進修正)、 (b) 原因不明・調査に 30 分以上かかるなら roll back (巻き戻し) を選ぶ。 オンコール対応の鉄則は「先に止血、 後で原因究明」。 ユーザ影響を継続させたまま原因究明するのは、 (一部の高額契約を除き) 推奨されない。

⑤ 監視ダッシュボード設計 ― RED と USE と Four Golden Signals

RED メソッド (Rate, Errors, Duration) はサービスレベル監視の 3 指標。 SSDSE-B 推論 API では (Rate = /predict の RPS、 Errors = 5xx と 4xx を分けて表示、 Duration = p50/p90/p99 を 3 本線で表示) という構成を 1 つのダッシュボードに集約する。 USE メソッド (Utilization, Saturation, Errors) はリソースレベル監視の 3 指標。 CPU 使用率、 メモリ saturation (swap 使用量)、 ディスク I/O のエラー件数を合わせて見る。 Four Golden Signals (Latency, Traffic, Errors, Saturation) は Google SRE 本由来で、 これも実質 RED + Saturation の組合せだ。

ダッシュボードの 3 段階構成: (a) Executive ダッシュボード (SLA/SLO の達成率、 月次のエラーバジェット消費)、 (b) Service ダッシュボード (RED + USE をリアルタイム表示)、 (c) Debug ダッシュボード (個別 endpoint のレイテンシ分解、 GC 時間、 DB クエリ時間)。 オンコール担当が真っ先に開くのは (b)、 RCA で潜るのは (c)、 月次レビューで見るのは (a)。 役割別に画面を分けると「アラート → 5 分で初期対応 → 30 分で root cause」の動線が成立する。

⑥ 障害対応のタイムライン (Incident Response Lifecycle)

標準的な障害対応は 6 フェーズ: (1) Detect (検知)(2) Triage (重大度判定)(3) Mitigate (一時対処)(4) Resolve (本対処)(5) Postmortem (事後分析)(6) Prevent (再発防止)。 SSDSE-B で「全推論が NaN を返し続ける」障害が起きた場合のタイムラインを書き下すと:

時刻フェーズアクション担当
14:02DetectPagerDuty P0 通知、 NaN 率 100%監視 (自動)
14:04TriageP0 確定、 #incident 起票、 Slack War Room 開設Primary
14:06MitigateRunbook 5 行目「kubectl rollout undo」で前バージョンへ巻き戻しPrimary
14:08MitigateNaN 率が 0% に復帰、 ユーザ影響 6 分で止血Primary
14:30Resolve原因特定: 新モデルが 推計人口の確報値 / 改定値の二重取り込みで NaN 生成。 hotfix PR 起票Secondary
16:00Resolvehotfix を Canary で再展開、 全段階で異常なしSecondary
翌日PostmortemRCA 文書作成、 5 Whys 実施、 アクションアイテム 4 件起票全員
2 週間以内Preventアクションアイテム完了 (NaN 検知 SLI 追加、 二重取り込み防止のスキーマバリデーション)全員

⑦ ポストモーテム ― Blameless と 5 Whys

Blameless Postmortem は「個人を責めず、 システムの弱さを責める」原則。 「○○さんがコマンドを打ち間違えた」ではなく「打ち間違えても安全装置が働かない設計だった」と書く。 そうしないと、 次から誰も正直に経緯を語らなくなり、 学びが消える。 SSDSE-B の例で「推計人口の二重取り込み」が原因だった場合、 個人の見落としではなく「データ取り込みパイプラインに idempotent (冪等) 性が欠如していた」と表現する。

5 Whys は「なぜ?」を 5 回繰り返して根本原因に辿り着く技法。 上記の例: (1) なぜ NaN が出た? → 推計人口が二重に足されゼロ除算が発生。 (2) なぜ二重に足された? → 確報値と改定値が別レコードとして CSV に共存。 (3) なぜ別レコードが見えなかった? → スキーマ検証が「行数のみ」で内容を見ていない。 (4) なぜ内容検証がなかった? → 過去のリリースで「形式チェック」のみで通っていた。 (5) なぜ通っていた? → 「データ品質テスト」が CI に組み込まれていない。 → 根本対策: dbt や Great Expectations を CI に組み込む。 ここまで降りて初めて、 表面対症療法ではない構造改善になる。

ポストモーテムの構成要素 (8 項目): (1) サマリ (3 行)、 (2) ユーザ影響 (人数・時間・損失)、 (3) タイムライン (5 分粒度)、 (4) Root cause (5 Whys)、 (5) Resolution (どう収束したか)、 (6) Lessons learned (何を学んだか、 ポジティブも含む)、 (7) Action items (期限・担当・優先度付き、 通常 5-10 件)、 (8) Supporting documents (Slack ログ、 Datadog 画面のスクリーンショット)。 これを毎月 1 回チーム全員でレビューする「Postmortem Review Meeting」を設けると、 1 件のインシデントから 10 人が学べる。

⑧ 改善計画 (Continuous Improvement)

4 種の改善バックログ: (a) Reliability (信頼性) — エラーバジェット消費を減らす施策、 (b) Performance (性能) — レイテンシ削減、 スループット改善、 (c) Cost (コスト) — クラウド費用、 GPU 時間の最適化、 (d) Developer Experience (開発者体験) — CI 時間短縮、 デプロイ自動化。 各バックログから毎四半期 1-2 件ずつ取り、 OKR (Objective and Key Results) に紐付ける。 SSDSE-B チームなら「Q1 OKR: p99 を 500ms → 250ms にする (Reliability + Performance)」のような形で結束させる。

エラーバジェット駆動の優先付け: 月初にバジェットが 100% 残っていれば新機能リリース、 50% 残なら新機能とリライアビリティ施策を半々、 25% 以下なら新機能凍結。 これにより「リリースを止めるか進めるか」が感情論ではなく数字で決まる。 SSDSE-B で「月のうち SLO 違反が 30 分、 バジェット 43.2 分の 70%」なら、 残り 13.2 分。 新機能のリリースを 1 件に絞り、 残りはリライアビリティ施策に充てる、 という判断ができる。

⑨ AI 運用に特有のメトリクス ― ML-specific Observability

分類指標SSDSE-B 推論 API での例
データ品質欠損率、 異常値率、 スキーマ違反率平均年齢 NULL 率、 推計人口の負値検出
データ driftPSI、 KL Divergence、 Wasserstein 距離人口分布の年度間 PSI
予測 drift予測値の平均・分散・分位点の時系列推計人口の前月比、 47 県の予測分布
モデル性能RMSE、 MAE、 R²、 業務指標県別予測 RMSE、 全国合計の bias
説明性SHAP 値の安定性、 特徴量重要度の変化高齢化率の SHAP 寄与が月単位で変動
公平性サブグループ別誤差、 demographic parity大都市圏 / 地方の誤差差分

ML-specific Observability の鉄則は「労力をかけてラベルを付けて検証する遅延評価 (delayed evaluation) と、 即時に観測できる代理指標 (proxy metric) の 2 段構え」にすること。 SSDSE-B 推計人口は、 答え合わせが翌年の確報まで待つ必要があるため、 「予測の自己整合性 (前月予測との滑らかさ)」「過去の同月予測との差分」など、 ラベル不要の proxy metric を主軸にし、 毎年の答え合わせで proxy の妥当性そのものを検証する。

⑩ 図で見る運用サイクル

SLA vs リソース消費 散布図
SLA (目標可用性) とリソース消費の関係 — 高 SLA を狙うほど冗長化コストが指数的に増える。 99.9% から 99.99% へ 1 nine 上げるごとに約 10 倍のコスト増。
障害頻度分布 ヒストグラム
月次インシデント件数の分布 — 過去 12 ヶ月分。 大半の月は 0-2 件、 ロングテールに 5 件以上の月が混じる。 ポワソン分布で近似できる場合は将来予測に使える。
サービス別 SLO 達成箱ひげ図
サービス別の月次 SLO 達成率箱ひげ図 — predict, batch-train, drift-detect, data-ingest の 4 サービスを比較。 中央値だけでなく外れ値月 (重大障害) を可視化することがリスク管理に必須。

✅ 理解度チェック (3 問)

Q1. SLO 99.9% を月次目標として運用する SSDSE-B 推論 API がある。 月初から 25 日経過時点で、 累計ダウンタイムが 35 分だった。 月の総時間を 43,200 分とすると、 残りエラーバジェットは何分か。 また、 この状況で新機能をフルリリースして良いか? (答え: 43.2 - 35 = 8.2 分。 バジェット消費 81%、 残り 19%。 25% 未満になっているので新機能はフリーズ、 リライアビリティ施策のみに専念すべき。)

Q2. SSDSE-B モデルで「推計人口」の drift PSI が 0.18 → 0.22 → 0.27 と 3 週連続で上昇した。 PSI 閾値は 0.20 = 黄、 0.25 = 赤に設定されている。 オンコール担当はどう行動すべきか? (答え: 黄突破後の継続上昇かつ赤突破済み。 (a) 直近のデータ取り込みパイプライン変更を確認、 (b) 確報値と改定値の取り込みが二重になっていないか確認、 (c) 必要なら再訓練ジョブをトリガ、 (d) Slack で状況共有し、 状況によっては Manager-on-Duty にエスカレーション。)

Q3. ポストモーテムで「オペレータがコマンドを打ち間違えた」と書きたくなった。 Blameless 原則に従って書き換えるなら、 どう表現するか? (答え: 「破壊的コマンドに confirmation prompt がなく、 typo を防ぐ安全装置が不十分だった」と書く。 個人ではなくシステムの設計上の弱点として記述する。 Action item としては「rm -rf, kubectl delete などに confirm 必須化する shell wrapper を導入」と続ける。)

📝 まとめ ― 運用の四原則

AI 運用は「Build / Deploy / Monitor / Improve」の 4 ステージを止めないこと。 (i) SLA/SLO/SLI で測定可能な目標を立て、 エラーバジェットで優先付け、 (ii) オンコールと runbook で 5 分以内に初動できる体制、 (iii) ロールバックは「コマンド 1 つで 30 秒以内に戻せる」状態を常時維持、 (iv) Blameless postmortem と 5 Whys で構造改善を続ける。 SSDSE-B のような実データを扱う運用では、 「データ更新サイクルに合わせた drift 監視」「確報値・改定値の二重取り込み防止」「47 都道府県粒度での Canary 展開」など、 ドメイン固有の運用設計が品質を分ける。 教科書的な MLOps を学んだら、 必ず自分の手元データで「障害台帳」「runbook」「postmortem テンプレート」を 1 枚ずつ書いてみると、 運用の解像度が一気に上がる。

🛠 SSDSE-B 推論パイプライン運用 — 具体ケース 7 連発

SSDSE-B-2026 を題材にした「予測 API + 月次再訓練」パイプラインを実際に運用する際、 現場で必ず遭遇する 7 つのケースを掘り下げる。 単純な「監視を入れましょう」では済まない、 ドメイン固有の落とし穴と対処を、 個別の SLO 設計と紐付けて記述する。 これらはすべて、 47 都道府県粒度の人口推計を例にしているが、 構造は他の集計データでも共通である。

ケース 1: 「総人口」確報値と改定値の二重カウント。 総務省統計局は推計人口を毎月公表し、 国勢調査年に「改定値」を遡及適用する。 運用パイプラインで「最新値で上書き」と「履歴を保持」を取り違えると、 同一年月のレコードが二度学習に入り、 重みが偏る。 対策は (i) ingest 段で (prefecture, year_month, revision) の複合キーを必須化、 (ii) revision の新旧でレコードを区別、 (iii) モデル投入時に最新 revision のみを使うフィルタを定数化する、 の 3 点である。 PSI 監視だけでは検知できないので、 ingest job の終了時に「重複キー件数 = 0」をハード assertion する。

ケース 2: 47 都道府県の Canary 展開順序。 新モデルを一度に全 47 都道府県へ展開するとロールバック単位が荒くなる。 推奨は「沖縄 → 鳥取 → 島根 → ... の小規模県 5 県 (1 時間) → 中規模県 15 県 (3 時間) → 大規模県 27 県 (24 時間)」の段階展開。 各段階で SLI (predict_p95_latency_ms, predict_error_rate) を新旧比較し、 旧モデルより 10% 以上悪化したら自動 abort。 この設計だと、 仮に問題が発生しても 5 県分のリクエストしか影響を受けず、 ロールバックも 1 minute で済む。

ケース 3: SSDSE-B 列追加への耐性。 SSDSE-B は年次でカラム追加・名称変更がある。 たとえば「保健医療費」の集計範囲が変更されたケース。 運用側で「unknown column が来たら fail」「known column が消えたら fail」の二方向 schema check を CI に組み込む。 さらに、 schema mismatch が発生した場合は「直近 30 日のリクエストを古いスキーマで処理し、 新スキーマ対応版をシャドウデプロイ」する移行レーンを用意する。 これにより、 SSDSE-B の年次更新でサービス停止することが無くなる。

ケース 4: 都道府県ごとの推論レイテンシ偏り。 東京・大阪・神奈川は問い合わせ件数が多く、 キャッシュヒット率が高いためレイテンシが小さい。 一方、 鳥取・島根・高知は問い合わせ件数が少なくキャッシュミスが頻発、 p95 レイテンシが他県の 3 倍になることがある。 「全体 p95 が SLO 内」で安心せず、 都道府県別 p95 を 47 系列でダッシュボード化する。 偏りが大きい県には pre-warming (起動時に上位 100 リクエストを再生) を導入する。

ケース 5: 月次再訓練ジョブのコスト爆発。 モデルを毎月再訓練する際、 ハイパーパラメータサーチを毎回フルで回すと月数百ドル単位でコストが嵩む。 対策は「ハイパーパラメータは四半期に 1 回フル探索、 月次は前回の最良パラメータを起点に局所探索」の二段戦略。 これで再訓練コストは 70% 削減でき、 性能劣化は 0.5% 以内に収まる経験則がある。

ケース 6: SSDSE-B 取り込みパイプラインの再現性。 過去に学習したモデルを「同じ条件で再現」できる状態を維持するため、 取り込み元の SSDSE-B CSV のハッシュ値、 加工スクリプトの git SHA、 ライブラリバージョンの 3 点を学習成果物に紐付ける。 さらに、 1 年に 1 回「過去の任意のモデルを clean room で再ビルド」する dry-run を実施。 これで、 監督官庁・学術論文・社内法務から「あのモデルの根拠を示せ」と求められた時に即応できる。

ケース 7: シーズナリティと運用カレンダー。 推計人口の集計は 4 月 (新年度), 10 月 (国勢調査基準月) に大きな更新がある。 これらの月は drift が増大しやすく、 アラート閾値を「平常時 PSI 0.20、 4 月・10 月のみ 0.30」と切り替える。 切り替えはコードではなく、 運用カレンダー (Google Calendar or Notion) で宣言し、 オンコール担当が交代時に必ず確認する。 「コードで全部やる」ではなく、 「人とコードの責任境界」を明示することが運用の質を上げる。

これら 7 ケースは、 一見すると「個別の小技」に見えるが、 共通項は「SSDSE-B というドメインデータの性質 (年次更新, 確報・改定値, 47 都道府県粒度, 月次シーズナリティ) を運用設計に折り込んでいる」ことである。 一般論の MLOps 教科書では学べない、 ドメイン固有の運用ノウハウは、 こうした「データの癖」を運用設計に翻訳する作業から生まれる。 自分の現場のデータ特性を 10 個書き出し、 それぞれを SLO/SLI/runbook に対応させる作業が、 運用品質の決定的な差を作る。

📋 運用設計テンプレ — 4 視点 12 質問

新規 AI サービスをリリースする前に、 運用チームとプロダクトチームで合意しておくべき設計事項を、 4 視点 (信頼性 / 可観測性 / 変更管理 / 組織) に整理し、 計 12 個の質問にまとめた。 すべての質問に「はい、 設計済み」と答えられない状態でリリースすると、 必ず深夜のオンコールで誰かが泣くことになる。

視点 1: 信頼性 (Reliability)

Q1-1. SLA, SLO, SLI が文書化されており、 顧客・ステークホルダーと合意済みか? 「99.5%」など曖昧な数字でなく、 「カレンダー月における、 5xx 応答を除くリクエストの p95 レイテンシが 500ms 以下である割合が 99.5% 以上」と定義の粒度まで詰めているか。

Q1-2. エラーバジェットの消費ペースが週次でモニタされ、 25% 残量を切ったときに新機能リリースをフリーズする運用プロセスが文書化されているか? バジェット消費の Slack 通知は誰宛か、 フリーズ判断は誰がするか、 までを明文化。

Q1-3. ロールバックが「コマンド 1 つで 30 秒以内」に実行できるか? 検証は本番に近い stage 環境で四半期に 1 回 dry-run しているか。 SSDSE-B のような月次データの場合、 ロールバック先のモデルが古すぎないか (3 ヶ月以上前のモデルへ戻ると drift で逆に悪化) も確認する。

視点 2: 可観測性 (Observability)

Q2-1. RED metrics (Rate, Errors, Duration) + USE metrics (Utilization, Saturation, Errors) + ML 固有 metrics (drift, fairness gap, calibration) の 3 階層が並列で取れているか? どれか 1 つでも欠けると、 障害時に「サービスの問題か、 インフラの問題か、 モデルの問題か」の切り分けに数十分かかる。

Q2-2. ログ・メトリクス・トレースの 3 つが「同じ request_id で串刺し検索」できる状態になっているか? OpenTelemetry または同等の規格に従い、 サービス間の transaction id 伝搬を CI レベルで強制しているか。

Q2-3. ダッシュボードに「3 つの黄金 view」が常設されているか? すなわち (i) 顧客視点 (RED), (ii) インフラ視点 (USE), (iii) モデル視点 (drift / fairness / calibration)。 オンコール初動はこの 3 view を順に見るだけで「どこに問題があるか」が 1 分で分かるはず。

視点 3: 変更管理 (Change Management)

Q3-1. 全ての本番デプロイが Canary → Progressive Rollout の段階展開を経ているか? その判定は人間の目視ではなく、 自動 abort 条件 (SLI 悪化, error rate spike) でゲートされているか。

Q3-2. モデル・コード・データの 3 種の変更が、 個別にバージョン管理され、 「どの version の組み合わせで作ったか」が再現可能か? モデル成果物に コード SHA, データセットハッシュ, ライブラリバージョン, 環境 OS の 4 点が記録されているか。

Q3-3. Feature flag で新機能を「段階的に有効化」できるか? 全有効化前に「内部社員のみ」「特定都道府県のみ」「ランダム 1%」など、 影響範囲を絞った試行ができる仕組みが整っているか。

視点 4: 組織 (Organization)

Q4-1. オンコール体制が 24/7 で組まれており、 1 次対応者 (Primary), 2 次対応者 (Secondary), Manager-on-Duty の 3 階層が明確か? シフトは Pagerduty などで自動化され、 担当不在のスキマが無いか。

Q4-2. Blameless postmortem の運用ルールが文書化され、 過去 12 ヶ月の postmortem が全社員から読める状態か? Action item の完了率を KPI として追跡しているか。

Q4-3. 新規エンジニアが「最初の 30 日で実施するオンコール訓練」のカリキュラムが整備されているか? runbook の読解, stage 環境での障害シミュレーション, postmortem の写経, シャドウオンコール の 4 ステップを段階的にこなせる構成になっているか。

この 12 質問のうち「いいえ」が 3 つ以上あるなら、 そのサービスは商用リリース基準を満たしていない。 まずは「いいえ」を 0 にすることに集中し、 その後に機能拡張や規模拡大を検討する順序を厳守する。 運用設計を後回しにしたサービスは、 必ず「リリース後 6 ヶ月で技術的負債が爆発する」ジンクスを背負うことになる。

🎓 運用力を伸ばす学習ロードマップ (90 日)

AI 運用 (MLOps + SRE for ML) は、 単一の本やコースで完結する分野ではない。 SRE, DevOps, ML, Data Engineering, セキュリティ など複数領域の知識を組み合わせて構築する総合技術である。 ここでは、 ML エンジニアまたはデータサイエンティストが「90 日で運用力を実用レベルに引き上げる」ためのロードマップを 3 つのフェーズに分けて提示する。

Phase 1 (Day 1-30): 概念と用語の正規化

SLA, SLO, SLI, エラーバジェット, MTBF, MTTR, RTO, RPO, Canary, Blue-Green, Feature Flag, Rollback, Drift, Champion-Challenger, Shadow Deploy, Postmortem, Runbook, On-call, Toil の 18 用語を「人に説明できる」レベルまで理解する。 おすすめ教材は (i) Google SRE Book の第 1-4 章 (無料公開), (ii) Designing Data-Intensive Applications の第 8 章, (iii) Machine Learning Design Patterns の第 6 章。 各章を読んだ後、 「自分の言葉で 200 字要約」を Notion or 個人ブログにまとめる。 アウトプットを伴わない読書は、 1 ヶ月後にほぼ全て忘れる。

この 30 日間で並行して「観察学習」を進める。 OSS のメジャープロジェクト (Kubernetes, Airflow, MLflow など) の postmortem や incident report を 10 件読む。 「どの兆候を見落としたか」「どこで判断ミスが起きたか」「Action item は実装されたか」の 3 観点で記録する。 他者の失敗から学ぶことは、 自分が同じ轍を踏まないための最短ルート。

Phase 2 (Day 31-60): 個人プロジェクトで実装

SSDSE-B-2026 の人口予測モデルを題材に、 個人レベルで「Minimum Viable MLOps」を構築する。 構成要素は (i) FastAPI で predict API, (ii) PostgreSQL で予測ログ保存, (iii) Prometheus + Grafana で metrics 監視, (iv) GitHub Actions で CI/CD, (v) MLflow で実験トラッキング, (vi) Apache Airflow で月次再訓練, (vii) Evidently AI で drift 監視。 これら 7 コンポーネントを Docker Compose で 1 つの開発環境にまとめる。

構築できたら、 自分で「3 種類の障害」を起こしてみる。 (a) DB を停止して predict API がどう振る舞うか, (b) Drift 閾値を意図的に超えてアラートが鳴るか, (c) Canary deploy で新モデルが旧モデルより悪い場合に自動 rollback されるか。 これらを runbook 化し、 障害発生から復旧までの手順を 1 ページにまとめる。 「障害を起こせる環境を持っている」ことは、 運用力の最大の資産になる。

Phase 3 (Day 61-90): チーム運用への適用と振り返り

所属チームに、 Phase 2 で学んだ運用パターンを 1 つだけ持ち込む。 全部一気に変えるとチームが拒絶するので、 「最も困っている領域」を 1 つ選び、 そこに 30 日かけて根付かせる。 例: drift 監視が無いなら Evidently AI を導入、 runbook が散在しているなら Notion に集約、 postmortem が形骸化しているならテンプレートを 1 枚作って次回から強制適用。

90 日終了時点で、 (i) 学んだ概念の整理ノート, (ii) 個人 MLOps スタックの GitHub repo, (iii) チームに導入した運用改善 1 件, (iv) その効果 (障害件数減・MTTR 短縮・toil 削減 のいずれか) のグラフ, の 4 つを成果物として持っているはず。 これらをポートフォリオにまとめれば、 「運用ができる ML エンジニア」として転職市場でも評価される。

運用力は属人技ではなく再現可能なエンジニアリング技術である。 90 日のロードマップを愚直に実行することで、 確実に運用の地肩がつく。 重要なのは「障害を恐れず、 障害から学ぶ姿勢」と「概念を実装で確認する習慣」の 2 つ。 この 2 つさえあれば、 残りは時間と試行回数の問題でしかない。 ぜひ、 今日から Phase 1 の Day 1 を始めてほしい。 関連トピックは モデル監視, 再学習, AI システム開発, サイバーセキュリティ, データガバナンス も参照のこと。

🧭 SLO 設計の数理 — エラーバジェットの実務計算

SLO とエラーバジェットは「決める」だけでは機能しない。 数値を運用に組み込み、 毎週・毎月の判断材料として使えてはじめて意味がある。 ここでは SSDSE-B 推論 API を題材に、 SLO 設計から運用までの数理を具体的にトレースする。 すべての計算は手元の表計算ソフトで再現できる粒度で記述する。

ステップ 1: 顧客視点の SLI を決める。 SSDSE-B 推論 API の場合、 顧客が直接気にするのは「自分のリクエストが (a) 成功するか, (b) 一定時間内に返るか, (c) 結果が正確か」の 3 つ。 これに対応する SLI を 「成功率 = (2xx 応答 + 4xx クライアントエラー) / 全リクエスト」「レイテンシ p95 = リクエストの 95 パーセンタイル応答時間」「予測精度 = 直近 30 日の予測値と確報値の MAPE」と定義する。 4xx を成功側に入れるのは「クライアント側の入力誤りはサービスの可用性問題ではない」という SRE 教科書の原則に従う。

ステップ 2: SLO 目標値を顧客契約と整合させる。 顧客が「月次で 30 分以上のダウンタイムは許容できない」と要求しているなら、 SLO は「成功率 99.93% (30 分 / 43,200 分 = 0.07% ダウン許容)」と逆算する。 これを「99.9%」と丸めて緩めると、 月 43 分のダウンが許容範囲となり契約違反のリスクが残る。 SLO は契約より「ほんの少し厳しめ」に設定するのが鉄則。

ステップ 3: エラーバジェットを「分」に変換する。 99.93% SLO の月次バジェットは 43,200 × (1 - 0.9993) = 30.24 分。 これを週次に分割すると 30.24 / 4.33 ≈ 6.99 分/週、 日次なら 30.24 / 30 ≈ 1.01 分/日。 オンコールチームは「今週のバジェットをすでに 7 分以上消費したか?」を毎週月曜に確認することで、 早期に問題を検知できる。

ステップ 4: バーンレートでアラート閾値を設計する。 Burn Rate = 期間中の消費速度 / 全期間で消費しきる速度。 たとえば「1 時間のうちにバジェットの 2% を消費」なら Burn Rate = (43,200/60) × 0.02 / 30.24 ≈ 0.476。 これを 1.0 を超えるレベルで連続検知する設計にすれば、 「1 時間以内にバジェットを使い切るペース」を即座に検知できる。 Google SRE Book の「Multi-Window, Multi-Burn-Rate Alerts」設計を参照すると良い。

ステップ 5: バジェット消費を可視化する。 Grafana で「バジェット残量 (分)」「Burn Rate (current 1h, 6h, 24h)」「SLI 達成率 (running 28 day window)」の 3 グラフを横並びで表示。 リーダーシップとの月次レビューでも、 この 3 グラフを示すだけで「今月の運用は健全か」が即座に伝わる。 数字でなく図で語ることが、 経営層との対話を円滑にする。

ステップ 6: バジェットと機能リリースを連動させる。 「バジェット残量 25% 未満 → 新機能リリース凍結」「10% 未満 → リライアビリティ施策のみ」「0% → インシデント宣言」と段階的に厳しくする。 これを「フリーズポリシー」として文書化し、 全エンジニアが議論なしに守るルールにする。 ルールを破る場合は CTO 承認を必須とすることで、 例外を可視化できる。

ステップ 7: バジェット余り運用 (Chaos Engineering)。 月末にバジェットが半分以上残っている場合、 「無駄に保守的な運用をしている」可能性がある。 残バジェットの一部を Chaos Engineering (故意の障害注入) に使うことで、 「想定外の障害」に対する耐性を継続的に試験できる。 残バジェット 50% のうち 10% を chaos に割り当てる、 などの設計が有効。

この 7 ステップは、 単にエラーバジェットを「計算する」だけでなく「運用に組み込む」ための実務手順である。 数字を毎週見て、 数字に基づいて判断する文化を作ることが、 SRE と MLOps の核心。 数字なき運用は、 結局のところ「声の大きい人の感覚」で意思決定される属人体制に戻ってしまう。 数字を武器に、 議論を構造化する。 これが、 運用エンジニアリングの本質である。

📓 障害台帳の書き方 — 30 件のサンプル分類

障害台帳 (Incident Ledger) は、 過去に発生した障害を時系列・カテゴリ別に集約した記録である。 単なる postmortem の集まりではなく、 「同種の障害が何回起きているか」「対策後に再発していないか」を一覧可能にすることで、 構造的な弱点を可視化する。 30 件の架空サンプルを 6 カテゴリに分類し、 障害台帳の書式と運用方法を提示する。

カテゴリ A (デプロイ起因, 8 件)。 A-001: Canary 1% で SLI 悪化を検知できず、 5% で発覚し rollback。 原因は「1% 環境のサンプル数が少なすぎ統計的検出力が不足」。 対策: Canary を「最低 1,000 リクエスト溜まるまで」延長。 A-002: Blue-Green 切り替え時に DB マイグレーションが先行し、 旧モデルが新スキーマで動かなかった。 対策: マイグレーションは「forward compatible」を厳守。 A-003: 設定ファイルの YAML エラーで起動失敗、 CI で検知できず本番で気付いた。 対策: CI に YAML lint を追加。

カテゴリ B (データ起因, 7 件)。 B-001: SSDSE-B 2025 年版から「保健医療費」列が削除され、 取り込みパイプラインが fail。 対策: schema check を二方向に強化。 B-002: 確報値と改定値の二重取り込みで重みが偏った。 対策: ingest 段で revision キーを必須化。 B-003: 県別 CSV のエンコーディングが Shift_JIS で文字化け、 県名マッチが失敗。 対策: ingest 段で UTF-8 強制変換とエンコーディング検知を追加。

カテゴリ C (モデル起因, 5 件)。 C-001: 月次再訓練後に MAPE が悪化、 原因はランダムシード未固定で乱数依存の挙動。 対策: 学習スクリプトに seed 固定を追加、 CI で再現性確認。 C-002: ハイパーパラメータの探索範囲が広すぎ、 学習時間が前月の 3 倍に。 対策: 四半期フル探索 + 月次局所探索の二段戦略。 C-003: クラス不均衡が悪化し、 一部都道府県の予測精度が著しく低下。 対策: SMOTE と class_weight の併用、 県別 MAPE を新規 SLI に追加。

カテゴリ D (インフラ起因, 5 件)。 D-001: Kubernetes node の OOM Kill で pod 再起動連鎖、 SLA を 30 分破る。 対策: メモリ上限を 1.5 倍に、 HPA の min replicas を 3 に。 D-002: ロードバランサのヘルスチェックが厳しすぎ、 GC pause 中に degradation 判定。 対策: ヘルスチェック interval を 5 秒→15 秒に、 threshold を 3→5 に。 D-003: クラウド事業者のリージョン障害で 1 時間停止。 対策: マルチリージョン化の計画策定 (ただしコスト要承認)。

カテゴリ E (ヒューマンエラー起因, 3 件)。 E-001: オペレータが本番 DB を stage 環境と勘違いし truncate 実行。 対策: 本番接続には MFA + ターミナル背景色変更 + confirmation prompt を強制。 E-002: PR レビュー時に重要な設定変更を見落とし、 マージ後に本番障害。 対策: 設定ファイル変更は CODEOWNERS で SRE レビュー必須に。 E-003: オンコール引き継ぎ時に「ペンディング中の調査タスク」が伝わらなかった。 対策: 引き継ぎチェックリストを Notion テンプレート化。

カテゴリ F (セキュリティ起因, 2 件)。 F-001: 開発者が本番 API キーを誤って GitHub に push、 24 時間以内に検知。 対策: pre-commit hook に secret scan を追加、 GitHub Push Protection を有効化。 F-002: 古いライブラリの CVE で SSRF 脆弱性、 監査でしか検知できなかった。 対策: 依存パッケージ更新を月次に強制、 Dependabot を有効化。

この 30 件を 6 カテゴリで集計すると、 「デプロイ起因 27%, データ起因 23%, モデル起因 17%, インフラ起因 17%, ヒューマン 10%, セキュリティ 7%」となる。 つまり、 デプロイとデータの 2 カテゴリで全体の半数を占める。 ここに運用改善の予算を集中投資することで、 全体の障害件数を 50% 削減できる可能性がある。 障害台帳の最大の効用は、 「どこに投資すべきか」をデータで示すことにある。 感覚やベテランの主観ではなく、 集計値で意思決定する。 これが、 障害台帳を運用する真の理由である。

障害台帳の運用ルールとしては (i) 全 P0/P1 障害は 24 時間以内に台帳に記入、 (ii) 月次で集計値レビューを実施、 (iii) 四半期で構造的弱点 (上位 3 カテゴリ) に重点投資、 (iv) 年次で台帳を全社員に公開、 学びを横展開、 の 4 点を厳守する。 台帳が「書きっぱなし」になると価値がゼロになるので、 「集計→投資→効果測定→次の集計」というサイクルで運用することが不可欠。 関連用語として モデル監視, データドリフト, ポストモーテム, runbook, オンコール も参照してほしい。

🧪 ポストモーテム 5 Whys 実践テンプレ

Blameless postmortem の核は「個人を責めず、 システムの構造を問う」こと。 ただし「Blameless だから何でも許される」のではなく、 「Why を 5 回繰り返して構造原因に到達する」のが定石である。 SSDSE-B 推論 API の架空インシデント「2026 年 3 月 14 日、 全 47 都道府県で 12 分間 5xx 応答が連発」を例に、 5 Whys を実演する。

Why 1: なぜ 5xx が連発したのか? → 推論サーバーが OOM Kill で再起動を繰り返したため。 単純な観察事実をまず明確にする。

Why 2: なぜ OOM になったのか? → 新規にデプロイした v3.2 モデルがメモリを 1.8 倍消費したため、 既存のメモリ上限 (2GB) を超えた。 ここで「メモリ消費が増えた」という変化点を発見する。

Why 3: なぜメモリ消費が 1.8 倍になったのか? → v3.2 では特徴量 embedding の次元を 64 → 128 に倍増したため、 内部キャッシュサイズが拡大した。 設計変更そのものは性能向上目的で正当だが、 メモリへの影響を事前に評価していなかった。

Why 4: なぜメモリ影響評価が抜けたのか? → モデル変更の PR テンプレートに「リソース影響評価」のチェック項目が無かった。 また、 stage 環境のメモリ上限が本番より緩く (4GB)、 stage では問題が再現しなかった。

Why 5: なぜ stage と本番でメモリ上限が異なるのか? → 2024 年に「stage を安く運用しよう」とリソース見直しを行った際、 本番と stage の対称性が崩れた。 当時はメモリ依存の障害が少なかったため、 非対称が問題視されなかった。 ここでようやく構造原因に到達。

Action Items (5 Whys から導出した恒久対策)。 (a) モデル変更 PR テンプレートに「リソース影響評価」セクションを追加 (Why 4 対応)。 (b) stage 環境のリソース上限を本番と一致させる、 もしくは「本番より厳しい」設定に変更 (Why 5 対応)。 (c) Canary 段階で「メモリ使用率の前バージョン比」を新規 SLI として導入 (Why 3 対応)。 (d) OOM Kill 発生時に自動 rollback する仕組みを追加 (Why 2 対応)。 (e) 5xx 連発時の自動アラート閾値を「1 分間 10 件→3 件」に厳格化 (Why 1 対応)。

5 Whys の落とし穴。 (i) 「個人を責める方向」に Why を進めない (例: 「なぜ A さんがレビューを見落としたか」は NG、 「なぜ見落としやすい仕組みになっていたか」は OK)。 (ii) Why が 5 回で到達しなくても焦らない、 7 回・10 回まで掘ることがある。 (iii) 逆に 3 回で構造原因に到達したらそれで止める、 無理に 5 回まで引き伸ばさない。 (iv) Action item は必ず「測定可能で完了判定できる」形に書く、 「気を付ける」「徹底する」は禁止。

この 5 Whys テンプレを SSDSE-B 推論 API のような実プロジェクトに適用することで、 「単発の障害対応」から「構造改善の連鎖」へと運用文化が変わる。 1 件の障害から 5 件の改善 (Action items) を生み出すことが、 成熟した運用組織の条件である。 障害は「失敗」ではなく「学習の機会」、 ポストモーテムは「責任追及」ではなく「次回への投資」と位置付ける。 この意識転換ができるかどうかが、 運用組織の成熟度を決定的に分ける。 詳細は ポストモーテム, runbook のほか モデル監視, 再学習, サイバーセキュリティ の各ページも併せて読んでほしい。

🔐 運用文化を支える 5 つの規律

技術や仕組みを揃えても、 それを支える「規律 (discipline)」が無ければ運用は崩れる。 ここでは、 強い運用組織に共通する 5 つの規律を、 SSDSE-B 推論 API の運用シーンに具体化して提示する。 規律は「個人の頑張り」ではなく「組織の制度設計」として実装することが重要。

規律 1: SLO を顧客と共有する。 SLO を社内文書に閉じ込めず、 顧客向け Status Page で公開する。 「99.93% を目指しています、 直近 28 日の実績は 99.94% です」と数値で示すことで、 顧客との信頼関係が構造化される。 SSDSE-B 推論 API なら、 統計利用者コミュニティに対して「月次レポート」を発行し、 SLA/SLO/MAPE の 3 指標を毎月共有する。 透明性は信頼の土台。

規律 2: Runbook を実行可能な状態に維持する。 Runbook が「読み物」になると、 緊急時に役に立たない。 「コマンドをコピペすれば動く」「リンクをクリックすればダッシュボードが開く」「数値を入力すればチェックリストが進む」状態を維持する。 半年に 1 回、 オンコール訓練で「runbook を実際に最後まで実行できるか」を試験。 試験で詰まった箇所はその日のうちに更新する。

規律 3: Toil を可視化し、 削減目標を持つ。 Toil (繰り返し作業) は、 オンコール時間の 50% を超えると「成長と改善ができない悪循環」に陥る。 月次で「オンコール時間のうち toil が何%」を計測し、 50% を超えていれば「toil 削減プロジェクト」を四半期テーマに据える。 SSDSE-B 推論 API の場合、 「月次再訓練ジョブの手動起動」「ログ集計のスクリプト実行」「drift アラートの一次対応」などが典型的 toil。

規律 4: 学びを共有する仕組み。 障害台帳とポストモーテムは「書いて終わり」ではなく、 全社員が読める状態に置き、 「月次 incident review」「四半期 retrospective」「年次 reliability summit」の 3 種のレビュー機会で共有する。 SSDSE-B 推論 API の例で言えば、 「2026 年に学んだ 7 つの教訓」を年次でまとめ、 新規参画メンバーのオンボーディングに使う。 過去の失敗は資産。

規律 5: 経営層と数字で対話する。 運用品質を「印象論」で議論すると、 必ず予算が削られる。 「SLO 達成率」「障害件数推移」「MTTR 推移」「toil 比率」「エラーバジェット消費率」の 5 指標を、 経営層向け月次レポートに必ず入れる。 数字は冷たいが、 経営判断は数字でしか説得できない。 運用エンジニアが経営層と直接対話するチャネルを持つことが、 運用文化を維持する最後の砦。

この 5 規律は、 強い運用組織なら例外なく実装している。 個別の技術 (Kubernetes, Prometheus, MLflow, ...) を学ぶことも重要だが、 それらを「規律として組織に根付かせる」プロセスがなければ、 技術投資は無駄になる。 SSDSE-B 推論 API のような中規模システムでも、 5 規律をしっかり実装すれば、 大企業並みの運用品質を実現できる。 規模ではなく規律が、 運用の質を決定する。 今日から自分の現場に持ち帰れる規律を 1 つだけ選び、 来週から実装してほしい。 1 つの規律が、 6 ヶ月後には組織全体の文化を変える種になる。

最後に、 これらの規律を「自分一人」で抱え込まないことが重要である。 運用は本来チーム競技であり、 一人が頑張っても続かない。 規律を制度化するには、 (i) ペア・モブ運用を導入し、 オンコール対応を二人以上で実施する文化を作る、 (ii) 規律違反を「個人攻撃」ではなく「制度の不備」として議論する、 (iii) 規律を守ったメンバーを四半期表彰の対象に含める、 (iv) 規律を破った場合のリカバリ手順 (postmortem, action item フォローアップ) を明文化する、 の 4 ステップで「個人努力」を「組織文化」に翻訳する。 SSDSE-B 推論 API のような統計データ提供サービスは、 公共性が高く、 信頼性が一度損なわれると回復に何年もかかる。 だからこそ、 平時から規律を維持する仕組みが、 緊急時に組織を救う最後のセーフティネットとなる。 ぜひ、 今日この瞬間から、 自分のチームで「規律を組織化する」議論を始めてほしい。

本ページでは AI 運用の全体像を、 SLA/SLO/SLI の数理から障害台帳・ポストモーテム・5 Whys・90 日学習ロードマップ・5 規律まで、 SSDSE-B 推論 API という具体例に紐付けて整理した。 個別の技術スタック (Kubernetes, Prometheus, MLflow, Airflow, Evidently, ...) は別ページに譲り、 ここでは「運用とは何か」「なぜ重要か」「どう実装するか」の 3 段階を、 教材としての一貫性を意識して描いた。 読み終えた後の最も重要なアクションは、 「自分の現場で実装する 1 つを決める」こと。 完璧な運用設計を求めると何も始まらないが、 1 つ始めれば必ず学びがある。 学びは次の改善を生み、 改善は次の学びを生む。 この正のループに入ることが、 運用エンジニアの最も価値ある成果である。 関連する詳細トピックとして、 MLOps, モデルデプロイ, モデル監視, 再学習, データドリフト, データガバナンス, サイバーセキュリティ, 情報セキュリティ, 可用性, AI の信頼性 の各ページも、 本ページと相補的に学習することを強く推奨する。

補足として、 AI 運用を学ぶ上で覚えておきたい 3 つの心得を記して締めくくる。 第 1 に、 「運用は地味で長期戦」だと割り切ること。 派手な新機能リリースより、 静かに動き続ける夜間バッチの方が、 サービスの本質的価値を支えている。 第 2 に、 「運用知見は属人化しやすい」と自覚すること。 だからこそ、 文書化・自動化・組織化の 3 点セットで「自分が休んでもサービスが回る」状態を作る。 第 3 に、 「運用は変化し続ける」と受け入れること。 昨日のベストプラクティスは明日には陳腐化する。 学び続ける姿勢、 業界動向 (SRE conference, MLOps community, KubeCon, ...) を追い続ける習慣が、 運用エンジニアとしての寿命を延ばす。 SSDSE-B 推論 API の運用も、 2026 年時点のベストプラクティスに過ぎず、 2030 年には別の枠組みが標準になっているはずだ。 だからこそ、 個別の手順より「原理原則 + 学び続ける姿勢」を身につけることが、 何よりも重要となる。

🧮 SSDSE-B 実値計算 — 都道府県データで手を動かす

SSDSE-B-2026 で 「過去 2 年(2024 vs 2026)の人口分布変化」を擬似ドリフトとして可視化することで、 運用フェーズで必要な分布監視のイメージを掴む。

使用データ:SSDSE-B-2026.csv(独立行政法人 統計センター提供、 47 都道府県 × 100 超の社会経済指標)。 出典

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A4101(出生数) 北海道 5,092,000 24,430 東京都 14,086,000 86,348 沖縄県 1,468,000 12,549 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={df.columns[2]: 'pref'})

# 「過去総人口」を A1101 から出生数(A4101)を引いて擬似生成(ドリフト検知デモ)
df['pop_now']  = df['A1101']
df['pop_past'] = df['A1101'] - df['A4101']  # 1 年分の出生数を引いた擬似過去人口

# 分布の平均・標準偏差で簡易ドリフト指標
mu_now,  sd_now  = df['pop_now'].mean(),  df['pop_now'].std()
mu_past, sd_past = df['pop_past'].mean(), df['pop_past'].std()
drift = abs(mu_now - mu_past) / sd_past
print(f'Drift 指標 = {drift:.4f}(0.1 以上で要再学習)')
📤 実行例(実測) Drift 指標 = 0.0072(0.1 以上で要再学習)

▲ 上記コードはそのまま実行可能。 CP932 エンコーディング・skiprows=[1](2 行目の日本語名行をスキップし 1 行目の列コードをヘッダにする)・列名の英数字コード(A1101 = 総人口 など)に注意。

🧮 SSDSE-B-2026 で PSI を実値計算

SSDSE-B-2026 の A1101 (人口) を 5 つのビンに分割し、 仮想的に「学習時 (5 年前と仮定)」と「現在」の分布で PSI を計算します。

ビン (人口千人)$P_i$ 学習時$Q_i$ 現在$P_i - Q_i$$\ln(P_i/Q_i)$寄与
[0, 1000)0.300.36-0.06-0.1820.0109
[1000, 2000)0.280.30-0.02-0.0690.0014
[2000, 5000)0.210.20+0.01+0.0490.0005
[5000, 10000)0.130.08+0.05+0.4860.0243
[10000, ∞)0.080.06+0.02+0.2880.0058
PSI 合計0.0429

判定: PSI = 0.0429 < 0.1 → 「安定」領域。 緩やかな少子高齢化を反映した分布シフトはあるが、 モデルを慌てて再訓練する必要はない。 ただし継続監視は必要 (来月 0.12 になるかもしれない)。

🧮 数式に値を入れて手で計算する: 月次 SLA (稼働率)

AWS や Azure の SLA 公開数値 (月間 99.9% 以上) に準じた代表シナリオで、 月別の稼働時間から SLA 達成率を計算する。 SSDSE-B-2026 を題材にした運用ログ集計の実装は下の章 8 を参照。

Step 1: 月別ダウンタイム

総時間停止 [hr]稼働率
1月74420.9973
2月67250.9926
3月74410.9987
4月72030.9958
5月74470.9906

Step 2: 5 ヶ月平均稼働率

合計稼働率 = 0.9973+0.9926+0.9987+0.9958+0.9906 = 4.9750 平均 = 4.9750 / 5 = 0.9950 = 99.50%

🐍 Python で再現

1
2
3
4
5
6
import numpy as np
total = np.array([744, 672, 744, 720, 744])
down = np.array([2, 5, 1, 3, 7])
uptime = (total - down) / total
print(f"月別稼働率: {uptime.round(4)}")
print(f"平均: {uptime.mean()*100:.2f}%")

📤 実行結果

月別稼働率: [0.9973 0.9926 0.9987 0.9958 0.9906] 平均: 99.50%

💬 手計算 (Step 2) 99.50% と Python 出力が完全一致。

🐍 Python での扱い

SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
import numpy as np

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
print(df.shape)
print(df.dtypes)
print(df.describe())

# 「AI運用」の文脈で扱う場合の例:
# 分野: MLOps
# 関連手法は同カテゴリの他用語を参照してください。
📤 実行例(実測) (564, 112) SSDSE-B-2026 int64 Code object Prefecture object A1101 int64 A110101 int64 ... L322106 int64 L322107 int64 L322108 int64 L322109 int64 L322110 int64 Length: 112, dtype: object SSDSE-B-2026 A1101 ... L322109 L322110 count 564.000000 5.640000e+02 ... 564.000000 564.000000 mean 2017.500000 2.690688e+06 ... 26931.026596 59784.718085 std 3.455117 2.730951e+06 ... 4219.487086 8813.812956 min 2012.000000 5.370000e+05 ... 14661.000000 35658.000000 25% 2014.750000 1.082250e+06 ... 24200.750000 53794.500000 50% …(以下略)

具体的なコードは データエンジニアリング を参照してください。

📝 レポートでの報告

分析結果を報告するときに含めるべき情報:

✅ チェックリスト

🔗 同カテゴリの他用語

AI構築MLOpsモデルデプロイモデル監視再学習データドリフトAIシステム開発AI計算デバイスAIクラウドサービス機械学習ライブラリ

🐍 Python 実装バリエーション

「AI 運用」を扱う代表的なライブラリ別実装。 同じ目的でも書き方が違うため、 自分のプロジェクトの依存関係に合わせて選択する:

① pandas + numpy(最小依存)

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) B4101(年平均気温) 北海道 5,092,000 1,681,000 24,430 11.0 東京都 14,086,000 3,205,000 86,348 17.6 沖縄県 1,468,000 350,000 12,549 23.8 …(全 47 行)
1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df.rename(columns={df.columns[2]: 'pref'})

print('行数:', len(df), '列数:', df.shape[1])
print(df[['pref', 'A1101', 'A1303', 'A4101', 'B4101']].head())
📤 実行例(実測) 行数: 564 列数: 112 pref A1101 A1303 A4101 B4101 0 北海道 5092000 1681000 24430 11.0 1 北海道 5140000 1686000 26407 10.2 2 北海道 5183000 1686000 28762 10.2 3 北海道 5224614 1664023 29523 10.0 4 北海道 5259000 1673000 31020 9.8

② scikit-learn(学習・評価)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
from sklearn.model_selection import train_test_split
import numpy as np

X = df[['A1101', 'A1303']].fillna(0).values
y = df['A4101'].values
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42)
m = LinearRegression().fit(X_tr, y_tr)
pred = m.predict(X_te)
print(f'R²   = {r2_score(y_te, pred):.3f}')
print(f'RMSE = {np.sqrt(mean_squared_error(y_te, pred)):.2f}')
📤 実行例(実測) R² = 0.974 RMSE = 3848.48

③ scipy.stats(統計検定・分布)

1
2
3
4
5
6
7
8
9
from scipy import stats

# 例: 2 変数の Pearson 相関 + p 値
r, p = stats.pearsonr(df['A1101'], df['A4101'])
print(f'相関係数 r = {r:.3f}, p 値 = {p:.2e}')

# 例: 1 標本 t 検定(平均が一定値と異なるか)
t, p = stats.ttest_1samp(df['A4101'], popmean=df['A4101'].mean())
print(f't = {t:.3f}, p = {p:.3f}')
📤 実行例(実測) 相関係数 r = 0.986, p 値 = 0.00e+00 t = 0.000, p = 1.000

④ 可視化(matplotlib + seaborn)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(8,5))
sns.scatterplot(data=df, x='A1101', y='A4101', ax=ax)
ax.set_xlabel('総人口')
ax.set_ylabel('出生数')
ax.set_title(f'{len(df)} 都道府県の関係')
plt.tight_layout()
plt.savefig('out.png', dpi=120)
plt.close()

🐍 Python 実装 — drift 検出と監視の 4 パターン

例 1: scipy で PSI 関数を実装

🎯 このコードでやること: SSDSE-B-2026 の A1101 (人口) を 10 ビンに分割し、 PSI を計算する関数を自作する。 学習時の分布として「2023 年の全 47 都道府県」、 現在の分布として「上位 30 都道府県のみ」をシミュレート。

📥 入力データ:

Code Prefecture A1101 0 R01000 北海道 5092000 1 R13000 東京都 14086000 ... (47 件)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np

def psi(base, current, n_bins=10):
    edges = np.linspace(base.min(), base.max(), n_bins + 1)
    p, _ = np.histogram(base,    bins=edges); p = p / p.sum() + 1e-6
    q, _ = np.histogram(current, bins=edges); q = q / q.sum() + 1e-6
    return float(np.sum((p - q) * np.log(p / q)))

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]            # 2023 年の 47 都道府県に固定
base    = d['A1101']
current = d.nlargest(30, 'A1101')['A1101']    # 上位 30 だけのシナリオ
print(f'PSI (基準 vs 上位 30): {psi(base, current):.4f}')
interpret = lambda v: '安定' if v < 0.1 else ('要注意' if v < 0.25 else '要再訓練')
print(f'判定: {interpret(psi(base, current))}')

📤 実行例:

PSI (基準 vs 上位 30): 0.2140 判定: 要注意

💬 結果の読み方: 「上位 30 都道府県だけ」は意図的に分布を歪めたシナリオなので PSI が 0.21 (要注意帯 0.1–0.25) に上昇する。 母集団が 47 件と小さいためビンが粗く、 0.25 の再訓練閾値までは届かない。 実運用では「先月の入力」と「今月の入力」のような時系列で比較する。

例 2: KS test で連続変数の drift 検定

🎯 このコードでやること: Kolmogorov-Smirnov test で 2 分布の差を統計的に検定する。 PSI は連続値だが、 KS test は p 値が得られるので「統計的に有意な drift か」を判定できる。

📥 入力データ: 例 1 の base, current を流用。

1
2
3
4
5
6
from scipy.stats import ks_2samp

stat, pval = ks_2samp(base, current)
print(f'KS 統計量: {stat:.4f}')
print(f'p 値     : {pval:.4f}')
print(f'結論     : {"drift あり (有意)" if pval < 0.05 else "drift なし"}')

📤 実行例:

KS 統計量: 0.3617 p 値 : 0.0117 結論 : drift あり (有意)

💬 結果の読み方: KS 統計量 0.36 (= 2 分布の CDF の最大差) で p=0.012 < 0.05 → 「2 分布は統計的に異なる」と結論。 PSI (連続値) と KS (有意性検定) を組み合わせると堅牢な検出ができる。

例 3: 精度の継続監視ログ

🎯 このコードでやること: 月次でモデル精度 (RMSE) を測定し、 SLO (RMSE < 5,000) を割ったらアラート文字列を出力する。 ドリフトの発生自体は合成 (シミュレーション) で、 固定した検証セットに月ごとに増大する乖離を注入している。

📥 入力データ: SSDSE-B-2026 を学習データとし、 SSDSE-B-2026 の 2023 年 47 都道府県で 総人口 A1101→出生数 A4101 回帰を学習。 現実には未来データを待つが、 デモのため固定検証セット (20 件) に月次でドリフト係数 (月 6%) を掛けた合成シナリオで RMSE 推移を再現する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]              # 2023 年の 47 都道府県に固定
model = LinearRegression().fit(d[['A1101']], d['A4101'])
val = d.sample(n=20, random_state=42)           # 固定の検証セット
pred = model.predict(val[['A1101']])
SLO_RMSE = 5000
for month in range(1, 7):                       # 月ごとに drift を注入するシミュレーション
    drift = 1 + 0.06 * (month - 1)              # 合成: 関係性が月 6% ずつ乖離
    rmse = np.sqrt(mean_squared_error(val['A4101'] * drift, pred))
    status = 'OK' if rmse < SLO_RMSE else 'ALERT'
    print(f'2026-{month:02d}  RMSE={rmse:>8.0f}  [{status}]')

📤 実行例:

2026-01 RMSE= 1289 [OK] 2026-02 RMSE= 2493 [OK] 2026-03 RMSE= 4108 [OK] 2026-04 RMSE= 5800 [ALERT] 2026-05 RMSE= 7517 [ALERT] 2026-06 RMSE= 9245 [ALERT]

💬 結果の読み方: 注入したドリフトにより 4 月から SLO 違反開始。 3 か月連続 ALERT で「再訓練トリガ」発動が定石。 これがあるからこそ「silent failure」が「audible failure」に変わる。

例 4: champion-challenger とロールバック判定

🎯 このコードでやること: 現行モデル (champion) と新候補 (challenger) を並走させ、 challenger のメトリクスが下回ったら rollback フラグを立てる。

📥 入力データ: 同じ SSDSE-B-2026 で、 出生数 (A4101) を目的変数とし、 champion は総人口 (A1101) のみ、 challenger は総人口 + B4101 (年平均気温) を使う。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]              # 2023 年の 47 都道府県に固定
y = d['A4101']
champion   = LinearRegression()
challenger = LinearRegression()
r2_champ   = cross_val_score(champion,   d[['A1101']],          y, cv=5).mean()
r2_chal    = cross_val_score(challenger, d[['A1101', 'B4101']], y, cv=5).mean()
margin = 0.005
rollback = r2_chal < r2_champ - margin

print(f'champion   R^2: {r2_champ:.4f}')
print(f'challenger R^2: {r2_chal:.4f}')
print(f'rollback判定: {rollback}')

📤 実行例:

champion R^2: 0.9440 challenger R^2: 0.9438 rollback判定: False

💬 結果の読み方: challenger に加えた B4101 (気温) は出生数とほぼ無相関のため R² はほぼ同値 (−0.0002pt)。 margin 0.5pt 以内なので自動 rollback は発火しないが、 明確な改善もないため昇格は見送り、 champion を維持するのが定石。 「悪化していない」ことと「昇格に値する」ことは別、 という運用判断がここでの学び。 これが MLOps の継続デリバリの肝。

⚠️ よくある落とし穴

❌ モデルは劣化する
データドリフト・コンセプトドリフトで精度が下がる。 監視必須。
❌ 再現可能性
入力・コード・乱数 seed・環境を全て管理。
❌ ステージング
本番リリース前にカナリアリリース等で段階的検証。

⚠️ よくある落とし穴(5 件)

「AI 運用」を実務・試験で扱うときに頻発する典型的なミスです。 各項目を 1 度読んでおけば 9 割の事故が防げます:

❌ 監視ダッシュボード未整備
Accuracy / Latency / Cost / Drift を可視化していないと、 障害発生時に状況把握すらできない。
❌ 再学習トリガーが曖昧
「精度 5% 落ちたら再学習」とルール化していないと運用が属人化する。
❌ ロールバック手順なし
新モデルがバグると即座に旧モデルに戻せる仕組みが必須。 Blue/Green デプロイ推奨。
❌ ログを残さない
推論ログ・特徴量・予測結果を残さないと、 後から原因究明できない。 ストレージコストとのバランスを設計。
❌ PII の取扱い
ログに個人情報が混入すると法令違反。 マスキング・暗号化・保持期間を厳格に。

⚠️ AI 運用の 5 大落とし穴

  1. Silent failure: モデルはエラーを吐かず、 ただ精度だけが下がる。 HTTP 500 監視では検知不能。 必ず予測分布・特徴量分布の監視 (PSI / KL) を別レイヤで仕込む。
  2. コスト爆発: GPU 推論は 1 リクエスト数円規模。 「ユーザー急増で 1 日 100 万円課金」事故が頻発。 必ず予算アラート (AWS Budgets / GCP Billing alert) と auto-scale 上限を設定。
  3. ロールバック手順の未整備: 「とりあえずデプロイ」で本番が落ちた時、 旧モデルへの戻し方が不明だと数時間〜数日の障害に。 model registry に必ず previous version を保持し、 ワンクリックで戻せる体制を作る。
  4. ラベル遅延: 教師信号 (正解) が即座に得られないタスク (例: 1 年後の販売額予測) では、 精度劣化が見えるまで 1 年かかる。 「proxy metric」 (短期的に観測可能な代理指標) の設計が必須。
  5. 監査ログ不足で再現不能: 「いつ・どのバージョンのモデルが・どのデータで予測したか」を残さないと、 顧客クレーム対応や規制対応で詰む。 MLflow / Weights & Biases / DVC で lineage を強制保存。

🗺 概念マップ

中央に「AI 運用 (operation phase)」を置き、 (a) MLOps 構成要素として モデル監視・データドリフト検知・コンセプトドリフト検知・再学習トリガを、 (b) インフラ層として モデルサービング (REST/gRPC)・バッチ推論・エッジ推論を、 (c) ガバナンス層として 監査ログ・アクセス制御・モデルバージョニング・ロールバックを、 (d) 上流の AI 構築フェーズ (build) と接続し、 build → deploy → monitor → retrain の循環を視覚化する。

AI 運用 MLOps モデル監視 / ドリフト 再学習 (Retraining) A/B テスト・カナリア モデルデプロイ

AI 運用の鍵は「モデルは時間とともに劣化する」前提に立つこと。 SSDSE-B-2026 で訓練したモデルも、 数年後の人口動態変化で性能低下する可能性が高い。 定期的な再学習・性能監視・データドリフト検知が必須。

🔗 隣接手法への橋渡し

「AI 運用」は単体技術ではなく、 開発→運用→監視の連鎖の中で機能する。 隣接概念とは「接続(前後関係)」「統合(一緒に走らせる)」「比較(役割の違い)」の 3 視点で関係を整理すると重複なく理解できる。

① 接続: AI 構築・MLOps・モデル監視と前後で組む

② 統合: MLOps 基盤の中で並走させる

③ 比較: 役割が混同されやすい隣接概念との違い

隣接概念役割時間軸AI 運用との違い
AI 構築モデル開発・学習・評価本番投入前運用は「動かし続ける」、 構築は「作る」 — 終了条件が異なる
MLOpsCI/CD/CT パイプライン基盤構築〜運用 通しMLOps は手段 (仕組み)、 AI 運用は目的 (KPI 達成)
モデル監視性能・ドリフトの観測運用中 (常時)監視は AI 運用の中の 1 機能、 運用には Rollback・SLA も含まれる
AI システム開発システム全体設計構築寄り開発はシステム全体、 運用はデプロイ後の継続動作のみ
AI 安全性事故防止・耐性確保通し横断安全性は性質 (要件)、 運用は活動 (実行) — 安全性は運用の制約条件

役割を分離すると「MLOps を入れたら運用は不要」「監視だけしておけば運用」という誤解を防げる。 接続 (前後関係)・統合 (同時並走)・比較 (役割差) の 3 視点で隣接概念を整理し、 単独学習でなく組合せで実務に活かす。

🌳 手法選択フロー

「AI運用」を実務で適用する/別手法に切り替える判断を、 状況別の 3 分岐で示す。 一律のレシピではなく、 自分の問題の特徴に応じて分岐を進めること。

  1. 分岐 1(前提条件): 「推論頻度は?」 オンライン → 低レイテンシ推論基盤、 バッチ → スケジューラ運用
  2. 分岐 2(手法特性): 「データドリフトは想定されるか?」 Yes → 監視 + 定期再学習、 No → 性能劣化アラートのみ
  3. 分岐 3(運用要件): 「規制業界か?」 Yes → 監査ログ + モデルバージョン管理、 No → 標準的な MLOps スタック

フローは出発点であって絶対解ではない。 領域知識・データ特性・運用制約を加えて最終判断する。 迷ったときは「🔗 隣接手法への橋渡し」と「🌐 関連手法・派生」を見直し、 単一の手法に固執しないこと。