Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
年間版1秒動画2023 大量配信の裏側 - MIXI TECH CONFERENCE 2023...
Search
浜田 恭平 (Kyohei Hamada)
March 01, 2023
Programming
3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
年間版1秒動画2023 大量配信の裏側 - MIXI TECH CONFERENCE 2023 DAY1
https://techcon.mixi.co.jp/d1-4
浜田 恭平 (Kyohei Hamada)
March 01, 2023
More Decks by 浜田 恭平 (Kyohei Hamada)
See All by 浜田 恭平 (Kyohei Hamada)
モンストのサーバー負荷との戦い 〜あけおめ2018編〜 / bcu_30_server_9
haman29
12
16k
SREによるモンスト改善事例 / improvement-example-of-monster-strike-by-sre
haman29
4
4.5k
Other Decks in Programming
See All in Programming
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
440
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
670
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
670
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
850
仕様駆動開発の消費期限
watany
14
6.2k
What's New in Android 2026
veronikapj
0
250
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
580
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
140
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
370
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4k
Built Our Own Background Agent at LayerX
layerx
PRO
9
4.9k
Featured
See All Featured
Speed Design
sergeychernyshev
33
2k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
200
Are puppies a ranking factor?
jonoalderson
1
3.8k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
240
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
It's Worth the Effort
3n
188
29k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Transcript
©MIXI 年間版1秒動画2023 大量配信の裏側 Vantageスタジオ みてね事業部 Data Engineeringグループ 浜田 恭平
©MIXI 自己紹介 • 浜田 恭平 ( Kyohei Hamada ) •
Twitter: @haman29, GitHub: @haman29 • 三児の父(9y / 5y / 1y)、育児休業1年 • 2017年 株式会社ミクシィ (現 株式会社MIXI) 入社 ◦ 2017年〜 モンスターストライクSRE ◦ 2018年〜 ライブエクスペリエンス事業本部サーバエンジニア ◦ 2019年〜 みてね事業部 Data Engineering グループ(現在) • 普段は Ruby を書いています 2
©MIXI 3 子どもの写真・動画をご家族で共有するアプリ 家族アルバム みてね ※ (株) MIXI 調べ。iOS・Android™ アプリ登録者数、ブラウザ版登録者数の合計
©MIXI Data Engineering グループ 機械学習技術を用いた自動提案・自動編集機能の開発・運用 • MLチーム 3名(兼任2名) ◦ 機械学習モデルに関わる研究開発(モデルの実装・訓練・評価・改善) ◦
機械学習モデルを動かすコンテナの作成や運用 • バックエンドチーム 4名 ← ここに所属しています! ◦ 写真・動画を解析するメディア解析パイプラインの開発・運用 ◦ 各種レコメンドロジックの実装 ◦ Ruby, Rails, ActiveRecord, BigQuery, FFmpeg, ImageMagick 4
©MIXI 関わっている機能 5 1秒動画 人物ごとのアルバム
©MIXI 関わっている商品 6 フォトブック 写真プリント アニバーサリーブック TV版DVD カレンダー みてね年賀状
©MIXI お品書き • 年間版1秒動画のお話 • 配信件数が年々増加する課題 • 2023年の取り組み ◦ 施策1.
1月1日の0時から生成し続ける ◦ 施策2. 本番環境での負荷テスト • 1月1日 本番当日 • まとめ 7
©MIXI 1秒動画 お子さまの成長・思い出がギュッと詰まったダイジェスト動画 • 四季版 • 月版(プレミアム) • 年間版(プレミアム)→ 本日はこちらのお話
8
©MIXI 年間版1秒動画:本体の仕様 • 最長 3分超え ◦ イントロ + ((月タイトル +
5 シーン) * 12ヶ月) + アウトロ • シーン:3.1秒 ◦ 動画:1件を切り出し ◦ 写真:4件をタイル表示など • 全 60 シーン ◦ 1ヶ月あたり最大 5 シーンずつ * 12ヶ月 ◦ 各シーンを 0.5 秒ずつクロスフェード • オリジナルBGM 9
©MIXI 年間版1秒動画:生成フロー 10 1.写真・動画の解析(メディア解析) ◦ 写真・動画がアップロードされるとバックグラウンドで解析処理が走る ◦ メディア解析パイプライン(Ruby, Amazon SQS,
Sidekiq) ◦ 機械学習モデル(Python) i. 顔検出、人物検出 → 「1秒動画」で利用 ii. 顔の姿勢推定、年齢・性別判定、特徴量抽出 →「人物ごとのアルバム」で利用 ◦ レコメンドに利用するため、スコアを事前計算しておく 2.生成対象家族の抽出 ◦ プレミアム加入家族を定期的に抽出しておく
©MIXI 年間版1秒動画:生成フロー 11 3.素材選択 ◦ 機械学習技術を用いたルールベースのレコメンドロジック ◦ スコア付け i. 顔検出
ii. 人物検出(動画のみ) iii. 家族みんなに公開 iv. お気に入り v. コメント数 ◦ 撮影日時を均等にする。日ごと、週ごと、月ごとのグルーピング。 みてねのMeetup #4 『1秒動画の作り方 〜深層学習とデータ分析で最高のダイジェスト動画を作る〜』を開催しました
©MIXI 年間版1秒動画:生成フロー 12 4.1秒動画の生成 ( Transcoder ) ◦ Transcoder と呼ばれるコンポーネント(Ruby)
◦ Sidekiq Batch(Sidekiq Pro 限定の機能)によるパイプライン処理 ◦ FFmpeg コマンドを利用 i. 各素材の回転・切り出し・加工 ii. 全ての素材を結合、BGMをつける iii. Amazon S3 に格納する 5.配信
©MIXI 年間版1秒動画:歴史 13 機能 インフラ 2020年 リリース AWS OpsWorks 2021年
誕生月アニメーション タイトルの多言語化(英語、ドイツ語、フランス 語) AWS OpsWorks, Amazon EKS 2022年 スペイン語追加 Amazon EKS 2023年 BGM のローカリゼーション (欧米圏、アジア圏) Amazon EKS
©MIXI 配信件数が年々増加する課題 14
©MIXI 配信件数が年々増加する課題 15
©MIXI 年間版1秒動画:要件 • 1月1日〜12月31までに撮影した1年間の写真・動画が対象 • 【重要】1月3日までに全てのご家族に配信する • すなわち、およそ2日間で1秒動画を生成する必要がある 16
©MIXI 高負荷が予想されるポイント • 3.素材選択 ◦ 四季版や月版と比べてレコード数が多い ▪ 1家族あたり最大で数十万件の写真・動画が対象 ◦ レコメンドに必要な関連レコードも合わせて取得する
◦ クエリの流量がどうしても多くなる、DBに高負荷が掛かる ▪ Amazon Aurora の Reader Endpoint を利用 • 4.1秒動画の生成(Transcoder) ▪ 年間版1秒動画を1本生成する • 掛かる時間は平均約45分 • 100を超える Sidekiq Worker プロセス数 17 1本の年間版1秒動画を作るだけでそれなりの難易度がある
©MIXI 昨年までのふりかえり • 毎年トラブルが多発し、都度対応が必要な状況 ◦ 素材選択Workerのクエリが刺さる ◦ Spot インスタンス枯渇 ◦
DBのコネクション数が上限に達する • 昨年は1月2日に配信遅延、1月3日に帳尻を合わせた ◦ ギリギリ間に合った 18 過去の経験を踏まえた上で、今年はもっと上手くやりたい
©MIXI 施策1. 1月1日0時から生成し続ける 19
©MIXI 施策1. 1月1日0時から生成し続ける • 昨年まで:デイリーバッチ ◦ 生成対象の家族を2グループ(A, B)に分割 ◦ 1月1日10時に
Aグループを生成開始、1月2日13時に配信 ◦ 1月2日10時に Bグループを生成開始、1月3日13時に配信 • 背景・課題 ◦ 四季版・月版のロジックをそのまま流用する実装 ◦ 四季版・月版では、長い時間を掛けてゆっくり生成することが暗黙的に許容さ れていたので、サーバ負荷が高くなりすぎない程度に生成数を調整すること ができた ◦ 年間版の場合、2日間で全て生成しきる必要がある ◦ 現状のつくりではサーバ負荷のピークが瞬発的にくる 20
©MIXI 施策1. 1月1日0時から生成し続ける • 今年:デーモンプロセス ◦ 1月1日0時に生成開始、生成できた分を1月2日13時に配信 ◦ 繰越分を1月3日13時に配信 •
効果 ◦ 瞬発的なサーバ負荷を軽減することができた ◦ ゆっくり絶えず生成し続けることでスループットも改善した 21
©MIXI 施策2. 本番環境での負荷テスト 22
©MIXI 施策2. 本番環境での負荷テスト • 処理件数は昨年の倍になる予想 • 1月3日の配信に間に合わせるために必要なスループットを試算 • = スループット目標値
• 目的 a. スループット目標値を出せるコードとインフラを用意すること b. 効率よくマシンリソースを使うこと c. 不具合やエラーを検知すること 23
©MIXI 手順 • BigQuery で対象家族の抽出(数千件) ◦ プレミアム家族からサンプリング ◦ 写真・動画数の多い上位5位の家族を含める •
1秒動画生成ジョブを一気に積む ◦ Sidekiq の push_bulk • メトリクスの確認 ◦ New Relic ▪ レスポンスタイム、スループット ◦ Grafana ▪ Amazon EKS の Node や Pod の CPU / Memory を確認 ▪ 1秒動画の生成数を Amazon CloudWatch Metrics に記録 24
©MIXI 各種パラメータ • 素材選択Worker 25 ひとまず昨年の設定ではじめる
©MIXI 各種パラメータ • Transcoder 26 ひとまず昨年の設定ではじめる
©MIXI 負荷テスト1回目 27
©MIXI 素材選択Worker • 極端に実行時間の長いジョブを観測 • 写真・動画を数十万件持つ家族がタイムアウト 28
©MIXI Transcoder (Memory) • Node の Memory にゆとりがある 29
©MIXI Transcoder (CPU) 30 • Node の CPU が100% 張り付き
• 明らかに Pod の CPU 使いすぎ
©MIXI 31 Transcoder (CPU) • Node の CPU が100% 張り付き
• 明らかに Pod の CPU 使いすぎ 修正(1) ・原因が FFmpeg コマンドで一部 `-threads` オ プションの指定漏れであることが発覚。 ・FFmpeg `-threads` オプションのデフォルト値 が CPU論理コア数。 ・つまり無指定の場合、 1 node で複数コンテ ナが動作する前提の K8s において node の vCPU数が指定された状態にあった(例 : c5.4xlarge であれば 16)。 ・修正した結果、 CPU の 100%張り付きが解 消。
©MIXI 32 Transcoder (CPU) • Node の CPU が100% 張り付き
• 明らかに Pod の CPU 使いすぎ 修正(2) ・concurrency を 3 から 4 に増やす ・maxReplicaCount を 1000 から 1200 に増やす 修正(1) ・原因が FFmpeg コマンドで一部 `-threads` オ プションの指定漏れであることが発覚。 ・FFmpeg `-threads` オプションのデフォルト値 が CPU論理コア数。 ・つまり無指定の場合、 1 node で複数コンテ ナが動作する前提の K8s において node の vCPU数が指定された状態にあった(例 : c5.4xlarge であれば 16)。 ・修正した結果、 CPU の 100%張り付きが解 消。
©MIXI 33 Transcoder (CPU / スループット) • Node の CPU
が100% 張り付き • 明らかに Pod の CPU 使いすぎ 修正(2) ・concurrency を 3 から 4 に増やす ・maxReplicaCount を 1000 から 1200 に増やす 修正(1) ・原因が FFmpeg コマンドで一部 `-threads` オ プションの指定漏れであることが発覚。 ・FFmpeg `-threads` オプションのデフォルト値 が CPU論理コア数。 ・つまり無指定の場合、 1 node で複数コンテ ナが動作する前提の K8s において node の vCPU数が指定された状態にあった(例 : c5.4xlarge であれば 16)。 ・修正した結果、 CPU の 100%張り付きが解 消。
©MIXI 34 Transcoder (CPU / スループット) 修正(2) ・concurrency を 3
から 4 に増やす ・maxReplicaCount を 1000 から 1200 に増やす あれ、CPU 100%張り付い てた時よりもスループットが 下がっている...? • Node の CPU が100% 張り付き • 明らかに Pod の CPU 使いすぎ 修正(1) ・原因が FFmpeg コマンドで一部 `-threads` オ プションの指定漏れであることが発覚。 ・FFmpeg `-threads` オプションのデフォルト値 が CPU論理コア数。 ・つまり無指定の場合、 1 node で複数コンテ ナが動作する前提の K8s において node の vCPU数が指定された状態にあった(例 : c5.4xlarge であれば 16)。 ・修正した結果、 CPU の 100%張り付きが解 消。
©MIXI Transcoder (スループット) • スループット目標値の 69% ほど ◦ 1秒動画パイプライン全体を管理する Sidekiq
Worker 35 • pod 数 目標値は このあたり
©MIXI 負荷テスト1回目:結果 • スループットが目標値に到達する前に、用意していた件数を全て捌ききってし まった。 • 翌日、もう一度負荷テストをすることになった。 36
©MIXI 変更点 • 素材選択Worker ◦ 数十万件の写真・動画と関連 レコードを取得するクエリが刺 さっていたので、クエリ自体の チューニング •
Transcoder ◦ パラメータチューニング ◦ CPU 100% に近づけたい ◦ FFmpeg `-threads` を 2 に してみる ◦ maxReplicaCount も増やす 37
©MIXI 負荷テスト2回目 38
©MIXI 素材選択ワーカー 39 実行時間の長いジョブを削減
©MIXI Transcoder (CPU / Memory) 40 (12:00~13:40)CPU を効率的に使えている
©MIXI Transcoder (スループット) 41 スループット目標値の105%達成 (最終的に maxReplicaCount: 3000 から 4000
に上げた) 目標値は このあたり
©MIXI 1月1日本番当日 42
©MIXI 1月1日本番当日 43 • 1月2日10時に全て生成が完了! • 1月2日13時に全てのご家族に配信! • 1月3日までに配信する要件を大幅に達 成!
• スループット目標値の112%! • エラー 0 件! • 1月3日のシフトを削減!最高! 目標値は このあたり
©MIXI まとめ 44
©MIXI まとめ • 年間版1秒動画2023 大量配信の裏側 • 配信件数が年々増加する課題 • 2023年の取り組み ◦
施策1. 1月1日0時から生成し続ける ◦ 施策2. 本番環境での負荷テスト • 結果、1月1日の本番当日はアクシデントがなかった • お正月三が日に全てのご家族に年間版1秒動画をお届けすることがで きた 45