大規模開発のための Luminous Engine の ログ分析と自動テスト
Total Page:16
File Type:pdf, Size:1020Kb
大規模開発のための LUMINOUS ENGINE の ログ分析と自動テスト 株式会社 Luminous Productions 岩﨑 浩 自己紹介 • 岩﨑 浩 Hiroshi Iwasaki – Luminous Productions http://www.luminous-productions.com/ – プログラムセクション ディレクター FINAL FANTASY XV MONSTER OF THE DEEP FINAL FANTASY XV © 2016 SQUARE ENIX CO., LTD. All Rights Reserved. MAIN CHARACTER DESIGN:TETSUYA NOMURA LOGO ILLUSTRATION:© 2016 YOSHITAKA AMANO ©2019 Luminous Productions CO.,LTD. Agenda • LUMINOUS ENGINE 紹介 主に機能紹介 • ログ分析と自動テスト の概要 • ログ分析 15分(目標) • プレイログ 機械学習の話とか • 自動プレイ ©2019 Luminous Productions CO.,LTD. What’s © 2016-2019 SQUARE ENIX CO., LTD. All Rights Reserved. ©2019 Luminous Productions CO.,LTD. MAIN CHARACTER DESIGN:TETSUYA NOMURA コリジョン C#スクリプト ナビメッシュ レベルエディタ キャラツール グラフィックス テラインツール AI LUMINOUS ENGINEの構成 VFX アニメーション UI アセットブラウザ アセットビルド Mayaプラグイン DevOps © 2016-2019 SQUARE ENIX CO., LTD. All Rights Reserved. MAIN©2019 CHARACTER Luminous DESIGN Productions:TETSUYA CO.,LTD. NOMURA ログ分析と自動テスト 概要 ©2019 Luminous Productions CO.,LTD. QA or デバッグで 大変な所 ©2019 Luminous Productions CO.,LTD. QAで大変なところ • 繰り返すのが大変 – 必須ルート、サブクエストの通しプレイ – 全ハードウェアで同じ内容をチェック • 多数のパターンを網羅するのが大変 – 全部のアイテムを検証 – 様々なセーブデータが正常にロードできるかの確認 – マップ全域を、いろいろな時間、天候で、確認 ©2019 Luminous Productions CO.,LTD. デバッグで大変なところ • どこでバグっているか見つけるのが大変。 – ほとんどの場合、原因を見つける方が、直すより大変です。 • バグを再現するのが大変。 – 再現性が低い、とか。 – 再現する手順が大変、とか。 ©2019 Luminous Productions CO.,LTD. 自動化したいこと 繰り返し 自動プレイ パターンの網羅 スクリプト実行 発生した 原因の特定 バージョンの特定 再現 リプレイ ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. Webサーバーの役割 • ログや自動テストの可視化です。 ©2019 Luminous Productions CO.,LTD. Webサーバー の機能紹介 ©2019 Luminous Productions CO.,LTD. テスト結果一覧 ©2019 Luminous Productions CO.,LTD. テスト結果の一覧 ©2019 Luminous Productions CO.,LTD. テストが失敗したバージョンを特定 ©2019 Luminous Productions CO.,LTD. テストが失敗する原因となった更新を特定 誰のSubmit? Submitのコメント テストが失敗した時に、 どのSubmitからバグが起きるようになったか?がわかる。 ©2019 Luminous Productions CO.,LTD. 各種、レポート パフォーマンス スクショ(2D) クラッシュした場所 JIRAチケットの場所 スクショ(パノラマ) 現在プレイされている場所 ©2019 Luminous Productions CO.,LTD. 過去の履歴 2019/6/15 2019/7/16 2019/8/5 すべてのログは、過去の情報も見られます。 ©2019 Luminous Productions CO.,LTD. グラフィックスの単体テスト ©2019 Luminous Productions CO.,LTD. テストに失敗したときのレポート Microsoft Teams での通知 前回と見た目が変わっていたら通知 ©2019 Luminous Productions CO.,LTD. アセットごとのスクショ&履歴 ©2019 Luminous Productions CO.,LTD. Webサーバー の仕組み ©2019 Luminous Productions CO.,LTD. 全体の図 influxdb アプリケーション開発者が 記述可能 定義ファイル Python (JSON) 自前 カスタム Flask python JavaScript ブラウザ ©2019 Luminous Productions CO.,LTD. エディタ 定義ファイル カスタム (JSON) JavaScript ブラウザ上で、 編集し、確認が可能。 ©2019 Luminous Productions CO.,LTD. Webサーバーの機能、動画 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. テストサーバーの役割 • いろいろなテストを実行します。 ©2019 Luminous Productions CO.,LTD. テストの記述の言語 ©2019 Luminous Productions CO.,LTD. テスト記述の言語 外部(ホストPC)で動作 実機で動作 C# C++ python C# with “Python for .NET” Visual Script .NET Frameworkに アクセス可能な言語なら、 RPC 何でもOK ©2019 Luminous Productions CO.,LTD. エンジンのスクリプトサポート LM_FUNCと書くと、 エンジンがサポートする 全てのスクリプトからアクセス可能になります。 こんな感じで使える。 ©2019 Luminous Productions CO.,LTD. Pythonでの記述例 スクショを取って、 前回の結果と比較 の例 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. スケジューラの役割 • テストを実行するタイミング、条件などを制御します。 • どのマシンで実行するか?なども制御します。 ©2019 Luminous Productions CO.,LTD. スケジューラ バックエンドは Jekinsを使っています。 実行条件などは、自前のスクリプトです。 ©2019 Luminous Productions CO.,LTD. スケジューラの構成 Test A 実行命令 Test B 実行命令 実行命令 マスター Job Test C 前半実行命令 実行 Job テスト実行命令を 実際に 最小単位に分解 テストを実行する Test C 後半実行命令 ©2019 Luminous Productions CO.,LTD. マスター Jobの役割 例えば、デイリーテストを実行 という命令に対して、 ・何のテストを、 ・どのプラットフォームで、 ・どのマシンでテストするか? を分解し、 複数の実行Job に投げます。 ©2019 Luminous Productions CO.,LTD. 実行Jobの役割 • 複数のマシンがアサインされています。 • JenkinsのLabelを使って、実行するマシンの制御を行っ ています。 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. ログ サーバー&ホストの役割 • ログを永続的に記録します。 ©2019 Luminous Productions CO.,LTD. ログの構成 実機 ログホスト 実機 influxdb Local Server ©2019 Luminous Productions CO.,LTD. ログの取り方 • 各種スクリプトにコードを仕込むことで、ログが記録されま す。 • ログは、InfluxDB に永続的に記録されます。 – ある程度古いのは間引いて消しています。 ©2019 Luminous Productions CO.,LTD. C#でログを取る例 Measurement(テーブル)の Performance.FPSに value, pos, angleというFieldで保存されます。 ©2019 Luminous Productions CO.,LTD. DBに書き込んだ内容を、 先ほどのWebで可視化します。 ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. プレイログとは? ©2019 Luminous Productions CO.,LTD. リプレイログとは? • ゲームをリアルタイムに記録する目的に特化したログです。 – 今まで紹介したInfluxDBで取るログとは別の仕組み です。(連携はできますが) ©2019 Luminous Productions CO.,LTD. プレイログ 開発の動機 ©2019 Luminous Productions CO.,LTD. あの1フレに 何が起きたかを知りたい。 ©2019 Luminous Productions CO.,LTD. プレイログ開発の動機 • コリジョンが抜けた。 • キャラが突然消えた。 • 扉を開けたら、いるはずのキャラがいなかった。 • 今、立つはずのないフラグが立っている。 その瞬間、 何が起きていたのかを知りたい! ©2019 Luminous Productions CO.,LTD. 後からじゃ遅い。 常に、全部 記録しておく! ©2019 Luminous Productions CO.,LTD. プレイログでできること。 ©2019 Luminous Productions CO.,LTD. プレイログを使ったデバッグ ©2019 Luminous Productions CO.,LTD. プレイログの仕組み 色々な システム プレイログ プレイログ 色々な システム システム ポインタを 自動で比較して、 登録しておきます。 変わった値を記録します。 ©2019 Luminous Productions CO.,LTD. ログを取っているパラメータ • エンジンが認識できるゲームのプロパティ全部。 – Visual Scriptの実行履歴やプロパティの変化 – ゲームオブジェクトのプロパティ • 座標、ゲームステートなど。 • パッド入力 • パフォーマンス、プロファイル情報 – スパイクが起きたフレームを分析するため • ユーザーが指定したパラメータ ©2019 Luminous Productions CO.,LTD. プレイログに登録するコードの例 • この例では、カメラのView Matrix, Projection Matrixのリプレイログを取る、と言う指定です。 • あとは、エンジンが勝手に毎フレーム、差分を記録し続け ます。 ©2019 Luminous Productions CO.,LTD. プレイログで できること ©2019 Luminous Productions CO.,LTD. プレイログでできること • 過去の値の確認 • 過去のフレームのプレビュー • 過去の任意のフレームからのリスタート • グラフによる履歴の可視化 • 保存/読み込み • 機械学習の入出力に使う (後述) ©2019 Luminous Productions CO.,LTD. ログ分析、自動プレイの全体像 ログホスト ログサーバー Web サーバー 開発機 スケジューラ プレイログ テストサーバーテストサーバー テストサーバーテストサーバー テストサーバー テストサーバー 自動プレイ ©2019 Luminous Productions CO.,LTD. 自動プレイに 期待すること ©2019 Luminous Productions CO.,LTD. 自動プレイの種類 自動で、今まで行われたことのないプレイをしてくれる。 発見的自動プレイ 過去に、一度行ったプレイを、繰り返し実行してくれる。 リプレイ的自動プレイ 今回はこちらの話 ©2019 Luminous Productions CO.,LTD. リプレイ的 自動プレイの手法 ©2019 Luminous Productions CO.,LTD. リプレイ的自動プレイの手法 • パッド入力を記録 • スクリプトで制御 パッド、と言っていますが、 もちろん、キーボードでもマウスでもタッチパネルでも同様です。 ©2019 Luminous Productions CO.,LTD. パッド入力を記録するメリット • 非常に高い汎用性 – ゲームの種類を問わず、入力を記録するリプレイは動 作します。 • リプレイのデータを用意するのが直感的 – 普通にプレイしたのを記録すれば良い。 • そのリプレイで再現したバグは、必ずユーザーも再現可能 – リプレイで行われた操作はパッドのみなので。 ©2019 Luminous Productions CO.,LTD. パッド入力を記録するデメリット • リプレイが安定しない – 何かの拍子に、少しでもずれると、使い物にならない。 • ⾧時間の通しプレイをパッド入力だけで、再現するには、 相当の仕込みが必要。 – ランダム要素の排除、エンジンとしての、結果の安定 性、など。 ©2019 Luminous Productions CO.,LTD. スクリプトで制御のメリット • ⾧時間の通しプレイも再現可能。 – 人力でスクリプトを組むので、がんばり次第で、何とで もなる。 ©2019 Luminous Productions CO.,LTD. スクリプトで制御のデメリット • 作るのが直感的ではない。 – プログラマ的作業。 • スクリプト制御特有のバグが起こりえる。 – 実際のユーザーのプレイとは若干違う。 • メンテコストが高い。 • 汎用性が低い。 ©2019 Luminous Productions CO.,LTD. パッド入力のリプレイが 安定すれば 最高 ©2019 Luminous Productions CO.,LTD. パッド入力のリプレイが安定しない理由 • 毎回、同じ結果にならないエンジン側の問題 • ランダム要素という、ゲーム側の問題 問題を取り除き、 維持し続けるのは、 難しい! ©2019 Luminous Productions CO.,LTD. リプレイがずれないように、がんばるのではなく、 一度ずれても、復帰できるように がんばった方が、よさそう。 ©2019 Luminous Productions CO.,LTD. マシンラーニングで やってみる。 ©2019 Luminous Productions CO.,LTD. 用語 記録したパッド入力を そのまま再生したリプレイ パッドリプレイ マシンラーニングを使った リプレイ ラーニングリプレイ ©2019 Luminous Productions CO.,LTD. ラーニングリプレイの結果 ©2019 Luminous Productions CO.,LTD. マシンラーニング の中身 ©2019 Luminous Productions CO.,LTD. ニューラルネットワークです。 以下、NN ©2019 Luminous Productions CO.,LTD. マシンラーニングの中身 • 何を学ばせるか? 色々な システム プレイログ プレイログ 色々な システム システム これを使います。 ©2019 Luminous Productions CO.,LTD. プレイログの中身 ゲームの状態を保存した データ列 ・・・ フレーム番号 N-2 N-1 N N+1 N+2 N+3 この中にはパッド入力も含まれています。 時系列のデータ ©2019 Luminous Productions CO.,LTD. ゲームの実際の進行 ・・・ N-1のパッド Nのパッド N+1のパッド N-1 の状態 N の状態 N+1 の状態 ©2019 Luminous Productions CO.,LTD. 何を学習するか? 今回の目的はQA用途のリプレイなので。 NNの出力は、パッド入力であるべき。 ここは? ここは、パッド入力 ©2019 Luminous Productions CO.,LTD. 何を学習するか? ・・・ N-1のパッド Nのパッド N+1のパッド N-1 の状態 N の状態 N+1 の状態 このゲームの状態を NNの入力に使います。 ©2019 Luminous Productions CO.,LTD. 何を学習するか? 解釈を変える Nのパッド Nのパッド N の状態 N+1 の状態 N の状態 NとN+1の差分 ©2019 Luminous Productions CO.,LTD. 何を学習するか? Nのゲーム状態と N+1への差分 パッド入力 ©2019 Luminous Productions CO.,LTD. 学習データ の用意の仕方 FPSが60の場合、1秒に60個の学習データが作れます。 プレイログ 早回しをすればもっと作れます。 先ほどの動画は、約20万のデータを学習させたものです プレイにして1時間くらいの分量。 普段のプレイログは使わず、 学習用の専用のプレイセットを用意しています。 ©2019 Luminous Productions CO.,LTD. 学習データを作成している様子 ©2019 Luminous Productions CO.,LTD. リプレイは何を保存するのか? ・・・ 学習済みNNが既にあるとして。 N-1 の状態 N の状態 N+1 の状態 これが、今回のリプレイで 保存&再生につかうデータです。 ©2019 Luminous Productions CO.,LTD. リプレイをどう再生するのか? フレームNを再生する場合 フレームNの パッド入力を求める 保存されたN+1 と、 の 状態 の状態の差分 ©2019 Luminous Productions CO.,LTD. ニューラルネットワークの構成 • 入力 • 出力 – キャラの座標 – スティックの傾き (4個) – キャラの早さ – ボタンの押し具合 (8個) – カメラの向き など ©2019 Luminous Productions CO.,LTD. ニューラルネットワークの構成(一例) • 3層で、ノード数は64の全結合。 • Dropoutは0.2 • 正則化はL2 (0.001) • 活性化関数は、ReLU • 入力データは事前に正規化。 ©2019 Luminous Productions CO.,LTD. 参考1 横軸:実際の値 縦軸:予測値 ©2019 Luminous Productions CO.,LTD. 参考2 横軸:予測値と実際の値との差分 縦軸:数 ©2019 Luminous Productions CO.,LTD. 参考3 青が、実際のデータ オレンジが、予測値 弱い入力は改善の余地あり ©2019 Luminous Productions CO.,LTD. 参考3 青が、実際のデータ オレンジが、予測値 ©2019 Luminous Productions CO.,LTD. エンジンとの連携 プレイログ プレイの巻き戻し パッドリプレイ プレイログ ゲーム システム ラーニングリプレイ 全部、プレイログのシステム経由で行います。 ・ゲームの値を取得して、NNに渡す ・NN結果をゲームに反映する など。 ©2019 Luminous Productions CO.,LTD. エンジンとの連携 プレイログ プレイの巻き戻し パッドリプレイ プレイログ ゲーム システム ラーニングリプレイ