From fd32b990ac0c5bd9c323a097b7a01569a5252faf Mon Sep 17 00:00:00 2001 From: Dabi Ahn Date: Mon, 2 Nov 2020 21:17:00 +0800 Subject: [PATCH] [CUDA-Optimized/FastSpeech] - support for PyTorch 1.7 and TensorRT 7.2 - limit sample audio file length --- CUDA-Optimized/FastSpeech/.gitmodules | 6 - CUDA-Optimized/FastSpeech/Dockerfile | 11 +- CUDA-Optimized/FastSpeech/README.md | 58 ++-- .../fastspeech/dataset/ljspeech_dataset.py | 13 +- .../FastSpeech/fastspeech/hparams/base.yaml | 2 +- .../FastSpeech/fastspeech/hparams/trt.yaml | 2 +- .../inferencer/waveglow_inferencer.py | 48 ++- .../fastspeech/perf_infer_ljspeech.py | 202 ++++++++++++ .../FastSpeech/fastspeech/trainer/trainer.py | 4 + .../trt/fastspeech_trt_inferencer.py | 13 +- .../trt/plugins/add_pos_enc/AddPosEncPlugin.d | 124 ++++---- .../trt/plugins/add_pos_enc/AddPosEncPlugin.o | Bin 114216 -> 102296 bytes .../plugins/add_pos_enc/AddPosEncPlugin.so | Bin 98184 -> 90176 bytes .../trt/plugins/add_pos_enc/Makefile | 10 +- .../fastspeech/trt/plugins/repeat/Makefile | 11 +- .../trt/plugins/repeat/RepeatPlugin.d | 238 ++++++++------ .../trt/plugins/repeat/RepeatPlugin.o | Bin 76808 -> 86696 bytes .../trt/plugins/repeat/RepeatPlugin.so | Bin 69088 -> 74264 bytes ...twenty one, RFC eight twenty two, RFC.wav} | Bin ... four two five four four four seven f.wav} | Bin ...twenty one, RFC eight twenty two, RFC.wav} | Bin ... four two five four four four seven f.wav} | Bin .../fastspeech/trt/trt_inferencer.py | 2 +- .../FastSpeech/fastspeech/utils/time.py | 14 +- CUDA-Optimized/FastSpeech/generate.py | 3 +- CUDA-Optimized/FastSpeech/requirements.txt | 4 +- ...twenty one, RFC eight twenty two, RFC.wav} | Bin ... four two five four four four seven f.wav} | Bin .../FastSpeech/scripts/docker/build.sh | 3 +- .../FastSpeech/scripts/docker/interactive.sh | 3 +- CUDA-Optimized/FastSpeech/scripts/install.sh | 6 +- .../scripts/waveglow/export_onnx2trt.py | 107 ------- CUDA-Optimized/FastSpeech/setup.py | 2 +- .../FastSpeech/waveglow/__init__.py | 23 ++ .../FastSpeech/waveglow/arg_parser.py | 65 ++++ .../FastSpeech/waveglow/data_function.py | 88 ++++++ .../FastSpeech/waveglow/denoiser.py | 72 +++++ .../FastSpeech/waveglow/loss_function.py | 48 +++ CUDA-Optimized/FastSpeech/waveglow/model.py | 292 ++++++++++++++++++ 39 files changed, 1155 insertions(+), 319 deletions(-) delete mode 100644 CUDA-Optimized/FastSpeech/.gitmodules create mode 100644 CUDA-Optimized/FastSpeech/fastspeech/perf_infer_ljspeech.py rename CUDA-Optimized/FastSpeech/fastspeech/trt/samples/{To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav => To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav} (100%) rename CUDA-Optimized/FastSpeech/fastspeech/trt/samples/{You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav => You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav} (100%) rename CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/{To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav => To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav} (100%) rename CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/{You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav => You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav} (100%) rename CUDA-Optimized/FastSpeech/samples/{To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav => To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav} (100%) rename CUDA-Optimized/FastSpeech/samples/{You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav => You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav} (100%) delete mode 100644 CUDA-Optimized/FastSpeech/scripts/waveglow/export_onnx2trt.py create mode 100644 CUDA-Optimized/FastSpeech/waveglow/__init__.py create mode 100644 CUDA-Optimized/FastSpeech/waveglow/arg_parser.py create mode 100644 CUDA-Optimized/FastSpeech/waveglow/data_function.py create mode 100644 CUDA-Optimized/FastSpeech/waveglow/denoiser.py create mode 100644 CUDA-Optimized/FastSpeech/waveglow/loss_function.py create mode 100644 CUDA-Optimized/FastSpeech/waveglow/model.py diff --git a/CUDA-Optimized/FastSpeech/.gitmodules b/CUDA-Optimized/FastSpeech/.gitmodules deleted file mode 100644 index 404a7af7..00000000 --- a/CUDA-Optimized/FastSpeech/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "waveglow"] - path = waveglow - url = https://github.com/NVIDIA/waveglow.git -[submodule "cub"] - path = cub - url = https://github.com/NVlabs/cub.git diff --git a/CUDA-Optimized/FastSpeech/Dockerfile b/CUDA-Optimized/FastSpeech/Dockerfile index f37fe00f..b62691d6 100644 --- a/CUDA-Optimized/FastSpeech/Dockerfile +++ b/CUDA-Optimized/FastSpeech/Dockerfile @@ -1,7 +1,14 @@ -ARG FROM_IMAGE_NAME=nvcr.io/nvidia/pytorch:20.03-py3 +ARG FROM_IMAGE_NAME=nvcr.io/nvidia/pytorch:20.10-py3 FROM ${FROM_IMAGE_NAME} +# ARG UNAME +# ARG UID +# ARG GID +# RUN groupadd -g $GID -o $UNAME +# RUN useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME +# USER $UNAME + ADD . /workspace/fastspeech WORKDIR /workspace/fastspeech -RUN sh ./scripts/install.sh \ No newline at end of file +RUN sh ./scripts/install.sh diff --git a/CUDA-Optimized/FastSpeech/README.md b/CUDA-Optimized/FastSpeech/README.md index a5d4e6ef..e79fb89f 100644 --- a/CUDA-Optimized/FastSpeech/README.md +++ b/CUDA-Optimized/FastSpeech/README.md @@ -95,9 +95,9 @@ and encapsulates some dependencies. Aside from these dependencies, ensure you have the following components: * [NVIDIA Docker](https://github.com/NVIDIA/nvidia-docker) -* [PyTorch 20.03-py3+ NGC container](https://ngc.nvidia.com/registry/nvidia-pytorch) +* [PyTorch 20.10-py3 NGC container](https://ngc.nvidia.com/registry/nvidia-pytorch) or newer -* [NVIDIA Volta](https://www.nvidia.com/en-us/data-center/volta-gpu-architecture/) or [Turing](https://www.nvidia.com/en-us/geforce/turing/) based GPU +* [NVIDIA Volta](https://www.nvidia.com/en-us/data-center/volta-gpu-architecture/), [Turing](https://www.nvidia.com/en-us/geforce/turing/) For more information about how to get started with NGC containers, see the following sections from the NVIDIA GPU Cloud Documentation and the Deep Learning @@ -120,11 +120,6 @@ To train your model using mixed precision with Tensor Cores or using FP32, perfo git clone https://github.com/NVIDIA/DeepLearningExamples.git cd DeepLearningExamples/CUDA-Optimized/FastSpeech ``` - and pull submodules. - ``` - git submodule init - git submodule update - ``` 2. Download and preprocess the dataset. Data is downloaded to the ./LJSpeech-1.1 directory (on the host). The ./LJSpeech-1.1 directory is mounted to the /workspace/fastspeech/LJSpeech-1.1 location in the NGC container. ``` @@ -148,7 +143,7 @@ To train your model using mixed precision with Tensor Cores or using FP32, perfo The preprocessed mel-spectrograms are stored in the ./mels_ljspeech1.1 directory. -Next, calculate alignments on the LJSpeech dataset using a pre-trained [NVIDIA Tacotron2 checkpoint](https://drive.google.com/file/d/1c5ZTuT7J08wLUoVZ2KkUs_VdZuJ86ZqA/view). The output directory is specified with `--aligns_path`. + Next, preprocess the alignments on LJSpeech dataset with feed-forwards to the teacher model. Download the Nvidia [pretrained Tacotron2 checkpoint](https://drive.google.com/file/d/1c5ZTuT7J08wLUoVZ2KkUs_VdZuJ86ZqA/view) to get a pretrained teacher model. And set --tacotron2_path to the Tacotron2 checkpoint file path and the result alignments are stored in --aligns_path. ``` python fastspeech/align_tacotron2.py --dataset_path="./LJSpeech-1.1" --tacotron2_path="tacotron2_statedict.pt" --aligns_path="aligns_ljspeech1.1" ``` @@ -169,23 +164,23 @@ Next, calculate alignments on the LJSpeech dataset using a pre-trained [NVIDIA T python fastspeech/train.py --dataset_path="./LJSpeech-1.1" --mels_path="./mels_ljspeech1.1" --aligns_path="./aligns_ljspeech1.1" --log_path="./logs" --checkpoint_path="./checkpoints" --use_amp ``` -6. Start generation. To generate waveforms with WaveGlow Vocoder, Get [pretrained WaveGlow model](https://drive.google.com/open?id=1rpK8CzAAirq9sWZhe9nlfvxMF1dRgFbF) in the home directory, for example, ./waveglow_256channels.pt. +6. Start generation. To generate waveforms with WaveGlow Vocoder, Get [pretrained WaveGlow model](https://ngc.nvidia.com/catalog/models/nvidia:waveglow_ckpt_amp_256/files?version=19.10.0) from NGC into the home directory, for example, ./nvidia_waveglow256pyt_fp16. After you have trained the FastSpeech model, you can perform generation using the checkpoint stored in ./checkpoints. Then run: ``` - python generate.py --waveglow_path="./waveglow_256channels.pt" --checkpoint_path="./checkpoints" --text="./test_sentences.txt" + python generate.py --waveglow_path="./nvidia_waveglow256pyt_fp16" --checkpoint_path="./checkpoints" --text="./test_sentences.txt" ``` The script loads automatically the latest checkpoint (if any exists), or you can pass a checkpoint file through --ckpt_file. And it loads input texts in ./test_sentences.txt and stores the result in ./results directory. You can also set the result directory path with --results_path. You can also run with a sample text: ``` - python generate.py --waveglow_path="./waveglow_256channels.pt" --checkpoint_path="./checkpoints" --text="The more you buy, the more you save." + python generate.py --waveglow_path="./nvidia_waveglow256pyt_fp16" --checkpoint_path="./checkpoints" --text="The more you buy, the more you save." ``` -7. Accelerate generation(inferencing of FastSpeech and WaveGlow) with TensorRT. Set parameters config file with --hparam=trt.yaml to enable TensorRT inference mode. To prepare for running WaveGlow on TensorRT, first extract a TensorRT engine file via [DeepLearningExamples/PyTorch/SpeechSynthesis/Tacotron2/trt](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/SpeechSynthesis/Tacotron2/trt) and copy this in the home directory, for example, ./waveglow.fp16.trt. Then run with --waveglow_engine_path: +7. Accelerate generation(inferencing of FastSpeech and WaveGlow) with TensorRT. Set parameters config file with --hparam=trt.yaml to enable TensorRT inference mode. To prepare for running WaveGlow on TensorRT, first get an ONNX file via [DeepLearningExamples/PyTorch/SpeechSynthesis/Tacotron2/tensorrt](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/SpeechSynthesis/Tacotron2/tensorrt), convert it to an TensorRT engine using scripts/waveglow/convert_onnx2trt.py, and copy this in the home directory, for example, ./waveglow.fp16.trt. Then run with --waveglow_engine_path: ``` - python generate.py --hparam=trt.yaml --waveglow_path="./waveglow_256channels.pt" --checkpoint_path="./checkpoints" --text="./test_sentences.txt" --waveglow_engine_path="waveglow.fp16.trt" + python generate.py --hparam=trt.yaml --waveglow_path="./nvidia_waveglow256pyt_fp16" --checkpoint_path="./checkpoints" --text="./test_sentences.txt" --waveglow_engine_path="waveglow.fp16.trt" ``` ## Advanced @@ -293,33 +288,29 @@ For more details, refer to [accelerating inference with TensorRT](fastspeech/trt #### Generation -To generate waveforms with WaveGlow Vocoder, 1) Make sure to pull [Nvidia WaveGlow](https://github.com/NVIDIA/waveglow) through git submodule, 2) get [pretrained WaveGlow model](https://drive.google.com/open?id=1rpK8CzAAirq9sWZhe9nlfvxMF1dRgFbF) in the home directory, for example, ./waveglow_256channels.pt. - ``` - git submodule init - git submodule update - ``` +To generate waveforms with WaveGlow Vocoder, get [pretrained WaveGlow model](https://ngc.nvidia.com/catalog/models/nvidia:waveglow_ckpt_amp_256/files?version=19.10.0) from NGC into the home directory, for example, ./nvidia_waveglow256pyt_fp16. Run generate.py with: * --text - an input text or the text file path. * --results_path - result waveforms directory path. (default=./results). * --ckpt_file - checkpoint file path. (default checkpoint file is the latest file in --checkpoint_path) ``` - python generate.py --waveglow_path="./waveglow_256channels.pt" --text="The more you buy, the more you save." + python generate.py --waveglow_path="./nvidia_waveglow256pyt_fp16" --text="The more you buy, the more you save." ``` or ``` - python generate.py --waveglow_path="./waveglow_256channels.pt" --text=test_sentences.txt + python generate.py --waveglow_path="./nvidia_waveglow256pyt_fp16" --text=test_sentences.txt ``` -Sample result waveforms are [here](https://gitlab-master.nvidia.com/dahn/fastspeech/tree/master/samples). +Sample result waveforms are [here](samples). -To generate waveforms with the whole pipeline of FastSpeech and WaveGlow with TensorRT, extract a WaveGlow TRT engine file through https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/SpeechSynthesis/Tacotron2/trt and run generate.py with --hparam=trt.yaml and --waveglow_engine_path. +To generate waveforms with the whole pipeline of FastSpeech and WaveGlow with TensorRT, extract a WaveGlow TRT engine file through https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/SpeechSynthesis/Tacotron2/tensorrt and run generate.py with --hparam=trt.yaml and --waveglow_engine_path. ``` -python generate.py --hparam=trt.yaml --waveglow_path="./waveglow_256channels.pt" --waveglow_engine_path="waveglow.fp16.trt" --text="The more you buy, the more you save." +python generate.py --hparam=trt.yaml --waveglow_path="./nvidia_waveglow256pyt_fp16" --waveglow_engine_path="waveglow.fp16.trt" --text="The more you buy, the more you save." ``` -Sample result waveforms are [FP32](https://gitlab-master.nvidia.com/dahn/fastspeech/-/tree/master/fastspeech/trt/samples) and [FP16](https://gitlab-master.nvidia.com/dahn/fastspeech/-/tree/master/fastspeech/trt/samples_fp16). +Sample result waveforms are [FP32](fastspeech/trt/samples) and [FP16](fastspeech/trt/samples_fp16). ## Performance @@ -391,7 +382,17 @@ The following sections provide details on how we achieved our performance and ac #### Training performance results -Our results were obtained by running the script in [training performance benchmark](#training-performance-benchmark) in the PyTorch-20.03-py3 NGC container on NVIDIA DGX-1 with 8x V100 16G GPUs. Performance numbers (in number of mels per second) were averaged over an entire training epoch. +Our results were obtained by running the script in [training performance benchmark](#training-performance-benchmark) on NVIDIA DGX-1 with 8x V100 16G GPUs. Performance numbers (in number of mels per second) were averaged over an entire training epoch. + + + +##### Training performance: NVIDIA DGX-1 (8x V100 16GB) | GPUs | Batch size / GPU | Throughput(mels/s) - FP32 | Throughput(mels/s) - mixed precision | Throughput speedup (FP32 - mixed precision) | Multi-GPU Weak scaling - FP32 | Multi-GPU Weak scaling - mixed precision |---|----|--------|--------|------|-----|------| @@ -401,7 +402,7 @@ Our results were obtained by running the script in [training performance benchma #### Inference performance results -Our results were obtained by running the script in [inference performance benchmark](#inference-performance-benchmark) in the PyTorch-20.03-py3 NGC container on NVIDIA DGX-1 with 1x V100 16GB GPU and a NVIDIA T4. The following tables show inference statistics for the FastSpeech and WaveGlow text-to-speech system on PyTorch and comparisons by framework with batch size 1 in FP16, gathered from 1000 inference runs. Latency is measured from the start of FastSpeech inference to the end of WaveGlow inference. The tables include average latency, latency standard deviation, and latency confidence intervals. Throughput is measured as the number of generated audio samples per second. RTF is the real-time factor which tells how many seconds of speech are generated in 1 second of compute. The used WaveGlow model is a 256-channel model. The numbers reported below were taken with a moderate length of 128 characters. +Our results were obtained by running the script in [inference performance benchmark](#inference-performance-benchmark) on NVIDIA DGX-1 with 1x V100 16GB GPU and a NVIDIA T4. The following tables show inference statistics for the FastSpeech and WaveGlow text-to-speech system on PyTorch and comparisons by framework with batch size 1 in FP16, gathered from 1000 inference runs. Latency is measured from the start of FastSpeech inference to the end of WaveGlow inference. The tables include average latency, latency standard deviation, and latency confidence intervals. Throughput is measured as the number of generated audio samples per second. RTF is the real-time factor which tells how many seconds of speech are generated in 1 second of compute. The used WaveGlow model is a 256-channel model. The numbers reported below were taken with a moderate length of 128 characters. ##### Inference performance: NVIDIA DGX-1 (1x V100 16GB) @@ -442,9 +443,12 @@ Our results were obtained by running the script in [inference performance benchm ## Release notes ### Changelog +Oct 2020 +- PyTorch 1.7, TensorRT 7.2 support + July 2020 - Initial release ### Known issues -There are no known issues in this release. +There are no known issues in this release. \ No newline at end of file diff --git a/CUDA-Optimized/FastSpeech/fastspeech/dataset/ljspeech_dataset.py b/CUDA-Optimized/FastSpeech/fastspeech/dataset/ljspeech_dataset.py index 97ef6b6e..ae51f193 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/dataset/ljspeech_dataset.py +++ b/CUDA-Optimized/FastSpeech/fastspeech/dataset/ljspeech_dataset.py @@ -24,11 +24,15 @@ import csv +import pprint + import librosa from torch.utils.data import Dataset import pandas as pd from fastspeech.text_norm import text_to_sequence from fastspeech import audio +from fastspeech.utils.logging import tprint + import os import pathlib @@ -38,6 +42,8 @@ from tqdm import tqdm from fastspeech import hparam as hp +pp = pprint.PrettyPrinter(indent=4, width=1000) + class LJSpeechDataset(Dataset): def __init__(self, root_path, meta_file="metadata.csv", @@ -130,7 +136,7 @@ class LJSpeechDataset(Dataset): return data -def preprocess_mel(hparam="base.yaml"): +def preprocess_mel(hparam="base.yaml", **kwargs): """The script for preprocessing mel-spectrograms from the dataset. By default, this script assumes to load parameters in the default config file, fastspeech/hparams/base.yaml. @@ -147,8 +153,9 @@ def preprocess_mel(hparam="base.yaml"): hparam (str, optional): Path to default config file. Defaults to "base.yaml". """ - hp.set_hparam(hparam) - + hp.set_hparam(hparam, kwargs) + tprint("Hparams:\n{}".format(pp.pformat(hp))) + pathlib.Path(hp.mels_path).mkdir(parents=True, exist_ok=True) dataset = LJSpeechDataset(hp.dataset_path, mels_path=None) diff --git a/CUDA-Optimized/FastSpeech/fastspeech/hparams/base.yaml b/CUDA-Optimized/FastSpeech/fastspeech/hparams/base.yaml index 4a0ab8bf..f3a1fe12 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/hparams/base.yaml +++ b/CUDA-Optimized/FastSpeech/fastspeech/hparams/base.yaml @@ -1,7 +1,7 @@ # Path dataset_path: "/workspace/fastspeech/LJSpeech-1.1" tacotron2_path: "/workspace/fastspeech/tacotron2_statedict.pt" -waveglow_path: "/workspace/fastspeech/waveglow_256channels.pt" +waveglow_path: "/workspace/fastspeech/nvidia_waveglow256pyt_fp16" mels_path: "/workspace/fastspeech/mels_ljspeech1.1" aligns_path: "/workspace/fastspeech/aligns_ljspeech1.1" log_path: "/workspace/fastspeech/logs" diff --git a/CUDA-Optimized/FastSpeech/fastspeech/hparams/trt.yaml b/CUDA-Optimized/FastSpeech/fastspeech/hparams/trt.yaml index e2c919c2..eb26b59f 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/hparams/trt.yaml +++ b/CUDA-Optimized/FastSpeech/fastspeech/hparams/trt.yaml @@ -3,7 +3,7 @@ parent_yaml: 'infer.yaml' # Inference batch_size: 1 # Batch size. use_trt: True # Usage of TensorRT. Must be True to enable TensorRT. -use_fp16: True # Usage of FP16. Set to True to enable half precision for the engine. +use_fp16: True # Usage of FP16. Set to True to enable half precision for the engine. # TRT trt_file_path: "/workspace/fastspeech/fastspeech.fp16.b1.trt" # Built TensorRT engine file path. diff --git a/CUDA-Optimized/FastSpeech/fastspeech/inferencer/waveglow_inferencer.py b/CUDA-Optimized/FastSpeech/fastspeech/inferencer/waveglow_inferencer.py index 4b85ea86..2f5a1c33 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/inferencer/waveglow_inferencer.py +++ b/CUDA-Optimized/FastSpeech/fastspeech/inferencer/waveglow_inferencer.py @@ -30,6 +30,21 @@ from fastspeech.utils.logging import tprint from fastspeech.utils.pytorch import to_cpu_numpy, to_device_async from fastspeech.inferencer.denoiser import Denoiser +from waveglow.model import WaveGlow +import argparse + +def unwrap_distributed(state_dict): + """ + Unwraps model from DistributedDataParallel. + DDP wraps model in additional "module.", it needs to be removed for single + GPU inference. + :param state_dict: model's state dict + """ + new_state_dict = {} + for key, value in state_dict.items(): + new_key = key.replace('module.', '') + new_state_dict[new_key] = value + return new_state_dict class WaveGlowInferencer(object): @@ -40,11 +55,36 @@ class WaveGlowInferencer(object): self.use_denoiser = use_denoiser # model - sys.path.append('waveglow') - self.model = torch.load(self.ckpt_file, map_location=self.device)['model'] - self.model = self.model.remove_weightnorm(self.model) - self.model.eval() + # sys.path.append('waveglow') + + from waveglow.arg_parser import parse_waveglow_args + parser = parser = argparse.ArgumentParser() + model_parser= parse_waveglow_args(parser) + args, _ = model_parser.parse_known_args() + model_config = dict( + n_mel_channels=args.n_mel_channels, + n_flows=args.flows, + n_group=args.groups, + n_early_every=args.early_every, + n_early_size=args.early_size, + WN_config=dict( + n_layers=args.wn_layers, + kernel_size=args.wn_kernel_size, + n_channels=args.wn_channels + ) + ) + self.model = WaveGlow(**model_config) + + state_dict = torch.load(self.ckpt_file, map_location=self.device)['state_dict'] + state_dict = unwrap_distributed(state_dict) + self.model.load_state_dict(state_dict) + self.model = to_device_async(self.model, self.device) + + self.model = self.model.remove_weightnorm(self.model) + + self.model.eval() + if self.use_fp16: self.model = self.model.half() self.model = self.model diff --git a/CUDA-Optimized/FastSpeech/fastspeech/perf_infer_ljspeech.py b/CUDA-Optimized/FastSpeech/fastspeech/perf_infer_ljspeech.py new file mode 100644 index 00000000..70766902 --- /dev/null +++ b/CUDA-Optimized/FastSpeech/fastspeech/perf_infer_ljspeech.py @@ -0,0 +1,202 @@ +# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the NVIDIA CORPORATION nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import pprint +import sys +import time + +import fire +import torch +from tqdm import tqdm + +from fastspeech import DEFAULT_DEVICE +from fastspeech import hparam as hp +from fastspeech.data_load import PadDataLoader +from fastspeech.dataset.ljspeech_dataset import LJSpeechDataset +from fastspeech.model.fastspeech import Fastspeech +from fastspeech.utils.logging import tprint +from fastspeech.utils.pytorch import to_cpu_numpy, to_device_async +from fastspeech.infer import get_inferencer +from fastspeech.inferencer.waveglow_inferencer import WaveGlowInferencer +from contextlib import ExitStack +import numpy as np + +try: + from apex import amp +except ImportError: + ImportError('Required to install apex.') + +pp = pprint.PrettyPrinter(indent=4, width=1000) + +WARMUP_ITERS = 3 + + +def perf_inference(hparam="infer.yaml", + with_vocoder=False, + n_iters=None, + device=DEFAULT_DEVICE, + **kwargs): + """The script for estimating inference performance. + + By default, this script assumes to load parameters in the default config file, fastspeech/hparams/infer.yaml. + + Besides the flags, you can also set parameters in the config file via the command-line. For examples, + --dataset_path=DATASET_PATH + Path to dataset directory. + --checkpoint_path=CHECKPOINT_PATH + Path to checkpoint directory. The latest checkpoint will be loaded. + --batch_size=BATCH_SIZE + Batch size to use. Defaults to 1. + + Refer to fastspeech/hparams/infer.yaml to see more parameters. + + Args: + hparam (str, optional): Path to default config file. Defaults to "infer.yaml". + with_vocoder (bool, optional): Whether or not to estimate with a vocoder. Defaults to False. + n_iters (int, optional): Number of batches to estimate. Defaults to None (an epoch). + device (str, optional): Device to use. Defaults to "cuda" if avaiable, or "cpu". + + """ + + hp.set_hparam(hparam, kwargs) + tprint("Hparams:\n{}".format(pp.pformat(hp))) + tprint("Device count: {}".format(torch.cuda.device_count())) + + model = Fastspeech( + max_seq_len=hp.max_seq_len, + d_model=hp.d_model, + phoneme_side_n_layer=hp.phoneme_side_n_layer, + phoneme_side_head=hp.phoneme_side_head, + phoneme_side_conv1d_filter_size=hp.phoneme_side_conv1d_filter_size, + phoneme_side_output_size=hp.phoneme_side_output_size, + mel_side_n_layer=hp.mel_side_n_layer, + mel_side_head=hp.mel_side_head, + mel_side_conv1d_filter_size=hp.mel_side_conv1d_filter_size, + mel_side_output_size=hp.mel_side_output_size, + duration_predictor_filter_size=hp.duration_predictor_filter_size, + duration_predictor_kernel_size=hp.duration_predictor_kernel_size, + fft_conv1d_kernel=hp.fft_conv1d_kernel, + fft_conv1d_padding=hp.fft_conv1d_padding, + dropout=hp.dropout, + n_mels=hp.num_mels, + fused_layernorm=hp.fused_layernorm + ) + + dataset = LJSpeechDataset(root_path=hp.dataset_path, + sr=hp.sr, + n_fft=hp.n_fft, + win_len=hp.win_len, + hop_len=hp.hop_len, + n_mels=hp.num_mels, + mel_fmin=hp.mel_fmin, + mel_fmax=hp.mel_fmax, + exclude_mels=True, + sort_by_length=True if hp.use_trt and hp.trt_multi_engine else False + ) + tprint("Dataset size: {}".format(len(dataset))) + + data_loader = PadDataLoader(dataset, + batch_size=hp.batch_size, + num_workers=hp.n_workers, + shuffle=False if hp.use_trt and hp.trt_multi_engine else True, + drop_last=True, + ) + + fs_inferencer = get_inferencer(model, data_loader, device) + + if with_vocoder: + if hp.use_trt: + from fastspeech.trt.waveglow_trt_inferencer import WaveGlowTRTInferencer + wb_inferencer = WaveGlowTRTInferencer(ckpt_file=hp.waveglow_path, engine_file=hp.waveglow_engine_path, use_fp16=hp.use_fp16) + else: + wb_inferencer = WaveGlowInferencer(ckpt_file=hp.waveglow_path, device=device, use_fp16=hp.use_fp16) + + with fs_inferencer, wb_inferencer if with_vocoder else ExitStack(): + + tprint("Perf started. Batch size={}.".format(hp.batch_size)) + + latencies = [] + throughputs = [] + + n_iters = min(n_iters, len(data_loader)) if n_iters else len(data_loader) + assert(n_iters > WARMUP_ITERS) + for i in tqdm(range(n_iters)): + start = time.time() + + outputs = fs_inferencer.infer() + + mels = outputs['mel'] + mel_masks = outputs['mel_mask'] + assert(mels.is_cuda) + + if with_vocoder: + # remove padding + max_len = mel_masks.sum(axis=1).max() + mels = mels[..., :max_len] + mel_masks = mel_masks[..., :max_len] + + with torch.no_grad(): + wavs = wb_inferencer.infer(mels) + wavs = to_cpu_numpy(wavs) + else: + # include time for DtoH copy + to_cpu_numpy(mels) + to_cpu_numpy(mel_masks) + + end = time.time() + + if i > WARMUP_ITERS-1: + time_elapsed = end - start + generated_samples = len(mel_masks.nonzero()) * hp.hop_len + throughput = generated_samples / time_elapsed + + latencies.append(time_elapsed) + throughputs.append(throughput) + + latencies.sort() + + avg_latency = np.mean(latencies) + std_latency = np.std(latencies) + latency_90 = max(latencies[:int(len(latencies)*0.90)]) if n_iters > 1 else 0 + latency_95 = max(latencies[:int(len(latencies)*0.95)]) if n_iters > 1 else 0 + latency_99 = max(latencies[:int(len(latencies)*0.99)]) if n_iters > 1 else 0 + + throughput = np.mean(throughputs) + rtf = throughput / (hp.sr * hp.batch_size) + + tprint("Batch size\tPrecision\tAvg Latency(s)\tStd Latency(s)\tLatency 90%(s)\tLatency 95%(s)\tLatency 99%(s)\tThroughput(samples/s)\tAvg RTF\n\ + {}\t{}\t{:.4f}\t{:.4f}\t{:.4f}\t{:.4f}\t{:.4f}\t{}\t{:.2f}".format( + hp.batch_size, + "FP16" if hp.use_fp16 else "FP32", + avg_latency, + std_latency, + latency_90, + latency_95, + latency_99, + int(throughput), + rtf)) + + +if __name__ == '__main__': + fire.Fire(perf_inference) diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trainer/trainer.py b/CUDA-Optimized/FastSpeech/fastspeech/trainer/trainer.py index c48bc8c4..e9d12ca9 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/trainer/trainer.py +++ b/CUDA-Optimized/FastSpeech/fastspeech/trainer/trainer.py @@ -41,6 +41,7 @@ from fastspeech.utils.fp16 import cast_model_to_half import torch.cuda.profiler as profiler from fastspeech.utils.logging import tprint +from fastspeech.utils.time import TimeElapsed plt.switch_backend('Agg') @@ -136,12 +137,15 @@ class Trainer(object): if self.nvprof_iter_start and i == self.nvprof_iter_start: profiler.start() + timer = TimeElapsed(name="Training time during profiling", format=":.6f") + timer.start() with Nvtx("step #{}".format(self.step)): loss, meta = self.do_step() if self.nvprof_iter_end and i == self.nvprof_iter_end: profiler.stop() + timer.end() if self.lr_scheduler: for param_group in self.optimizer.param_groups: diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/fastspeech_trt_inferencer.py b/CUDA-Optimized/FastSpeech/fastspeech/trt/fastspeech_trt_inferencer.py index 17f7e953..0f4db331 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/trt/fastspeech_trt_inferencer.py +++ b/CUDA-Optimized/FastSpeech/fastspeech/trt/fastspeech_trt_inferencer.py @@ -61,27 +61,30 @@ class FastSpeechTRTInferencer(TRTInferencer): super(FastSpeechTRTInferencer, self).__init__(model_name, model, data_loader, ckpt_path, ckpt_file, trt_max_ws_size, trt_file_path, trt_force_build, use_fp16) def build_engine(self): + engine = None if self.trt_file_path and os.path.isfile(self.trt_file_path) and not self.trt_force_build: with open(self.trt_file_path, 'rb') as f: engine_str = f.read() with trt.Runtime(TRT_LOGGER) as runtime: - self.engine = runtime.deserialize_cuda_engine(engine_str) + engine = runtime.deserialize_cuda_engine(engine_str) - if self.engine: + if engine: tprint('TRT Engine Loaded from {} successfully.'.format(self.trt_file_path)) - return + return engine else: tprint('Loading TRT Engine from {} failed.'.format(self.trt_file_path)) tprint('Building a TRT Engine..') - self.engine = self.do_build_engine() + engine = self.do_build_engine() tprint('TRT Engine Built.') if self.trt_file_path: with open(self.trt_file_path, 'wb') as f: - f.write(self.engine.serialize()) + f.write(engine.serialize()) tprint('TRT Engine Saved in {}.'.format(self.trt_file_path)) + return engine + def create_plugins(self): # create "adding positional encoding" plugin self.plugins['AddPosEncPlugin'] = self.get_plugin_creator( diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/plugins/add_pos_enc/AddPosEncPlugin.d b/CUDA-Optimized/FastSpeech/fastspeech/trt/plugins/add_pos_enc/AddPosEncPlugin.d index a8e15b44..47d95e84 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/trt/plugins/add_pos_enc/AddPosEncPlugin.d +++ b/CUDA-Optimized/FastSpeech/fastspeech/trt/plugins/add_pos_enc/AddPosEncPlugin.d @@ -143,6 +143,8 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/sm_61_intrinsics.hpp \ /usr/local/cuda/include/crt/sm_70_rt.h \ /usr/local/cuda/include/crt/sm_70_rt.hpp \ + /usr/local/cuda/include/crt/sm_80_rt.h \ + /usr/local/cuda/include/crt/sm_80_rt.hpp \ /usr/local/cuda/include/surface_functions.h \ /usr/local/cuda/include/texture_fetch_functions.h \ /usr/local/cuda/include/texture_indirect_functions.h \ @@ -280,6 +282,7 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/detail/config/compiler.h \ /usr/local/cuda/include/thrust/detail/config/cpp_dialect.h \ /usr/local/cuda/include/thrust/detail/config/cpp_compatibility.h \ + /usr/local/cuda/include/thrust/detail/config/deprecated.h \ /usr/local/cuda/include/thrust/detail/config/host_system.h \ /usr/local/cuda/include/thrust/detail/config/device_system.h \ /usr/local/cuda/include/thrust/detail/config/host_device.h \ @@ -301,6 +304,8 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/cuda/detail/execution_policy.h \ /usr/local/cuda/include/thrust/iterator/detail/any_system_tag.h \ /usr/local/cuda/include/thrust/system/cuda/config.h \ + /usr/local/cuda/include/cub/util_namespace.cuh \ + /usr/local/cuda/include/cub/version.cuh \ /usr/local/cuda/include/thrust/detail/allocator_aware_execution_policy.h \ /usr/local/cuda/include/thrust/detail/execute_with_allocator_fwd.h \ /usr/local/cuda/include/thrust/detail/type_traits.h \ @@ -379,8 +384,10 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/cpp/detail/for_each.h \ /usr/local/cuda/include/thrust/system/cuda/detail/for_each.h \ /usr/local/cuda/include/thrust/system/cuda/detail/util.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/util_arch.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/util_namespace.cuh \ + /usr/local/cuda/include/cub/util_arch.cuh \ + /usr/local/cuda/include/cub/util_cpp_dialect.cuh \ + /usr/local/cuda/include/cub/util_compiler.cuh \ + /usr/local/cuda/include/cub/util_macro.cuh \ /usr/local/cuda/include/thrust/system_error.h \ /usr/local/cuda/include/thrust/system/error_code.h \ /usr/local/cuda/include/thrust/system/detail/errno.h \ @@ -404,35 +411,37 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/cuda/detail/core/util.h \ /usr/local/cuda/include/cuda_occupancy.h \ /usr/local/cuda/include/thrust/type_traits/is_contiguous_iterator.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/block_load.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/block_exchange.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../util_ptx.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../util_type.cuh \ + /usr/local/cuda/include/cub/block/block_load.cuh \ + /usr/local/cuda/include/cub/block/block_exchange.cuh \ + /usr/local/cuda/include/cub/block/../config.cuh \ + /usr/local/cuda/include/cub/block/../util_deprecated.cuh \ + /usr/local/cuda/include/cub/block/../util_ptx.cuh \ + /usr/local/cuda/include/cub/block/../util_type.cuh \ /usr/include/c++/7/cfloat \ /usr/lib/gcc/x86_64-linux-gnu/7/include/float.h \ /usr/local/cuda/include/cuda_fp16.h \ /usr/local/cuda/include/cuda_fp16.hpp \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../util_macro.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../util_debug.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../iterator/cache_modified_input_iterator.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../iterator/../thread/thread_load.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../iterator/../thread/thread_store.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/../iterator/../util_device.cuh \ + /usr/local/cuda/include/cub/block/../util_debug.cuh \ + /usr/local/cuda/include/cub/block/../iterator/cache_modified_input_iterator.cuh \ + /usr/local/cuda/include/cub/block/../iterator/../thread/thread_load.cuh \ + /usr/local/cuda/include/cub/block/../iterator/../thread/thread_store.cuh \ + /usr/local/cuda/include/cub/block/../iterator/../util_device.cuh \ + /usr/include/c++/7/atomic \ /usr/local/cuda/include/thrust/iterator/iterator_facade.h \ /usr/local/cuda/include/thrust/iterator/detail/iterator_facade_category.h \ /usr/local/cuda/include/thrust/iterator/detail/is_iterator_category.h \ /usr/local/cuda/include/thrust/iterator/detail/distance_from_result.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/block_store.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/block_scan.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/block_scan_raking.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/../../block/block_raking_layout.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/../../thread/thread_reduce.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/../../thread/../thread/thread_operators.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/../../thread/thread_scan.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/../../warp/warp_scan.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/../../warp/specializations/warp_scan_shfl.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/../../warp/specializations/warp_scan_smem.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/specializations/block_scan_warp_scans.cuh \ + /usr/local/cuda/include/cub/block/block_store.cuh \ + /usr/local/cuda/include/cub/block/block_scan.cuh \ + /usr/local/cuda/include/cub/block/specializations/block_scan_raking.cuh \ + /usr/local/cuda/include/cub/block/specializations/../../block/block_raking_layout.cuh \ + /usr/local/cuda/include/cub/block/specializations/../../thread/thread_reduce.cuh \ + /usr/local/cuda/include/cub/block/specializations/../../thread/../thread/thread_operators.cuh \ + /usr/local/cuda/include/cub/block/specializations/../../thread/thread_scan.cuh \ + /usr/local/cuda/include/cub/block/specializations/../../warp/warp_scan.cuh \ + /usr/local/cuda/include/cub/block/specializations/../../warp/specializations/warp_scan_shfl.cuh \ + /usr/local/cuda/include/cub/block/specializations/../../warp/specializations/warp_scan_smem.cuh \ + /usr/local/cuda/include/cub/block/specializations/block_scan_warp_scans.cuh \ /usr/local/cuda/include/thrust/distance.h \ /usr/local/cuda/include/thrust/detail/distance.inl \ /usr/local/cuda/include/thrust/advance.h \ @@ -446,6 +455,7 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/iterator/detail/minimum_category.h \ /usr/local/cuda/include/thrust/iterator/detail/zip_iterator.inl \ /usr/local/cuda/include/thrust/detail/internal_functional.h \ + /usr/local/cuda/include/thrust/detail/memory_wrapper.h \ /usr/local/cuda/include/thrust/system/detail/adl/transform.h \ /usr/local/cuda/include/thrust/system/detail/sequential/transform.h \ /usr/local/cuda/include/thrust/system/cpp/detail/transform.h \ @@ -568,14 +578,15 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/cpp/detail/scan.h \ /usr/local/cuda/include/thrust/system/cuda/detail/scan.h \ /usr/local/cuda/include/thrust/detail/cstdint.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/device_scan.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/dispatch_scan.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/agent_scan.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/single_pass_scan_operators.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../warp/warp_reduce.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../warp/specializations/warp_reduce_shfl.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../warp/specializations/warp_reduce_smem.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../grid/grid_queue.cuh \ + /usr/local/cuda/include/cub/device/device_scan.cuh \ + /usr/local/cuda/include/cub/device/dispatch/dispatch_scan.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/agent_scan.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/single_pass_scan_operators.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../warp/warp_reduce.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../warp/specializations/warp_reduce_shfl.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../warp/specializations/warp_reduce_smem.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../grid/grid_queue.cuh \ + /usr/local/cuda/include/thrust/system/cuda/detail/dispatch.h \ /usr/local/cuda/include/thrust/detail/mpl/math.h \ /usr/local/cuda/include/thrust/detail/minmax.h \ /usr/local/cuda/include/thrust/system/detail/adl/scan_by_key.h \ @@ -584,11 +595,11 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/cuda/detail/scan_by_key.h \ /usr/local/cuda/include/thrust/system/cuda/execution_policy.h \ /usr/local/cuda/include/thrust/system/cuda/detail/adjacent_difference.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/device_select.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/dispatch_select_if.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/agent_select_if.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../block/block_discontinuity.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/block/block_adjacent_difference.cuh \ + /usr/local/cuda/include/cub/device/device_select.cuh \ + /usr/local/cuda/include/cub/device/dispatch/dispatch_select_if.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/agent_select_if.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../block/block_discontinuity.cuh \ + /usr/local/cuda/include/cub/block/block_adjacent_difference.cuh \ /usr/local/cuda/include/thrust/adjacent_difference.h \ /usr/local/cuda/include/thrust/detail/adjacent_difference.inl \ /usr/local/cuda/include/thrust/system/detail/generic/adjacent_difference.h \ @@ -616,19 +627,20 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/cpp/detail/copy_if.h \ /usr/local/cuda/include/thrust/system/cuda/detail/count.h \ /usr/local/cuda/include/thrust/system/cuda/detail/reduce.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/device_reduce.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/../iterator/arg_index_input_iterator.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/dispatch_reduce.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/agent_reduce.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../block/block_reduce.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../block/specializations/block_reduce_raking.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../block/specializations/block_reduce_raking_commutative_only.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../block/specializations/block_reduce_warp_reductions.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../grid/grid_mapping.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../grid/grid_even_share.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/dispatch_reduce_by_key.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/agent_reduce_by_key.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../iterator/constant_input_iterator.cuh \ + /usr/local/cuda/include/cub/device/device_reduce.cuh \ + /usr/local/cuda/include/cub/device/../iterator/arg_index_input_iterator.cuh \ + /usr/local/cuda/include/cub/device/dispatch/dispatch_reduce.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/agent_reduce.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../block/block_reduce.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../block/specializations/block_reduce_raking.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../block/specializations/block_reduce_raking_commutative_only.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../block/specializations/block_reduce_warp_reductions.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../grid/grid_mapping.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../grid/grid_even_share.cuh \ + /usr/local/cuda/include/cub/device/dispatch/dispatch_reduce_by_key.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/agent_reduce_by_key.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../iterator/constant_input_iterator.cuh \ + /usr/local/cuda/include/thrust/system/cuda/detail/make_unsigned_special.h \ /usr/local/cuda/include/thrust/reduce.h \ /usr/local/cuda/include/thrust/detail/reduce.inl \ /usr/local/cuda/include/thrust/system/detail/generic/reduce.h \ @@ -717,7 +729,7 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/cuda/detail/gather.h \ /usr/local/cuda/include/thrust/system/cuda/detail/inner_product.h \ /usr/local/cuda/include/thrust/system/cuda/detail/partition.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/device_partition.cuh \ + /usr/local/cuda/include/cub/device/device_partition.cuh \ /usr/local/cuda/include/thrust/partition.h \ /usr/local/cuda/include/thrust/detail/partition.inl \ /usr/local/cuda/include/thrust/system/detail/generic/partition.h \ @@ -745,12 +757,12 @@ AddPosEncPlugin.o : AddPosEncPlugin.cu \ /usr/local/cuda/include/thrust/system/detail/adl/find.h \ /usr/local/cuda/include/thrust/system/detail/adl/sort.h \ /usr/local/cuda/include/thrust/system/cuda/detail/sort.h \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/device_radix_sort.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/dispatch_radix_sort.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/agent_radix_sort_upsweep.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/agent_radix_sort_downsweep.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../agent/../block/block_radix_rank.cuh \ - /usr/local/cuda/include/thrust/system/cuda/detail/cub/device/dispatch/../../block/block_radix_sort.cuh \ + /usr/local/cuda/include/cub/device/device_radix_sort.cuh \ + /usr/local/cuda/include/cub/device/dispatch/dispatch_radix_sort.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/agent_radix_sort_upsweep.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/agent_radix_sort_downsweep.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../agent/../block/block_radix_rank.cuh \ + /usr/local/cuda/include/cub/device/dispatch/../../block/block_radix_sort.cuh \ /usr/local/cuda/include/thrust/detail/trivial_sequence.h \ /usr/local/cuda/include/thrust/sequence.h \ /usr/local/cuda/include/thrust/detail/sequence.inl \ diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/plugins/add_pos_enc/AddPosEncPlugin.o b/CUDA-Optimized/FastSpeech/fastspeech/trt/plugins/add_pos_enc/AddPosEncPlugin.o index c9eebe33f7ab383576f7e2760f7677970d834e8d..c9d26c70103375bc008b303a4afd9c31f30af2ce 100644 GIT binary patch literal 102296 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 C&oui0 literal 114216 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�V4HIN}VL!xy{U9@a)F;M&bQef)zcHWF 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 A9RL6T literal 98184 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

$r~b9j9> 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 bP3e~=a2)@h*zmo#`dzlN<-NpLF6{pg)dzMM literal 76808 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 delta 22431 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 HyYv4aNtTz~ diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav b/CUDA-Optimized/FastSpeech/fastspeech/trt/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav similarity index 100% rename from CUDA-Optimized/FastSpeech/fastspeech/trt/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav rename to CUDA-Optimized/FastSpeech/fastspeech/trt/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav b/CUDA-Optimized/FastSpeech/fastspeech/trt/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav similarity index 100% rename from CUDA-Optimized/FastSpeech/fastspeech/trt/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav rename to CUDA-Optimized/FastSpeech/fastspeech/trt/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav b/CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav similarity index 100% rename from CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav rename to CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav b/CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav similarity index 100% rename from CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav rename to CUDA-Optimized/FastSpeech/fastspeech/trt/samples_fp16/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav diff --git a/CUDA-Optimized/FastSpeech/fastspeech/trt/trt_inferencer.py b/CUDA-Optimized/FastSpeech/fastspeech/trt/trt_inferencer.py index fef0a01e..9fd1006f 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/trt/trt_inferencer.py +++ b/CUDA-Optimized/FastSpeech/fastspeech/trt/trt_inferencer.py @@ -70,7 +70,7 @@ class TRTInferencer(object): # load checkpoint self.load(ckpt_file) - self.build_engine() + self.engine = self.build_engine() def __enter__(self): self.context = self.engine.create_execution_context() diff --git a/CUDA-Optimized/FastSpeech/fastspeech/utils/time.py b/CUDA-Optimized/FastSpeech/fastspeech/utils/time.py index 86b22cc4..90b012cd 100644 --- a/CUDA-Optimized/FastSpeech/fastspeech/utils/time.py +++ b/CUDA-Optimized/FastSpeech/fastspeech/utils/time.py @@ -35,13 +35,21 @@ class TimeElapsed(object): self.format = format def __enter__(self): + self.start() + + def __exit__(self, *exc_info): + self.end() + + def start(self): if self.device == 'cuda' and self.cuda_sync: torch.cuda.synchronize() self.start_time = time.time() - - def __exit__(self, *exc_info): + + def end(self): + if not hasattr(self, "start_time"): + return if self.device == 'cuda' and self.cuda_sync: torch.cuda.synchronize() self.end_time = time.time() self.time_elapsed = self.end_time - self.start_time - tprint(("[{}] Time elapsed: {" + self.format + "}").format(self.name, self.time_elapsed)) + tprint(("[{}] Time elapsed: {" + self.format + "}").format(self.name, self.time_elapsed)) \ No newline at end of file diff --git a/CUDA-Optimized/FastSpeech/generate.py b/CUDA-Optimized/FastSpeech/generate.py index 7fa859f7..66114c6c 100644 --- a/CUDA-Optimized/FastSpeech/generate.py +++ b/CUDA-Optimized/FastSpeech/generate.py @@ -42,6 +42,7 @@ from fastspeech.utils.pytorch import to_device_async, to_cpu_numpy from fastspeech.infer import get_inferencer from fastspeech.inferencer.waveglow_inferencer import WaveGlowInferencer +MAX_FILESIZE=128 # TODO test with different speeds def generate(hparam='infer.yaml', @@ -156,7 +157,7 @@ def generate(hparam='infer.yaml', wav_len = mel_lens[i] * hp.hop_len wav = wav[:wav_len] - path = os.path.join(results_path, text + ".wav") + path = os.path.join(results_path, text[:MAX_FILESIZE] + ".wav") librosa.output.write_wav(path, wav, hp.sr) except StopIteration: diff --git a/CUDA-Optimized/FastSpeech/requirements.txt b/CUDA-Optimized/FastSpeech/requirements.txt index 2f6c62bb..1e9c2044 100644 --- a/CUDA-Optimized/FastSpeech/requirements.txt +++ b/CUDA-Optimized/FastSpeech/requirements.txt @@ -1,4 +1,3 @@ -# torch == 1.5 librosa >= 0.7.0 tensorboardX matplotlib @@ -10,4 +9,5 @@ torchvision opencv-python pyyaml tqdm -data \ No newline at end of file +data +pycuda \ No newline at end of file diff --git a/CUDA-Optimized/FastSpeech/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav b/CUDA-Optimized/FastSpeech/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav similarity index 100% rename from CUDA-Optimized/FastSpeech/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC nine seventy seven, and MIME content..wav rename to CUDA-Optimized/FastSpeech/samples/To deliver interfaces that are significantly better suited to create and process RFC eight twenty one, RFC eight twenty two, RFC.wav diff --git a/CUDA-Optimized/FastSpeech/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav b/CUDA-Optimized/FastSpeech/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav similarity index 100% rename from CUDA-Optimized/FastSpeech/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven four seven four or send me a meeting request with all the appropriate information..wav rename to CUDA-Optimized/FastSpeech/samples/You can call me directly at four two five seven zero three seven three four four or my cell four two five four four four seven f.wav diff --git a/CUDA-Optimized/FastSpeech/scripts/docker/build.sh b/CUDA-Optimized/FastSpeech/scripts/docker/build.sh index c64addd6..f1e55eb3 100644 --- a/CUDA-Optimized/FastSpeech/scripts/docker/build.sh +++ b/CUDA-Optimized/FastSpeech/scripts/docker/build.sh @@ -1,3 +1,4 @@ #!/bin/bash -docker build . --rm -t fastspeech \ No newline at end of file +docker build . --rm -t fastspeech +# docker build . --build-arg UID=$(id -u) --build-arg GID=$(id -g) --build-arg UNAME=$(id -un) --rm -t fastspeech \ No newline at end of file diff --git a/CUDA-Optimized/FastSpeech/scripts/docker/interactive.sh b/CUDA-Optimized/FastSpeech/scripts/docker/interactive.sh index 57b093af..a1cd0096 100644 --- a/CUDA-Optimized/FastSpeech/scripts/docker/interactive.sh +++ b/CUDA-Optimized/FastSpeech/scripts/docker/interactive.sh @@ -1,4 +1,5 @@ #!/bin/bash nvidia-docker run -it --rm --shm-size=16g -v $PWD:/workspace/fastspeech/ fastspeech bash -# --ulimit memlock=-1 --ulimit stack=67108864 -it --rm --ipc=host \ No newline at end of file +# nvidia-docker run -it -u $(id -u):$(id -g) --rm --shm-size=16g -v $PWD:/workspace/fastspeech/ fastspeech bash +# --ulimit memlock=-1 --ulimit stack=67108864 --ipc=host diff --git a/CUDA-Optimized/FastSpeech/scripts/install.sh b/CUDA-Optimized/FastSpeech/scripts/install.sh index e900eeee..53a16fee 100644 --- a/CUDA-Optimized/FastSpeech/scripts/install.sh +++ b/CUDA-Optimized/FastSpeech/scripts/install.sh @@ -1,8 +1,8 @@ #!/bin/bash # install ffmpeg -apt-get update -apt-get install -y ffmpeg +# apt-get update +# apt-get install -y ffmpeg # install the project and its dependencies -pip install --no-cache-dir . \ No newline at end of file +pip install --user --no-cache-dir . \ No newline at end of file diff --git a/CUDA-Optimized/FastSpeech/scripts/waveglow/export_onnx2trt.py b/CUDA-Optimized/FastSpeech/scripts/waveglow/export_onnx2trt.py deleted file mode 100644 index 583b7574..00000000 --- a/CUDA-Optimized/FastSpeech/scripts/waveglow/export_onnx2trt.py +++ /dev/null @@ -1,107 +0,0 @@ -# ***************************************************************************** -# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the NVIDIA CORPORATION nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# ***************************************************************************** - -# Edited from https://github.com/NVIDIA/DeepLearningExamples/blob/master/PyTorch/SpeechSynthesis/Tacotron2/trt/export_onnx2trt.py - -import pycuda.driver as cuda -import pycuda.autoinit -import tensorrt as trt -import onnx -import argparse - -import sys -sys.path.append('./') - -def parse_args(parser): - """ - Parse commandline arguments. - """ - parser.add_argument('-o', '--output', required=True, - help='output folder to save audio (file per phrase)') - parser.add_argument('--waveglow', type=str, default="", - help='full path to the WaveGlow ONNX') - parser.add_argument('--fp16', action='store_true', - help='inference with FP16') - parser.add_argument('-b', '--batch_size', default=1, type=int, - help='batch size for inference.') - parser.add_argument('-w', '--max_ws', default=1, type=int, - help='max workspace size in GB.') - - return parser - - -def build_engine(model_file, shapes, max_ws=512*1024*1024, fp16=False): - TRT_LOGGER = trt.Logger(trt.Logger.WARNING) - builder = trt.Builder(TRT_LOGGER) - builder.fp16_mode = fp16 - - config = builder.create_builder_config() - config.max_workspace_size = max_ws - if fp16: - config.flags |= 1 << int(trt.BuilderFlag.FP16) - profile = builder.create_optimization_profile() - for s in shapes: - profile.set_shape(s['name'], min=s['min'], opt=s['opt'], max=s['max']) - config.add_optimization_profile(profile) - explicit_batch = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) - network = builder.create_network(explicit_batch) - - with trt.OnnxParser(network, TRT_LOGGER) as parser: - with open(model_file, 'rb') as model: - parsed = parser.parse(model.read()) - for i in range(parser.num_errors): - print("TensorRT ONNX parser error:", parser.get_error(i)) - engine = builder.build_engine(network, config=config) - - return engine - - -def main(): - parser = argparse.ArgumentParser( - description='Export from ONNX to TensorRT for WaveGlow') - parser = parse_args(parser) - args = parser.parse_args() - - engine_prec = ".fp16" if args.fp16 else ".fp32" - - # WaveGlow - batch_size = args.batch_size - shapes=[{"name": "mel", "min": (batch_size,80,32,1), "opt": (batch_size,80,768,1), "max": (batch_size,80,1024,1)}, - {"name": "z", "min": (batch_size,8,1024,1), "opt": (batch_size,8,24576,1), "max": (batch_size,8,32768,1)}] - if args.waveglow != "": - print("Building WaveGlow ...") - waveglow_engine = build_engine(args.waveglow, shapes=shapes, fp16=args.fp16, max_ws=args.max_ws * 1<<30) - if waveglow_engine is not None: - with open(args.output+"/"+"waveglow"+engine_prec+".b"+str(batch_size), 'wb') as f: - f.write(waveglow_engine.serialize()) - else: - print("Failed to build engine from", args.waveglow) - sys.exit() - - -if __name__ == '__main__': - main() diff --git a/CUDA-Optimized/FastSpeech/setup.py b/CUDA-Optimized/FastSpeech/setup.py index 11178ee6..221ca8cd 100644 --- a/CUDA-Optimized/FastSpeech/setup.py +++ b/CUDA-Optimized/FastSpeech/setup.py @@ -37,7 +37,7 @@ def get_requirements(filename='requirements.txt'): setup( name='fastspeech', - version='0.2.1', + version='0.2.2', description='FastSpeech training and inference in PyTorch and TensorRT', author='Dabi Ahn', keywords='tts', diff --git a/CUDA-Optimized/FastSpeech/waveglow/__init__.py b/CUDA-Optimized/FastSpeech/waveglow/__init__.py new file mode 100644 index 00000000..0a2d298f --- /dev/null +++ b/CUDA-Optimized/FastSpeech/waveglow/__init__.py @@ -0,0 +1,23 @@ +# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the NVIDIA CORPORATION nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/CUDA-Optimized/FastSpeech/waveglow/arg_parser.py b/CUDA-Optimized/FastSpeech/waveglow/arg_parser.py new file mode 100644 index 00000000..e4673b16 --- /dev/null +++ b/CUDA-Optimized/FastSpeech/waveglow/arg_parser.py @@ -0,0 +1,65 @@ +# ***************************************************************************** +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the NVIDIA CORPORATION nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ***************************************************************************** + +import argparse + +def parse_waveglow_args(parent, add_help=False): + """ + Parse commandline arguments. + """ + parser = argparse.ArgumentParser(parents=[parent], add_help=add_help) + + # misc parameters + parser.add_argument('--n-mel-channels', default=80, type=int, + help='Number of bins in mel-spectrograms') + + # glow parameters + parser.add_argument('--flows', default=12, type=int, + help='Number of steps of flow') + parser.add_argument('--groups', default=8, type=int, + help='Number of samples in a group processed by the steps of flow') + parser.add_argument('--early-every', default=4, type=int, + help='Determines how often (i.e., after how many coupling layers) \ + a number of channels (defined by --early-size parameter) are output\ + to the loss function') + parser.add_argument('--early-size', default=2, type=int, + help='Number of channels output to the loss function') + parser.add_argument('--sigma', default=1.0, type=float, + help='Standard deviation used for sampling from Gaussian') + parser.add_argument('--segment-length', default=8000, type=int, + help='Segment length (audio samples) processed per iteration') + + # wavenet parameters + wavenet = parser.add_argument_group('WaveNet parameters') + wavenet.add_argument('--wn-kernel-size', default=3, type=int, + help='Kernel size for dialted convolution in the affine coupling layer (WN)') + wavenet.add_argument('--wn-channels', default=256, type=int, + help='Number of channels in WN') + wavenet.add_argument('--wn-layers', default=8, type=int, + help='Number of layers in WN') + + return parser diff --git a/CUDA-Optimized/FastSpeech/waveglow/data_function.py b/CUDA-Optimized/FastSpeech/waveglow/data_function.py new file mode 100644 index 00000000..1a425189 --- /dev/null +++ b/CUDA-Optimized/FastSpeech/waveglow/data_function.py @@ -0,0 +1,88 @@ +# ***************************************************************************** +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the NVIDIA CORPORATION nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# *****************************************************************************\ + +import torch +import random +import common.layers as layers +from common.utils import load_wav_to_torch, load_filepaths_and_text, to_gpu + + +class MelAudioLoader(torch.utils.data.Dataset): + """ + 1) loads audio,text pairs + 2) computes mel-spectrograms from audio files. + """ + + def __init__(self, dataset_path, audiopaths_and_text, args): + self.audiopaths_and_text = load_filepaths_and_text(dataset_path, audiopaths_and_text) + self.max_wav_value = args.max_wav_value + self.sampling_rate = args.sampling_rate + self.stft = layers.TacotronSTFT( + args.filter_length, args.hop_length, args.win_length, + args.n_mel_channels, args.sampling_rate, args.mel_fmin, + args.mel_fmax) + self.segment_length = args.segment_length + random.seed(1234) + random.shuffle(self.audiopaths_and_text) + + def get_mel_audio_pair(self, filename): + audio, sampling_rate = load_wav_to_torch(filename) + + if sampling_rate != self.stft.sampling_rate: + raise ValueError("{} {} SR doesn't match target {} SR".format( + sampling_rate, self.stft.sampling_rate)) + + # Take segment + if audio.size(0) >= self.segment_length: + max_audio_start = audio.size(0) - self.segment_length + audio_start = random.randint(0, max_audio_start) + audio = audio[audio_start:audio_start+self.segment_length] + else: + audio = torch.nn.functional.pad( + audio, (0, self.segment_length - audio.size(0)), 'constant').data + + audio = audio / self.max_wav_value + audio_norm = audio.unsqueeze(0) + audio_norm = torch.autograd.Variable(audio_norm, requires_grad=False) + melspec = self.stft.mel_spectrogram(audio_norm) + melspec = melspec.squeeze(0) + + return (melspec, audio, len(audio)) + + def __getitem__(self, index): + return self.get_mel_audio_pair(self.audiopaths_and_text[index][0]) + + def __len__(self): + return len(self.audiopaths_and_text) + + +def batch_to_gpu(batch): + x, y, len_y = batch + x = to_gpu(x).float() + y = to_gpu(y).float() + len_y = to_gpu(torch.sum(len_y)) + return ((x, y), y, len_y) diff --git a/CUDA-Optimized/FastSpeech/waveglow/denoiser.py b/CUDA-Optimized/FastSpeech/waveglow/denoiser.py new file mode 100644 index 00000000..e7c17657 --- /dev/null +++ b/CUDA-Optimized/FastSpeech/waveglow/denoiser.py @@ -0,0 +1,72 @@ +# ***************************************************************************** +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the NVIDIA CORPORATION nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ***************************************************************************** + +import sys +sys.path.append('tacotron2') +import torch +from common.layers import STFT + + +class Denoiser(torch.nn.Module): + """ Removes model bias from audio produced with waveglow """ + + def __init__(self, waveglow, cpu_run=False, filter_length=1024, n_overlap=4, + win_length=1024, mode='zeros'): + super(Denoiser, self).__init__() + if cpu_run: + self.stft = STFT(filter_length=filter_length, + hop_length=int(filter_length/n_overlap), + win_length=win_length) + else: + self.stft = STFT(filter_length=filter_length, + hop_length=int(filter_length/n_overlap), + win_length=win_length).cuda() + if mode == 'zeros': + mel_input = torch.zeros( + (1, 80, 88), + dtype=waveglow.upsample.weight.dtype, + device=waveglow.upsample.weight.device) + elif mode == 'normal': + mel_input = torch.randn( + (1, 80, 88), + dtype=waveglow.upsample.weight.dtype, + device=waveglow.upsample.weight.device) + else: + raise Exception("Mode {} if not supported".format(mode)) + + with torch.no_grad(): + bias_audio = waveglow.infer(mel_input, sigma=0.0).float() + bias_spec, _ = self.stft.transform(bias_audio) + + self.register_buffer('bias_spec', bias_spec[:, :, 0][:, :, None]) + + def forward(self, audio, strength=0.1): + audio_spec, audio_angles = self.stft.transform(audio.float()) + audio_spec_denoised = audio_spec - self.bias_spec * strength + audio_spec_denoised = torch.clamp(audio_spec_denoised, 0.0) + audio_denoised = self.stft.inverse(audio_spec_denoised, audio_angles) + return audio_denoised diff --git a/CUDA-Optimized/FastSpeech/waveglow/loss_function.py b/CUDA-Optimized/FastSpeech/waveglow/loss_function.py new file mode 100644 index 00000000..efc00db7 --- /dev/null +++ b/CUDA-Optimized/FastSpeech/waveglow/loss_function.py @@ -0,0 +1,48 @@ +# ***************************************************************************** +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the NVIDIA CORPORATION nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ***************************************************************************** + +import torch + +class WaveGlowLoss(torch.nn.Module): + def __init__(self, sigma=1.0): + super(WaveGlowLoss, self).__init__() + self.sigma = sigma + + def forward(self, model_output, clean_audio): + # clean_audio is unused; + z, log_s_list, log_det_W_list = model_output + for i, log_s in enumerate(log_s_list): + if i == 0: + log_s_total = torch.sum(log_s) + log_det_W_total = log_det_W_list[i] + else: + log_s_total = log_s_total + torch.sum(log_s) + log_det_W_total += log_det_W_list[i] + + loss = torch.sum( + z * z) / (2 * self.sigma * self.sigma) - log_s_total - log_det_W_total # noqa: E501 + return loss / (z.size(0) * z.size(1) * z.size(2)) diff --git a/CUDA-Optimized/FastSpeech/waveglow/model.py b/CUDA-Optimized/FastSpeech/waveglow/model.py new file mode 100644 index 00000000..c799709a --- /dev/null +++ b/CUDA-Optimized/FastSpeech/waveglow/model.py @@ -0,0 +1,292 @@ +# ***************************************************************************** +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the NVIDIA CORPORATION nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ***************************************************************************** +import torch +from torch.autograd import Variable +import torch.nn.functional as F + + +@torch.jit.script +def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts + + +class Invertible1x1Conv(torch.nn.Module): + """ + The layer outputs both the convolution, and the log determinant + of its weight matrix. If reverse=True it does convolution with + inverse + """ + + def __init__(self, c): + super(Invertible1x1Conv, self).__init__() + self.conv = torch.nn.Conv1d(c, c, kernel_size=1, stride=1, padding=0, + bias=False) + + # Sample a random orthonormal matrix to initialize weights + W = torch.qr(torch.FloatTensor(c, c).normal_())[0] + + # Ensure determinant is 1.0 not -1.0 + if torch.det(W) < 0: + W[:, 0] = -1 * W[:, 0] + W = W.view(c, c, 1) + self.conv.weight.data = W + + def forward(self, z, reverse=False): + # shape + batch_size, group_size, n_of_groups = z.size() + + W = self.conv.weight.squeeze() + + if reverse: + if not hasattr(self, 'W_inverse'): + # Reverse computation + W_inverse = W.float().inverse() + W_inverse = Variable(W_inverse[..., None]) + if z.type() == 'torch.cuda.HalfTensor' or z.type() == 'torch.HalfTensor': + W_inverse = W_inverse.half() + self.W_inverse = W_inverse + z = F.conv1d(z, self.W_inverse, bias=None, stride=1, padding=0) + return z + else: + # Forward computation + log_det_W = batch_size * n_of_groups * torch.logdet(W.unsqueeze(0).float()).squeeze() + z = self.conv(z) + return z, log_det_W + + +class WN(torch.nn.Module): + """ + This is the WaveNet like layer for the affine coupling. The primary + difference from WaveNet is the convolutions need not be causal. There is + also no dilation size reset. The dilation only doubles on each layer + """ + + def __init__(self, n_in_channels, n_mel_channels, n_layers, n_channels, + kernel_size): + super(WN, self).__init__() + assert(kernel_size % 2 == 1) + assert(n_channels % 2 == 0) + self.n_layers = n_layers + self.n_channels = n_channels + self.in_layers = torch.nn.ModuleList() + self.res_skip_layers = torch.nn.ModuleList() + self.cond_layers = torch.nn.ModuleList() + + start = torch.nn.Conv1d(n_in_channels, n_channels, 1) + start = torch.nn.utils.weight_norm(start, name='weight') + self.start = start + + # Initializing last layer to 0 makes the affine coupling layers + # do nothing at first. This helps with training stability + end = torch.nn.Conv1d(n_channels, 2 * n_in_channels, 1) + end.weight.data.zero_() + end.bias.data.zero_() + self.end = end + + for i in range(n_layers): + dilation = 2 ** i + padding = int((kernel_size * dilation - dilation) / 2) + in_layer = torch.nn.Conv1d(n_channels, 2 * n_channels, kernel_size, + dilation=dilation, padding=padding) + in_layer = torch.nn.utils.weight_norm(in_layer, name='weight') + self.in_layers.append(in_layer) + + cond_layer = torch.nn.Conv1d(n_mel_channels, 2 * n_channels, 1) + cond_layer = torch.nn.utils.weight_norm(cond_layer, name='weight') + self.cond_layers.append(cond_layer) + + # last one is not necessary + if i < n_layers - 1: + res_skip_channels = 2 * n_channels + else: + res_skip_channels = n_channels + res_skip_layer = torch.nn.Conv1d(n_channels, res_skip_channels, 1) + res_skip_layer = torch.nn.utils.weight_norm( + res_skip_layer, name='weight') + self.res_skip_layers.append(res_skip_layer) + + def forward(self, forward_input): + audio, spect = forward_input + audio = self.start(audio) + + for i in range(self.n_layers): + acts = fused_add_tanh_sigmoid_multiply( + self.in_layers[i](audio), + self.cond_layers[i](spect), + torch.IntTensor([self.n_channels])) + + res_skip_acts = self.res_skip_layers[i](acts) + if i < self.n_layers - 1: + audio = res_skip_acts[:, :self.n_channels, :] + audio + skip_acts = res_skip_acts[:, self.n_channels:, :] + else: + skip_acts = res_skip_acts + + if i == 0: + output = skip_acts + else: + output = skip_acts + output + return self.end(output) + + +class WaveGlow(torch.nn.Module): + def __init__(self, n_mel_channels, n_flows, n_group, n_early_every, + n_early_size, WN_config): + super(WaveGlow, self).__init__() + + self.upsample = torch.nn.ConvTranspose1d(n_mel_channels, + n_mel_channels, + 1024, stride=256) + assert(n_group % 2 == 0) + self.n_flows = n_flows + self.n_group = n_group + self.n_early_every = n_early_every + self.n_early_size = n_early_size + self.WN = torch.nn.ModuleList() + self.convinv = torch.nn.ModuleList() + + n_half = int(n_group / 2) + + # Set up layers with the right sizes based on how many dimensions + # have been output already + n_remaining_channels = n_group + for k in range(n_flows): + if k % self.n_early_every == 0 and k > 0: + n_half = n_half - int(self.n_early_size / 2) + n_remaining_channels = n_remaining_channels - self.n_early_size + self.convinv.append(Invertible1x1Conv(n_remaining_channels)) + self.WN.append(WN(n_half, n_mel_channels * n_group, **WN_config)) + self.n_remaining_channels = n_remaining_channels + + def forward(self, forward_input): + """ + forward_input[0] = mel_spectrogram: batch x n_mel_channels x frames + forward_input[1] = audio: batch x time + """ + spect, audio = forward_input + + # Upsample spectrogram to size of audio + spect = self.upsample(spect) + assert(spect.size(2) >= audio.size(1)) + if spect.size(2) > audio.size(1): + spect = spect[:, :, :audio.size(1)] + + spect = spect.unfold(2, self.n_group, self.n_group).permute(0, 2, 1, 3) + spect = spect.contiguous().view(spect.size(0), spect.size(1), -1) + spect = spect.permute(0, 2, 1) + + audio = audio.unfold(1, self.n_group, self.n_group).permute(0, 2, 1) + output_audio = [] + log_s_list = [] + log_det_W_list = [] + + for k in range(self.n_flows): + if k % self.n_early_every == 0 and k > 0: + output_audio.append(audio[:, :self.n_early_size, :]) + audio = audio[:, self.n_early_size:, :] + + audio, log_det_W = self.convinv[k](audio) + log_det_W_list.append(log_det_W) + + n_half = int(audio.size(1) / 2) + audio_0 = audio[:, :n_half, :] + audio_1 = audio[:, n_half:, :] + + output = self.WN[k]((audio_0, spect)) + log_s = output[:, n_half:, :] + b = output[:, :n_half, :] + audio_1 = torch.exp(log_s) * audio_1 + b + log_s_list.append(log_s) + + audio = torch.cat([audio_0, audio_1], 1) + + output_audio.append(audio) + return torch.cat(output_audio, 1), log_s_list, log_det_W_list + + def infer(self, spect, sigma=1.0): + + spect = self.upsample(spect) + # trim conv artifacts. maybe pad spec to kernel multiple + time_cutoff = self.upsample.kernel_size[0] - self.upsample.stride[0] + spect = spect[:, :, :-time_cutoff] + + spect = spect.unfold(2, self.n_group, self.n_group).permute(0, 2, 1, 3) + spect = spect.contiguous().view(spect.size(0), spect.size(1), -1) + spect = spect.permute(0, 2, 1) + + audio = torch.randn(spect.size(0), + self.n_remaining_channels, + spect.size(2), device=spect.device).to(spect.dtype) + + audio = torch.autograd.Variable(sigma * audio) + + for k in reversed(range(self.n_flows)): + n_half = int(audio.size(1) / 2) + audio_0 = audio[:, :n_half, :] + audio_1 = audio[:, n_half:, :] + + output = self.WN[k]((audio_0, spect)) + s = output[:, n_half:, :] + b = output[:, :n_half, :] + audio_1 = (audio_1 - b) / torch.exp(s) + audio = torch.cat([audio_0, audio_1], 1) + + audio = self.convinv[k](audio, reverse=True) + + if k % self.n_early_every == 0 and k > 0: + z = torch.randn(spect.size(0), self.n_early_size, spect.size( + 2), device=spect.device).to(spect.dtype) + audio = torch.cat((sigma * z, audio), 1) + + audio = audio.permute( + 0, 2, 1).contiguous().view( + audio.size(0), -1).data + return audio + + + @staticmethod + def remove_weightnorm(model): + waveglow = model + for WN in waveglow.WN: + WN.start = torch.nn.utils.remove_weight_norm(WN.start) + WN.in_layers = remove(WN.in_layers) + WN.cond_layers = remove(WN.cond_layers) + WN.res_skip_layers = remove(WN.res_skip_layers) + return waveglow + + +def remove(conv_list): + new_conv_list = torch.nn.ModuleList() + for old_conv in conv_list: + old_conv = torch.nn.utils.remove_weight_norm(old_conv) + new_conv_list.append(old_conv) + return new_conv_list