From 8776c564912433aa5bf705dea671e108ef53102b Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Mon, 19 Sep 2022 20:14:54 +0800 Subject: [PATCH 1/4] support exporting to ncnn format via PNNX --- .../ASR/lstm_transducer_stateless2/export.py | 28 ++ .../lstm_transducer_stateless2/ncnn-decode.py | 242 ++++++++++++++ .../streaming-ncnn-decode.py | 309 ++++++++++++++++++ .../ASR/lstm_transducer_stateless2/train.py | 3 + 4 files changed, 582 insertions(+) create mode 100755 egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py create mode 100755 egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py diff --git a/egs/librispeech/ASR/lstm_transducer_stateless2/export.py b/egs/librispeech/ASR/lstm_transducer_stateless2/export.py index a1ed6b3b13..6db84b7d83 100755 --- a/egs/librispeech/ASR/lstm_transducer_stateless2/export.py +++ b/egs/librispeech/ASR/lstm_transducer_stateless2/export.py @@ -169,6 +169,18 @@ def get_parser(): """, ) + parser.add_argument( + "--pnnx", + type=str2bool, + default=False, + help="""True to save a model after applying torch.jit.trace for later + converting to PNNX. It will generate 3 files: + - encoder_jit_trace-pnnx.pt + - decoder_jit_trace-pnnx.pt + - joiner_jit_trace-pnnx.pt + """, + ) + parser.add_argument( "--context-size", type=int, @@ -277,6 +289,10 @@ def main(): logging.info(params) + if params.pnnx: + params.is_pnnx = params.pnnx + logging.info("For PNNX") + logging.info("About to create model") model = get_transducer_model(params, enable_giga=False) @@ -371,6 +387,18 @@ def main(): model.to("cpu") model.eval() + if params.pnnx: + convert_scaled_to_non_scaled(model, inplace=True) + logging.info("Using torch.jit.trace()") + encoder_filename = params.exp_dir / "encoder_jit_trace-pnnx.pt" + export_encoder_model_jit_trace(model.encoder, encoder_filename) + + decoder_filename = params.exp_dir / "decoder_jit_trace-pnnx.pt" + export_decoder_model_jit_trace(model.decoder, decoder_filename) + + joiner_filename = params.exp_dir / "joiner_jit_trace-pnnx.pt" + export_joiner_model_jit_trace(model.joiner, joiner_filename) + if params.jit_trace is True: convert_scaled_to_non_scaled(model, inplace=True) logging.info("Using torch.jit.trace()") diff --git a/egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py b/egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py new file mode 100755 index 0000000000..e2379c8f8a --- /dev/null +++ b/egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +# +# Copyright 2022 Xiaomi Corp. (authors: Fangjun Kuang, Zengwei Yao) +# +# See ../../../../LICENSE for clarification regarding multiple authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from typing import List + +import kaldifeat +import ncnn +import sentencepiece as spm +import torch +import torchaudio + + +class Model: + def __init__(self, d): + self.init_encoder(d) + self.init_decoder(d) + self.init_joiner(d) + + def init_encoder(self, d): + encoder_net = ncnn.Net() + encoder_net.opt.use_packing_layout = False + encoder_net.opt.use_fp16_storage = False + encoder_param = ( + d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" + ) + encoder_model = ( + d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + ) + + encoder_net.load_param(encoder_param) + encoder_net.load_model(encoder_model) + + self.encoder_net = encoder_net + + def init_decoder(self, d): + decoder_param = ( + d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" + ) + decoder_model = ( + d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + ) + + decoder_net = ncnn.Net() + decoder_net.opt.use_packing_layout = False + + decoder_net.load_param(decoder_param) + decoder_net.load_model(decoder_model) + + self.decoder_net = decoder_net + + def init_joiner(self, d): + joiner_param = ( + d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" + ) + joiner_model = d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + joiner_net = ncnn.Net() + joiner_net.opt.use_packing_layout = False + joiner_net.load_param(joiner_param) + joiner_net.load_model(joiner_model) + + self.joiner_net = joiner_net + + def run_encoder(self, x, states): + with self.encoder_net.create_extractor() as ex: + ex.set_num_threads(10) + ex.input("in0", ncnn.Mat(x.numpy()).clone()) + x_lens = torch.tensor([x.size(0)], dtype=torch.float32) + ex.input("in1", ncnn.Mat(x_lens.numpy()).clone()) + ex.input("in2", ncnn.Mat(states[0].numpy()).clone()) + ex.input("in3", ncnn.Mat(states[1].numpy()).clone()) + + ret, ncnn_out0 = ex.extract("out0") + assert ret == 0, ret + + ret, ncnn_out1 = ex.extract("out1") + assert ret == 0, ret + + ret, ncnn_out2 = ex.extract("out2") + assert ret == 0, ret + + ret, ncnn_out3 = ex.extract("out3") + assert ret == 0, ret + + encoder_out = torch.from_numpy(ncnn_out0.numpy()).clone() + encoder_out_lens = torch.from_numpy(ncnn_out1.numpy()).to( + torch.int32 + ) + hx = torch.from_numpy(ncnn_out2.numpy()).clone() + cx = torch.from_numpy(ncnn_out3.numpy()).clone() + return encoder_out, encoder_out_lens, hx, cx + + def run_decoder(self, decoder_input): + assert decoder_input.dtype == torch.int32 + + with self.decoder_net.create_extractor() as ex: + ex.set_num_threads(10) + ex.input("in0", ncnn.Mat(decoder_input.numpy()).clone()) + ret, ncnn_out0 = ex.extract("out0") + assert ret == 0, ret + decoder_out = torch.from_numpy(ncnn_out0.numpy()).clone() + return decoder_out + + def run_joiner(self, encoder_out, decoder_out): + with self.joiner_net.create_extractor() as ex: + ex.set_num_threads(10) + ex.input("in0", ncnn.Mat(encoder_out.numpy()).clone()) + ex.input("in1", ncnn.Mat(decoder_out.numpy()).clone()) + ret, ncnn_out0 = ex.extract("out0") + assert ret == 0, ret + joiner_out = torch.from_numpy(ncnn_out0.numpy()).clone() + return joiner_out + + +def read_sound_files( + filenames: List[str], expected_sample_rate: float +) -> List[torch.Tensor]: + """Read a list of sound files into a list 1-D float32 torch tensors. + Args: + filenames: + A list of sound filenames. + expected_sample_rate: + The expected sample rate of the sound files. + Returns: + Return a list of 1-D float32 torch tensors. + """ + ans = [] + for f in filenames: + wave, sample_rate = torchaudio.load(f) + assert sample_rate == expected_sample_rate, ( + f"expected sample rate: {expected_sample_rate}. " + f"Given: {sample_rate}" + ) + # We use only the first channel + ans.append(wave[0]) + return ans + + +def greedy_search(model: Model, encoder_out: torch.Tensor): + assert encoder_out.ndim == 2 + T = encoder_out.size(0) + + context_size = 2 + blank_id = 0 # hard-code to 0 + hyp = [blank_id] * context_size + + decoder_input = torch.tensor(hyp, dtype=torch.int32) # (1, context_size) + + decoder_out = model.run_decoder(decoder_input).squeeze(0) + # print(decoder_out.shape) # (512,) + + for t in range(T): + encoder_out_t = encoder_out[t] + joiner_out = model.run_joiner(encoder_out_t, decoder_out) + # print(joiner_out.shape) # [500] + y = joiner_out.argmax(dim=0).tolist() + if y != blank_id: + hyp.append(y) + decoder_input = hyp[-context_size:] + decoder_input = torch.tensor(decoder_input, dtype=torch.int32) + decoder_out = model.run_decoder(decoder_input).squeeze(0) + return hyp[context_size:] + + +def main(): + model = Model("./lstm_transducer_stateless2/exp") + + sp = spm.SentencePieceProcessor() + sp.load("./data/lang_bpe_500/bpe.model") + + sound_files = [ + "./test_wavs/1089-134686-0001.wav", + # "./test_wavs/1221-135766-0001.wav", + # "./test_wavs/1221-135766-0002.wav", + ] + assert len(sound_files) == 1, "ncnn only support batch_size==1" + + sample_rate = 16000 + + logging.info("Constructing Fbank computer") + opts = kaldifeat.FbankOptions() + opts.device = "cpu" + opts.frame_opts.dither = 0 + opts.frame_opts.snip_edges = False + opts.frame_opts.samp_freq = sample_rate + opts.mel_opts.num_bins = 80 + + fbank = kaldifeat.Fbank(opts) + + logging.info(f"Reading sound files: {sound_files}") + wave_samples = read_sound_files( + filenames=sound_files, + expected_sample_rate=sample_rate, + )[0] + + logging.info("Decoding started") + features = fbank(wave_samples) + + num_encoder_layers = 12 + d_model = 512 + rnn_hidden_size = 1024 + + states = ( + torch.zeros(num_encoder_layers, d_model), + torch.zeros( + num_encoder_layers, + rnn_hidden_size, + ), + ) + + encoder_out, encoder_out_lens, hx, cx = model.run_encoder(features, states) + print(encoder_out.shape) + print(encoder_out_lens) + hyp = greedy_search(model, encoder_out) + print(sound_files[0]) + print(sp.decode(hyp)) + print(hyp) + + +if __name__ == "__main__": + formatter = ( + "%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] %(message)s" + ) + + logging.basicConfig(format=formatter, level=logging.INFO) + + main() diff --git a/egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py b/egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py new file mode 100755 index 0000000000..3a44f8ff41 --- /dev/null +++ b/egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py @@ -0,0 +1,309 @@ +#!/usr/bin/env python3 +# +# Copyright 2022 Xiaomi Corp. (authors: Fangjun Kuang, Zengwei Yao) +# +# See ../../../../LICENSE for clarification regarding multiple authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +from typing import List, Optional + +import ncnn +import sentencepiece as spm +import torch +import torchaudio +from kaldifeat import FbankOptions, OnlineFbank, OnlineFeature + + +class Model: + def __init__(self, d): + self.init_encoder(d) + self.init_decoder(d) + self.init_joiner(d) + + def init_encoder(self, d): + encoder_net = ncnn.Net() + encoder_net.opt.use_packing_layout = False + encoder_net.opt.use_fp16_storage = False + encoder_param = ( + d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" + ) + encoder_model = ( + d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + ) + + encoder_net.load_param(encoder_param) + encoder_net.load_model(encoder_model) + + self.encoder_net = encoder_net + + def init_decoder(self, d): + decoder_param = ( + d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" + ) + decoder_model = ( + d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + ) + + decoder_net = ncnn.Net() + decoder_net.opt.use_packing_layout = False + + decoder_net.load_param(decoder_param) + decoder_net.load_model(decoder_model) + + self.decoder_net = decoder_net + + def init_joiner(self, d): + joiner_param = ( + d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" + ) + joiner_model = d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + joiner_net = ncnn.Net() + joiner_net.opt.use_packing_layout = False + joiner_net.load_param(joiner_param) + joiner_net.load_model(joiner_model) + + self.joiner_net = joiner_net + + def run_encoder(self, x, states): + with self.encoder_net.create_extractor() as ex: + ex.set_num_threads(10) + ex.input("in0", ncnn.Mat(x.numpy()).clone()) + x_lens = torch.tensor([x.size(0)], dtype=torch.float32) + ex.input("in1", ncnn.Mat(x_lens.numpy()).clone()) + ex.input("in2", ncnn.Mat(states[0].numpy()).clone()) + ex.input("in3", ncnn.Mat(states[1].numpy()).clone()) + + ret, ncnn_out0 = ex.extract("out0") + assert ret == 0, ret + + ret, ncnn_out1 = ex.extract("out1") + assert ret == 0, ret + + ret, ncnn_out2 = ex.extract("out2") + assert ret == 0, ret + + ret, ncnn_out3 = ex.extract("out3") + assert ret == 0, ret + + encoder_out = torch.from_numpy(ncnn_out0.numpy()).clone() + encoder_out_lens = torch.from_numpy(ncnn_out1.numpy()).to( + torch.int32 + ) + hx = torch.from_numpy(ncnn_out2.numpy()).clone() + cx = torch.from_numpy(ncnn_out3.numpy()).clone() + return encoder_out, encoder_out_lens, hx, cx + + def run_decoder(self, decoder_input): + assert decoder_input.dtype == torch.int32 + + with self.decoder_net.create_extractor() as ex: + ex.set_num_threads(10) + ex.input("in0", ncnn.Mat(decoder_input.numpy()).clone()) + ret, ncnn_out0 = ex.extract("out0") + assert ret == 0, ret + decoder_out = torch.from_numpy(ncnn_out0.numpy()).clone() + return decoder_out + + def run_joiner(self, encoder_out, decoder_out): + with self.joiner_net.create_extractor() as ex: + ex.set_num_threads(10) + ex.input("in0", ncnn.Mat(encoder_out.numpy()).clone()) + ex.input("in1", ncnn.Mat(decoder_out.numpy()).clone()) + ret, ncnn_out0 = ex.extract("out0") + assert ret == 0, ret + joiner_out = torch.from_numpy(ncnn_out0.numpy()).clone() + return joiner_out + + +def read_sound_files( + filenames: List[str], expected_sample_rate: float +) -> List[torch.Tensor]: + """Read a list of sound files into a list 1-D float32 torch tensors. + Args: + filenames: + A list of sound filenames. + expected_sample_rate: + The expected sample rate of the sound files. + Returns: + Return a list of 1-D float32 torch tensors. + """ + ans = [] + for f in filenames: + wave, sample_rate = torchaudio.load(f) + assert sample_rate == expected_sample_rate, ( + f"expected sample rate: {expected_sample_rate}. " + f"Given: {sample_rate}" + ) + # We use only the first channel + ans.append(wave[0]) + return ans + + +def create_streaming_feature_extractor() -> OnlineFeature: + """Create a CPU streaming feature extractor. + + At present, we assume it returns a fbank feature extractor with + fixed options. In the future, we will support passing in the options + from outside. + + Returns: + Return a CPU streaming feature extractor. + """ + opts = FbankOptions() + opts.device = "cpu" + opts.frame_opts.dither = 0 + opts.frame_opts.snip_edges = False + opts.frame_opts.samp_freq = 16000 + opts.mel_opts.num_bins = 80 + return OnlineFbank(opts) + + +def greedy_search( + model: Model, + encoder_out: torch.Tensor, + decoder_out: Optional[torch.Tensor] = None, + hyp: Optional[List[int]] = None, +): + assert encoder_out.ndim == 1 + context_size = 2 + blank_id = 0 + + if decoder_out is None: + assert hyp is None, hyp + hyp = [blank_id] * context_size + decoder_input = torch.tensor( + hyp, dtype=torch.int32 + ) # (1, context_size) + decoder_out = model.run_decoder(decoder_input).squeeze(0) + + else: + assert decoder_out.ndim == 1 + assert hyp is not None, hyp + + joiner_out = model.run_joiner(encoder_out, decoder_out) + y = joiner_out.argmax(dim=0).tolist() + if y != blank_id: + hyp.append(y) + decoder_input = hyp[-context_size:] + decoder_input = torch.tensor(decoder_input, dtype=torch.int32) + decoder_out = model.run_decoder(decoder_input).squeeze(0) + + return hyp, decoder_out + + +def main(): + model = Model("./lstm_transducer_stateless2/exp") + + sp = spm.SentencePieceProcessor() + sp.load("./data/lang_bpe_500/bpe.model") + + sound_files = [ + "./test_wavs/1089-134686-0001.wav", + # "./test_wavs/1221-135766-0001.wav", + # "./test_wavs/1221-135766-0002.wav", + ] + assert len(sound_files) == 1, "ncnn only support batch_size==1" + + sample_rate = 16000 + + logging.info("Constructing Fbank computer") + online_fbank = create_streaming_feature_extractor() + + logging.info(f"Reading sound files: {sound_files}") + wave_samples = read_sound_files( + filenames=sound_files, + expected_sample_rate=sample_rate, + )[0] + + num_encoder_layers = 12 + batch_size = 1 + d_model = 512 + rnn_hidden_size = 1024 + + states = ( + torch.zeros(num_encoder_layers, batch_size, d_model), + torch.zeros( + num_encoder_layers, + batch_size, + rnn_hidden_size, + ), + ) + + hyp = None + decoder_out = None + + num_processed_frames = 0 + segment = 9 + offset = 4 + + chunk = 3200 # 0.2 second + + start = 0 + while start < wave_samples.numel(): + end = min(start + chunk, wave_samples.numel()) + samples = wave_samples[start:end] + start += chunk + + online_fbank.accept_waveform( + sampling_rate=sample_rate, + waveform=samples, + ) + print(num_processed_frames) + while online_fbank.num_frames_ready - num_processed_frames >= segment: + frames = [] + for i in range(segment): + frames.append(online_fbank.get_frame(num_processed_frames + i)) + num_processed_frames += offset + frames = torch.cat(frames, dim=0) + encoder_out, encoder_out_lens, hx, cx = model.run_encoder( + frames, states + ) + states = (hx, cx) + hyp, decoder_out = greedy_search( + model, encoder_out.squeeze(0), decoder_out, hyp + ) + online_fbank.accept_waveform( + sampling_rate=sample_rate, waveform=torch.zeros(8000, dtype=torch.int32) + ) + + online_fbank.input_finished() + while online_fbank.num_frames_ready - num_processed_frames >= segment: + frames = [] + for i in range(segment): + frames.append(online_fbank.get_frame(num_processed_frames + i)) + num_processed_frames += offset + frames = torch.cat(frames, dim=0) + encoder_out, encoder_out_lens, hx, cx = model.run_encoder( + frames, states + ) + states = (hx, cx) + hyp, decoder_out = greedy_search( + model, encoder_out.squeeze(0), decoder_out, hyp + ) + + context_size = 2 + + print(sound_files[0]) + print(sp.decode(hyp[context_size:])) + + +if __name__ == "__main__": + formatter = ( + "%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] %(message)s" + ) + + logging.basicConfig(format=formatter, level=logging.INFO) + + main() diff --git a/egs/librispeech/ASR/lstm_transducer_stateless2/train.py b/egs/librispeech/ASR/lstm_transducer_stateless2/train.py index b3e50c52b8..9eed2dfcb4 100755 --- a/egs/librispeech/ASR/lstm_transducer_stateless2/train.py +++ b/egs/librispeech/ASR/lstm_transducer_stateless2/train.py @@ -406,6 +406,8 @@ def get_params() -> AttributeDict: "decoder_dim": 512, # parameters for joiner "joiner_dim": 512, + # True to generate a model that can be exported via PNNX + "is_pnnx": False, # parameters for Noam "model_warm_step": 3000, # arg given to model, not for lrate "env_info": get_env_info(), @@ -424,6 +426,7 @@ def get_encoder_model(params: AttributeDict) -> nn.Module: dim_feedforward=params.dim_feedforward, num_encoder_layers=params.num_encoder_layers, aux_layer_period=params.aux_layer_period, + is_pnnx=params.is_pnnx, ) return encoder From 6fdc9d53a46f3bf1568735402e14185aef4eb1b3 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Mon, 19 Sep 2022 20:34:15 +0800 Subject: [PATCH 2/4] Add missing files --- .gitignore | 2 + .../ASR/lstm_transducer_stateless/lstm.py | 41 ++++++++++++++++--- .../scaling_converter.py | 36 ++++++++++++++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 1dbf8f395f..406deff6aa 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ log *.bak *-bak *bak.py +*.param +*.bin diff --git a/egs/librispeech/ASR/lstm_transducer_stateless/lstm.py b/egs/librispeech/ASR/lstm_transducer_stateless/lstm.py index 0d268ab07b..898bf89305 100644 --- a/egs/librispeech/ASR/lstm_transducer_stateless/lstm.py +++ b/egs/librispeech/ASR/lstm_transducer_stateless/lstm.py @@ -116,6 +116,8 @@ class RNN(EncoderInterface): Period of auxiliary layers used for random combiner during training. If set to 0, will not use the random combiner (Default). You can set a positive integer to use the random combiner, e.g., 3. + is_pnnx: + True to make this class exportable via PNNX. """ def __init__( @@ -129,6 +131,7 @@ def __init__( dropout: float = 0.1, layer_dropout: float = 0.075, aux_layer_period: int = 0, + is_pnnx: bool = False, ) -> None: super(RNN, self).__init__() @@ -142,7 +145,13 @@ def __init__( # That is, it does two things simultaneously: # (1) subsampling: T -> T//subsampling_factor # (2) embedding: num_features -> d_model - self.encoder_embed = Conv2dSubsampling(num_features, d_model) + self.encoder_embed = Conv2dSubsampling( + num_features, + d_model, + is_pnnx=is_pnnx, + ) + + self.is_pnnx = is_pnnx self.num_encoder_layers = num_encoder_layers self.d_model = d_model @@ -209,7 +218,13 @@ def forward( # lengths = ((x_lens - 3) // 2 - 1) // 2 # issue an warning # # Note: rounding_mode in torch.div() is available only in torch >= 1.8.0 - lengths = (((x_lens - 3) >> 1) - 1) >> 1 + if not self.is_pnnx: + lengths = (((x_lens - 3) >> 1) - 1) >> 1 + else: + lengths1 = torch.floor((x_lens - 3) / 2) + lengths = torch.floor((lengths1 - 1) / 2) + lengths = lengths.to(x_lens) + if not torch.jit.is_tracing(): assert x.size(0) == lengths.max().item() @@ -359,7 +374,7 @@ def forward( # for cell state assert states[1].shape == (1, src.size(1), self.rnn_hidden_size) src_lstm, new_states = self.lstm(src, states) - src = src + self.dropout(src_lstm) + src = self.dropout(src_lstm) + src # feed forward module src = src + self.dropout(self.feed_forward(src)) @@ -505,6 +520,7 @@ def __init__( layer1_channels: int = 8, layer2_channels: int = 32, layer3_channels: int = 128, + is_pnnx: bool = False, ) -> None: """ Args: @@ -517,6 +533,9 @@ def __init__( Number of channels in layer1 layer1_channels: Number of channels in layer2 + is_pnnx: + True if we are converting the model to PNNX format. + False otherwise. """ assert in_channels >= 9 super().__init__() @@ -559,6 +578,10 @@ def __init__( channel_dim=-1, min_positive=0.45, max_positive=0.55 ) + # ncnn support only batch size == 1 + self.is_pnnx = is_pnnx + self.conv_out_dim = self.out.weight.shape[1] + def forward(self, x: torch.Tensor) -> torch.Tensor: """Subsample x. @@ -572,9 +595,15 @@ def forward(self, x: torch.Tensor) -> torch.Tensor: # On entry, x is (N, T, idim) x = x.unsqueeze(1) # (N, T, idim) -> (N, 1, T, idim) i.e., (N, C, H, W) x = self.conv(x) - # Now x is of shape (N, odim, ((T-3)//2-1)//2, ((idim-3)//2-1)//2) - b, c, t, f = x.size() - x = self.out(x.transpose(1, 2).contiguous().view(b, t, c * f)) + + if torch.jit.is_tracing() and self.is_pnnx: + x = x.permute(0, 2, 1, 3).reshape(1, -1, self.conv_out_dim) + x = self.out(x) + else: + # Now x is of shape (N, odim, ((T-3)//2-1)//2, ((idim-3)//2-1)//2) + b, c, t, f = x.size() + x = self.out(x.transpose(1, 2).contiguous().view(b, t, c * f)) + # Now x is of shape (N, ((T-3)//2-1))//2, odim) x = self.out_norm(x) x = self.out_balancer(x) diff --git a/egs/librispeech/ASR/pruned_transducer_stateless3/scaling_converter.py b/egs/librispeech/ASR/pruned_transducer_stateless3/scaling_converter.py index 428f35796d..43f5d409c6 100644 --- a/egs/librispeech/ASR/pruned_transducer_stateless3/scaling_converter.py +++ b/egs/librispeech/ASR/pruned_transducer_stateless3/scaling_converter.py @@ -30,6 +30,7 @@ import torch import torch.nn as nn from scaling import ( + BasicNorm, ScaledConv1d, ScaledConv2d, ScaledEmbedding, @@ -38,6 +39,29 @@ ) +class NonScaledNorm(nn.Module): + """See BasicNorm for doc""" + + def __init__( + self, + num_channels: int, + eps_exp: float, + channel_dim: int = -1, # CAUTION: see documentation. + ): + super().__init__() + self.num_channels = num_channels + self.channel_dim = channel_dim + self.eps_exp = eps_exp + + def forward(self, x: torch.Tensor) -> torch.Tensor: + if not torch.jit.is_tracing(): + assert x.shape[self.channel_dim] == self.num_channels + scales = ( + torch.mean(x * x, dim=self.channel_dim, keepdim=True) + self.eps_exp + ).pow(-0.5) + return x * scales + + def scaled_linear_to_linear(scaled_linear: ScaledLinear) -> nn.Linear: """Convert an instance of ScaledLinear to nn.Linear. @@ -174,6 +198,16 @@ def scaled_embedding_to_embedding( return embedding +def convert_basic_norm(basic_norm: BasicNorm) -> NonScaledNorm: + assert isinstance(basic_norm, BasicNorm), type(BasicNorm) + norm = NonScaledNorm( + num_channels=basic_norm.num_channels, + eps_exp=basic_norm.eps.data.exp().item(), + channel_dim=basic_norm.channel_dim, + ) + return norm + + def scaled_lstm_to_lstm(scaled_lstm: ScaledLSTM) -> nn.LSTM: """Convert an instance of ScaledLSTM to nn.LSTM. @@ -256,6 +290,8 @@ def convert_scaled_to_non_scaled(model: nn.Module, inplace: bool = False): d[name] = scaled_conv2d_to_conv2d(m) elif isinstance(m, ScaledEmbedding): d[name] = scaled_embedding_to_embedding(m) + elif isinstance(m, BasicNorm): + d[name] = convert_basic_norm(m) elif isinstance(m, ScaledLSTM): d[name] = scaled_lstm_to_lstm(m) From 50f8555d4bd8d3bf9be4357c7af7307e9160b478 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 20 Sep 2022 13:37:48 +0800 Subject: [PATCH 3/4] Add CI tests --- ...-lstm-transducer-stateless2-2022-09-03.yml | 159 ++++++++++++++++++ ...-lstm-transducer-stateless2-2022-09-03.yml | 136 +++++++++++++++ .../lstm_transducer_stateless2/ncnn-decode.py | 131 ++++++++++----- .../streaming-ncnn-decode.py | 122 +++++++++----- 4 files changed, 470 insertions(+), 78 deletions(-) create mode 100755 .github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml create mode 100644 .github/workflows/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml diff --git a/.github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml b/.github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml new file mode 100755 index 0000000000..5291d23273 --- /dev/null +++ b/.github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml @@ -0,0 +1,159 @@ +#!/usr/bin/env bash + +log() { + # This function is from espnet + local fname=${BASH_SOURCE[1]##*/} + echo -e "$(date '+%Y-%m-%d %H:%M:%S') (${fname}:${BASH_LINENO[0]}:${FUNCNAME[1]}) $*" +} + +cd egs/librispeech/ASR + +repo_url=https://huggingface.co/csukuangfj/icefall-asr-librispeech-lstm-transducer-stateless2-2022-09-03 + +log "Downloading pre-trained model from $repo_url" +git lfs install +git clone $repo_url +repo=$(basename $repo_url) + +log "Display test files" +tree $repo/ +soxi $repo/test_wavs/*.wav +ls -lh $repo/test_wavs/*.wav + +pushd $repo/exp +ln -s pretrained-iter-468000-avg-16.pt pretrained.pt +ln -s pretrained-iter-468000-avg-16.pt epoch-99.pt +popd + +log "Install ncnn and pnnx" + +# We are using a modified ncnn here. Will try to merge it to the official repo +# of ncnn +git clone https://github.com/csukuangfj/ncnn +pushd ncnn +git submodule init +git submodule update python/pybind11 +python3 setup.py bdist_wheel +ls -lh dist/ +pip install dist/*.whl +cd tools/pnnx +mkdir build +cd build +cmake .. +make -j4 pnnx + +./src/pnnx || echo "pass" + +popd + +log "Test exporting to pnnx format" + +./lstm_transducer_stateless2/export.py \ + --exp-dir $repo/exp \ + --bpe-model $repo/data/lang_bpe_500/bpe.model \ + --epoch 99 \ + --avg 1 \ + --use-averaged-model 0 \ + --pnnx 1 + +./ncnn/tools/pnnx/build/src/pnnx $repo/exp/encoder_jit_trace.pt +./ncnn/tools/pnnx/build/src/pnnx $repo/exp/decoder_jit_trace.pt +./ncnn/tools/pnnx/build/src/pnnx $repo/exp/joiner_jit_trace.pt + +./lstm_transducer_stateless2/ncnn-decode.py \ + --bpe-model-filename $repo/data/lang_bpe_500/bpe.model \ + --encoder-param-filename $repo/exp/encoder_jit_trace-pnnx.ncnn.param \ + --encoder-bin-filename $repo/exp/encoder_jit_trace-pnnx.ncnn.bin \ + --decoder-param-filename $repo/exp/decoder_jit_trace-pnnx.ncnn.param \ + --decoder-bin-filename $repo/exp/decoder_jit_trace-pnnx.ncnn.bin \ + --joiner-param-filename $repo/exp/joiner_jit_trace-pnnx.ncnn.param \ + --joiner-bin-filename $repo/exp/joiner_jit_trace-pnnx.ncnn.bin \ + $repo/test_wavs/1089-134686-0001.wav + +./lstm_transducer_stateless2/streaming-ncnn-decode.py \ + --bpe-model-filename $repo/data/lang_bpe_500/bpe.model \ + --encoder-param-filename $repo/exp/encoder_jit_trace-pnnx.ncnn.param \ + --encoder-bin-filename $repo/exp/encoder_jit_trace-pnnx.ncnn.bin \ + --decoder-param-filename $repo/exp/decoder_jit_trace-pnnx.ncnn.param \ + --decoder-bin-filename $repo/exp/decoder_jit_trace-pnnx.ncnn.bin \ + --joiner-param-filename $repo/exp/joiner_jit_trace-pnnx.ncnn.param \ + --joiner-bin-filename $repo/exp/joiner_jit_trace-pnnx.ncnn.bin \ + $repo/test_wavs/1089-134686-0001.wav + + + +log "Test exporting with torch.jit.trace()" + +./lstm_transducer_stateless2/export.py \ + --exp-dir $repo/exp \ + --bpe-model $repo/data/lang_bpe_500/bpe.model \ + --epoch 99 \ + --avg 1 \ + --use-averaged-model 0 \ + --jit-trace 1 + +log "Decode with models exported by torch.jit.trace()" + +./lstm_transducer_stateless2/jit_pretrained.py \ + --bpe-model $repo/data/lang_bpe_500/bpe.model \ + --encoder-model-filename $repo/exp/encoder_jit_trace.pt \ + --decoder-model-filename $repo/exp/decoder_jit_trace.pt \ + --joiner-model-filename $repo/exp/joiner_jit_trace.pt \ + $repo/test_wavs/1089-134686-0001.wav \ + $repo/test_wavs/1221-135766-0001.wav \ + $repo/test_wavs/1221-135766-0002.wav + +for sym in 1 2 3; do + log "Greedy search with --max-sym-per-frame $sym" + + ./lstm_transducer_stateless2/pretrained.py \ + --method greedy_search \ + --max-sym-per-frame $sym \ + --checkpoint $repo/exp/pretrained.pt \ + --bpe-model $repo/data/lang_bpe_500/bpe.model \ + $repo/test_wavs/1089-134686-0001.wav \ + $repo/test_wavs/1221-135766-0001.wav \ + $repo/test_wavs/1221-135766-0002.wav +done + +for method in modified_beam_search beam_search fast_beam_search; do + log "$method" + + ./lstm_transducer_stateless2/pretrained.py \ + --method $method \ + --beam-size 4 \ + --checkpoint $repo/exp/pretrained.pt \ + --bpe-model $repo/data/lang_bpe_500/bpe.model \ + $repo/test_wavs/1089-134686-0001.wav \ + $repo/test_wavs/1221-135766-0001.wav \ + $repo/test_wavs/1221-135766-0002.wav +done + +echo "GITHUB_EVENT_NAME: ${GITHUB_EVENT_NAME}" +echo "GITHUB_EVENT_LABEL_NAME: ${GITHUB_EVENT_LABEL_NAME}" +if [[ x"${GITHUB_EVENT_NAME}" == x"schedule" || x"${GITHUB_EVENT_LABEL_NAME}" == x"ncnn" ]]; then + mkdir -p lstm_transducer_stateless2/exp + ln -s $PWD/$repo/exp/pretrained.pt lstm_transducer_stateless2/exp/epoch-999.pt + ln -s $PWD/$repo/data/lang_bpe_500 data/ + + ls -lh data + ls -lh lstm_transducer_stateless2/exp + + log "Decoding test-clean and test-other" + + # use a small value for decoding with CPU + max_duration=100 + + for method in greedy_search fast_beam_search modified_beam_search; do + log "Decoding with $method" + + ./lstm_transducer_stateless2/decode.py \ + --decoding-method $method \ + --epoch 999 \ + --avg 1 \ + --max-duration $max_duration \ + --exp-dir lstm_transducer_stateless2/exp + done + + rm lstm_transducer_stateless2/exp/*.pt +fi diff --git a/.github/workflows/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml b/.github/workflows/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml new file mode 100644 index 0000000000..a3aa0c0b88 --- /dev/null +++ b/.github/workflows/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml @@ -0,0 +1,136 @@ +name: run-librispeech-lstm-transducer-2022-09-03 + +on: + push: + branches: + - master + pull_request: + types: [labeled] + + schedule: + # minute (0-59) + # hour (0-23) + # day of the month (1-31) + # month (1-12) + # day of the week (0-6) + # nightly build at 15:50 UTC time every day + - cron: "50 15 * * *" + +jobs: + run_librispeech_pruned_transducer_stateless3_2022_05_13: + if: github.event.label.name == 'ncnn' || github.event_name == 'push' || github.event_name == 'schedule' + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-18.04] + python-version: [3.8] + + fail-fast: false + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Setup Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: '**/requirements-ci.txt' + + - name: Install Python dependencies + run: | + grep -v '^#' ./requirements-ci.txt | xargs -n 1 -L 1 pip install + pip uninstall -y protobuf + pip install --no-binary protobuf protobuf + + - name: Cache kaldifeat + id: my-cache + uses: actions/cache@v2 + with: + path: | + ~/tmp/kaldifeat + key: cache-tmp-${{ matrix.python-version }} + + - name: Install kaldifeat + if: steps.my-cache.outputs.cache-hit != 'true' + shell: bash + run: | + .github/scripts/install-kaldifeat.sh + + - name: Cache LibriSpeech test-clean and test-other datasets + id: libri-test-clean-and-test-other-data + uses: actions/cache@v2 + with: + path: | + ~/tmp/download + key: cache-libri-test-clean-and-test-other + + - name: Download LibriSpeech test-clean and test-other + if: steps.libri-test-clean-and-test-other-data.outputs.cache-hit != 'true' + shell: bash + run: | + .github/scripts/download-librispeech-test-clean-and-test-other-dataset.sh + + - name: Prepare manifests for LibriSpeech test-clean and test-other + shell: bash + run: | + .github/scripts/prepare-librispeech-test-clean-and-test-other-manifests.sh + + - name: Cache LibriSpeech test-clean and test-other fbank features + id: libri-test-clean-and-test-other-fbank + uses: actions/cache@v2 + with: + path: | + ~/tmp/fbank-libri + key: cache-libri-fbank-test-clean-and-test-other-v2 + + - name: Compute fbank for LibriSpeech test-clean and test-other + if: steps.libri-test-clean-and-test-other-fbank.outputs.cache-hit != 'true' + shell: bash + run: | + .github/scripts/compute-fbank-librispeech-test-clean-and-test-other.sh + + - name: Inference with pre-trained model + shell: bash + env: + GITHUB_EVENT_NAME: ${{ github.event_name }} + GITHUB_EVENT_LABEL_NAME: ${{ github.event.label.name }} + run: | + mkdir -p egs/librispeech/ASR/data + ln -sfv ~/tmp/fbank-libri egs/librispeech/ASR/data/fbank + ls -lh egs/librispeech/ASR/data/* + + sudo apt-get -qq install git-lfs tree sox + export PYTHONPATH=$PWD:$PYTHONPATH + export PYTHONPATH=~/tmp/kaldifeat/kaldifeat/python:$PYTHONPATH + export PYTHONPATH=~/tmp/kaldifeat/build/lib:$PYTHONPATH + + .github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml + + - name: Display decoding results for lstm_transducer_stateless2 + if: github.event_name == 'schedule' || github.event.label.name == 'ncnn' + shell: bash + run: | + cd egs/librispeech/ASR + tree lstm_transducer_stateless2/exp + cd lstm_transducer_stateless2/exp + echo "===greedy search===" + find greedy_search -name "log-*" -exec grep -n --color "best for test-clean" {} + | sort -n -k2 + find greedy_search -name "log-*" -exec grep -n --color "best for test-other" {} + | sort -n -k2 + + echo "===fast_beam_search===" + find fast_beam_search -name "log-*" -exec grep -n --color "best for test-clean" {} + | sort -n -k2 + find fast_beam_search -name "log-*" -exec grep -n --color "best for test-other" {} + | sort -n -k2 + + echo "===modified beam search===" + find modified_beam_search -name "log-*" -exec grep -n --color "best for test-clean" {} + | sort -n -k2 + find modified_beam_search -name "log-*" -exec grep -n --color "best for test-other" {} + | sort -n -k2 + + - name: Upload decoding results for lstm_transducer_stateless2 + uses: actions/upload-artifact@v2 + if: github.event_name == 'schedule' || github.event.label.name == 'ncnn' + with: + name: torch-${{ matrix.torch }}-python-${{ matrix.python-version }}-ubuntu-18.04-cpu-lstm_transducer_stateless2-2022-09-03 + path: egs/librispeech/ASR/lstm_transducer_stateless2/exp/ diff --git a/egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py b/egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py index e2379c8f8a..410de8d3d3 100755 --- a/egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py +++ b/egs/librispeech/ASR/lstm_transducer_stateless2/ncnn-decode.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +# flake8: noqa # # Copyright 2022 Xiaomi Corp. (authors: Fangjun Kuang, Zengwei Yao) # @@ -15,7 +16,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +""" +Usage: + ./lstm_transducer_stateless2/ncnn-decode.py \ + --bpe-model-filename ./data/lang_bpe_500/bpe.model \ + --encoder-param-filename ./lstm_transducer_stateless2/exp/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param \ + --encoder-bin-filename ./lstm_transducer_stateless2/exp/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin \ + --decoder-param-filename ./lstm_transducer_stateless2/exp/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param \ + --decoder-bin-filename ./lstm_transducer_stateless2/exp/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin \ + --joiner-param-filename ./lstm_transducer_stateless2/exp/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.param \ + --joiner-bin-filename ./lstm_transducer_stateless2/exp/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin \ + ./test_wavs/1089-134686-0001.wav +""" + +import argparse import logging from typing import List @@ -26,35 +40,81 @@ import torchaudio +def get_args(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "--bpe-model-filename", + type=str, + help="Path to bpe.model", + ) + + parser.add_argument( + "--encoder-param-filename", + type=str, + help="Path to encoder.ncnn.param", + ) + + parser.add_argument( + "--encoder-bin-filename", + type=str, + help="Path to encoder.ncnn.bin", + ) + + parser.add_argument( + "--decoder-param-filename", + type=str, + help="Path to decoder.ncnn.param", + ) + + parser.add_argument( + "--decoder-bin-filename", + type=str, + help="Path to decoder.ncnn.bin", + ) + + parser.add_argument( + "--joiner-param-filename", + type=str, + help="Path to joiner.ncnn.param", + ) + + parser.add_argument( + "--joiner-bin-filename", + type=str, + help="Path to joiner.ncnn.bin", + ) + + parser.add_argument( + "sound_filename", + type=str, + help="Path to foo.wav", + ) + + return parser.parse_args() + + class Model: - def __init__(self, d): - self.init_encoder(d) - self.init_decoder(d) - self.init_joiner(d) + def __init__(self, args): + self.init_encoder(args) + self.init_decoder(args) + self.init_joiner(args) - def init_encoder(self, d): + def init_encoder(self, args): encoder_net = ncnn.Net() encoder_net.opt.use_packing_layout = False encoder_net.opt.use_fp16_storage = False - encoder_param = ( - d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" - ) - encoder_model = ( - d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" - ) + encoder_param = args.encoder_param_filename + encoder_model = args.encoder_bin_filename encoder_net.load_param(encoder_param) encoder_net.load_model(encoder_model) self.encoder_net = encoder_net - def init_decoder(self, d): - decoder_param = ( - d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" - ) - decoder_model = ( - d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" - ) + def init_decoder(self, args): + decoder_param = args.decoder_param_filename + decoder_model = args.decoder_bin_filename decoder_net = ncnn.Net() decoder_net.opt.use_packing_layout = False @@ -64,11 +124,9 @@ def init_decoder(self, d): self.decoder_net = decoder_net - def init_joiner(self, d): - joiner_param = ( - d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" - ) - joiner_model = d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + def init_joiner(self, args): + joiner_param = args.joiner_param_filename + joiner_model = args.joiner_bin_filename joiner_net = ncnn.Net() joiner_net.opt.use_packing_layout = False joiner_net.load_param(joiner_param) @@ -178,17 +236,15 @@ def greedy_search(model: Model, encoder_out: torch.Tensor): def main(): - model = Model("./lstm_transducer_stateless2/exp") + args = get_args() + logging.info(vars(args)) + + model = Model(args) sp = spm.SentencePieceProcessor() - sp.load("./data/lang_bpe_500/bpe.model") + sp.load(args.bpe_model_filename) - sound_files = [ - "./test_wavs/1089-134686-0001.wav", - # "./test_wavs/1221-135766-0001.wav", - # "./test_wavs/1221-135766-0002.wav", - ] - assert len(sound_files) == 1, "ncnn only support batch_size==1" + sound_file = args.sound_filename sample_rate = 16000 @@ -202,9 +258,9 @@ def main(): fbank = kaldifeat.Fbank(opts) - logging.info(f"Reading sound files: {sound_files}") + logging.info(f"Reading sound files: {sound_file}") wave_samples = read_sound_files( - filenames=sound_files, + filenames=[sound_file], expected_sample_rate=sample_rate, )[0] @@ -224,12 +280,9 @@ def main(): ) encoder_out, encoder_out_lens, hx, cx = model.run_encoder(features, states) - print(encoder_out.shape) - print(encoder_out_lens) hyp = greedy_search(model, encoder_out) - print(sound_files[0]) - print(sp.decode(hyp)) - print(hyp) + logging.info(sound_file) + logging.info(sp.decode(hyp)) if __name__ == "__main__": diff --git a/egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py b/egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py index 3a44f8ff41..da78413f78 100755 --- a/egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py +++ b/egs/librispeech/ASR/lstm_transducer_stateless2/streaming-ncnn-decode.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +# flake8: noqa # # Copyright 2022 Xiaomi Corp. (authors: Fangjun Kuang, Zengwei Yao) # @@ -16,6 +17,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import argparse import logging from typing import List, Optional @@ -26,35 +28,81 @@ from kaldifeat import FbankOptions, OnlineFbank, OnlineFeature +def get_args(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "--bpe-model-filename", + type=str, + help="Path to bpe.model", + ) + + parser.add_argument( + "--encoder-param-filename", + type=str, + help="Path to encoder.ncnn.param", + ) + + parser.add_argument( + "--encoder-bin-filename", + type=str, + help="Path to encoder.ncnn.bin", + ) + + parser.add_argument( + "--decoder-param-filename", + type=str, + help="Path to decoder.ncnn.param", + ) + + parser.add_argument( + "--decoder-bin-filename", + type=str, + help="Path to decoder.ncnn.bin", + ) + + parser.add_argument( + "--joiner-param-filename", + type=str, + help="Path to joiner.ncnn.param", + ) + + parser.add_argument( + "--joiner-bin-filename", + type=str, + help="Path to joiner.ncnn.bin", + ) + + parser.add_argument( + "sound_filename", + type=str, + help="Path to foo.wav", + ) + + return parser.parse_args() + + class Model: - def __init__(self, d): - self.init_encoder(d) - self.init_decoder(d) - self.init_joiner(d) + def __init__(self, args): + self.init_encoder(args) + self.init_decoder(args) + self.init_joiner(args) - def init_encoder(self, d): + def init_encoder(self, args): encoder_net = ncnn.Net() encoder_net.opt.use_packing_layout = False encoder_net.opt.use_fp16_storage = False - encoder_param = ( - d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" - ) - encoder_model = ( - d + "/encoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" - ) + encoder_param = args.encoder_param_filename + encoder_model = args.encoder_bin_filename encoder_net.load_param(encoder_param) encoder_net.load_model(encoder_model) self.encoder_net = encoder_net - def init_decoder(self, d): - decoder_param = ( - d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" - ) - decoder_model = ( - d + "/decoder_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" - ) + def init_decoder(self, args): + decoder_param = args.decoder_param_filename + decoder_model = args.decoder_bin_filename decoder_net = ncnn.Net() decoder_net.opt.use_packing_layout = False @@ -64,11 +112,9 @@ def init_decoder(self, d): self.decoder_net = decoder_net - def init_joiner(self, d): - joiner_param = ( - d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.param" - ) - joiner_model = d + "/joiner_jit_trace-iter-468000-avg-16-pnnx.ncnn.bin" + def init_joiner(self, args): + joiner_param = args.joiner_param_filename + joiner_model = args.joiner_bin_filename joiner_net = ncnn.Net() joiner_net.opt.use_packing_layout = False joiner_net.load_param(joiner_param) @@ -78,7 +124,7 @@ def init_joiner(self, d): def run_encoder(self, x, states): with self.encoder_net.create_extractor() as ex: - ex.set_num_threads(10) + # ex.set_num_threads(10) ex.input("in0", ncnn.Mat(x.numpy()).clone()) x_lens = torch.tensor([x.size(0)], dtype=torch.float32) ex.input("in1", ncnn.Mat(x_lens.numpy()).clone()) @@ -109,7 +155,7 @@ def run_decoder(self, decoder_input): assert decoder_input.dtype == torch.int32 with self.decoder_net.create_extractor() as ex: - ex.set_num_threads(10) + # ex.set_num_threads(10) ex.input("in0", ncnn.Mat(decoder_input.numpy()).clone()) ret, ncnn_out0 = ex.extract("out0") assert ret == 0, ret @@ -118,7 +164,7 @@ def run_decoder(self, decoder_input): def run_joiner(self, encoder_out, decoder_out): with self.joiner_net.create_extractor() as ex: - ex.set_num_threads(10) + # ex.set_num_threads(10) ex.input("in0", ncnn.Mat(encoder_out.numpy()).clone()) ex.input("in1", ncnn.Mat(decoder_out.numpy()).clone()) ret, ncnn_out0 = ex.extract("out0") @@ -204,28 +250,27 @@ def greedy_search( def main(): - model = Model("./lstm_transducer_stateless2/exp") + args = get_args() + logging.info(vars(args)) + + model = Model(args) sp = spm.SentencePieceProcessor() - sp.load("./data/lang_bpe_500/bpe.model") + sp.load(args.bpe_model_filename) - sound_files = [ - "./test_wavs/1089-134686-0001.wav", - # "./test_wavs/1221-135766-0001.wav", - # "./test_wavs/1221-135766-0002.wav", - ] - assert len(sound_files) == 1, "ncnn only support batch_size==1" + sound_file = args.sound_filename sample_rate = 16000 logging.info("Constructing Fbank computer") online_fbank = create_streaming_feature_extractor() - logging.info(f"Reading sound files: {sound_files}") + logging.info(f"Reading sound files: {sound_file}") wave_samples = read_sound_files( - filenames=sound_files, + filenames=[sound_file], expected_sample_rate=sample_rate, )[0] + logging.info(wave_samples.shape) num_encoder_layers = 12 batch_size = 1 @@ -260,7 +305,6 @@ def main(): sampling_rate=sample_rate, waveform=samples, ) - print(num_processed_frames) while online_fbank.num_frames_ready - num_processed_frames >= segment: frames = [] for i in range(segment): @@ -295,8 +339,8 @@ def main(): context_size = 2 - print(sound_files[0]) - print(sp.decode(hyp[context_size:])) + logging.info(sound_file) + logging.info(sp.decode(hyp[context_size:])) if __name__ == "__main__": From 783efa763d14c2b9c2c7115d29a53168cabf85a7 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Tue, 20 Sep 2022 17:26:01 +0800 Subject: [PATCH 4/4] Add doc --- ...-lstm-transducer-stateless2-2022-09-03.yml | 7 +- ...speech-lstm-transducer-tensorboard-log.png | Bin 0 -> 423059 bytes docs/source/recipes/librispeech/index.rst | 1 + .../lstm_pruned_stateless_transducer.rst | 625 ++++++++++++++++++ .../ASR/lstm_transducer_stateless/lstm.py | 2 +- .../ASR/lstm_transducer_stateless2/export.py | 3 +- 6 files changed, 632 insertions(+), 6 deletions(-) create mode 100644 docs/source/recipes/librispeech/images/librispeech-lstm-transducer-tensorboard-log.png create mode 100644 docs/source/recipes/librispeech/lstm_pruned_stateless_transducer.rst diff --git a/.github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml b/.github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml index 5291d23273..19d6066826 100755 --- a/.github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml +++ b/.github/scripts/run-librispeech-lstm-transducer-stateless2-2022-09-03.yml @@ -56,9 +56,9 @@ log "Test exporting to pnnx format" --use-averaged-model 0 \ --pnnx 1 -./ncnn/tools/pnnx/build/src/pnnx $repo/exp/encoder_jit_trace.pt -./ncnn/tools/pnnx/build/src/pnnx $repo/exp/decoder_jit_trace.pt -./ncnn/tools/pnnx/build/src/pnnx $repo/exp/joiner_jit_trace.pt +./ncnn/tools/pnnx/build/src/pnnx $repo/exp/encoder_jit_trace-pnnx.pt +./ncnn/tools/pnnx/build/src/pnnx $repo/exp/decoder_jit_trace-pnnx.pt +./ncnn/tools/pnnx/build/src/pnnx $repo/exp/joiner_jit_trace-pnnx.pt ./lstm_transducer_stateless2/ncnn-decode.py \ --bpe-model-filename $repo/data/lang_bpe_500/bpe.model \ @@ -151,6 +151,7 @@ if [[ x"${GITHUB_EVENT_NAME}" == x"schedule" || x"${GITHUB_EVENT_LABEL_NAME}" == --decoding-method $method \ --epoch 999 \ --avg 1 \ + --use-averaged-model 0 \ --max-duration $max_duration \ --exp-dir lstm_transducer_stateless2/exp done diff --git a/docs/source/recipes/librispeech/images/librispeech-lstm-transducer-tensorboard-log.png b/docs/source/recipes/librispeech/images/librispeech-lstm-transducer-tensorboard-log.png new file mode 100644 index 0000000000000000000000000000000000000000..cc475a45f7b7b25948b1235034b924c67bf0a73b GIT binary patch literal 423059 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�cT+L$lZ;SXl4+PXAZ2Z@BB=laE~)@WK(46J!P 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%0ABR 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