From 8235da11dd95db5b648f64a80f5e97f4544ce0f5 Mon Sep 17 00:00:00 2001 From: mmmkkaaayy <18418787+mmmkkaaayy@users.noreply.github.com> Date: Thu, 16 Nov 2023 13:50:08 -0800 Subject: [PATCH] whisper: support batch inference, add librispeech WER test (#2074) * whisper: support batch inference, add librispeech WER test, add kv caching and JIT * remove JIT_SUPPORTED_DEVICE --------- Co-authored-by: George Hotz <72895+geohot@users.noreply.github.com> --- examples/whisper.py | 245 ++++++++++++------ .../external_test_whisper_librispeech.py | 83 ++++++ test/models/test_whisper.py | 17 +- test/models/whisper/test2.wav | Bin 0 -> 85088 bytes test/test_jit.py | 54 +++- 5 files changed, 309 insertions(+), 90 deletions(-) create mode 100644 test/external/external_test_whisper_librispeech.py create mode 100644 test/models/whisper/test2.wav diff --git a/examples/whisper.py b/examples/whisper.py index 2dae8d1721..8406b0a466 100644 --- a/examples/whisper.py +++ b/examples/whisper.py @@ -5,59 +5,80 @@ import pathlib import base64 import multiprocessing import numpy as np -from typing import Optional +from typing import Optional, Union, Literal from extra.utils import download_file +from tinygrad.jit import TinyJit from tinygrad.nn.state import torch_load, load_state_dict -from tinygrad.helpers import getenv +from tinygrad.helpers import getenv, DEBUG, CI import tinygrad.nn as nn +from tinygrad.shape.symbolic import Variable from tinygrad.tensor import Tensor import itertools import librosa -# TODO: you have written this fifteen times class MultiHeadAttention: - def __init__(self, n_state, n_head): + def __init__(self, n_state, n_head, kv_caching: Literal['cross', 'self']=None, max_self_attn_cache_len=None): self.n_head = n_head self.query = nn.Linear(n_state, n_state) self.key = nn.Linear(n_state, n_state, bias=False) self.value = nn.Linear(n_state, n_state) self.out = nn.Linear(n_state, n_state) - def __call__(self, x:Tensor, xa:Optional[Tensor]=None, mask:Optional[Tensor]=None): + self.kv_caching = kv_caching + self.max_self_attn_cache_len = max_self_attn_cache_len + + def __call__(self, x:Tensor, xa:Optional[Tensor]=None, mask:Optional[Tensor]=None, len: Union[Variable,int]=None): + if self.kv_caching == 'cross': + if xa is not None: + k, v = self.key(xa), self.value(xa) + if not hasattr(self, 'cache_k'): + self.cache_k, self.cache_v = k, v + else: + # see test_jitted_read_assign in test_jit.py + self.cache_k.assign(k+1-1).realize() + self.cache_v.assign(v+1-1).realize() + else: + k, v = self.cache_k, self.cache_v + else: + k, v = self.key(x), self.value(x) + if self.kv_caching == 'self': + if not hasattr(self, 'cache_k'): + self.cache_k = Tensor.zeros(x.shape[0], self.max_self_attn_cache_len, x.shape[2]) + self.cache_v = Tensor.zeros(x.shape[0], self.max_self_attn_cache_len, x.shape[2]) + k = self.cache_k.shrink((None, (0, len), None)).cat(k, dim=1) + v = self.cache_v.shrink((None, (0, len), None)).cat(v, dim=1) + padding = self.max_self_attn_cache_len-len-x.shape[1] + self.cache_k.assign(k.pad((None, (0, padding), None)).contiguous()).realize() + self.cache_v.assign(v.pad((None, (0, padding), None)).contiguous()).realize() + q = self.query(x) - k = self.key(xa or x) - v = self.value(xa or x) - wv, qk = self.qkv_attention(q, k, v, mask) - # NOTE: we aren't returning qk + n_ctx = q.shape[1] + assert(q.shape[-1] == k.shape[-1] == v.shape[-1]) + head_dim = q.shape[-1] // self.n_head + q = q.reshape(*q.shape[:2], self.n_head, head_dim).permute(0, 2, 1, 3) + k = k.reshape(*k.shape[:2], self.n_head, head_dim).permute(0, 2, 1, 3) + v = v.reshape(*v.shape[:2], self.n_head, head_dim).permute(0, 2, 1, 3) + attn = Tensor.scaled_dot_product_attention(q, k, v, mask[:n_ctx,:n_ctx] if mask is not None else None) + wv = attn.permute(0, 2, 1, 3).flatten(start_dim=2) return self.out(wv) - def qkv_attention(self, q, k, v, mask=None): - n_batch, n_ctx, n_state = q.shape - scale = (n_state // self.n_head) ** -0.25 - q = q.reshape(*q.shape[:2], self.n_head, -1).permute(0, 2, 1, 3) * scale - k = k.reshape(*k.shape[:2], self.n_head, -1).permute(0, 2, 3, 1) * scale - v = v.reshape(*v.shape[:2], self.n_head, -1).permute(0, 2, 1, 3) - qk = q @ k - if mask is not None: qk = qk + mask[:n_ctx, :n_ctx] - w = qk.softmax(-1) - return (w @ v).permute(0, 2, 1, 3).flatten(start_dim=2), qk.detach() class ResidualAttentionBlock: - def __init__(self, n_state, n_head, cross_attention=False): - self.attn = MultiHeadAttention(n_state, n_head) + def __init__(self, n_state, n_head, is_decoder_block=False, max_self_attn_cache_len=None): + self.attn = MultiHeadAttention(n_state, n_head, kv_caching='self' if is_decoder_block else None, max_self_attn_cache_len=max_self_attn_cache_len) self.attn_ln = nn.LayerNorm(n_state) - self.cross_attn = MultiHeadAttention(n_state, n_head) if cross_attention else None - self.cross_attn_ln = nn.LayerNorm(n_state) if cross_attention else None + self.cross_attn = MultiHeadAttention(n_state, n_head, kv_caching='cross') if is_decoder_block else None + self.cross_attn_ln = nn.LayerNorm(n_state) if is_decoder_block else None self.mlp = [nn.Linear(n_state, n_state*4), Tensor.gelu, nn.Linear(n_state*4, n_state)] self.mlp_ln = nn.LayerNorm(n_state) - def __call__(self, x, xa=None, mask=None): - x = x + self.attn(self.attn_ln(x), mask=mask) + def __call__(self, x, xa=None, mask=None, len: Union[Variable, int]=None): + x = x + self.attn(self.attn_ln(x), mask=mask, len=len) if self.cross_attn: x = x + self.cross_attn(self.cross_attn_ln(x), xa) x = x + self.mlp_ln(x).sequential(self.mlp) - return x + return x.realize() class AudioEncoder: def __init__(self, n_mels, n_audio_ctx, n_audio_state, n_audio_head, n_audio_layer, **_): @@ -66,6 +87,7 @@ class AudioEncoder: self.blocks = [ResidualAttentionBlock(n_audio_state, n_audio_head) for _ in range(n_audio_layer)] self.ln_post = nn.LayerNorm(n_audio_state) self.positional_embedding = Tensor.empty(n_audio_ctx, n_audio_state) + self.encode = TinyJit(self.__call__) def __call__(self, x): x = self.conv1(x).gelu() @@ -74,61 +96,82 @@ class AudioEncoder: x = x + self.positional_embedding[:x.shape[1]] x = x.sequential(self.blocks) x = self.ln_post(x) - return x + return x.realize() class TextDecoder: def __init__(self, n_vocab, n_text_ctx, n_text_state, n_text_head, n_text_layer, **_): + self.max_tokens_to_sample = n_text_ctx // 2 + self.max_self_attn_cache_len = self.max_tokens_to_sample * 2 # double the size as an extra buffer for prefix/start tokens + self.token_embedding = nn.Embedding(n_vocab, n_text_state) self.positional_embedding = Tensor.empty(n_text_ctx, n_text_state) - self.blocks = [ResidualAttentionBlock(n_text_state, n_text_head, cross_attention=True) for _ in range(n_text_layer)] + self.blocks = [ResidualAttentionBlock(n_text_state, n_text_head, is_decoder_block=True, max_self_attn_cache_len=self.max_self_attn_cache_len) for _ in range(n_text_layer)] self.ln = nn.LayerNorm(n_text_state) - #mask = torch.empty(n_ctx, n_ctx).fill_(-np.inf).triu_(1) + self.mask = Tensor.full((n_text_ctx, n_text_ctx), -np.inf).triu(1).realize() + self.blocks_start_tok = [TinyJit(block.__call__) for block in self.blocks] + self.blocks_after_start_tok = [TinyJit(block.__call__) for block in self.blocks] + self.start_output_tok = TinyJit(self.output_tok) + self.after_start_output_tok = TinyJit(self.output_tok) - def __call__(self, x, xa): - offset = 0 - x = self.token_embedding(x) + self.positional_embedding[offset : offset + x.shape[-1]] + def __call__(self, x: Tensor, pos: int, encoded_audio: Tensor, streaming=False): + seqlen = x.shape[-1] + x = self.token_embedding(x) + self.positional_embedding[pos:pos+seqlen] + if pos == 0: + for block in (self.blocks if streaming else self.blocks_start_tok): + x = block(x, xa=encoded_audio, mask=self.mask, len=0) # pass xa for cross attn kv caching + return self.output_tok(x) if streaming else self.start_output_tok(x) + else: + for block in self.blocks_after_start_tok: + len_v = Variable("self_attn_cache_len", 1, self.max_self_attn_cache_len).bind(pos) + x = block(x, mask=self.mask, len=len_v) + return self.after_start_output_tok(x) - seqlen, start_pos = x.shape[1], 0 - - mask = np.full((1, 1, seqlen, start_pos + seqlen), float("-inf"), dtype=np.float32) - mask = np.triu(mask, k=start_pos + 1) # TODO: this is hard to do in tinygrad - mask = Tensor(mask) - - for block in self.blocks: x = block(x, xa, mask) - x = self.ln(x) - return x @ self.token_embedding.weight.T + def output_tok(self, x): + return (self.ln(x) @ self.token_embedding.weight.T).realize() class Whisper: - def __init__(self, dims): + def __init__(self, dims, batch_size=1): self.encoder = AudioEncoder(**dims) self.decoder = TextDecoder(**dims) + self.is_multilingual = dims["n_vocab"] == 51865 + self.batch_size = batch_size - def __call__(self, mel:Tensor, tokens:Tensor): - return self.decoder(tokens, self.encoder(mel)) RATE = 16000 CHUNK = 1600 RECORD_SECONDS = 10 -def prep_audio(waveform) -> Tensor: +def prep_audio(waveform, batch_size) -> np.ndarray: + assert waveform is not None + + def pad_or_trim(arr, target_len=480000): + curr_len = len(arr) + if curr_len == target_len: + return arr + elif curr_len < target_len: + return np.pad(arr, (0, target_len - curr_len), 'constant') + else: + return arr[:target_len] + + waveform = np.array(list(map(pad_or_trim, waveform))) + assert waveform.shape[0] <= batch_size + # pad the waveform to match the model's batch_size to avoid JIT shape mismatch errors. + # if operations like conv in the AudioEncoder could support symbolic shapes, then we wouldn't need to do this here + if waveform.shape[0] < batch_size: + waveform = np.pad(waveform, pad_width=((0, batch_size - waveform.shape[0]), (0, 0))) + N_FFT = 400 HOP_LENGTH = 160 N_MELS = 80 - assert waveform is not None - waveform = waveform.reshape(1, -1) - stft = librosa.stft(waveform, n_fft=N_FFT, hop_length=HOP_LENGTH, window='hann', dtype=np.float32) - magnitudes = stft[..., :-1] ** 2 + stft = librosa.stft(waveform, n_fft=N_FFT, hop_length=HOP_LENGTH, window='hann', dtype=np.csingle) + magnitudes = np.absolute(stft[..., :-1]) ** 2 mel_spec = librosa.filters.mel(sr=RATE, n_fft=N_FFT, n_mels=N_MELS) @ magnitudes - log_spec = np.log10(np.clip(mel_spec, 1e-10, mel_spec.max() + 1e8)) + + log_spec = np.log10(np.clip(mel_spec, 1e-10, None)) + log_spec = np.maximum(log_spec, log_spec.max() - 8.0) log_spec = (log_spec + 4.0) / 4.0 - # https://github.com/openai/whisper/blob/b38a1f20f4b23f3f3099af2c3e0ca95627276ddf/whisper/audio.py#L19 - n_frames = log_spec.shape[2] - if n_frames < 3000: - log_spec = np.pad(log_spec, ((0, 0), (0, 0), (0, 3000 - n_frames))) - - #print(waveform.shape, log_spec.shape) return log_spec LANGUAGES = { @@ -145,9 +188,11 @@ LANGUAGES = { } BASE = pathlib.Path(__file__).parents[1] / "weights" -def get_encoding(n_vocab_in): - download_file("https://raw.githubusercontent.com/openai/whisper/main/whisper/assets/gpt2.tiktoken", BASE / "gpt2.tiktoken") - ranks = {base64.b64decode(token): int(rank) for token, rank in (line.split() for line in open(BASE / "gpt2.tiktoken") if line)} +def get_encoding(encoding_name): + filename = encoding_name + ".tiktoken" + download_file("https://raw.githubusercontent.com/openai/whisper/main/whisper/assets/" + filename, BASE / filename) + with open(BASE / filename) as f: + ranks = {base64.b64decode(token): int(rank) for token, rank in (line.split() for line in f if line)} n_vocab = len(ranks) specials = [ "<|endoftext|>", @@ -163,10 +208,9 @@ def get_encoding(n_vocab_in): ] special_tokens = dict(zip(specials, itertools.count(n_vocab))) n_vocab += len(specials) - assert n_vocab == n_vocab_in import tiktoken return tiktoken.Encoding( - name="bob", + name=encoding_name, explicit_n_vocab=n_vocab, pat_str=r"""'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+""", mergeable_ranks=ranks, @@ -202,39 +246,70 @@ MODEL_URLS = { "large-v2": "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt", "large": "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt", } -def init_whisper(model_name="tiny.en"): +def init_whisper(model_name="tiny.en", batch_size=1): assert MODEL_URLS[model_name] is not None filename = BASE / "whisper-{}.pt".format(model_name) download_file(MODEL_URLS[model_name], filename) state = torch_load(filename) - model = Whisper(state['dims']) - load_state_dict(model, state['model_state_dict']) - - enc = get_encoding(state['dims']['n_vocab']) + model = Whisper(state['dims'], batch_size) + load_state_dict(model, state['model_state_dict'], strict=False) + enc = get_encoding("multilingual" if model.is_multilingual else "gpt2") return model, enc -def transcribe_file(model, enc, filename): - waveform, sample_rate = librosa.load(filename, sr=RATE) - log_spec = prep_audio(waveform) - lst = [enc._special_tokens["<|startoftranscript|>"], enc._special_tokens["<|notimestamps|>"]] - dat = model.encoder(Tensor(log_spec)).realize() +def load_file_waveform(filename): + waveform, _ = librosa.load(filename, sr=RATE) + return waveform - for i in range(50): - out = model.decoder(Tensor([lst]), dat).realize() - idx = int(out[0,-1].argmax().numpy().item()) - lst.append(idx) - transcription = enc.decode(lst) - print(transcription) - if lst[-1] == enc._special_tokens["<|endoftext|>"]: - return transcription +def transcribe_file(model, enc, filename): + return transcribe_waveform(model, enc, [load_file_waveform(filename)]) + +def transcribe_waveform(model, enc, waveforms): + """ + Expects an array of shape (N,S) where N is the number waveforms to transcribe in parallel and S is number of 16000Hz samples + Returns the transcribed text if a single waveform is provided, or an array of transcriptions if multiple are provided + """ + N_audio = len(waveforms) + log_spec = prep_audio(waveforms, model.batch_size) + encoded_audio = model.encoder.encode(Tensor(log_spec)) + # print('encoded audio', np.sum(encoded_audio.numpy())) + + start_tokens = [enc._special_tokens["<|startoftranscript|>"]] + if model.is_multilingual: + # TODO detect language + language_token = enc._special_tokens["<|startoftranscript|>"] + 1 + tuple(LANGUAGES.keys()).index("en") + start_tokens.append(language_token) + start_tokens.append(enc._special_tokens["<|transcribe|>"]) + start_tokens.append(enc._special_tokens["<|notimestamps|>"]) + + transcription_start_index = len(start_tokens) + eot = enc._special_tokens["<|endoftext|>"] + tokens = np.tile(start_tokens, (log_spec.shape[0], 1)) + + pos = 0 + for i in range(model.decoder.max_tokens_to_sample): + out = model.decoder(Tensor(tokens if i == 0 else tokens[:, -1:]), pos, encoded_audio) + next_tokens = out[:, -1].argmax(axis=-1).numpy().astype(np.int32) + next_tokens[tokens[:, -1] == eot] = eot + tokens = np.concatenate((tokens, next_tokens.reshape(-1, 1)), axis=1) + pos = tokens.shape[-1] - 1 + if DEBUG >= 1: print(i, list(map(lambda tokens: enc.decode(tokens), tokens))) + if (tokens[:, -1] == eot).all(): + break + + transcriptions = [] + for t in tokens: + eot_index = np.where(t == eot)[0] + eot_index = None if len(eot_index) == 0 else eot_index[0] + transcriptions.append(enc.decode(t[transcription_start_index:eot_index]).strip()) + return transcriptions[:N_audio] if N_audio > 1 else transcriptions[0] if __name__ == "__main__": - model, enc = init_whisper("small.en" if getenv("SMALL") else "tiny.en") + model, enc = init_whisper("small.en" if getenv("SMALL") else "tiny.en", batch_size=1) if len(sys.argv) > 1: - transcribe_file(model, enc, sys.argv[1]) + print(transcribe_file(model, enc, sys.argv[1])) else: # online @@ -253,13 +328,13 @@ if __name__ == "__main__": else: total = np.concatenate([total, waveform]) did_read = True if did_read: - log_spec = prep_audio(total) - encoded_audio = model.encoder(Tensor(log_spec)).realize() - out = model.decoder(Tensor([lst]), encoded_audio).realize() + log_spec = prep_audio(total.reshape(1, -1), 1) + encoded_audio = model.encoder.encode(Tensor(log_spec)) + # pass the previously inferred tokens as 'prefix' - https://github.com/openai/whisper/discussions/117#discussioncomment-3727051 + out = model.decoder(Tensor([lst]), 0, encoded_audio, streaming=True).realize() idx = int(out[0,-1].argmax().numpy().item()) lst.append(idx) dec = enc.decode(lst) print(dec) # DO NOT REMOVE PRINT. IT'S VERY IMPORTANT if dec.endswith("<|endoftext|>"): - #total = total[:, 320*(len(lst)-1):] lst.pop() diff --git a/test/external/external_test_whisper_librispeech.py b/test/external/external_test_whisper_librispeech.py new file mode 100644 index 0000000000..49ce6a3c71 --- /dev/null +++ b/test/external/external_test_whisper_librispeech.py @@ -0,0 +1,83 @@ +import unittest +import torch +import tqdm +import torchaudio +import pathlib +import jiwer +import os +import numpy as np +from whisper.normalizers import EnglishTextNormalizer +from examples.whisper import init_whisper, transcribe_waveform + +class TestWhisperLibriSpeech(unittest.TestCase): + # reference WERs determined by running https://github.com/openai/whisper/blob/main/notebooks/LibriSpeech.ipynb + # the values should be consistent with the paper D.1.1 https://cdn.openai.com/papers/whisper.pdf#page=22 + # tinygrad WERs do not perfectly match due to what seem to be precision differences vs torch + def test_en_tiny(self): + run_evaluation("tiny.en", 0.056629001883239174, 0.05655609406528749) + + def test_tiny(self): + run_evaluation("tiny", 0.0771121409407306, 0.07558413638335187) + + def test_en_base(self): + run_evaluation("base.en", 0.041412520064205455, 0.04271408904897505) + + def test_en_small(self): + run_evaluation("small.en", 0.03369011117172363, 0.030531615969223228) + +def run_evaluation(model_name, tinygrad_expected_wer, reference_wer): + dataset = LibriSpeech() + batch_size=16 + loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size) + + model, enc = init_whisper(model_name, batch_size=batch_size) + + hypotheses = [] + references = [] + + for audio, texts in tqdm.tqdm(loader): + transcriptions = transcribe_waveform(model, enc, audio.numpy()) + hypotheses.extend(transcriptions) + references.extend(texts) + + normalizer = EnglishTextNormalizer() + normalized_hypotheses = [normalizer(text) for text in hypotheses] + normalized_references = [normalizer(text) for text in references] + wer = jiwer.wer(normalized_hypotheses, normalized_references) + + np.testing.assert_almost_equal(wer, tinygrad_expected_wer) + print(f'tinygrad WER {wer} vs reference WER {reference_wer}') + del model, enc + +class LibriSpeech(torch.utils.data.Dataset): + def __init__(self): + dir = pathlib.Path(__file__).parent.parent.parent / "extra" / "datasets" / "librispeech" + if not os.path.exists(dir): + os.makedirs(dir) + + self.dataset = torchaudio.datasets.LIBRISPEECH( + root=dir, + url="test-clean", + download=True, + ) + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, item): + audio, sample_rate, text, _, _, _ = self.dataset[item] + assert sample_rate == 16000 + return pad_or_trim_tensor(audio[0]), text + +def pad_or_trim_tensor(tensor, target_len=480000): + curr_len = len(tensor) + if curr_len == target_len: + return tensor + elif curr_len < target_len: + return torch.cat((tensor, torch.zeros(target_len - curr_len))) + else: + return tensor[:target_len] + + +if __name__ == '__main__': + unittest.main() diff --git a/test/models/test_whisper.py b/test/models/test_whisper.py index b68dea5093..835c238fe4 100644 --- a/test/models/test_whisper.py +++ b/test/models/test_whisper.py @@ -1,13 +1,13 @@ import unittest import pathlib +from examples.whisper import init_whisper, load_file_waveform, transcribe_file, transcribe_waveform from tinygrad.ops import Device -from examples.whisper import init_whisper, transcribe_file @unittest.skipUnless(Device.DEFAULT == "METAL", "Some non-metal backends spend too long trying to allocate a 20GB array") class TestWhisper(unittest.TestCase): @classmethod def setUpClass(cls): - model, enc = init_whisper("tiny.en") + model, enc = init_whisper("tiny.en", batch_size=2) cls.model = model cls.enc = enc @@ -22,4 +22,15 @@ class TestWhisper(unittest.TestCase): # We use the WAVE type because it's easier to decode in CI test environments filename = str(pathlib.Path(__file__).parent / "whisper/test.wav") transcription = transcribe_file(self.model, self.enc, filename) - self.assertEqual("<|startoftranscript|><|notimestamps|> Could you please let me out of the box?<|endoftext|>", transcription) + self.assertEqual("Could you please let me out of the box?", transcription) + + def test_transcribe_batch(self): + file1 = str(pathlib.Path(__file__).parent / "whisper/test.wav") + file2 = str(pathlib.Path(__file__).parent / "whisper/test2.wav") + + waveforms = [load_file_waveform(file1), load_file_waveform(file2)] + + transcriptions = transcribe_waveform(self.model, self.enc, waveforms) + self.assertEqual(2, len(transcriptions)) + self.assertEqual("Could you please let me out of the box?", transcriptions[0]) + self.assertEqual("a slightly longer audio file so that we can test batch transcriptions of varying length.", transcriptions[1]) diff --git a/test/models/whisper/test2.wav b/test/models/whisper/test2.wav new file mode 100644 index 0000000000000000000000000000000000000000..e76b04fcd1712a6050cdd575f4bcd95b377d60f6 GIT binary patch literal 85088 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