Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update whisper decoding algorithm #1355

Closed
kyakuno opened this issue Dec 27, 2023 · 14 comments
Closed

Update whisper decoding algorithm #1355

kyakuno opened this issue Dec 27, 2023 · 14 comments
Assignees

Comments

@kyakuno
Copy link
Collaborator

kyakuno commented Dec 27, 2023

ailia-modelsのwhisperをエクスポートしたのが2022年10月で、そこから最近のwhisperはコード改良で繰り返しが発生しにくくなっている。そこで、最新のwhisperの変更をportする。

コミットログ:https://github.com/openai/whisper/commits/main/
デコーダ:https://github.com/openai/whisper/commits/main/whisper/decoding.py
メイン:https://github.com/openai/whisper/commits/main/whisper/transcribe.py

@kyakuno kyakuno self-assigned this Dec 27, 2023
@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 27, 2023

評価対象。

ailia

python3 whisper.py -m base -i input.wav

whisper official

beam_size = 1

import numpy as np
import librosa
import soundfile as sf
import time

import whisper
whisper_small = whisper.load_model("base")

start = int(round(time.time() * 1000))
result = whisper_small.transcribe("sample.mp3", language="ja", beam_size = beam_size, verbose=True)
print("Whisper Small", result["text"])
end = int(round(time.time() * 1000))
estimation_time = (end - start)
print(f'\ttotal processing time {estimation_time} ms')

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 27, 2023

まずは公式のwhisperの各バージョンの変更と性能を把握する。

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 28, 2023

2023/03/08 -> 2023/03/14で劇的にbaseの性能が上がっている。

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 28, 2023

更新内容。

openai/whisper#1044
TokenizerをHuggingFaceからtiktokenに移行することでtensorflowへの依存を削除

openai/whisper#1087
word timestampの改善

openai/whisper#1076
githubのlanguage statsの表示改善

openai/whisper#1089
不正なunicodeが出現することへの対策

openai/whisper#1090
空入力でエラーが起きる問題を修正

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 28, 2023

性能差はtiktokenへの移行によって発生している。
tiktokenとtransformersは等価な論理かと思ったが、何か別の変更も入っている?
openai/whisper#1044

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 29, 2023

2023/03/08だと2セグメント目でtempratureが上がっていく。
原因は、古いtokenizerがsot_prev APIが50361を返さず、50324を返す。
2023/03/14のtiktoken版だと、正しく50361を返す。
ここを50361を返すように修正すると、2023/03/08でも変な出力が出ない。
この問題は下記でも報告されている。
zhuzilin/whisper-openvino#3

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 29, 2023

kv_cacheをnormalとdynamicで比較すると結果は一致する。

python3 whisper.py -m base -i sample.mp3 --normal
python3 whisper.py -m base -i sample.mp3 --dynamic_kv_cache

normalとoptは結果は一致しない。

python3 whisper.py -m base -i sample.mp3 --normal
python3 whisper.py -m base -i sample.mp3

これは、MeanVarianceNormalizationがepsilonを持てないため、OptimizerでMeanVarianceNormalizationに変換した結果、torchとonnxで誤差が出ているためである。

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 29, 2023

本来、epsilonの影響は小さいが、baseはそもそもモデルが小さくて不安定なので、揺らぎが発生しやすい。

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 29, 2023

順当に最新のtimestampの扱いをマージする。

@kyakuno
Copy link
Collaborator Author

kyakuno commented Dec 29, 2023

v3対応の際に、transcribe.pyの変更は取り込まれている。
#1313 (comment)
decoding.pyの変更はまだ取り込まれていない。

@kyakuno
Copy link
Collaborator Author

kyakuno commented Jan 5, 2024

MeanVarianceNormalizationのepsilonが問題のようなので、LayerNormalizationになるようにwhisperをopset=17で再エクスポートした。opset=17であれば、epsilonの誤差は発生しない。
axinc-ai/whisper-export#2

@kyakuno
Copy link
Collaborator Author

kyakuno commented Jan 9, 2024

whisperでは、デコードしたテキストをgzipで圧縮し、圧縮率によって繰り返し判定し、decode_fallbackを発生させ、繰り返しを抑制している。decode_fallbackでは、tempretureが上がり、サンプリングになるので、結果が推論のたびに変化する。

ただし、whisper-exportのリポジトリでbaseだと、torchでもdecode_fallbackが発生し、繰り返しが発生するが、最新のwhisper-officialだとdecode_fallbackが発生しない。

これは、timestampルールが影響しているようで、timestampルールを最新にすると、whisper-exportでもdecode_fallbackが発生せず、tempretureは上がらない。

@kyakuno
Copy link
Collaborator Author

kyakuno commented Jan 9, 2024

下記を無効にすると、decode_fallbackが発生するので、timestampの、まきもどり検知は重要そう。

            if timestamps.numel() > 0:
                # timestamps shouldn't decrease; forbid timestamp tokens smaller than the last
                # also force each segment to have a nonzero length, to prevent infinite looping
                if last_was_timestamp and not penultimate_was_timestamp:
                    timestamp_last = timestamps[-1]
                else:
                    timestamp_last = timestamps[-1] + 1
                logits[k, self.tokenizer.timestamp_begin : timestamp_last] = -np.inf

openai/whisper#914

@kyakuno
Copy link
Collaborator Author

kyakuno commented Jan 9, 2024

baseモデルはかなりセンシティブなようで、flg_ffmpegの有効・無効で結果が大きく異なる。
また、mp3を一度、wavに事前変換してもfallbackが発生する。

@kyakuno kyakuno closed this as completed Jan 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant