この記事はDMMグループ Advent Calendar 2019の14日目です。
はじめに
二年ぶりのアドベントカレンダー参加です。
前回からチームを移動し、現在はレコメンドチームで運用・開発をしている @funa1g です。
今回はDMMサイト内の複数サービスで表示しているレコメンドの現在の運用設計、今後の課題について紹介します。
この記事でわかること
- DMMレコメンドシステムの運用の雰囲気
- レコメンドのようなバッチ処理に対する運用上の注意点
この記事でわからないこと
- DMMレコメンドシステムのレコメンド手法(これはまたいずれ)
- モダンなMLOpsの運用実態(数年前から運用されているため、結構泥臭い)
現在の運用設計
パイプライン処理
レコメンド結果を毎日Jenkinsでのバッチ処理で生成しています。
前処理を経て、レコメンド結果を出力し、APIサーバへexportするのが大まかな流れになっています。
この処理は結構時間がかかるため、実行時間の変化には気をつけている必要があります。
レコメンドを増やした時や、システムリソースの状態が変化した時に、完了時間が大幅に後ろ倒しになるなどの形で影響が判明したりします。
そのため、レコメンドの生成時間の推移を可視化しています。
こちらは全体の一部です。
これにより、バッチ処理時間に異常があった際には、クリティカルパスを探すことができます。
データ更新の検知
レコメンド生成には、ユーザーの行動ログや商品情報などを利用しています。
これらのデータ(特に商品情報)は定時更新されているため、そちらの更新を検知して、バッチ処理は実施されるようになっています。
何らかの理由でデータが更新されていない場合もあり、その場合には slack に通知を出すようにしています。
パッと見は他のエラーと区別がつかないため、botにJenkins側の状態をチェックさせ、pollingによるエラーであることを検知させています。
通常のエラーと区別し、特別な対応は不要であることがわかるようにしています。
チームのマスコット、nagatochanが教えてくれます。かわいいですね。
レコメンド内容の変化検知
レコメンド作成に利用するユーザーの行動ログは毎日少しずつ変化していきます。
そのため、ある日レコメンドが正しく生成されなくなる場合があります。
この対策として、アイテムベースのレコメンドでは、商品全体の一定割合に対してレコメンドが生成できなかった場合にはエラーを出すようにしています。
大きな対策ではないのですが、以下のようなケースでエラーが出て、その後の問題を回避できました。
- 元データの値の持ち方がいつの間にか変わって、レコメンドの生成割合が減っていた
- ログ取り込み設定にミスがあり、ログが実は取り込まれておらず、レコメンドが正しく生成されていなかった
後者はもっと早く検知できたはずですが、そこは今後の課題ですね。
今後の課題
ここまで現在の運用設計を大まかに見てきました。
すでにそれなりの運用実績がある設計なのですが、レコメンド改善に取り組む上で複数の課題があります。
今後、取り組んでいく予定の課題が次のものになります。
パイプラインの実行時間推移の可視化
現在もパイプライン上のバッチ処理の時間は、可視化されています。
しかし、当日の実行時間を一覧として眺められますが、前日からの実行時間推移などが追いにくい状態にあります。
先ほどの可視化はあくまで1日の中の実行時間を可視化できるだけで、日毎の変化は追えるようになっていません。
また、Jenkinsのパイプラインも実行時間一覧が見られますが、こんな感じでずらっと並んでしまいます。チェックしづらい。
日時変化や全体のボトルネックを探すために、Datadogでの可視化を準備中です。
以下は作りかけのイメージです。今後、もう少し綺麗にして見やすいダッシュボードにする予定です。
レコメンドの質の表示
レコメンドチームでは、レコメンドの質を改善するため、各種改善に取り組んでいます。
改善結果をABテストに出す前に評価するため、オフライン評価に取り組んでいます。
その詳細はこちら。
現在は開発の段階でしか実施していないオフライン評価ですが、これをプロダクトに対しても実施していきたいと考えています。
毎日のレコメンド結果に実施し、その質の変化を見ていくことで、レコメンドの状態変化を可視化し、今後必要な調整をあぶりだすことが目的です。
例えば、前月よりレコメンド結果のアイテムの網羅率が大きく低下している場合、何かデータに変化が発生していることを意味している可能性があります。
合わせて元データとなる商品データの傾向なども推移を確認できるようにすることで、より価値のあるインサイトを得られるようになるはずです。
まとめ
運用設計についてざっくり見てきました。
結構泥臭い内容だったかと思いますが、どこか一つでも面白いと思ってもらえる箇所があるとうれしいです。
さらなる詳細やレコメンドの仕組みについても、今後発信していく機会があるかと思います。
その際にはまたよろしくお願いいたします。
次は @k0bya4 さんです。WebRTCで遊んでみるとのことですが、どんな内容なんでしょうか。