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
AIを活用した柔軟かつ効率的な社内リソース検索への取り組み
Search
Cygames
September 09, 2024
Technology
0
360
AIを活用した柔軟かつ効率的な社内リソース検索への取り組み
Cygames
September 09, 2024
Tweet
Share
More Decks by Cygames
See All by Cygames
『GRANBLUE FANTASY Relink』キャラクターの魅力を支えるリグ・シミュレーション制作事例
cygames
0
290
『GRANBLUE FANTASY: Relink』最高の「没入感」を実現するカットシーン制作手法とそれを支える技術
cygames
1
250
『GRANBLUE FANTASY Relink』ソフトウェアラスタライザによる実践的なオクルージョンカリング
cygames
0
270
高品質なフォトグラメトリデータを取得するためのハードウェア&ソフトウェア開発
cygames
0
670
『GRANBLUE FANTASY: Relink』開発からリリースまでを支えたCI/CDの取り組み
cygames
0
170
『GRANBLUE FANTASY: Relink』専任エンジニアチームで回す大規模開発QAサイクル
cygames
0
190
『GRANBLUE FANTASY: Relink』クオリティと物量の両立に挑戦したフェイシャルアニメーション事例 ~カットシーンからランタイムまで~
cygames
0
190
『GRANBLUE FANTASY: Relink』キャラクターの個性にlinkした効果音表現
cygames
0
89
『GRANBLUE FANTASY: Relink』 乱戦を制するミックス ―Ambisonicsと動的音量制御と掛け合いボイス―
cygames
0
110
Other Decks in Technology
See All in Technology
クレジットカードを製造する技術
yutadayo
81
47k
入門 KRR
donkomura
0
110
Slackbot × RAG で実現する社内情報検索の最適化
howdy39
2
330
【shownet.conf_】ShowNet x 宇宙ネットワーク
shownet
PRO
0
410
Develop to Survive - YAPC::Hakodate 2024 Keynote
moznion
8
2.5k
Binary Hacks Rebooted 私選ハック集
nullpo_head
1
260
Case Study: Concurrent Counting
ennael
PRO
0
120
テストを楽に書きたい
tomorrowkey
0
120
【shownet.conf_】ローカル5Gを活用したウォーキングツアーの体感向上
shownet
PRO
0
350
エムスリー全チーム紹介資料 / Introduction of M3 All Teams
m3_engineering
1
320
受託開発でもアジャイル開発できました / Agile in Contract Development
takaking22
9
4.3k
LINE-ChatGPT 倫理問題を整理する全力肯定彼氏くん [LuC4]に訪れたサービス開始以来の最大の危機
o_ob
1
150
Featured
See All Featured
The Brand Is Dead. Long Live the Brand.
mthomps
53
38k
Bootstrapping a Software Product
garrettdimon
PRO
304
110k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
504
140k
Happy Clients
brianwarren
97
6.7k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
22k
Build The Right Thing And Hit Your Dates
maggiecrowley
31
2.3k
Statistics for Hackers
jakevdp
796
220k
Debugging Ruby Performance
tmm1
73
12k
For a Future-Friendly Web
brad_frost
174
9.3k
Code Reviewing Like a Champion
maltzj
519
39k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
249
21k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Transcript
1/63 株式会社Cygames 開発運営支援 ゲームエンジニア / 立福 寛 エンジニアリング・プロダクション AIを活用した 柔軟かつ効率的な社内リソース検索への取り組み
2/63 はじめに
3/63 立福 寛 開発運営支援 / ゲームエンジニア 複数のゲーム会社でコンテンツパイプラインの構築、モバイルゲームの開発・運営などを担当。 2018年10月に株式会社Cygamesへ入社。2019年後半からAIの社内導入に取り組んでいる。 CEDEC2021:ゲーム制作効率化のためのAIによる画像認識・自然言語処理への取り組み CEDEC2022:AIによる自然言語処理を活用したゲームシナリオの誤字検出への取り組み
CEDEC2023:AIによる自然言語処理・音声解析を用いたゲーム内会話パートの感情分析への取り組み 自己紹介
4/63 この講演で得られること AIを使った画像検索の原理 サーバレスで実装する場合の問題点と 解決方法 楽曲・効果音への適用
5/63 今回解決したい課題 ◼ 人力で行うには大変すぎる ◼ 担当者によってばらつきがでてしまう 大量の画像へのタグ付けをAIで行えないか? ◼ 所属部署が社内に提供しているWebアプリ 対象は社内のリソース管理ツール
6/63 リソース管理ツール : CyResource ◼ 画像、動画、音声、スライドなどをアップロード可能 ◼ タグ付け、バージョン管理、ユーザー管理 ◼ 用途ごとに「スペース」が分かれている
社内向けの汎用アップローダー ◼ アップロードされたリソースはS3に格納される AWS上に実装
7/63 リソース管理ツールにAI検索を実装 ◼ テキストで画像を検索 ◼ 画像で画像を検索 ◼ 色で画像を検索 AIを使えば テキストで直接画像検索できる
◼ 画像のアップロード時に検索用情報を登録 ◼ 検索時には登録された情報を使って検索 登録と検索
8/63 原理と機能
9/63 AI画像検索の原理と機能
10/63 AI画像検索の原理(その1) ◼ 画像を扱うAIでよく利用されているモデル ◼ テキストと画像を関連付けすることができる ◼ 日本語モデルも公開されている CLIPモデルを利用 ◼
CLIP : OpenAI(英語) ◼ Japanese CLIP : rinna、日本語対応したCLIP(今回採用) 利用可能なCLIPモデル
11/63 AI画像検索の原理(その2) ◼ CLIPはテキストと画像をベクトルに変換する 基本的な原理 意味が近いものは ベクトル間の距離が近くなる 近い 遠い 「赤いりんご」
テキスト ベクトル (スイカ) ベクトル (テキスト) ベクトル (りんご) 相談 画像 画像
12/63 AI画像検索の原理(その3) ◼ Web上の画像とそのテキストのペアを4億セット学習している ◼ ゼロショット(ファインチューニングなし)で高い性能を達成 CLIPの学習 赤いリンゴ テキスト 大きなスイカ
テキスト 相談 画像 画像
13/63 AI画像検索の原理(その4) 1. あらかじめ「検索対象の全画像」をベクトルに変換 2. 検索テキストをベクトルに変換 3. 2のベクトルに近い順に画像のベクトルをソート テキストで画像を検索 1.
あらかじめ「検索対象の全画像」をベクトルに変換 2. 検索画像をベクトルに変換 3. 2のベクトルに近い順に画像のベクトルをソート 画像で画像を検索
14/63 例:画像検索の結果
15/63 リソース管理ツールの検索結果(1) 「パン」で検索 ◼ 左から右に近いものが並ぶ ◼ 原理上、多少違うものが上位に来ることがある
16/63 リソース管理ツールの検索結果(2) 「テレビ」で検索 ◼ デフォルメのイラストでも大丈夫 ◼ 完全一致するテキストでなくても検索できる
17/63 リソース管理ツールの検索結果(3) 「マグロの寿司」の画像で検索 ◼ 同じものがトップに来る
18/63 CLIPによる検索の特徴と限界 画像の「意味・要素」で検索できる 類似した構図でも検索したいが…… 同じポーズ・似た構図を検索したい 意味を優先してしまう(別のアプローチが必要)
19/63 実装
20/63 機能の概要
21/63 機能の概要: 画像のアップロード 画像をベクトル変換して登録 アップロード API:登録処理 相談 画像 AI検索 画像
相談 リソース管理ツール 検索インデックス ベクトル
22/63 機能の概要: テキストで検索 テキストをベクトル変換 検索インデックス ベクトル 検索 AI検索 近いベクトルを検索 赤いリンゴ
テキスト 赤いリンゴ テキスト 検索結果 画像 相談 リソース管理ツール API:検索処理
23/63 実装 : デプロイ環境、ベクトル検索エンジン ◼ サーバレスで扱いやすい ◼ コストが低い ◼ リソース管理ツールとは別に実装(後で役に立った)
◼ Lambdaの詳しい話は次のデプロイのところで AWSのLambda上にデプロイ ◼ ベクトル間の距離を高速に求める ◼ Meta社のfaissを利用 https://github.com/facebookresearch/faiss ◼ 今回は検索件数が数万の単位なので必須ではない ベクトル検索エンジンを利用
24/63 実装 : ベクトル検索エンジン faiss ◼ C++実装なので高速 ◼ 多様な検索方法、GPUサポート(今回はCPU版を利用) 特徴
◼ コサイン類似度:2つのベクトルのなす角のコサイン値(同じベクトルの場合1) ◼ faiss.IndexFlatIPがコサイン類似度で検索 ◼ 削除時:検索インデックスを再作成(削除機能がないため) 今回はコサイン類似度が近いものを検索 ◼ 検索前:ベクトルを追加して「検索インデックス」を構築 ◼ 検索時:「検索したいベクトル」と「検索インデックス」から検索 ◼ 検索結果は距離が近い順のインデックス値 [2,3,1,…] 検索インデックスを構築 > 検索
25/63 実装 : faissはベクトルしか格納できない ◼ 同じ順番でfaissのインデックスを作成 ◼ faissの検索結果を使って、リソースIDを取得 ◼ 「ベクトル間の距離が近い順」の「リソースIDのリスト」を返す
◼ Pythonのpickle形式で保存 (リソースID:ベクトル)の配列を別に持つ 検索結果 リソースリスト リソースID1, 画像のベクトル1 リソースID2, 画像のベクトル2 リソースID3, 画像のベクトル3 faissの検索インデックス 画像のベクトル1 画像のベクトル2 画像のベクトル3 検索
26/63 実装 : APIごとの処理 ◼ 画像の登録時 > 検索インデックスの登録処理 ◼ 画像の検索時
> 検索してソートされたリソースIDのリストを返す リソース管理ツールからAPIを呼び出す
27/63 実装 : 登録時の処理 1. 登録する画像をCLIPでベクトルに変換 2. リソースリストを読み込む 3. リソース名とベクトルのペアをリソースリストに追加
4. リソースリストを使ってfaissのインデックスを再作成 インデックスの追加 faissの検索 インデックス インデックス 再作成 • ベクトル • リソースID リストに 追加 リソースリスト 画像 CLIPで ベクトル変換
28/63 実装 : 検索時の処理 1. テキストor画像をCLIPでベクトルに変換 2. faissのsearch関数で検索 3. コサイン距離が近い順に配列のインデックスのリストが返る
4. リソースリストからリソースIDのリストを取得して返す faissの検索+リソースIDのリストを返す faissの検索 インデックス リンゴ テキスト ベクトル Search関数で 近いベクトルを検索 リソースIDの リストを取得 CLIPで ベクトル変換 リソースリスト
29/63 デプロイ
30/63 デプロイ上の問題点と解決策 ◼ 合計15万枚を登録 ◼ 1回のAPI呼び出しで20枚登録 ◼ 1分間に1回実行 ◼ 5日以上
アップロード済みの画像を登録 ◼ 同時アクセスで検索インデックスが壊れる ◼ AIのモデルがインフラの帯域制限に引っかかってしまう ◼ 制限時間内に処理が終わらない 実行すると問題が多数発生
31/63 システム構成
32/63 システム構成 リソース管理ツール AI画像検索 EFS 帯域制限 ファイル転送 API Gateway Lambda
/tmp エフェメラルストレージ 30秒の制限 S3
33/63 AI画像検索 API Gateway EFS リソース管理ツール 帯域制限 ファイル転送 API Gateway
Lambda /tmp エフェメラルストレージ 30秒の制限 S3
34/63 Lambda リソース管理ツール AI画像検索 EFS 帯域制限 ファイル転送 Lambda API Gateway
30秒の制限 /tmp エフェメラルストレージ S3
35/63 EFS リソース管理ツール AI画像検索 EFS 帯域制限 ファイル転送 API Gateway Lambda
/tmp エフェメラルストレージ 30秒の制限 S3
36/63 S3 リソース管理ツール AI画像検索 S3 EFS 帯域制限 ファイル転送 API Gateway
Lambda /tmp エフェメラルストレージ 30秒の制限
37/63 発生した問題
38/63 検索インデックスが同時アクセスで壊れる ◼ Faissの検索インデックスのファイルをEFSに保存 ◼ 登録時、検索時にロード&セーブ ◼ 同時アクセスするとファイルが破損! 当初の実装 ◼
ネットワークファイルシステムなのでアクセス制御してくると思っていた EFSは同時アクセスの制御はしてくれない ◼ fcntl.LOCK_EXで排他ロック ◼ ロックファイルはサービスごとに作成(EFSに作成) ◼ サービス単位での同時アクセス数が少ないので問題なかった シンプルにファイルロックで回避
39/63 AIのモデルがインフラの帯域制限に引っかかる ◼ モデルをS3に配置 ◼ 最初の一回だけS3からEFSにコピー ◼ 実行時にEFSからモデルをロード 当初の実装 ①コピー
②ロード モデルファイル モデルファイル S3 EFS Lambda
40/63 AIのモデルがインフラの帯域制限に引っかかる ◼ Lambdaの関数を呼び出していくと途中で重くなる ◼ EFSは一定枠までは高速に使えるがそれ以上は制限がかかる(知らなかった!) 最初は問題なく動くが……! ①コピー ②ロード モデルファイル
モデルファイル S3 EFS Lambda 帯域制限
41/63 AIのモデルがインフラの帯域制限に引っかかる ◼ 関数呼び出しごとにS3から/tmpへモデルをコピー ◼ 2022年4月から/tmpの容量を追加できる Lambdaのエフェメラルストレージで解決 モデルファイル S3 Lambda
/tmp
42/63 faissのファイルも帯域制限に引っかかる ◼ faissの検索インデックスをEFSに保存 ◼ 画像登録・検索ごとにEFSからロード 当初の実装 ◼ faissの検索インデックスは数十MB ◼
数千回EFSから読み込むと制限がかかって遅くなる こちらも最初は問題なく動くが……! ◼ 関数呼び出しごとにS3から/tmpへ検索インデックスをコピー ◼ 更新後はS3へ戻す ◼ 最終的にEFSはロックファイル置き場としてのみ利用 同じ方法で解決
43/63 画像の登録処理が制限時間内に終わらない ◼ 画像の登録処理は20件まとめて行う ◼ Lambda内部では1件の登録処理を20回呼ぶ実装 ◼ モデルを20回S3から転送するので遅い! ◼ API
Gatewayの制限のため30秒以内に終わらせたい 当初の実装 1. S3からモデルをコピー 2. 20件まとめて画像をベクトルに変換 3. faissにベクトルを登録 4. faissの検索インデックスをS3へコピー まとめて処理する実装に変更
44/63 開発期間 ◼ Japanese CLIPとfaissを使った実装 1週間 ◼ Lambdaでの初期実装 2週間 ◼
リソース管理ツールへの組み込み 1ヶ月(別の担当者) ◼ デプロイ時のトラブル対応 1ヶ月 初期実装からリソース管理ツールへの組込みまで ◼ 基本構成は過去のAI機能と同じ ◼ AWSのインフラ構成も同じ ◼ AWS CDKのコードを流用 過去のAI機能の実装を使い回す
45/63 導入後の感想と今後の改善
46/63 リリース後の社内の感想
47/63 リリース後の社内での感想 ◼ 新しく入ったAI検索機能ものすごくいいです。...今まで発掘できなかったイラストが、 グーグル検索のように適当に思い浮かんだ言葉で検索出来てしまう。 これはまさに、かゆかったところに手が届く機能です!ありがとうございます! ◼ 本日の更新にてAI機能がつきました!とてもすごいのでぜひ使ってみてください~! (「青」って入れたら、青系イラストがいっぱい出てきました。すごい) 社内の感想
◼ 予想以上に好印象 ◼ 開発中の問題は多かったが、導入してよかった ◼ これもAIでできるんじゃない?という相談が増えた 想定以上に評判がよかった
48/63 別のアプリケーションでも使いたい ◼ シナリオライターがゲーム中の背景画像を指定 ◼ 数百枚以上ある背景画像を検索したい ◼ タグやファイル名を知らないと探せない ◼ 埋もれている背景がある
社内のシナリオ執筆ツールに導入してほしい ◼ リソース管理ツールとは独立している ◼ 別のサービスからでもAPIを呼び出せる 独立した実装になっているので導入が簡単
49/63 AI画像検索の改善
50/63 検索システムの改善 ◼ 「赤いリボンを付けたキャラクターA」で検索できるとさらに便利 ◼ Japanese CLIPのファインチューニングが必要 ◼ ファインチューニングの実装コードがない キャラクター名でも検索したい
◼ とあるカンファレンスで開発者の講演があった ◼ 講演後に話をして教えてもらった ◼ OpenAIのCLIPと同じ方法でファインチューニング可能 開発者に直接質問できた
51/63 ファインチューニングを行ってみた(その1) ◼ リソース管理ツールにはキャラクター名がタグで付いている ◼ 画像とキャラクター名の対応は取れるのでこれを学習 ◼ キャラクター名は学習できるが、学習済みの情報が失われてしまう キャラクター名を学習 ◼
ファインチューニングで学習した知識は増えるが、他の知識を忘れる現象 ◼ 両者のバランスを維持するファインチューニング手法 ◼ PAINT ◼ Patching open-vocabulary models by interpolating weights ◼ 参考文献:深層学習による画像認識の基礎 オーム社 菅沼 雅徳 破滅的忘却
52/63 ファインチューニングを行ってみた(その2) ◼ LLaVA1.5は画像に対してテキストで問い合わせを行えるモデル ◼ キャラクターの名前+画像の説明テキストを学習 ◼ 「(キャラクター名)の画像です。ギターを持った女性がいます」 ◼ 出力は英語なので日本語に翻訳して適用
◼ 学習してみたが精度が上がっていかなかった ◼ 生成テキストが学習に向いていなかった可能性 LLaVA1.5モデルで画像からテキストを生成 画像 テキスト 「画像を説明して」 プロンプト LLaVAモデル 「ギターを持った 女性がいます」
53/63 楽曲と効果音への適用
54/63 社内の楽曲管理について ◼ 社内リソース管理ツールのUIを変更したもの ◼ 楽曲管理に便利な機能を足してある ◼ 2023年から導入中 社内の楽曲管理システム:MusicDB ◼
担当者ごとにぶれてしまう ◼ こちらをAIで自動化できないか? 手動でタグを付けているが大変
55/63 音声版のCLIP : CLAP ◼ 画像以外を扱うCLIPモデルが多数公開済み ◼ 今回はLAION-AI/CLAPモデルを利用 音声版のCLIPを使えば可能! ◼
CLAP : Contrastive Language-Audio Pretraining ◼ 楽曲、効果音を扱えるCLIP(英語のみ) ◼ 商用利用可能なライセンス ◼ 精度が高い ◼ 先頭の10秒のみ利用(10秒以下の場合はリピート) ◼ 楽曲用の事前学習モデルを利用 LAION-AI/CLAP
56/63 楽曲の自動タグ付け ◼ CLAPをクラス分類に適用 ◼ ジャンル : クラシック、カントリー、ジャズ、…… ◼ テンポ:速い、普通、ゆっくり
◼ ムード:クール、楽しい、ロマンティック、悲しい、…… ジャンル、テンポ、ムードを自動タグ付け ◼ ジャンル分類の場合 ◼ 例:this audio is {ジャンル名} sound ◼ ジャンル名 : 'classical', 'country', 'jazz’ , … ◼ 「テキスト」と「楽曲」の距離が近いものへ分類 テキストのテンプレートを利用してクラス分類 ◼ 途中でテンポやムードが変わる曲は扱えない 実際の運用に使える精度
57/63 類似楽曲の検索 ◼ 楽曲から楽曲を探せる機能 ◼ 便利な機能なのでこちらから提案 ◼ 同じ曲のアレンジ版が上位に出てきたので正しく動作している ◼ たまに間違える(まったく別の曲が出てくる)
画像検索と同様に類似楽曲を検索できる
58/63 Lambdaでの実装 ◼ モデルファイルがrinna社のCLIPより大きい ◼ 初期化に時間がかかる 同様にAWS Lambdaで実装 ◼ LAION-AI/CLAPはモデルのファイルサイズが2.2GB
◼ これをS3から毎回転送するのは時間がかかる ◼ モデルを16bitに変換すると383MB(精度変わらず) モデルファイルが大きい ◼ 特定のクラスのインスタンス化に数秒かかる ◼ インスタンスをPythonのpickle形式で保存 ◼ 毎回S3から転送して読み込むことで高速化 初期化に時間がかかる
59/63 現在実装中 ◼ リソース管理ツールへの組み込み待ち Lambda側は完成
60/63 効果音の検索 ◼ 大量の効果音にタグを付けるのは大変 ◼ 担当者が異動すると引き継ぎのコストが大きい ◼ LAION/CLAPは効果音(環境音)の扱いが得意なモデル 効果音の検索もやりたい! ◼
テキストで効果音を検索 ◼ 効果音で効果音を検索 楽曲と同様のシステムとして提供(予定)
61/63 まとめ
62/63 まとめ : AIを使ったリソース検索を開発 ◼ 「いままで発掘できなかった画像が見つかった」など ◼ タグは使わずに、テキストで直接検索 ◼ 担当者ごとの感覚の違いに影響されない
AI画像検索は評判がよかった ◼ 同様の仕組みで楽曲・効果音も検索できる ◼ 工夫すればクラス分類も実装可能 楽曲・効果音の検索にも利用可能 ◼ 原理は極めてシンプル ◼ サーバレスでの実装には工夫が必要 ◼ 独立したシステムにすると他でも使える サーバレスでの実装は少し大変
63/63
参考文献 ◼ https://github.com/openai/CLIP CLIP ◼ https://github.com/rinnakk/japanese-clip Japanese CLIP ◼ https://github.com/facebookresearch/faiss
faiss
参考文献 ◼ https://github.com/LAION-AI/CLAP LAION-AI/CLAP ◼ https://github.com/haotian-liu/LLaVA LLaVA 1.5
参考文献 ◼ MERT: Acoustic Music Understanding Model with Large- Scale
Self-supervised Training ◼ https://github.com/yizhilll/MERT MERT ◼ Patching open-vocabulary models by interpolating weights ◼ https://arxiv.org/abs/2208.05592 PAINT
参考文献 ◼ オーム社 菅沼 雅徳 ◼ 8章 3.6 CLIP 深層学習による画像認識の基礎
参考文献 ◼ https://magazine.cygames.co.jp/archives/19967 社内のシナリオ執筆ツール
クラス分類の精度を向上できないか? ◼ テキストor楽曲による検索がメイン ◼ 開発者がクラス分類は得意でないとコメント LAION-AI/CLAPはクラス分類は得意ではない ◼ タスクごとのモデルの精度を見れるサイト ◼ Music
Auto-Tagging ◼ Music Genre Recognition ◼ Music Question Answering ◼ Music Classification Papers with Codeで探す ◼ 楽曲生成はかなり盛り上がっているのに…… 楽曲分類は人気がない
LAION-AI/CLAPより高精度のモデル ◼ 楽曲をベクトルに変換するモデル ◼ ジャンル分けなどのクラス分類の精度が高い ◼ ソースコードは商用利用可能 ◼ 事前学習モデルが商用利用不可! MERT