GENZITSU / UsefulMaterials

34 stars 0 forks source link

almost weekly useful materials - 08/23 - #137

Open GENZITSU opened 10 months ago

GENZITSU commented 10 months ago

【LLM】ベクトルデータベースって多くてどれを使ったら良いか分からないというあなたのための記事(6つのツールを比較)

代表的なベクトルデータベースである、Pinecone, pgvector, Weaviate, Qdrant, Milvus, Chromaのそれぞれの概要と一般的な使い方を紹介している記事。

コメント

参考になったのでメモ

元々pgvectorを使おうと思っていたが、性能が悪いらしいので、WeaviateかQdrantを使ってみようかなと

出典

GENZITSU commented 10 months ago

大規模言語モデルを使って自動車走行時の状況説明をさせてみる? -社内LLMハッカソン記-

画像のcaption, dense caption, segmentation除法をテキストに落として、LLMに組み込むことでドライブレコーダーで撮影した走行状況の説明を試みている記事

Image2Paragraphというレポジトリをもとに、画像キャプショニングはBLIP-2、Dense CaptioningはGRiT[Wu+ 22]、領域の意味抽出はFastSAM[Zhao+, 23]を用いて、プロンプトに落とし込む情報を抽出している。

コメント

多段階にモデルを走らせる必要があるため、推論時間に難ありだが、現状の構成としてはかなり優秀そう。

現状はChatGPTレベルに優秀なマルチモーダルモデルがないため一旦テキストに落とし込む他ないが、マルチモーダルが解放されたらもっと凄いことになりそう。

出典

GENZITSU commented 10 months ago

論文解説∶Segment Any Anomaly∶プロンプトを使った学習要らずの異常検知

正常画像と異常画像を用いずに、プロンプトを工夫することで異常検知を行う手法の解説記事

この手法はVAND 2023 ChallengeというZero-shot, Few-shot異常検知の精度を競うコンペで準優勝という成績を納めている。

スクリーンショット 2023-07-13 16 30 48

SAA (ベースモーデル)

スクリーンショット 2023-07-13 16 31 29

画像とプロンプトを入力に使えるGrounding DINOを用いて、候補領域のBBoxを検出後、Segment Anything Modelに画像とBBox, プロンプトを入力してsegmentationを実施する

ただしこのベースモデルには、事前学習済みモデルと対象画像との間のDomain Gapやプロンプトに用いるワードのtraining / inference時のgapなどが存在する

SAA+ (改良版)

スクリーンショット 2023-07-13 16 36 41

ポイントは以下の3つ

コメント

ジッパーのような一般的にはどこが以上がわかりにくい画像 (ジッパー自体を異常と見做しがち)では間違いやすいが、プロンプトの改良と既存技術の掛け合わせで、コンペ準優勝までいけるというのは驚き。

出典

GENZITSU commented 10 months ago

EdgeAIのためのDNN推論処理の最適化

TIER IV ワークショップ:自動運転におけるAIコンピューティングにて発表された物体検出処理モデル(YOLOX)の高速化事例の紹介動画

勉強になった点をペタペタメモ

YOLO famillyをまとめている図

スクリーンショット 2023-07-14 15 52 55

代表的な高速化手法

スクリーンショット 2023-07-14 15 49 57

TIER IVで行われている最適化

onnx → TensorRTでモデルを最適化 (precisionはINT-8)

スクリーンショット 2023-07-14 15 53 59

スクリーンショット 2023-07-14 15 55 29

前処理をCPU→CUDA→Kernel Fusionを用いて高速化

スクリーンショット 2023-07-14 15 57 15

GPU効率の良いアーキテクチャーの探索 (都度プロファイリングして遅いところを潰す)

スクリーンショット 2023-07-14 15 58 30

INT8を前提にすると32chずつのアーキテクチャーの方が効率が良い

スクリーンショット 2023-07-14 15 59 17

SwishよりもReLUの方が効率が良い

スクリーンショット 2023-07-14 16 01 19

スクリーンショット 2023-07-14 16 02 19

スクリーンショット 2023-07-14 16 03 07

Jetson OrinからサポートされたDeep Learning Accelarator (DLA) の恩恵を受けられるように改造する

スクリーンショット 2023-07-14 17 32 21

使い方自体はTensorRTを用いる際にフラグを立てるだけ

スクリーンショット 2023-07-14 17 32 33

プロファイリングをしながら、DLAオンリーになるように改造してく

スクリーンショット 2023-07-14 17 33 22

スクリーンショット 2023-07-14 16 08 33

更なる改造

スクリーンショット 2023-07-14 16 10 14

スクリーンショット 2023-07-14 16 11 26

高速化できた分、input sizeを大きくし、精度向上を狙う

スクリーンショット 2023-07-14 16 12 15

モデル量子化に関するtips

量子化手法はいろいろあるが、モデルによってどれが最適か検証する必要がある

スクリーンショット 2023-07-14 16 14 20

DLAではサポートされていない量子化だったのでDynamic Range Quantizationを採用

スクリーンショット 2023-07-14 16 15 50

スクリーンショット 2023-07-14 16 16 29

スクリーンショット 2023-07-14 16 16 55

結局どうなったか

スクリーンショット 2023-07-14 16 17 16

スクリーンショット 2023-07-14 16 18 35

コメント

勉強になりすぎる...

DLAを意識した改造は相当用途が決まっていないと手が出せない領域だが、以下のテクニック達は通常のユースケースでも手を出せそう。

出典

GENZITSU commented 9 months ago

BERT系モデルで文章をEmbeddingする際のTips

sentence bertを利用せずに、huggingfaceライブラリを用いて文章ベクトルを抽出する際のtipsを共有している記事。

1. トークン長

イタズラに長いトークン長固定でencodeすると推論時間が無駄に伸びるのでpadding数を削減しようという旨

以下の図がわかりやすいが、トークン長が近いもの同士で並び替えて、バッチ推論するとpadding数が少なく済むので、推論が早くなる

スクリーンショット 2023-08-10 16 30 54

スクリーンショット 2023-08-10 16 31 00

スクリーンショット 2023-08-10 16 31 10

2. CLS vs Token Averaging

CLSトークンを文章ベクトルとみなすことも可能だが、最終層の全トークンのembeddingのmean/maxを取るという手段もある

その際、padding文を無視するようにすることを忘れずに

python

features = tokenizer.batch_encode_plus(
    batch, padding="longest", truncation=True, return_tensors="pt"
)
output = model(**features)
output = output["last_hidden_state"]

# [CLS] tokenの場合
output = output[:, 0, :]

# token平均値の場合
att_mask = features["attention_mask"]
att_mask = att_mask.unsqueeze(-1)
output = (output * att_mask).sum(dim=1) / att_mask.sum(dim=1)

タスクにもよるが、token 平均を使った方がいい時もありそう

スクリーンショット 2023-08-10 16 38 25

3. どこからembeddingを取得するか

最終層は事前学習タスクに最適化されている可能性が高いということで、最終層から2層目以降からembeddingを引っ張ってくることがある

今回はあまり変化なかったとのこと

スクリーンショット 2023-08-10 16 46 17

コメント

token平均のところは意外と忘れやすそう

それらtipsを統合した実装も公開されているのがありがたい

出典

GENZITSU commented 9 months ago

X(Twitter)で見かける誤字ツイート(誤字エックス)を生成するライブラリ

添付のような誤字ツイートを機械的に生成するライブラリの紹介

スクリーンショット 2023-08-14 10 25 30

誤字ツイートの生成ロジックを分析して、それをシミュレートしているのが好印象

パターンA:元と読みは同じで漢字だけ違う単語(同音異義語)に置き換わる パターンB:一文字違いの単語に置き換わる パターンC:予測変換によって、最初の数文字だけ同じ全く別の単語に置き換わる

コメント

SNS投稿に対するモデリングをする際のdata augmentationとして利用できるかもしれない

出典

GENZITSU commented 9 months ago

ランダムフォレストを使うなら変数選択はしなくてもいいのか?

表題の通り

検証結果としては明らかにノイズとなるような特徴量は削除しておいた方が良いが、もしかしたら関係するかも?というものは別に残しておいてもそこまで悪影響を及ぼさないという結論を得ている

スクリーンショット 2023-08-14 16 58 33

コメント

実務的には明らかにノイズ!となる特徴量を混ぜ込むことはそうそうなさそうなので、気にしなくてもいい感じかも

出典

GENZITSU commented 9 months ago

YOLOXで多量物体検出訓練を行う設定

表題の通り、デフォルトのまま学習させると全く精度が出ないものの、適切に設定を変えると精度が出るようになる

以下エッセンス

  • ラベル量(データ量)が多いと、データセット準備時(init prefetcher)にcore dumpする場合がある。その対策としてdata_num_workersを1に指定する。参考
  • get_data_loaderメソッドをオーバーライドして、max_labelsの値を120から任意の値(1画像枚のラベル数の上限)に変更する。yolox/exp/yolox_base.pyよりget_data_loaderメソッドをコピペして該当箇所を修正すればよい。
  • mixupはオフにする。ただでさえラベルが多いのにmixupで画像を重ね合わせるとラベルがさらに増えてしまう。
  • pycocotoolsはデフォルトで1画像毎のラベル数を[1,10,100]とハードコードしていて、APやARの計算には100ラベル時の値が用いられる。ラベル数はCOCOEval.params.maxDetsで管理されているので、ここを改変すれば良い。COCOeval_optもCOCOevalを継承しているので同様に変更可能。ここでは[1,10,100] -> [100,500,1000]とした。

コメント

出典

GENZITSU commented 8 months ago

類似画像検索にLLMを利用する。

画像 → テキストに一回した後に、テキストのembeddingで類似度とるやつ

コメント

最近ちらほら見かける構成

画像→テキスト 部分はchatgptのplugin使ってるけど、普通に画像を説明してくれるモデルを使うのでも良い

出典

GENZITSU commented 8 months ago

Debur 外観

Deblurモデルを作成する際に必要な基礎知識が体系的にまとめられているシリーズ

コメント

まだ読めてないけど、いつか使いそうなのでメモ

出典