@scrypted/libav 1.0.167 → 1.0.169
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +2 -0
- package/opus/.gitattributes +10 -0
- package/opus/.gitlab-ci.yml +122 -0
- package/opus/AUTHORS +6 -0
- package/opus/CMakeLists.txt +755 -0
- package/opus/COPYING +44 -0
- package/opus/ChangeLog +0 -0
- package/opus/LICENSE_PLEASE_READ.txt +22 -0
- package/opus/Makefile.am +497 -0
- package/opus/Makefile.mips +169 -0
- package/opus/Makefile.unix +167 -0
- package/opus/NEWS +0 -0
- package/opus/README +189 -0
- package/opus/README.draft +54 -0
- package/opus/autogen.bat +13 -0
- package/opus/autogen.sh +16 -0
- package/opus/celt/_kiss_fft_guts.h +188 -0
- package/opus/celt/arch.h +390 -0
- package/opus/celt/arm/arm2gnu.pl +353 -0
- package/opus/celt/arm/arm_celt_map.c +171 -0
- package/opus/celt/arm/armcpu.c +291 -0
- package/opus/celt/arm/armcpu.h +90 -0
- package/opus/celt/arm/armopts.s.in +37 -0
- package/opus/celt/arm/celt_fft_ne10.c +173 -0
- package/opus/celt/arm/celt_mdct_ne10.c +258 -0
- package/opus/celt/arm/celt_neon_intr.c +272 -0
- package/opus/celt/arm/celt_pitch_xcorr_arm.s +551 -0
- package/opus/celt/arm/fft_arm.h +71 -0
- package/opus/celt/arm/fixed_arm64.h +35 -0
- package/opus/celt/arm/fixed_armv4.h +80 -0
- package/opus/celt/arm/fixed_armv5e.h +151 -0
- package/opus/celt/arm/kiss_fft_armv4.h +121 -0
- package/opus/celt/arm/kiss_fft_armv5e.h +118 -0
- package/opus/celt/arm/mdct_arm.h +59 -0
- package/opus/celt/arm/meson.build +12 -0
- package/opus/celt/arm/pitch_arm.h +160 -0
- package/opus/celt/arm/pitch_neon_intr.c +288 -0
- package/opus/celt/bands.c +1686 -0
- package/opus/celt/bands.h +123 -0
- package/opus/celt/celt.c +317 -0
- package/opus/celt/celt.h +255 -0
- package/opus/celt/celt_decoder.c +1616 -0
- package/opus/celt/celt_encoder.c +2854 -0
- package/opus/celt/celt_lpc.c +364 -0
- package/opus/celt/celt_lpc.h +66 -0
- package/opus/celt/cpu_support.h +72 -0
- package/opus/celt/cwrs.c +715 -0
- package/opus/celt/cwrs.h +48 -0
- package/opus/celt/dump_modes/dump_modes.c +400 -0
- package/opus/celt/dump_modes/dump_modes_arch.h +45 -0
- package/opus/celt/dump_modes/dump_modes_arm_ne10.c +152 -0
- package/opus/celt/ecintrin.h +91 -0
- package/opus/celt/entcode.c +153 -0
- package/opus/celt/entcode.h +152 -0
- package/opus/celt/entdec.c +266 -0
- package/opus/celt/entdec.h +110 -0
- package/opus/celt/entenc.c +305 -0
- package/opus/celt/entenc.h +119 -0
- package/opus/celt/fixed_c5x.h +79 -0
- package/opus/celt/fixed_c6x.h +70 -0
- package/opus/celt/fixed_debug.h +839 -0
- package/opus/celt/fixed_generic.h +201 -0
- package/opus/celt/float_cast.h +152 -0
- package/opus/celt/kiss_fft.c +648 -0
- package/opus/celt/kiss_fft.h +217 -0
- package/opus/celt/laplace.c +235 -0
- package/opus/celt/laplace.h +57 -0
- package/opus/celt/mathops.c +217 -0
- package/opus/celt/mathops.h +479 -0
- package/opus/celt/mdct.c +372 -0
- package/opus/celt/mdct.h +115 -0
- package/opus/celt/meson.build +64 -0
- package/opus/celt/mfrngcod.h +48 -0
- package/opus/celt/mips/celt_mipsr1.h +152 -0
- package/opus/celt/mips/fixed_generic_mipsr1.h +126 -0
- package/opus/celt/mips/kiss_fft_mipsr1.h +167 -0
- package/opus/celt/mips/mdct_mipsr1.h +288 -0
- package/opus/celt/mips/pitch_mipsr1.h +161 -0
- package/opus/celt/mips/vq_mipsr1.h +116 -0
- package/opus/celt/modes.c +450 -0
- package/opus/celt/modes.h +75 -0
- package/opus/celt/opus_custom_demo.c +451 -0
- package/opus/celt/os_support.h +99 -0
- package/opus/celt/pitch.c +555 -0
- package/opus/celt/pitch.h +203 -0
- package/opus/celt/quant_bands.c +562 -0
- package/opus/celt/quant_bands.h +66 -0
- package/opus/celt/rate.c +646 -0
- package/opus/celt/rate.h +101 -0
- package/opus/celt/stack_alloc.h +185 -0
- package/opus/celt/static_modes_fixed.h +1541 -0
- package/opus/celt/static_modes_fixed_arm_ne10.h +388 -0
- package/opus/celt/static_modes_float.h +888 -0
- package/opus/celt/static_modes_float_arm_ne10.h +404 -0
- package/opus/celt/tests/meson.build +19 -0
- package/opus/celt/tests/test_unit_cwrs32.c +162 -0
- package/opus/celt/tests/test_unit_dft.c +181 -0
- package/opus/celt/tests/test_unit_entropy.c +383 -0
- package/opus/celt/tests/test_unit_laplace.c +94 -0
- package/opus/celt/tests/test_unit_mathops.c +369 -0
- package/opus/celt/tests/test_unit_mdct.c +233 -0
- package/opus/celt/tests/test_unit_rotation.c +87 -0
- package/opus/celt/tests/test_unit_types.c +50 -0
- package/opus/celt/vq.c +442 -0
- package/opus/celt/vq.h +79 -0
- package/opus/celt/x86/celt_lpc_sse.h +67 -0
- package/opus/celt/x86/celt_lpc_sse4_1.c +96 -0
- package/opus/celt/x86/pitch_avx.c +101 -0
- package/opus/celt/x86/pitch_sse.c +185 -0
- package/opus/celt/x86/pitch_sse.h +216 -0
- package/opus/celt/x86/pitch_sse2.c +95 -0
- package/opus/celt/x86/pitch_sse4_1.c +240 -0
- package/opus/celt/x86/vq_sse.h +52 -0
- package/opus/celt/x86/vq_sse2.c +217 -0
- package/opus/celt/x86/x86_arch_macros.h +47 -0
- package/opus/celt/x86/x86_celt_map.c +187 -0
- package/opus/celt/x86/x86cpu.c +184 -0
- package/opus/celt/x86/x86cpu.h +112 -0
- package/opus/celt_headers.mk +54 -0
- package/opus/celt_sources.mk +55 -0
- package/opus/cmake/CFeatureCheck.cmake +39 -0
- package/opus/cmake/OpusBuildtype.cmake +27 -0
- package/opus/cmake/OpusConfig.cmake +118 -0
- package/opus/cmake/OpusConfig.cmake.in +20 -0
- package/opus/cmake/OpusFunctions.cmake +231 -0
- package/opus/cmake/OpusPackageVersion.cmake +70 -0
- package/opus/cmake/OpusSources.cmake +71 -0
- package/opus/cmake/README.md +132 -0
- package/opus/cmake/RunTest.cmake +61 -0
- package/opus/cmake/config.h.cmake.in +1 -0
- package/opus/cmake/cpu_info_by_asm.c +31 -0
- package/opus/cmake/cpu_info_by_c.c +9 -0
- package/opus/cmake/vla.c +7 -0
- package/opus/configure.ac +1091 -0
- package/opus/dnn/LPCNet.yml +24 -0
- package/opus/dnn/README +1 -0
- package/opus/dnn/README.md +126 -0
- package/opus/dnn/adaconvtest.c +449 -0
- package/opus/dnn/arm/arm_dnn_map.c +88 -0
- package/opus/dnn/arm/dnn_arm.h +104 -0
- package/opus/dnn/arm/nnet_dotprod.c +38 -0
- package/opus/dnn/arm/nnet_neon.c +38 -0
- package/opus/dnn/burg.c +246 -0
- package/opus/dnn/burg.h +41 -0
- package/opus/dnn/common.h +56 -0
- package/opus/dnn/datasets.txt +163 -0
- package/opus/dnn/download_model.bat +9 -0
- package/opus/dnn/download_model.sh +30 -0
- package/opus/dnn/dred_coding.c +44 -0
- package/opus/dnn/dred_coding.h +36 -0
- package/opus/dnn/dred_config.h +54 -0
- package/opus/dnn/dred_decoder.c +129 -0
- package/opus/dnn/dred_decoder.h +49 -0
- package/opus/dnn/dred_encoder.c +363 -0
- package/opus/dnn/dred_encoder.h +71 -0
- package/opus/dnn/dred_rdovae.h +42 -0
- package/opus/dnn/dred_rdovae_dec.c +139 -0
- package/opus/dnn/dred_rdovae_dec.h +53 -0
- package/opus/dnn/dred_rdovae_enc.c +110 -0
- package/opus/dnn/dred_rdovae_enc.h +52 -0
- package/opus/dnn/dump_data.c +238 -0
- package/opus/dnn/dump_lpcnet_tables.c +104 -0
- package/opus/dnn/fargan.c +225 -0
- package/opus/dnn/fargan.h +68 -0
- package/opus/dnn/fargan_demo.c +217 -0
- package/opus/dnn/freq.c +328 -0
- package/opus/dnn/freq.h +61 -0
- package/opus/dnn/fwgan.c +322 -0
- package/opus/dnn/fwgan.h +83 -0
- package/opus/dnn/kiss99.c +81 -0
- package/opus/dnn/kiss99.h +46 -0
- package/opus/dnn/lossgen.c +192 -0
- package/opus/dnn/lossgen.h +55 -0
- package/opus/dnn/lossgen_demo.c +22 -0
- package/opus/dnn/lpcnet.c +283 -0
- package/opus/dnn/lpcnet.h +183 -0
- package/opus/dnn/lpcnet_enc.c +230 -0
- package/opus/dnn/lpcnet_plc.c +211 -0
- package/opus/dnn/lpcnet_private.h +90 -0
- package/opus/dnn/lpcnet_tables.c +307 -0
- package/opus/dnn/meson.build +64 -0
- package/opus/dnn/nndsp.c +416 -0
- package/opus/dnn/nndsp.h +143 -0
- package/opus/dnn/nnet.c +149 -0
- package/opus/dnn/nnet.h +163 -0
- package/opus/dnn/nnet_arch.h +247 -0
- package/opus/dnn/nnet_default.c +35 -0
- package/opus/dnn/osce.c +1419 -0
- package/opus/dnn/osce.h +84 -0
- package/opus/dnn/osce_config.h +60 -0
- package/opus/dnn/osce_features.c +454 -0
- package/opus/dnn/osce_features.h +50 -0
- package/opus/dnn/osce_structs.h +125 -0
- package/opus/dnn/parse_lpcnet_weights.c +238 -0
- package/opus/dnn/pitchdnn.c +79 -0
- package/opus/dnn/pitchdnn.h +34 -0
- package/opus/dnn/tansig_table.h +50 -0
- package/opus/dnn/test_vec.c +128 -0
- package/opus/dnn/torch/dnntools/dnntools/__init__.py +2 -0
- package/opus/dnn/torch/dnntools/dnntools/quantization/__init__.py +1 -0
- package/opus/dnn/torch/dnntools/dnntools/quantization/softquant.py +113 -0
- package/opus/dnn/torch/dnntools/dnntools/relegance/__init__.py +2 -0
- package/opus/dnn/torch/dnntools/dnntools/relegance/meta_critic.py +85 -0
- package/opus/dnn/torch/dnntools/dnntools/relegance/relegance.py +449 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/__init__.py +6 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/base_sparsifier.py +58 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/common.py +123 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/conv1d_sparsifier.py +133 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/conv_transpose1d_sparsifier.py +134 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/gru_sparsifier.py +178 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/linear_sparsifier.py +128 -0
- package/opus/dnn/torch/dnntools/dnntools/sparsification/utils.py +64 -0
- package/opus/dnn/torch/dnntools/requirements.txt +1 -0
- package/opus/dnn/torch/dnntools/setup.py +48 -0
- package/opus/dnn/torch/fargan/README.md +54 -0
- package/opus/dnn/torch/fargan/adv_train_fargan.py +277 -0
- package/opus/dnn/torch/fargan/dataset.py +61 -0
- package/opus/dnn/torch/fargan/dump_fargan_weights.py +112 -0
- package/opus/dnn/torch/fargan/fargan.py +322 -0
- package/opus/dnn/torch/fargan/filters.py +46 -0
- package/opus/dnn/torch/fargan/rc.py +29 -0
- package/opus/dnn/torch/fargan/stft_loss.py +186 -0
- package/opus/dnn/torch/fargan/test_fargan.py +128 -0
- package/opus/dnn/torch/fargan/train_fargan.py +168 -0
- package/opus/dnn/torch/fwgan/dump_model_weights.py +88 -0
- package/opus/dnn/torch/fwgan/inference.py +141 -0
- package/opus/dnn/torch/fwgan/models/__init__.py +7 -0
- package/opus/dnn/torch/fwgan/models/fwgan400.py +308 -0
- package/opus/dnn/torch/fwgan/models/fwgan500.py +260 -0
- package/opus/dnn/torch/lossgen/README.md +27 -0
- package/opus/dnn/torch/lossgen/export_lossgen.py +101 -0
- package/opus/dnn/torch/lossgen/lossgen.py +29 -0
- package/opus/dnn/torch/lossgen/process_data.sh +17 -0
- package/opus/dnn/torch/lossgen/test_lossgen.py +42 -0
- package/opus/dnn/torch/lossgen/train_lossgen.py +99 -0
- package/opus/dnn/torch/lpcnet/README.md +27 -0
- package/opus/dnn/torch/lpcnet/add_dataset_config.py +77 -0
- package/opus/dnn/torch/lpcnet/data/__init__.py +1 -0
- package/opus/dnn/torch/lpcnet/data/lpcnet_dataset.py +227 -0
- package/opus/dnn/torch/lpcnet/engine/lpcnet_engine.py +141 -0
- package/opus/dnn/torch/lpcnet/make_default_setup.py +56 -0
- package/opus/dnn/torch/lpcnet/make_test_config.py +78 -0
- package/opus/dnn/torch/lpcnet/models/__init__.py +8 -0
- package/opus/dnn/torch/lpcnet/models/lpcnet.py +303 -0
- package/opus/dnn/torch/lpcnet/models/multi_rate_lpcnet.py +437 -0
- package/opus/dnn/torch/lpcnet/print_lpcnet_complexity.py +64 -0
- package/opus/dnn/torch/lpcnet/scripts/collect_multi_run_results.py +190 -0
- package/opus/dnn/torch/lpcnet/scripts/loop_run.sh +52 -0
- package/opus/dnn/torch/lpcnet/scripts/make_animation.py +67 -0
- package/opus/dnn/torch/lpcnet/scripts/modify_dataset_target.py +17 -0
- package/opus/dnn/torch/lpcnet/scripts/multi_run.sh +17 -0
- package/opus/dnn/torch/lpcnet/scripts/run_inference_test.sh +22 -0
- package/opus/dnn/torch/lpcnet/scripts/update_checkpoints.py +54 -0
- package/opus/dnn/torch/lpcnet/scripts/update_output_folder.sh +22 -0
- package/opus/dnn/torch/lpcnet/scripts/update_setups.py +57 -0
- package/opus/dnn/torch/lpcnet/test_lpcnet.py +89 -0
- package/opus/dnn/torch/lpcnet/train_lpcnet.py +272 -0
- package/opus/dnn/torch/lpcnet/utils/__init__.py +4 -0
- package/opus/dnn/torch/lpcnet/utils/data.py +141 -0
- package/opus/dnn/torch/lpcnet/utils/endoscopy.py +234 -0
- package/opus/dnn/torch/lpcnet/utils/layers/__init__.py +3 -0
- package/opus/dnn/torch/lpcnet/utils/layers/dual_fc.py +44 -0
- package/opus/dnn/torch/lpcnet/utils/layers/pcm_embeddings.py +71 -0
- package/opus/dnn/torch/lpcnet/utils/layers/subconditioner.py +497 -0
- package/opus/dnn/torch/lpcnet/utils/misc.py +65 -0
- package/opus/dnn/torch/lpcnet/utils/pcm.py +35 -0
- package/opus/dnn/torch/lpcnet/utils/sample.py +44 -0
- package/opus/dnn/torch/lpcnet/utils/sparsification/__init__.py +2 -0
- package/opus/dnn/torch/lpcnet/utils/sparsification/common.py +121 -0
- package/opus/dnn/torch/lpcnet/utils/sparsification/gru_sparsifier.py +187 -0
- package/opus/dnn/torch/lpcnet/utils/templates.py +157 -0
- package/opus/dnn/torch/lpcnet/utils/ulaw.py +58 -0
- package/opus/dnn/torch/lpcnet/utils/wav.py +43 -0
- package/opus/dnn/torch/neural-pitch/README.md +18 -0
- package/opus/dnn/torch/neural-pitch/data_augmentation.py +149 -0
- package/opus/dnn/torch/neural-pitch/download_demand.sh +43 -0
- package/opus/dnn/torch/neural-pitch/evaluation.py +349 -0
- package/opus/dnn/torch/neural-pitch/experiments.py +38 -0
- package/opus/dnn/torch/neural-pitch/export_neuralpitch_weights.py +109 -0
- package/opus/dnn/torch/neural-pitch/models.py +178 -0
- package/opus/dnn/torch/neural-pitch/neural_pitch_update.py +179 -0
- package/opus/dnn/torch/neural-pitch/ptdb_process.sh +34 -0
- package/opus/dnn/torch/neural-pitch/run_crepe.py +72 -0
- package/opus/dnn/torch/neural-pitch/training.py +162 -0
- package/opus/dnn/torch/neural-pitch/utils.py +59 -0
- package/opus/dnn/torch/osce/README.md +66 -0
- package/opus/dnn/torch/osce/adv_train_model.py +462 -0
- package/opus/dnn/torch/osce/adv_train_vocoder.py +451 -0
- package/opus/dnn/torch/osce/create_testvectors.py +165 -0
- package/opus/dnn/torch/osce/data/__init__.py +2 -0
- package/opus/dnn/torch/osce/data/lpcnet_vocoding_dataset.py +225 -0
- package/opus/dnn/torch/osce/data/silk_conversion_set.py +132 -0
- package/opus/dnn/torch/osce/data/silk_enhancement_set.py +140 -0
- package/opus/dnn/torch/osce/engine/engine.py +103 -0
- package/opus/dnn/torch/osce/engine/vocoder_engine.py +101 -0
- package/opus/dnn/torch/osce/export_model_weights.py +174 -0
- package/opus/dnn/torch/osce/losses/stft_loss.py +277 -0
- package/opus/dnn/torch/osce/losses/td_lowpass.py +34 -0
- package/opus/dnn/torch/osce/make_default_setup.py +93 -0
- package/opus/dnn/torch/osce/models/__init__.py +42 -0
- package/opus/dnn/torch/osce/models/fd_discriminator.py +974 -0
- package/opus/dnn/torch/osce/models/lace.py +190 -0
- package/opus/dnn/torch/osce/models/lavoce.py +274 -0
- package/opus/dnn/torch/osce/models/lavoce_400.py +254 -0
- package/opus/dnn/torch/osce/models/lpcnet_feature_net.py +91 -0
- package/opus/dnn/torch/osce/models/nns_base.py +69 -0
- package/opus/dnn/torch/osce/models/no_lace.py +218 -0
- package/opus/dnn/torch/osce/models/scale_embedding.py +68 -0
- package/opus/dnn/torch/osce/models/shape_up_48.py +179 -0
- package/opus/dnn/torch/osce/models/silk_feature_net.py +86 -0
- package/opus/dnn/torch/osce/models/silk_feature_net_pl.py +127 -0
- package/opus/dnn/torch/osce/requirements.txt +9 -0
- package/opus/dnn/torch/osce/resources/training_files.txt +107716 -0
- package/opus/dnn/torch/osce/resources/validation_files.txt +26929 -0
- package/opus/dnn/torch/osce/scripts/concatenator.py +85 -0
- package/opus/dnn/torch/osce/silk_16_to_48.py +28 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/commonvoice_clip_selection.py +123 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/create_input_data.sh +25 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/env.rc +7 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/evaluate.py +113 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/lace_loss_metric.py +330 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_boxplots.py +116 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_boxplots_moctest.py +109 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_tables.py +124 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/make_tables_moctest.py +121 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/moc.py +182 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/moc2.py +190 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/process_dataset.sh +98 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/run_nomad.py +138 -0
- package/opus/dnn/torch/osce/stndrd/evaluation/run_osce_test.py +196 -0
- package/opus/dnn/torch/osce/stndrd/presentation/endoscopy.py +205 -0
- package/opus/dnn/torch/osce/stndrd/presentation/lace_demo.ipynb +313 -0
- package/opus/dnn/torch/osce/stndrd/presentation/linear_prediction.ipynb +320 -0
- package/opus/dnn/torch/osce/stndrd/presentation/playback.py +25 -0
- package/opus/dnn/torch/osce/stndrd/presentation/postfilter.ipynb +275 -0
- package/opus/dnn/torch/osce/stndrd/presentation/spectrogram.ipynb +173 -0
- package/opus/dnn/torch/osce/test_model.py +96 -0
- package/opus/dnn/torch/osce/test_vocoder.py +103 -0
- package/opus/dnn/torch/osce/train_model.py +307 -0
- package/opus/dnn/torch/osce/train_vocoder.py +287 -0
- package/opus/dnn/torch/osce/utils/ada_conv.py +71 -0
- package/opus/dnn/torch/osce/utils/complexity.py +8 -0
- package/opus/dnn/torch/osce/utils/endoscopy.py +205 -0
- package/opus/dnn/torch/osce/utils/layers/fir.py +27 -0
- package/opus/dnn/torch/osce/utils/layers/limited_adaptive_comb1d.py +230 -0
- package/opus/dnn/torch/osce/utils/layers/limited_adaptive_conv1d.py +200 -0
- package/opus/dnn/torch/osce/utils/layers/noise_shaper.py +100 -0
- package/opus/dnn/torch/osce/utils/layers/pitch_auto_correlator.py +84 -0
- package/opus/dnn/torch/osce/utils/layers/silk_upsampler.py +167 -0
- package/opus/dnn/torch/osce/utils/layers/td_shaper.py +145 -0
- package/opus/dnn/torch/osce/utils/lpcnet_features.py +112 -0
- package/opus/dnn/torch/osce/utils/misc.py +95 -0
- package/opus/dnn/torch/osce/utils/moc.py +153 -0
- package/opus/dnn/torch/osce/utils/pitch.py +122 -0
- package/opus/dnn/torch/osce/utils/silk_features.py +144 -0
- package/opus/dnn/torch/osce/utils/softquant.py +110 -0
- package/opus/dnn/torch/osce/utils/spec.py +210 -0
- package/opus/dnn/torch/osce/utils/templates.py +347 -0
- package/opus/dnn/torch/plc/export_plc.py +100 -0
- package/opus/dnn/torch/plc/plc.py +144 -0
- package/opus/dnn/torch/plc/plc_dataset.py +60 -0
- package/opus/dnn/torch/plc/train_plc.py +145 -0
- package/opus/dnn/torch/rdovae/README.md +55 -0
- package/opus/dnn/torch/rdovae/download_datasets.sh +6 -0
- package/opus/dnn/torch/rdovae/export_rdovae_weights.py +365 -0
- package/opus/dnn/torch/rdovae/fec_encoder.py +212 -0
- package/opus/dnn/torch/rdovae/import_rdovae_weights.py +143 -0
- package/opus/dnn/torch/rdovae/packets/__init__.py +1 -0
- package/opus/dnn/torch/rdovae/packets/fec_packets.c +142 -0
- package/opus/dnn/torch/rdovae/packets/fec_packets.h +34 -0
- package/opus/dnn/torch/rdovae/packets/fec_packets.py +108 -0
- package/opus/dnn/torch/rdovae/process_speech.sh +7 -0
- package/opus/dnn/torch/rdovae/rdovae/__init__.py +2 -0
- package/opus/dnn/torch/rdovae/rdovae/dataset.py +67 -0
- package/opus/dnn/torch/rdovae/rdovae/rdovae.py +719 -0
- package/opus/dnn/torch/rdovae/requirements.txt +4 -0
- package/opus/dnn/torch/rdovae/train_rdovae.py +278 -0
- package/opus/dnn/torch/testsuite/README.md +46 -0
- package/opus/dnn/torch/testsuite/examples/lpcnet_c_example.yml +6 -0
- package/opus/dnn/torch/testsuite/examples/lpcnet_c_plc_example.yml +5 -0
- package/opus/dnn/torch/testsuite/examples/lpcnet_torch_example.yml +5 -0
- package/opus/dnn/torch/testsuite/requirements.txt +12 -0
- package/opus/dnn/torch/testsuite/run_test.py +375 -0
- package/opus/dnn/torch/testsuite/utils/__init__.py +0 -0
- package/opus/dnn/torch/testsuite/utils/files.py +54 -0
- package/opus/dnn/torch/testsuite/utils/pesq.py +43 -0
- package/opus/dnn/torch/testsuite/utils/pitch.py +61 -0
- package/opus/dnn/torch/weight-exchange/README.md +21 -0
- package/opus/dnn/torch/weight-exchange/requirements.txt +1 -0
- package/opus/dnn/torch/weight-exchange/setup.py +48 -0
- package/opus/dnn/torch/weight-exchange/wexchange/__init__.py +30 -0
- package/opus/dnn/torch/weight-exchange/wexchange/c_export/__init__.py +31 -0
- package/opus/dnn/torch/weight-exchange/wexchange/c_export/c_writer.py +181 -0
- package/opus/dnn/torch/weight-exchange/wexchange/c_export/common.py +386 -0
- package/opus/dnn/torch/weight-exchange/wexchange/tf/__init__.py +5 -0
- package/opus/dnn/torch/weight-exchange/wexchange/tf/tf.py +188 -0
- package/opus/dnn/torch/weight-exchange/wexchange/torch/__init__.py +37 -0
- package/opus/dnn/torch/weight-exchange/wexchange/torch/torch.py +433 -0
- package/opus/dnn/training_tf2/dataloader.py +49 -0
- package/opus/dnn/training_tf2/decode_rdovae.py +111 -0
- package/opus/dnn/training_tf2/diffembed.py +49 -0
- package/opus/dnn/training_tf2/dump_lpcnet.py +388 -0
- package/opus/dnn/training_tf2/dump_plc.py +296 -0
- package/opus/dnn/training_tf2/dump_rdovae.py +306 -0
- package/opus/dnn/training_tf2/encode_rdovae.py +125 -0
- package/opus/dnn/training_tf2/fec_encoder.py +256 -0
- package/opus/dnn/training_tf2/fec_packets.c +142 -0
- package/opus/dnn/training_tf2/fec_packets.h +34 -0
- package/opus/dnn/training_tf2/fec_packets.py +108 -0
- package/opus/dnn/training_tf2/keraslayerdump.py +189 -0
- package/opus/dnn/training_tf2/lossfuncs.py +99 -0
- package/opus/dnn/training_tf2/lpcnet.py +339 -0
- package/opus/dnn/training_tf2/lpcnet_plc.py +101 -0
- package/opus/dnn/training_tf2/mdense.py +95 -0
- package/opus/dnn/training_tf2/pade.py +70 -0
- package/opus/dnn/training_tf2/parameters.py +29 -0
- package/opus/dnn/training_tf2/plc_loader.py +73 -0
- package/opus/dnn/training_tf2/rdovae.py +372 -0
- package/opus/dnn/training_tf2/rdovae_exchange.py +138 -0
- package/opus/dnn/training_tf2/rdovae_import.py +123 -0
- package/opus/dnn/training_tf2/test_lpcnet.py +120 -0
- package/opus/dnn/training_tf2/test_plc.py +92 -0
- package/opus/dnn/training_tf2/tf_funcs.py +70 -0
- package/opus/dnn/training_tf2/train_lpcnet.py +214 -0
- package/opus/dnn/training_tf2/train_plc.py +197 -0
- package/opus/dnn/training_tf2/train_rdovae.py +151 -0
- package/opus/dnn/training_tf2/ulaw.py +19 -0
- package/opus/dnn/training_tf2/uniform_noise.py +78 -0
- package/opus/dnn/vec.h +389 -0
- package/opus/dnn/vec_avx.h +884 -0
- package/opus/dnn/vec_neon.h +473 -0
- package/opus/dnn/write_lpcnet_weights.c +97 -0
- package/opus/dnn/x86/dnn_x86.h +121 -0
- package/opus/dnn/x86/nnet_avx2.c +40 -0
- package/opus/dnn/x86/nnet_sse2.c +40 -0
- package/opus/dnn/x86/nnet_sse4_1.c +40 -0
- package/opus/dnn/x86/x86_dnn_map.c +83 -0
- package/opus/doc/Doxyfile.in +340 -0
- package/opus/doc/Makefile.am +45 -0
- package/opus/doc/build_draft.sh +113 -0
- package/opus/doc/build_isobmff.sh +50 -0
- package/opus/doc/build_oggdraft.sh +52 -0
- package/opus/doc/customdoxygen.css +1011 -0
- package/opus/doc/draft-ietf-codec-oggopus.xml +1873 -0
- package/opus/doc/draft-ietf-codec-opus-update.xml +513 -0
- package/opus/doc/draft-ietf-codec-opus.xml +8276 -0
- package/opus/doc/draft-ietf-payload-rtp-opus.xml +960 -0
- package/opus/doc/footer.html +32 -0
- package/opus/doc/header.html +61 -0
- package/opus/doc/meson.build +33 -0
- package/opus/doc/opus_in_isobmff.css +60 -0
- package/opus/doc/opus_in_isobmff.html +692 -0
- package/opus/doc/opus_logo.svg +157 -0
- package/opus/doc/opus_update.patch +244 -0
- package/opus/doc/release.txt +43 -0
- package/opus/doc/trivial_example.c +171 -0
- package/opus/include/meson.build +13 -0
- package/opus/include/opus.h +1172 -0
- package/opus/include/opus_custom.h +381 -0
- package/opus/include/opus_defines.h +830 -0
- package/opus/include/opus_multistream.h +736 -0
- package/opus/include/opus_projection.h +643 -0
- package/opus/include/opus_types.h +166 -0
- package/opus/lpcnet_headers.mk +44 -0
- package/opus/lpcnet_sources.mk +44 -0
- package/opus/m4/as-gcc-inline-assembly.m4 +98 -0
- package/opus/m4/ax_add_fortify_source.m4 +53 -0
- package/opus/m4/opus-intrinsics.m4 +29 -0
- package/opus/meson/README.md +88 -0
- package/opus/meson/get-version.py +86 -0
- package/opus/meson/read-sources-list.py +28 -0
- package/opus/meson.build +745 -0
- package/opus/meson_options.txt +27 -0
- package/opus/opus-uninstalled.pc.in +12 -0
- package/opus/opus.m4 +117 -0
- package/opus/opus.pc.in +16 -0
- package/opus/opus_headers.mk +8 -0
- package/opus/opus_sources.mk +17 -0
- package/opus/releases.sha2 +85 -0
- package/opus/scripts/dump_rnn.py +57 -0
- package/opus/scripts/local_build.py +220 -0
- package/opus/scripts/rnn_train.py +67 -0
- package/opus/scripts/shrink_model.sh +7 -0
- package/opus/silk/A2NLSF.c +267 -0
- package/opus/silk/API.h +156 -0
- package/opus/silk/CNG.c +188 -0
- package/opus/silk/HP_variable_cutoff.c +77 -0
- package/opus/silk/Inlines.h +188 -0
- package/opus/silk/LPC_analysis_filter.c +111 -0
- package/opus/silk/LPC_fit.c +82 -0
- package/opus/silk/LPC_inv_pred_gain.c +141 -0
- package/opus/silk/LP_variable_cutoff.c +135 -0
- package/opus/silk/MacroCount.h +710 -0
- package/opus/silk/MacroDebug.h +945 -0
- package/opus/silk/NLSF2A.c +141 -0
- package/opus/silk/NLSF_VQ.c +76 -0
- package/opus/silk/NLSF_VQ_weights_laroia.c +80 -0
- package/opus/silk/NLSF_decode.c +93 -0
- package/opus/silk/NLSF_del_dec_quant.c +215 -0
- package/opus/silk/NLSF_encode.c +124 -0
- package/opus/silk/NLSF_stabilize.c +142 -0
- package/opus/silk/NLSF_unpack.c +55 -0
- package/opus/silk/NSQ.c +437 -0
- package/opus/silk/NSQ.h +101 -0
- package/opus/silk/NSQ_del_dec.c +733 -0
- package/opus/silk/PLC.c +493 -0
- package/opus/silk/PLC.h +65 -0
- package/opus/silk/SigProc_FIX.h +643 -0
- package/opus/silk/VAD.c +360 -0
- package/opus/silk/VQ_WMat_EC.c +131 -0
- package/opus/silk/ana_filt_bank_1.c +74 -0
- package/opus/silk/arm/LPC_inv_pred_gain_arm.h +57 -0
- package/opus/silk/arm/LPC_inv_pred_gain_neon_intr.c +288 -0
- package/opus/silk/arm/NSQ_del_dec_arm.h +100 -0
- package/opus/silk/arm/NSQ_del_dec_neon_intr.c +1138 -0
- package/opus/silk/arm/NSQ_neon.c +112 -0
- package/opus/silk/arm/NSQ_neon.h +114 -0
- package/opus/silk/arm/SigProc_FIX_armv4.h +47 -0
- package/opus/silk/arm/SigProc_FIX_armv5e.h +61 -0
- package/opus/silk/arm/arm_silk_map.c +128 -0
- package/opus/silk/arm/biquad_alt_arm.h +68 -0
- package/opus/silk/arm/biquad_alt_neon_intr.c +156 -0
- package/opus/silk/arm/macros_arm64.h +39 -0
- package/opus/silk/arm/macros_armv4.h +110 -0
- package/opus/silk/arm/macros_armv5e.h +220 -0
- package/opus/silk/biquad_alt.c +121 -0
- package/opus/silk/bwexpander.c +51 -0
- package/opus/silk/bwexpander_32.c +51 -0
- package/opus/silk/check_control_input.c +106 -0
- package/opus/silk/code_signs.c +115 -0
- package/opus/silk/control.h +161 -0
- package/opus/silk/control_SNR.c +113 -0
- package/opus/silk/control_audio_bandwidth.c +132 -0
- package/opus/silk/control_codec.c +423 -0
- package/opus/silk/debug.c +174 -0
- package/opus/silk/debug.h +267 -0
- package/opus/silk/dec_API.c +465 -0
- package/opus/silk/decode_core.c +243 -0
- package/opus/silk/decode_frame.c +169 -0
- package/opus/silk/decode_indices.c +151 -0
- package/opus/silk/decode_parameters.c +115 -0
- package/opus/silk/decode_pitch.c +77 -0
- package/opus/silk/decode_pulses.c +115 -0
- package/opus/silk/decoder_set_fs.c +108 -0
- package/opus/silk/define.h +235 -0
- package/opus/silk/enc_API.c +593 -0
- package/opus/silk/encode_indices.c +181 -0
- package/opus/silk/encode_pulses.c +206 -0
- package/opus/silk/errors.h +98 -0
- package/opus/silk/fixed/LTP_analysis_filter_FIX.c +90 -0
- package/opus/silk/fixed/LTP_scale_ctrl_FIX.c +58 -0
- package/opus/silk/fixed/apply_sine_window_FIX.c +101 -0
- package/opus/silk/fixed/arm/warped_autocorrelation_FIX_arm.h +68 -0
- package/opus/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c +265 -0
- package/opus/silk/fixed/autocorr_FIX.c +48 -0
- package/opus/silk/fixed/burg_modified_FIX.c +280 -0
- package/opus/silk/fixed/corrMatrix_FIX.c +150 -0
- package/opus/silk/fixed/encode_frame_FIX.c +444 -0
- package/opus/silk/fixed/find_LPC_FIX.c +151 -0
- package/opus/silk/fixed/find_LTP_FIX.c +99 -0
- package/opus/silk/fixed/find_pitch_lags_FIX.c +143 -0
- package/opus/silk/fixed/find_pred_coefs_FIX.c +146 -0
- package/opus/silk/fixed/k2a_FIX.c +54 -0
- package/opus/silk/fixed/k2a_Q16_FIX.c +54 -0
- package/opus/silk/fixed/main_FIX.h +244 -0
- package/opus/silk/fixed/mips/noise_shape_analysis_FIX_mipsr1.h +336 -0
- package/opus/silk/fixed/mips/prefilter_FIX_mipsr1.h +184 -0
- package/opus/silk/fixed/mips/warped_autocorrelation_FIX_mipsr1.h +165 -0
- package/opus/silk/fixed/noise_shape_analysis_FIX.c +407 -0
- package/opus/silk/fixed/pitch_analysis_core_FIX.c +721 -0
- package/opus/silk/fixed/process_gains_FIX.c +117 -0
- package/opus/silk/fixed/regularize_correlations_FIX.c +47 -0
- package/opus/silk/fixed/residual_energy16_FIX.c +103 -0
- package/opus/silk/fixed/residual_energy_FIX.c +98 -0
- package/opus/silk/fixed/schur64_FIX.c +93 -0
- package/opus/silk/fixed/schur_FIX.c +107 -0
- package/opus/silk/fixed/structs_FIX.h +116 -0
- package/opus/silk/fixed/vector_ops_FIX.c +102 -0
- package/opus/silk/fixed/warped_autocorrelation_FIX.c +92 -0
- package/opus/silk/fixed/x86/burg_modified_FIX_sse4_1.c +400 -0
- package/opus/silk/fixed/x86/vector_ops_FIX_sse4_1.c +93 -0
- package/opus/silk/float/LPC_analysis_filter_FLP.c +249 -0
- package/opus/silk/float/LPC_inv_pred_gain_FLP.c +73 -0
- package/opus/silk/float/LTP_analysis_filter_FLP.c +75 -0
- package/opus/silk/float/LTP_scale_ctrl_FLP.c +58 -0
- package/opus/silk/float/SigProc_FLP.h +205 -0
- package/opus/silk/float/apply_sine_window_FLP.c +81 -0
- package/opus/silk/float/autocorrelation_FLP.c +53 -0
- package/opus/silk/float/burg_modified_FLP.c +187 -0
- package/opus/silk/float/bwexpander_FLP.c +49 -0
- package/opus/silk/float/corrMatrix_FLP.c +95 -0
- package/opus/silk/float/encode_frame_FLP.c +432 -0
- package/opus/silk/float/energy_FLP.c +59 -0
- package/opus/silk/float/find_LPC_FLP.c +105 -0
- package/opus/silk/float/find_LTP_FLP.c +65 -0
- package/opus/silk/float/find_pitch_lags_FLP.c +132 -0
- package/opus/silk/float/find_pred_coefs_FLP.c +117 -0
- package/opus/silk/float/inner_product_FLP.c +59 -0
- package/opus/silk/float/k2a_FLP.c +54 -0
- package/opus/silk/float/main_FLP.h +290 -0
- package/opus/silk/float/noise_shape_analysis_FLP.c +350 -0
- package/opus/silk/float/pitch_analysis_core_FLP.c +630 -0
- package/opus/silk/float/process_gains_FLP.c +103 -0
- package/opus/silk/float/regularize_correlations_FLP.c +48 -0
- package/opus/silk/float/residual_energy_FLP.c +117 -0
- package/opus/silk/float/scale_copy_vector_FLP.c +57 -0
- package/opus/silk/float/scale_vector_FLP.c +56 -0
- package/opus/silk/float/schur_FLP.c +70 -0
- package/opus/silk/float/sort_FLP.c +83 -0
- package/opus/silk/float/structs_FLP.h +112 -0
- package/opus/silk/float/warped_autocorrelation_FLP.c +75 -0
- package/opus/silk/float/wrappers_FLP.c +209 -0
- package/opus/silk/float/x86/inner_product_FLP_avx2.c +85 -0
- package/opus/silk/gain_quant.c +142 -0
- package/opus/silk/init_decoder.c +84 -0
- package/opus/silk/init_encoder.c +68 -0
- package/opus/silk/inner_prod_aligned.c +47 -0
- package/opus/silk/interpolate.c +51 -0
- package/opus/silk/lin2log.c +46 -0
- package/opus/silk/log2lin.c +58 -0
- package/opus/silk/macros.h +151 -0
- package/opus/silk/main.h +486 -0
- package/opus/silk/meson.build +69 -0
- package/opus/silk/mips/NSQ_del_dec_mipsr1.h +410 -0
- package/opus/silk/mips/macros_mipsr1.h +92 -0
- package/opus/silk/mips/sigproc_fix_mipsr1.h +60 -0
- package/opus/silk/pitch_est_defines.h +88 -0
- package/opus/silk/pitch_est_tables.c +99 -0
- package/opus/silk/process_NLSFs.c +107 -0
- package/opus/silk/quant_LTP_gains.c +132 -0
- package/opus/silk/resampler.c +215 -0
- package/opus/silk/resampler_down2.c +74 -0
- package/opus/silk/resampler_down2_3.c +103 -0
- package/opus/silk/resampler_private.h +88 -0
- package/opus/silk/resampler_private_AR2.c +55 -0
- package/opus/silk/resampler_private_IIR_FIR.c +107 -0
- package/opus/silk/resampler_private_down_FIR.c +194 -0
- package/opus/silk/resampler_private_up2_HQ.c +113 -0
- package/opus/silk/resampler_rom.c +96 -0
- package/opus/silk/resampler_rom.h +68 -0
- package/opus/silk/resampler_structs.h +60 -0
- package/opus/silk/shell_coder.c +151 -0
- package/opus/silk/sigm_Q15.c +76 -0
- package/opus/silk/sort.c +154 -0
- package/opus/silk/stereo_LR_to_MS.c +229 -0
- package/opus/silk/stereo_MS_to_LR.c +85 -0
- package/opus/silk/stereo_decode_pred.c +73 -0
- package/opus/silk/stereo_encode_pred.c +62 -0
- package/opus/silk/stereo_find_predictor.c +79 -0
- package/opus/silk/stereo_quant_pred.c +73 -0
- package/opus/silk/structs.h +357 -0
- package/opus/silk/sum_sqr_shift.c +83 -0
- package/opus/silk/table_LSF_cos.c +70 -0
- package/opus/silk/tables.h +114 -0
- package/opus/silk/tables_LTP.c +294 -0
- package/opus/silk/tables_NLSF_CB_NB_MB.c +195 -0
- package/opus/silk/tables_NLSF_CB_WB.c +234 -0
- package/opus/silk/tables_gain.c +63 -0
- package/opus/silk/tables_other.c +124 -0
- package/opus/silk/tables_pitch_lag.c +69 -0
- package/opus/silk/tables_pulses_per_block.c +264 -0
- package/opus/silk/tests/meson.build +8 -0
- package/opus/silk/tests/test_unit_LPC_inv_pred_gain.c +130 -0
- package/opus/silk/tuning_parameters.h +155 -0
- package/opus/silk/typedef.h +81 -0
- package/opus/silk/x86/NSQ_del_dec_avx2.c +1075 -0
- package/opus/silk/x86/NSQ_del_dec_sse4_1.c +915 -0
- package/opus/silk/x86/NSQ_sse4_1.c +772 -0
- package/opus/silk/x86/SigProc_FIX_sse.h +99 -0
- package/opus/silk/x86/VAD_sse4_1.c +289 -0
- package/opus/silk/x86/VQ_WMat_EC_sse4_1.c +173 -0
- package/opus/silk/x86/main_sse.h +299 -0
- package/opus/silk/x86/x86_silk_map.c +179 -0
- package/opus/silk_headers.mk +44 -0
- package/opus/silk_sources.mk +164 -0
- package/opus/src/analysis.c +979 -0
- package/opus/src/analysis.h +103 -0
- package/opus/src/extensions.c +663 -0
- package/opus/src/mapping_matrix.c +993 -0
- package/opus/src/mapping_matrix.h +165 -0
- package/opus/src/meson.build +45 -0
- package/opus/src/mlp.c +132 -0
- package/opus/src/mlp.h +60 -0
- package/opus/src/mlp_data.c +672 -0
- package/opus/src/opus.c +362 -0
- package/opus/src/opus_compare.c +382 -0
- package/opus/src/opus_decoder.c +1579 -0
- package/opus/src/opus_demo.c +1194 -0
- package/opus/src/opus_encoder.c +3180 -0
- package/opus/src/opus_multistream.c +92 -0
- package/opus/src/opus_multistream_decoder.c +563 -0
- package/opus/src/opus_multistream_encoder.c +1321 -0
- package/opus/src/opus_private.h +263 -0
- package/opus/src/opus_projection_decoder.c +283 -0
- package/opus/src/opus_projection_encoder.c +522 -0
- package/opus/src/repacketizer.c +469 -0
- package/opus/src/repacketizer_demo.c +247 -0
- package/opus/src/tansig_table.h +45 -0
- package/opus/tar_list.txt +28 -0
- package/opus/tests/meson.build +39 -0
- package/opus/tests/opus_build_test.sh +29 -0
- package/opus/tests/opus_decode_fuzzer.c +124 -0
- package/opus/tests/opus_decode_fuzzer.options +2 -0
- package/opus/tests/opus_encode_regressions.c +1034 -0
- package/opus/tests/random_config.sh +126 -0
- package/opus/tests/run_vectors.sh +143 -0
- package/opus/tests/test_opus_api.c +1904 -0
- package/opus/tests/test_opus_common.h +86 -0
- package/opus/tests/test_opus_custom.c +694 -0
- package/opus/tests/test_opus_decode.c +481 -0
- package/opus/tests/test_opus_dred.c +107 -0
- package/opus/tests/test_opus_encode.c +738 -0
- package/opus/tests/test_opus_extensions.c +750 -0
- package/opus/tests/test_opus_padding.c +94 -0
- package/opus/tests/test_opus_projection.c +384 -0
- package/opus/training/rnn_dump.py +66 -0
- package/opus/training/rnn_train.py +177 -0
- package/opus/training/txt2hdf5.py +12 -0
- package/opus/update_version +65 -0
- package/package.json +2 -2
- package/src/build-ffmpeg-msys.sh +8 -2
- package/test.mp4 +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
/* Copyright (c) 2023 Amazon
|
|
3
|
+
Written by Jan Buethe */
|
|
4
|
+
/*
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
- Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
documentation and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
20
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
class BaseSparsifier:
|
|
31
|
+
def __init__(self, task_list, start, stop, interval, exponent=3):
|
|
32
|
+
|
|
33
|
+
# just copying parameters...
|
|
34
|
+
self.start = start
|
|
35
|
+
self.stop = stop
|
|
36
|
+
self.interval = interval
|
|
37
|
+
self.exponent = exponent
|
|
38
|
+
self.task_list = task_list
|
|
39
|
+
|
|
40
|
+
# ... and setting counter to 0
|
|
41
|
+
self.step_counter = 0
|
|
42
|
+
|
|
43
|
+
def step(self, verbose=False):
|
|
44
|
+
# compute current interpolation factor
|
|
45
|
+
self.step_counter += 1
|
|
46
|
+
|
|
47
|
+
if self.step_counter < self.start:
|
|
48
|
+
return
|
|
49
|
+
elif self.step_counter < self.stop:
|
|
50
|
+
# update only every self.interval-th interval
|
|
51
|
+
if self.step_counter % self.interval:
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
alpha = ((self.stop - self.step_counter) / (self.stop - self.start)) ** self.exponent
|
|
55
|
+
else:
|
|
56
|
+
alpha = 0
|
|
57
|
+
|
|
58
|
+
self.sparsify(alpha, verbose=verbose)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""
|
|
2
|
+
/* Copyright (c) 2023 Amazon
|
|
3
|
+
Written by Jan Buethe */
|
|
4
|
+
/*
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
- Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
documentation and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
20
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import torch
|
|
31
|
+
|
|
32
|
+
debug=True
|
|
33
|
+
|
|
34
|
+
def sparsify_matrix(matrix : torch.tensor, density : float, block_size, keep_diagonal : bool=False, return_mask : bool=False):
|
|
35
|
+
""" sparsifies matrix with specified block size
|
|
36
|
+
|
|
37
|
+
Parameters:
|
|
38
|
+
-----------
|
|
39
|
+
matrix : torch.tensor
|
|
40
|
+
matrix to sparsify
|
|
41
|
+
density : int
|
|
42
|
+
target density
|
|
43
|
+
block_size : [int, int]
|
|
44
|
+
block size dimensions
|
|
45
|
+
keep_diagonal : bool
|
|
46
|
+
If true, the diagonal will be kept. This option requires block_size[0] == block_size[1] and defaults to False
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
m, n = matrix.shape
|
|
50
|
+
m1, n1 = block_size
|
|
51
|
+
|
|
52
|
+
if m % m1 or n % n1:
|
|
53
|
+
raise ValueError(f"block size {(m1, n1)} does not divide matrix size {(m, n)}")
|
|
54
|
+
|
|
55
|
+
# extract diagonal if keep_diagonal = True
|
|
56
|
+
if keep_diagonal:
|
|
57
|
+
if m != n:
|
|
58
|
+
raise ValueError("Attempting to sparsify non-square matrix with keep_diagonal=True")
|
|
59
|
+
|
|
60
|
+
to_spare = torch.diag(torch.diag(matrix))
|
|
61
|
+
matrix = matrix - to_spare
|
|
62
|
+
else:
|
|
63
|
+
to_spare = torch.zeros_like(matrix)
|
|
64
|
+
|
|
65
|
+
# calculate energy in sub-blocks
|
|
66
|
+
x = torch.reshape(matrix, (m // m1, m1, n // n1, n1))
|
|
67
|
+
x = x ** 2
|
|
68
|
+
block_energies = torch.sum(torch.sum(x, dim=3), dim=1)
|
|
69
|
+
|
|
70
|
+
number_of_blocks = (m * n) // (m1 * n1)
|
|
71
|
+
number_of_survivors = round(number_of_blocks * density)
|
|
72
|
+
|
|
73
|
+
# masking threshold
|
|
74
|
+
if number_of_survivors == 0:
|
|
75
|
+
threshold = 0
|
|
76
|
+
else:
|
|
77
|
+
threshold = torch.sort(torch.flatten(block_energies)).values[-number_of_survivors]
|
|
78
|
+
|
|
79
|
+
# create mask
|
|
80
|
+
mask = torch.ones_like(block_energies)
|
|
81
|
+
mask[block_energies < threshold] = 0
|
|
82
|
+
mask = torch.repeat_interleave(mask, m1, dim=0)
|
|
83
|
+
mask = torch.repeat_interleave(mask, n1, dim=1)
|
|
84
|
+
|
|
85
|
+
# perform masking
|
|
86
|
+
masked_matrix = mask * matrix + to_spare
|
|
87
|
+
|
|
88
|
+
if return_mask:
|
|
89
|
+
return masked_matrix, mask
|
|
90
|
+
else:
|
|
91
|
+
return masked_matrix
|
|
92
|
+
|
|
93
|
+
def calculate_gru_flops_per_step(gru, sparsification_dict=dict(), drop_input=False):
|
|
94
|
+
input_size = gru.input_size
|
|
95
|
+
hidden_size = gru.hidden_size
|
|
96
|
+
flops = 0
|
|
97
|
+
|
|
98
|
+
input_density = (
|
|
99
|
+
sparsification_dict.get('W_ir', [1])[0]
|
|
100
|
+
+ sparsification_dict.get('W_in', [1])[0]
|
|
101
|
+
+ sparsification_dict.get('W_iz', [1])[0]
|
|
102
|
+
) / 3
|
|
103
|
+
|
|
104
|
+
recurrent_density = (
|
|
105
|
+
sparsification_dict.get('W_hr', [1])[0]
|
|
106
|
+
+ sparsification_dict.get('W_hn', [1])[0]
|
|
107
|
+
+ sparsification_dict.get('W_hz', [1])[0]
|
|
108
|
+
) / 3
|
|
109
|
+
|
|
110
|
+
# input matrix vector multiplications
|
|
111
|
+
if not drop_input:
|
|
112
|
+
flops += 2 * 3 * input_size * hidden_size * input_density
|
|
113
|
+
|
|
114
|
+
# recurrent matrix vector multiplications
|
|
115
|
+
flops += 2 * 3 * hidden_size * hidden_size * recurrent_density
|
|
116
|
+
|
|
117
|
+
# biases
|
|
118
|
+
flops += 6 * hidden_size
|
|
119
|
+
|
|
120
|
+
# activations estimated by 10 flops per activation
|
|
121
|
+
flops += 30 * hidden_size
|
|
122
|
+
|
|
123
|
+
return flops
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""
|
|
2
|
+
/* Copyright (c) 2023 Amazon
|
|
3
|
+
Written by Jan Buethe */
|
|
4
|
+
/*
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
- Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
documentation and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
20
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import torch
|
|
31
|
+
|
|
32
|
+
from .base_sparsifier import BaseSparsifier
|
|
33
|
+
from .common import sparsify_matrix, debug
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class Conv1dSparsifier(BaseSparsifier):
|
|
37
|
+
def __init__(self, task_list, start, stop, interval, exponent=3):
|
|
38
|
+
""" Sparsifier for torch.nn.GRUs
|
|
39
|
+
|
|
40
|
+
Parameters:
|
|
41
|
+
-----------
|
|
42
|
+
task_list : list
|
|
43
|
+
task_list contains a list of tuples (conv1d, params), where conv1d is an instance
|
|
44
|
+
of torch.nn.Conv1d and params is a tuple (density, [m, n]),
|
|
45
|
+
where density is the target density in [0, 1], [m, n] is the shape sub-blocks to which
|
|
46
|
+
sparsification is applied.
|
|
47
|
+
|
|
48
|
+
start : int
|
|
49
|
+
training step after which sparsification will be started.
|
|
50
|
+
|
|
51
|
+
stop : int
|
|
52
|
+
training step after which sparsification will be completed.
|
|
53
|
+
|
|
54
|
+
interval : int
|
|
55
|
+
sparsification interval for steps between start and stop. After stop sparsification will be
|
|
56
|
+
carried out after every call to GRUSparsifier.step()
|
|
57
|
+
|
|
58
|
+
exponent : float
|
|
59
|
+
Interpolation exponent for sparsification interval. In step i sparsification will be carried out
|
|
60
|
+
with density (alpha + target_density * (1 * alpha)), where
|
|
61
|
+
alpha = ((stop - i) / (start - stop)) ** exponent
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
--------
|
|
65
|
+
>>> import torch
|
|
66
|
+
>>> conv = torch.nn.Conv1d(8, 16, 8)
|
|
67
|
+
>>> params = (0.2, [8, 4])
|
|
68
|
+
>>> sparsifier = Conv1dSparsifier([(conv, params)], 0, 100, 50)
|
|
69
|
+
>>> for i in range(100):
|
|
70
|
+
... sparsifier.step()
|
|
71
|
+
"""
|
|
72
|
+
super().__init__(task_list, start, stop, interval, exponent=3)
|
|
73
|
+
|
|
74
|
+
self.last_mask = None
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def sparsify(self, alpha, verbose=False):
|
|
78
|
+
""" carries out sparsification step
|
|
79
|
+
|
|
80
|
+
Call this function after optimizer.step in your
|
|
81
|
+
training loop.
|
|
82
|
+
|
|
83
|
+
Parameters:
|
|
84
|
+
----------
|
|
85
|
+
alpha : float
|
|
86
|
+
density interpolation parameter (1: dense, 0: target density)
|
|
87
|
+
verbose : bool
|
|
88
|
+
if true, densities are printed out
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
--------
|
|
92
|
+
None
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
with torch.no_grad():
|
|
97
|
+
for conv, params in self.task_list:
|
|
98
|
+
# reshape weight
|
|
99
|
+
if hasattr(conv, 'weight_v'):
|
|
100
|
+
weight = conv.weight_v
|
|
101
|
+
else:
|
|
102
|
+
weight = conv.weight
|
|
103
|
+
i, o, k = weight.shape
|
|
104
|
+
w = weight.permute(0, 2, 1).flatten(1)
|
|
105
|
+
target_density, block_size = params
|
|
106
|
+
density = alpha + (1 - alpha) * target_density
|
|
107
|
+
w, new_mask = sparsify_matrix(w, density, block_size, return_mask=True)
|
|
108
|
+
w = w.reshape(i, k, o).permute(0, 2, 1)
|
|
109
|
+
weight[:] = w
|
|
110
|
+
|
|
111
|
+
if self.last_mask is not None:
|
|
112
|
+
if not torch.all(self.last_mask * new_mask == new_mask) and debug:
|
|
113
|
+
print("weight resurrection in conv.weight")
|
|
114
|
+
|
|
115
|
+
self.last_mask = new_mask
|
|
116
|
+
|
|
117
|
+
if verbose:
|
|
118
|
+
print(f"conv1d_sparsier[{self.step_counter}]: {density=}")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
if __name__ == "__main__":
|
|
122
|
+
print("Testing sparsifier")
|
|
123
|
+
|
|
124
|
+
import torch
|
|
125
|
+
conv = torch.nn.Conv1d(8, 16, 8)
|
|
126
|
+
params = (0.2, [8, 4])
|
|
127
|
+
|
|
128
|
+
sparsifier = Conv1dSparsifier([(conv, params)], 0, 100, 5)
|
|
129
|
+
|
|
130
|
+
for i in range(100):
|
|
131
|
+
sparsifier.step(verbose=True)
|
|
132
|
+
|
|
133
|
+
print(conv.weight)
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"""
|
|
2
|
+
/* Copyright (c) 2023 Amazon
|
|
3
|
+
Written by Jan Buethe */
|
|
4
|
+
/*
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
- Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
documentation and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
20
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import torch
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
from .base_sparsifier import BaseSparsifier
|
|
34
|
+
from .common import sparsify_matrix, debug
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ConvTranspose1dSparsifier(BaseSparsifier):
|
|
38
|
+
def __init__(self, task_list, start, stop, interval, exponent=3):
|
|
39
|
+
""" Sparsifier for torch.nn.GRUs
|
|
40
|
+
|
|
41
|
+
Parameters:
|
|
42
|
+
-----------
|
|
43
|
+
task_list : list
|
|
44
|
+
task_list contains a list of tuples (conv1d, params), where conv1d is an instance
|
|
45
|
+
of torch.nn.Conv1d and params is a tuple (density, [m, n]),
|
|
46
|
+
where density is the target density in [0, 1], [m, n] is the shape sub-blocks to which
|
|
47
|
+
sparsification is applied.
|
|
48
|
+
|
|
49
|
+
start : int
|
|
50
|
+
training step after which sparsification will be started.
|
|
51
|
+
|
|
52
|
+
stop : int
|
|
53
|
+
training step after which sparsification will be completed.
|
|
54
|
+
|
|
55
|
+
interval : int
|
|
56
|
+
sparsification interval for steps between start and stop. After stop sparsification will be
|
|
57
|
+
carried out after every call to GRUSparsifier.step()
|
|
58
|
+
|
|
59
|
+
exponent : float
|
|
60
|
+
Interpolation exponent for sparsification interval. In step i sparsification will be carried out
|
|
61
|
+
with density (alpha + target_density * (1 * alpha)), where
|
|
62
|
+
alpha = ((stop - i) / (start - stop)) ** exponent
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
--------
|
|
66
|
+
>>> import torch
|
|
67
|
+
>>> conv = torch.nn.ConvTranspose1d(8, 16, 8)
|
|
68
|
+
>>> params = (0.2, [8, 4])
|
|
69
|
+
>>> sparsifier = ConvTranspose1dSparsifier([(conv, params)], 0, 100, 50)
|
|
70
|
+
>>> for i in range(100):
|
|
71
|
+
... sparsifier.step()
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
super().__init__(task_list, start, stop, interval, exponent=3)
|
|
75
|
+
|
|
76
|
+
self.last_mask = None
|
|
77
|
+
|
|
78
|
+
def sparsify(self, alpha, verbose=False):
|
|
79
|
+
""" carries out sparsification step
|
|
80
|
+
|
|
81
|
+
Call this function after optimizer.step in your
|
|
82
|
+
training loop.
|
|
83
|
+
|
|
84
|
+
Parameters:
|
|
85
|
+
----------
|
|
86
|
+
alpha : float
|
|
87
|
+
density interpolation parameter (1: dense, 0: target density)
|
|
88
|
+
verbose : bool
|
|
89
|
+
if true, densities are printed out
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
--------
|
|
93
|
+
None
|
|
94
|
+
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
with torch.no_grad():
|
|
98
|
+
for conv, params in self.task_list:
|
|
99
|
+
# reshape weight
|
|
100
|
+
if hasattr(conv, 'weight_v'):
|
|
101
|
+
weight = conv.weight_v
|
|
102
|
+
else:
|
|
103
|
+
weight = conv.weight
|
|
104
|
+
i, o, k = weight.shape
|
|
105
|
+
w = weight.permute(2, 1, 0).reshape(k * o, i)
|
|
106
|
+
target_density, block_size = params
|
|
107
|
+
density = alpha + (1 - alpha) * target_density
|
|
108
|
+
w, new_mask = sparsify_matrix(w, density, block_size, return_mask=True)
|
|
109
|
+
w = w.reshape(k, o, i).permute(2, 1, 0)
|
|
110
|
+
weight[:] = w
|
|
111
|
+
|
|
112
|
+
if self.last_mask is not None:
|
|
113
|
+
if not torch.all(self.last_mask * new_mask == new_mask) and debug:
|
|
114
|
+
print("weight resurrection in conv.weight")
|
|
115
|
+
|
|
116
|
+
self.last_mask = new_mask
|
|
117
|
+
|
|
118
|
+
if verbose:
|
|
119
|
+
print(f"convtrans1d_sparsier[{self.step_counter}]: {density=}")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
if __name__ == "__main__":
|
|
123
|
+
print("Testing sparsifier")
|
|
124
|
+
|
|
125
|
+
import torch
|
|
126
|
+
conv = torch.nn.ConvTranspose1d(8, 16, 4, 4)
|
|
127
|
+
params = (0.2, [8, 4])
|
|
128
|
+
|
|
129
|
+
sparsifier = ConvTranspose1dSparsifier([(conv, params)], 0, 100, 5)
|
|
130
|
+
|
|
131
|
+
for i in range(100):
|
|
132
|
+
sparsifier.step(verbose=True)
|
|
133
|
+
|
|
134
|
+
print(conv.weight)
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"""
|
|
2
|
+
/* Copyright (c) 2023 Amazon
|
|
3
|
+
Written by Jan Buethe */
|
|
4
|
+
/*
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
- Redistributions of source code must retain the above copyright
|
|
10
|
+
notice, this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer in the
|
|
14
|
+
documentation and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
20
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
import torch
|
|
31
|
+
|
|
32
|
+
from .base_sparsifier import BaseSparsifier
|
|
33
|
+
from .common import sparsify_matrix, debug
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class GRUSparsifier(BaseSparsifier):
|
|
37
|
+
def __init__(self, task_list, start, stop, interval, exponent=3):
|
|
38
|
+
""" Sparsifier for torch.nn.GRUs
|
|
39
|
+
|
|
40
|
+
Parameters:
|
|
41
|
+
-----------
|
|
42
|
+
task_list : list
|
|
43
|
+
task_list contains a list of tuples (gru, sparsify_dict), where gru is an instance
|
|
44
|
+
of torch.nn.GRU and sparsify_dic is a dictionary with keys in {'W_ir', 'W_iz', 'W_in',
|
|
45
|
+
'W_hr', 'W_hz', 'W_hn'} corresponding to the input and recurrent weights for the reset,
|
|
46
|
+
update, and new gate. The values of sparsify_dict are tuples (density, [m, n], keep_diagonal),
|
|
47
|
+
where density is the target density in [0, 1], [m, n] is the shape sub-blocks to which
|
|
48
|
+
sparsification is applied and keep_diagonal is a bool variable indicating whether the diagonal
|
|
49
|
+
should be kept.
|
|
50
|
+
|
|
51
|
+
start : int
|
|
52
|
+
training step after which sparsification will be started.
|
|
53
|
+
|
|
54
|
+
stop : int
|
|
55
|
+
training step after which sparsification will be completed.
|
|
56
|
+
|
|
57
|
+
interval : int
|
|
58
|
+
sparsification interval for steps between start and stop. After stop sparsification will be
|
|
59
|
+
carried out after every call to GRUSparsifier.step()
|
|
60
|
+
|
|
61
|
+
exponent : float
|
|
62
|
+
Interpolation exponent for sparsification interval. In step i sparsification will be carried out
|
|
63
|
+
with density (alpha + target_density * (1 * alpha)), where
|
|
64
|
+
alpha = ((stop - i) / (start - stop)) ** exponent
|
|
65
|
+
|
|
66
|
+
Example:
|
|
67
|
+
--------
|
|
68
|
+
>>> import torch
|
|
69
|
+
>>> gru = torch.nn.GRU(10, 20)
|
|
70
|
+
>>> sparsify_dict = {
|
|
71
|
+
... 'W_ir' : (0.5, [2, 2], False),
|
|
72
|
+
... 'W_iz' : (0.6, [2, 2], False),
|
|
73
|
+
... 'W_in' : (0.7, [2, 2], False),
|
|
74
|
+
... 'W_hr' : (0.1, [4, 4], True),
|
|
75
|
+
... 'W_hz' : (0.2, [4, 4], True),
|
|
76
|
+
... 'W_hn' : (0.3, [4, 4], True),
|
|
77
|
+
... }
|
|
78
|
+
>>> sparsifier = GRUSparsifier([(gru, sparsify_dict)], 0, 100, 50)
|
|
79
|
+
>>> for i in range(100):
|
|
80
|
+
... sparsifier.step()
|
|
81
|
+
"""
|
|
82
|
+
super().__init__(task_list, start, stop, interval, exponent=3)
|
|
83
|
+
|
|
84
|
+
self.last_masks = {key : None for key in ['W_ir', 'W_in', 'W_iz', 'W_hr', 'W_hn', 'W_hz']}
|
|
85
|
+
|
|
86
|
+
def sparsify(self, alpha, verbose=False):
|
|
87
|
+
""" carries out sparsification step
|
|
88
|
+
|
|
89
|
+
Call this function after optimizer.step in your
|
|
90
|
+
training loop.
|
|
91
|
+
|
|
92
|
+
Parameters:
|
|
93
|
+
----------
|
|
94
|
+
alpha : float
|
|
95
|
+
density interpolation parameter (1: dense, 0: target density)
|
|
96
|
+
verbose : bool
|
|
97
|
+
if true, densities are printed out
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
--------
|
|
101
|
+
None
|
|
102
|
+
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
with torch.no_grad():
|
|
106
|
+
for gru, params in self.task_list:
|
|
107
|
+
hidden_size = gru.hidden_size
|
|
108
|
+
|
|
109
|
+
# input weights
|
|
110
|
+
for i, key in enumerate(['W_ir', 'W_iz', 'W_in']):
|
|
111
|
+
if key in params:
|
|
112
|
+
if hasattr(gru, 'weight_ih_l0_v'):
|
|
113
|
+
weight = gru.weight_ih_l0_v
|
|
114
|
+
else:
|
|
115
|
+
weight = gru.weight_ih_l0
|
|
116
|
+
density = alpha + (1 - alpha) * params[key][0]
|
|
117
|
+
if verbose:
|
|
118
|
+
print(f"[{self.step_counter}]: {key} density: {density}")
|
|
119
|
+
|
|
120
|
+
weight[i * hidden_size : (i+1) * hidden_size, : ], new_mask = sparsify_matrix(
|
|
121
|
+
weight[i * hidden_size : (i + 1) * hidden_size, : ],
|
|
122
|
+
density, # density
|
|
123
|
+
params[key][1], # block_size
|
|
124
|
+
params[key][2], # keep_diagonal (might want to set this to False)
|
|
125
|
+
return_mask=True
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
if type(self.last_masks[key]) != type(None):
|
|
129
|
+
if not torch.all(self.last_masks[key] * new_mask == new_mask) and debug:
|
|
130
|
+
print("weight resurrection in weight_ih_l0_v")
|
|
131
|
+
|
|
132
|
+
self.last_masks[key] = new_mask
|
|
133
|
+
|
|
134
|
+
# recurrent weights
|
|
135
|
+
for i, key in enumerate(['W_hr', 'W_hz', 'W_hn']):
|
|
136
|
+
if key in params:
|
|
137
|
+
if hasattr(gru, 'weight_hh_l0_v'):
|
|
138
|
+
weight = gru.weight_hh_l0_v
|
|
139
|
+
else:
|
|
140
|
+
weight = gru.weight_hh_l0
|
|
141
|
+
density = alpha + (1 - alpha) * params[key][0]
|
|
142
|
+
if verbose:
|
|
143
|
+
print(f"[{self.step_counter}]: {key} density: {density}")
|
|
144
|
+
weight[i * hidden_size : (i+1) * hidden_size, : ], new_mask = sparsify_matrix(
|
|
145
|
+
weight[i * hidden_size : (i + 1) * hidden_size, : ],
|
|
146
|
+
density,
|
|
147
|
+
params[key][1], # block_size
|
|
148
|
+
params[key][2], # keep_diagonal (might want to set this to False)
|
|
149
|
+
return_mask=True
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
if type(self.last_masks[key]) != type(None):
|
|
153
|
+
if not torch.all(self.last_masks[key] * new_mask == new_mask) and True:
|
|
154
|
+
print("weight resurrection in weight_hh_l0_v")
|
|
155
|
+
|
|
156
|
+
self.last_masks[key] = new_mask
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
if __name__ == "__main__":
|
|
161
|
+
print("Testing sparsifier")
|
|
162
|
+
|
|
163
|
+
gru = torch.nn.GRU(10, 20)
|
|
164
|
+
sparsify_dict = {
|
|
165
|
+
'W_ir' : (0.5, [2, 2], False),
|
|
166
|
+
'W_iz' : (0.6, [2, 2], False),
|
|
167
|
+
'W_in' : (0.7, [2, 2], False),
|
|
168
|
+
'W_hr' : (0.1, [4, 4], True),
|
|
169
|
+
'W_hz' : (0.2, [4, 4], True),
|
|
170
|
+
'W_hn' : (0.3, [4, 4], True),
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
sparsifier = GRUSparsifier([(gru, sparsify_dict)], 0, 100, 10)
|
|
174
|
+
|
|
175
|
+
for i in range(100):
|
|
176
|
+
sparsifier.step(verbose=True)
|
|
177
|
+
|
|
178
|
+
print(gru.weight_hh_l0)
|