止めることと、残すこと
一言でいうと
再学習は自動で進めても、プロモーションはゲートを通る必要があり、ゲートが止めたものを人が押し切ったなら、その事実まで記録に残さなければなりません。
なぜ必要なのか
再学習パイプラインを作ると、1つ誘惑が生まれます。学習が終わったのだから、そのままデプロイまでつなげてしまうことです。たいていの週には、何も起こりません。問題は、何も起こらないことが成功したという意味ではないことです。上流のデータが1度壊れた週にも、パイプラインは同じように緑のランプをつけ、より悪いモデルが、静かに本番に上がります。
Googleがまとめた、MLOpsの成熟度のドキュメントは、この点をはっきり区別しています。学習パイプラインを自動化すること(継続的学習)と、その成果物を本番に上げること(継続的デプロイ)は、別の段階で、後者には、モデルの検証の段階が必ず挟まっている必要があります(MLOps: Continuous delivery and automation pipelines in machine learning)。
どう動くのか
ゲートは、思ったより単純な数行のルールです。難しいのはルールを決めることではなく、ルールが読む数字が、信頼できる形で用意されているかです。そのため、前のモジュールが先に来ます。
입력 champion 별칭이 가리키는 버전의 평가 지표
challenger 별칭이 가리키는 버전의 평가 지표
데이터 계약 검증 결과
규칙 challenger >= champion + margin 이고 계약 검증 통과
출력 promote | block + 왜 그렇게 판단했는지
マージン(margin)を置く理由は、測定のノイズです。同じデータでも、シードが違うと、正解率が小数点以下3桁で揺れます。マージンが0だと、その揺れだけでチャンピオンが入れ替わり、来週もまた入れ替わります。デプロイが増えるのではなく、意味もなく増えます。
MLflowは、この判断の結果を、バージョンのタグとして付ける方式を、ドキュメントで例に挙げています。検証を待っているバージョンにvalidation_status: pending、通ったバージョンにapprovedを付ける形です(MLflow Model Registry)。ゲートの判定をタグとして残せば、人ではなく自動化が、その条件で次の段階を選べます。
ゲートが読む数字がどこから来るのかも、決めておく必要があります。評価の分割を毎回新しく取ると、指標が揺れて、ゲートが無意味になり、逆に、固定した分割だけを使い続けると、その分割に過学習したモデルが、ゲートを通ってしまいます。そのため、たいていは、固定した分割を基準にしながら、定期的に新しい分割を追加して、2つの数字を一緒に見ます。
そして、ロールバック。前のモジュールでエイリアスを置いた理由が、ここで回収されます。ロールバックは、championが指すバージョンを変えることで、その変更は、監査記録の1行になります。記録に以前の値(from)まで書いておけば、最初から再生したときに、今の状態が出てくるはずで、出てこなければ、どこかに記録されていない変更があったという意味です。この性質1つが、「誰がいつ何を変えたのか」を、推測ではなく検算にします。
ゲートの判定は、人が読めなければなりません。blockという単語1つだけが残ると、次の人は、なぜ止まったのかがわからず、ゲートを疑うようになり、疑われるゲートは、まもなくオフにされます。そのため、判定の横に、比べた2つの数字とマージン、そしてどの条件で引っかかったのかを、文として一緒に残します。
現場での姿
ゲートを作ると、必ず迂回の要請が来ます。デモが明日で、顧客が待っていて、今回のものは確実だと言います。このとき、ゲートをオフにする代わりに、無視できるようにしつつ、無視した事実を残すように設計するほうが長持ちします。止められないものを止めようとすると、人々はゲートの外側に新しい経路を作り、そうなると、記録すら残りません。
2番目によくあるのは、ゲートが見る指標が1つだけの場合です。全体の正解率だけを見ると、少数のグループで大きく悪くなったモデルが通ります。指標を増やすのは簡単ですが、増やした指標ごとに、「どれだけ悪くなったら止めるのか」を決める必要があるので、合意が必要です。その合意をコードに書いておくことが、ゲートの本当の価値です。
3番目は、ロールバックしたあとの沈黙です。ロールバックまではうまくやるのに、なぜそのバージョンが悪かったのかを誰も書かないので、2か月後に似たパラメーターで同じ失敗を繰り返します。
4番目は、ゲートを通ったあとの観察です。プロモーションは終わりではなく始まりなので、新しいチャンピオンが本番で実際にどう振る舞うのかを、数日見守る時間枠が必要です。そのため、多くのチームが、チャレンジャーを一部のトラフィックにだけ流してみてから、エイリアスを動かします。このときも、判断の根拠は、同じ場所に書きます。ゲートが見た数字と、観察期間に見た数字が別々の場所に散らばっていると、ロールバックするかどうかを決める会議で、2人が違う表を持って出てきます。
次のラボですること
バージョンとエイリアスを備えた小さなレジストリを立て、再学習の結果をチャレンジャーとして登録し、マージンを持つプロモーションのゲートをコードで作ります。そのあと、ゲートが止めたプロモーションを人が押し切った状況を再現し、ロールバックしたあと、監査記録を最初から再生して、今の状態と合うかを検算します。最後に、入力の分布がどれだけ動いたかを、数字にします。