{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "SqueezeWave computational complexity.ipynb", "provenance": [] }, "kernelspec": { "name": "python2", "display_name": "Python 2" } }, "cells": [ { "cell_type": "code", "metadata": { "id": "s8VYGy15fwqN", "colab_type": "code", "colab": {} }, "source": [ "import numpy as np" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "MDp5WalGf5Ji", "colab_type": "text" }, "source": [ "**WaveGlow**" ] }, { "cell_type": "code", "metadata": { "id": "wrBBjKSYf89M", "colab_type": "code", "outputId": "4d77bc19-7a81-4f0b-bcad-65c42c4b2e9c", "colab": { "base_uri": "https://localhost:8080/", "height": 136 } }, "source": [ "L = 2048 # audio length\n", "n_audio_channel_init = 8 # initial audio channel \n", "C_mel = 80 * 8 # After upsampling and unfolding \n", "kernal_size = 3\n", "C_wn = 256 # input channel size of in_layer\n", "C_wn_middle = C_wn * 2 # output channel size of in_layer and cond_layer\n", "n_flows = 12\n", "n_layers = 8\n", "n_early_output = 2\n", "n_early_output_interval = 4\n", "duration = 0.725\n", "\n", "n_audio_channels = []\n", "n_audio = n_audio_channel_init\n", "for i in range(n_flows):\n", " if i % n_early_output_interval == 0 and i > 0:\n", " n_audio -= n_early_output\n", " n_audio_channels.append(n_audio) # audio channel after early output\n", "\n", "# in_layers\n", "WN_in_layers = L * kernal_size * C_wn * C_wn_middle * n_layers * n_flows\n", "print('MACs of in_layers', WN_in_layers / duration / 1e9)\n", "# cond layers\n", "WN_cond_layers = L * C_mel * C_wn_middle * n_layers * n_flows \n", "print('MACs of cond_layers', WN_cond_layers / duration / 1e9)\n", "# res skip layers\n", "WN_res_layers = (L * C_wn * C_wn_middle * (n_layers - 1) + L * C_wn * C_wn) * n_flows\n", "print('MACs of res_skip_layers', WN_res_layers / duration / 1e9)\n", "# invertible convs\n", "inv1x1 = np.sum([n**2 * L for n in n_audio_channels])\n", "print('MACs of invertible conv layers', inv1x1 / duration / 1e9)\n", "# start\n", "starts = np.sum([n / 2 * C_wn * L for n in n_audio_channels])\n", "print('MACs of start conv layers', starts / duration / 1e9)\n", "# end\n", "ends = np.sum([C_wn * n * L for n in n_audio_channels])\n", "print('MACs of end conv layers', ends / duration / 1e9)\n", "# total\n", "WG_total = WN_in_layers + WN_cond_layers + WN_res_layers + inv1x1 + starts + ends\n", "print('Total number of MACs is', WG_total / duration / 1e9)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "('MACs of in_layers', 106.63367079724138)\n", "('MACs of cond_layers', 88.86139233103448)\n", "('MACs of res_skip_layers', 33.32302212413793)\n", "('MACs of invertible conv layers', 0.00131072)\n", "('MACs of start conv layers', 0.02603361103448276)\n", "('MACs of end conv layers', 0.05206722206896552)\n", "('Total number of MACs is', 228.89749680551725)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "QRQheCWjgC9D", "colab_type": "text" }, "source": [ "SqueezeWave L=64, C=128" ] }, { "cell_type": "code", "metadata": { "id": "zSlwPlvUgJue", "colab_type": "code", "outputId": "18e282ea-a071-4117-ba08-6e6abdc36c68", "colab": { "base_uri": "https://localhost:8080/", "height": 153 } }, "source": [ "L = 64 # audio length\n", "n_audio_channel_init = 256 # initial audio channel \n", "L_mel = 64 # mel-spectrogram length\n", "C_mel =80 # mel-spectrogram channel \n", "kernal_size = 3\n", "C_wn = 128 # input channel size of in_layer\n", "C_wn_middle = C_wn * 2 # output channel size of in_layer and cond_layer\n", "n_flows = 12\n", "n_layers = 8\n", "n_early_output = 16\n", "n_early_output_interval = 2\n", "duration = 0.725\n", "\n", "n_audio_channels = []\n", "n_audio = n_audio_channel_init\n", "for i in range(n_flows):\n", " if i % n_early_output_interval == 0 and i > 0:\n", " n_audio -= n_early_output\n", " n_audio_channels.append(n_audio) # audio channel after early output\n", "\n", "# in_layers\n", "WN_in_layers = L * kernal_size * C_wn * n_layers * n_flows # depthwise\n", "WN_in_layers += L * C_wn * C_wn_middle * n_layers * n_flows # pointwise\n", "print('MACs of in_layers', WN_in_layers / duration / 1e9)\n", "# cond_layers\n", "WN_cond_layers = L_mel * C_mel * C_wn_middle * n_layers * n_flows\n", "print('MACs of cond_layers', WN_cond_layers / duration / 1e9)\n", "# res_skip_layers\n", "WN_res_layers = L * C_wn * C_wn * n_layers * n_flows\n", "print('MACs of res_skip_layers', WN_res_layers / duration / 1e9)\n", "# invertible convs\n", "inv1x1 = np.sum([n**2 * L for n in n_audio_channels])\n", "print('MACs of invertible conv layers', inv1x1 / duration / 1e9)\n", "# start\n", "starts = np.sum([n / 2 * C_wn * L for n in n_audio_channels])\n", "print('MACs of start conv layers', starts / duration / 1e9)\n", "#end\n", "ends = np.sum([C_wn * n * L for n in n_audio_channels])\n", "print('MACs of end conv layers', ends / duration / 1e9)\n", "# total\n", "total = WN_in_layers + WN_cond_layers + WN_res_layers + inv1x1 + starts + ends\n", "print('Total number of MACs is', total / duration / 1e9)\n", "print('Reduction compared with WaveGlow', WG_total / total)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "('MACs of in_layers', 0.2809460524137931)\n", "('MACs of cond_layers', 0.17355740689655172)\n", "('MACs of res_skip_layers', 0.1388459255172414)\n", "('MACs of invertible conv layers', 0.0502141351724138)\n", "('MACs of start conv layers', 0.014643906206896554)\n", "('MACs of end conv layers', 0.029287812413793107)\n", "('Total number of MACs is', 0.6874952386206896)\n", "('Reduction compared with WaveGlow', 332)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "M6K8zJ6cugYj", "colab_type": "text" }, "source": [ "**SqueezeWave L=64, C=256**" ] }, { "cell_type": "code", "metadata": { "id": "ju5Xa4oAhScO", "colab_type": "code", "outputId": "c91361be-ff73-4113-a584-6dda74c3690e", "colab": { "base_uri": "https://localhost:8080/", "height": 153 } }, "source": [ "L = 64 # audio length\n", "n_audio_channel_init = 256 # initial audio channel \n", "L_mel = 64 # mel-spectrogram length\n", "C_mel =80 # mel-spectrogram channel \n", "kernal_size = 3\n", "C_wn = 256 # input channel size of in_layer\n", "C_wn_middle = C_wn * 2 # output channel size of in_layer and cond_layer\n", "n_flows = 12\n", "n_layers = 8\n", "n_early_output = 16\n", "n_early_output_interval = 2\n", "duration = 0.725\n", "\n", "n_audio_channels = []\n", "n_audio = n_audio_channel_init\n", "for i in range(n_flows):\n", " if i % n_early_output_interval == 0 and i > 0:\n", " n_audio -= n_early_output\n", " n_audio_channels.append(n_audio) # audio channel after early output\n", "\n", "# in_layers\n", "WN_in_layers = L * kernal_size * C_wn * n_layers * n_flows # depthwise\n", "WN_in_layers += L * C_wn * C_wn_middle * n_layers * n_flows # pointwise\n", "print('MACs of in_layers', WN_in_layers / duration / 1e9)\n", "# cond_layers\n", "WN_cond_layers = L_mel * C_mel * C_wn_middle * n_layers * n_flows\n", "print('MACs of cond_layers', WN_cond_layers / duration / 1e9)\n", "# res_skip_layers\n", "WN_res_layers = L * C_wn * C_wn * n_layers * n_flows\n", "print('MACs of res_skip_layers', WN_res_layers / duration / 1e9)\n", "# invertible convs\n", "inv1x1 = np.sum([n**2 * L for n in n_audio_channels])\n", "print('MACs of invertible conv layers', inv1x1 / duration / 1e9)\n", "# start\n", "starts = np.sum([n / 2 * C_wn * L for n in n_audio_channels])\n", "print('MACs of start conv layers', starts / duration / 1e9)\n", "#end\n", "ends = np.sum([C_wn * n * L for n in n_audio_channels])\n", "print('MACs of end conv layers', ends / duration / 1e9)\n", "# total\n", "total = WN_in_layers + WN_cond_layers + WN_res_layers + inv1x1 + starts + ends\n", "print('Total number of MACs is', total / duration / 1e9)\n", "print('Reduction compared with WaveGlow', WG_total / total)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "('MACs of in_layers', 1.1172758068965518)\n", "('MACs of cond_layers', 0.34711481379310344)\n", "('MACs of res_skip_layers', 0.5553837020689656)\n", "('MACs of invertible conv layers', 0.0502141351724138)\n", "('MACs of start conv layers', 0.029287812413793107)\n", "('MACs of end conv layers', 0.058575624827586215)\n", "('Total number of MACs is', 2.157851895172414)\n", "('Reduction compared with WaveGlow', 106)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "aIgnX6Yi4BFu", "colab_type": "text" }, "source": [ "**SqueezeWave L=128, C=128**" ] }, { "cell_type": "code", "metadata": { "id": "W-3Q5jW84F_t", "colab_type": "code", "outputId": "436038c3-f3f8-4989-eeec-eb59c154b183", "colab": { "base_uri": "https://localhost:8080/", "height": 153 } }, "source": [ "L = 128 # audio length\n", "n_audio_channel_init = 128 # initial audio channel \n", "L_mel = 64 # mel-spectrogram length\n", "C_mel =80 # mel-spectrogram channel \n", "kernal_size = 3\n", "C_wn = 128 # input channel size of in_layer\n", "C_wn_middle = C_wn * 2 # output channel size of in_layer and cond_layer\n", "n_flows = 12\n", "n_layers = 8\n", "n_early_output = 16\n", "n_early_output_interval = 2\n", "duration = 0.725\n", "\n", "n_audio_channels = []\n", "n_audio = n_audio_channel_init\n", "for i in range(n_flows):\n", " if i % n_early_output_interval == 0 and i > 0:\n", " n_audio -= n_early_output\n", " n_audio_channels.append(n_audio) # audio channel after early output\n", "\n", "# in_layers\n", "WN_in_layers = L * kernal_size * C_wn * n_layers * n_flows # depthwise\n", "WN_in_layers += L * C_wn * C_wn_middle * n_layers * n_flows # pointwise\n", "print('MACs of in_layers', WN_in_layers / duration / 1e9)\n", "# cond_layers\n", "WN_cond_layers = L_mel * C_mel * C_wn_middle * n_layers * n_flows\n", "print('MACs of cond_layers', WN_cond_layers / duration / 1e9)\n", "# res_skip_layers\n", "WN_res_layers = L * C_wn * C_wn * n_layers * n_flows\n", "print('MACs of res_skip_layers', WN_res_layers / duration / 1e9)\n", "# invertible convs\n", "inv1x1 = np.sum([n**2 * L for n in n_audio_channels])\n", "print('MACs of invertible conv layers', inv1x1 / duration / 1e9)\n", "# start\n", "starts = np.sum([n / 2 * C_wn * L for n in n_audio_channels])\n", "print('MACs of start conv layers', starts / duration / 1e9)\n", "#end\n", "ends = np.sum([C_wn * n * L for n in n_audio_channels])\n", "print('MACs of end conv layers', ends / duration / 1e9)\n", "# total\n", "total = WN_in_layers + WN_cond_layers + WN_res_layers + inv1x1 + starts + ends\n", "print('Total number of MACs is', total / duration / 1e9)\n", "print('Reduction compared with WaveGlow', WG_total / total)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "('MACs of in_layers', 0.5618921048275862)\n", "('MACs of cond_layers', 0.17355740689655172)\n", "('MACs of res_skip_layers', 0.2776918510344828)\n", "('MACs of invertible conv layers', 0.017988502068965517)\n", "('MACs of start conv layers', 0.011932071724137933)\n", "('MACs of end conv layers', 0.023864143448275865)\n", "('Total number of MACs is', 1.06692608)\n", "('Reduction compared with WaveGlow', 214)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "1kWvIBWU4Vwm", "colab_type": "text" }, "source": [ "**SqueezeWave L=128, C=256**" ] }, { "cell_type": "code", "metadata": { "id": "6YM2bkC14WWc", "colab_type": "code", "outputId": "b1fd3d03-0135-400e-cfbc-28746c8d0cf0", "colab": { "base_uri": "https://localhost:8080/", "height": 153 } }, "source": [ "L = 128 # audio length\n", "n_audio_channel_init = 128 # initial audio channel \n", "L_mel = 64 # mel-spectrogram length\n", "C_mel =80 # mel-spectrogram channel \n", "kernal_size = 3\n", "C_wn = 256 # input channel size of in_layer\n", "C_wn_middle = C_wn * 2 # output channel size of in_layer and cond_layer\n", "n_flows = 12\n", "n_layers = 8\n", "n_early_output = 16\n", "n_early_output_interval = 2\n", "duration = 0.725\n", "\n", "n_audio_channels = []\n", "n_audio = n_audio_channel_init\n", "for i in range(n_flows):\n", " if i % n_early_output_interval == 0 and i > 0:\n", " n_audio -= n_early_output\n", " n_audio_channels.append(n_audio) # audio channel after early output\n", "\n", "# in_layers\n", "WN_in_layers = L * kernal_size * C_wn * n_layers * n_flows # depthwise\n", "WN_in_layers += L * C_wn * C_wn_middle * n_layers * n_flows # pointwise\n", "print('MACs of in_layers', WN_in_layers / duration / 1e9)\n", "# cond_layers\n", "WN_cond_layers = L_mel * C_mel * C_wn_middle * n_layers * n_flows\n", "print('MACs of cond_layers', WN_cond_layers / duration / 1e9)\n", "# res_skip_layers\n", "WN_res_layers = L * C_wn * C_wn * n_layers * n_flows\n", "print('MACs of res_skip_layers', WN_res_layers / duration / 1e9)\n", "# invertible convs\n", "inv1x1 = np.sum([n**2 * L for n in n_audio_channels])\n", "print('MACs of invertible conv layers', inv1x1 / duration / 1e9)\n", "# start\n", "starts = np.sum([n / 2 * C_wn * L for n in n_audio_channels])\n", "print('MACs of start conv layers', starts / duration / 1e9)\n", "#end\n", "ends = np.sum([C_wn * n * L for n in n_audio_channels])\n", "print('MACs of end conv layers', ends / duration / 1e9)\n", "# total\n", "total = WN_in_layers + WN_cond_layers + WN_res_layers + inv1x1 + starts + ends\n", "print('Total number of MACs is', total / duration / 1e9)\n", "print('Reduction compared with WaveGlow', WG_total / total)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "('MACs of in_layers', 2.2345516137931036)\n", "('MACs of cond_layers', 0.34711481379310344)\n", "('MACs of res_skip_layers', 1.1107674041379312)\n", "('MACs of invertible conv layers', 0.017988502068965517)\n", "('MACs of start conv layers', 0.023864143448275865)\n", "('MACs of end conv layers', 0.04772828689655173)\n", "('Total number of MACs is', 3.7820147641379314)\n", "('Reduction compared with WaveGlow', 60)\n" ], "name": "stdout" } ] } ] }