From 5bba9ea5d1df12f67d9b52598e77ec7b2e65ea86 Mon Sep 17 00:00:00 2001 From: JRMeyer Date: Tue, 28 Jan 2020 07:13:15 -0800 Subject: [PATCH 1/6] Transfer-learning support --- DeepSpeech.py | 117 ++++------------- bin/run-tc-transfer.sh | 120 ++++++++++++++++++ .../russian_sample_data/alphabet.ru | 34 +++++ data/smoke_test/russian_sample_data/ru.csv | 2 + data/smoke_test/russian_sample_data/ru.wav | Bin 0 -> 181372 bytes evaluate.py | 24 ++-- util/checkpoints.py | 115 +++++++++++++++++ util/config.py | 17 +++ util/flags.py | 16 ++- util/helpers.py | 11 +- 10 files changed, 337 insertions(+), 119 deletions(-) create mode 100755 bin/run-tc-transfer.sh create mode 100644 data/smoke_test/russian_sample_data/alphabet.ru create mode 100644 data/smoke_test/russian_sample_data/ru.csv create mode 100644 data/smoke_test/russian_sample_data/ru.wav create mode 100644 util/checkpoints.py diff --git a/DeepSpeech.py b/DeepSpeech.py index d25c192b..ba4ce998 100755 --- a/DeepSpeech.py +++ b/DeepSpeech.py @@ -22,13 +22,14 @@ from ds_ctcdecoder import ctc_beam_search_decoder, Scorer from evaluate import evaluate from six.moves import zip, range from tensorflow.python.tools import freeze_graph, strip_unused_lib -from tensorflow.python.framework import errors_impl from util.config import Config, initialize_globals +from util.checkpoints import load_or_init_graph from util.feeding import create_dataset, samples_to_mfccs, audiofile_to_features from util.flags import create_flags, FLAGS +from util.helpers import check_ctcdecoder_version from util.logging import log_info, log_error, log_debug, log_progress, create_progressbar -from util.helpers import check_ctcdecoder_version; check_ctcdecoder_version() +check_ctcdecoder_version() # Graph Creation # ============== @@ -222,7 +223,7 @@ def calculate_mean_edit_distance_and_loss(iterator, dropout, reuse): # Obtain the next batch of data batch_filenames, (batch_x, batch_seq_len), batch_y = iterator.get_next() - if FLAGS.use_cudnn_rnn: + if FLAGS.train_cudnn: rnn_impl = rnn_impl_cudnn_rnn else: rnn_impl = rnn_impl_lstmblockfusedcell @@ -397,30 +398,6 @@ def log_grads_and_vars(grads_and_vars): log_variable(variable, gradient=gradient) -def try_loading(session, saver, checkpoint_filename, caption, load_step=True, log_success=True): - try: - checkpoint = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir, checkpoint_filename) - if not checkpoint: - return False - checkpoint_path = checkpoint.model_checkpoint_path - saver.restore(session, checkpoint_path) - if load_step: - restored_step = session.run(tfv1.train.get_global_step()) - if log_success: - log_info('Restored variables from %s checkpoint at %s, step %d' % - (caption, checkpoint_path, restored_step)) - elif log_success: - log_info('Restored variables from %s checkpoint at %s' % (caption, checkpoint_path)) - return True - except tf.errors.InvalidArgumentError as e: - log_error(str(e)) - log_error('The checkpoint in {0} does not match the shapes of the model.' - ' Did you change alphabet.txt or the --n_hidden parameter' - ' between train runs using the same checkpoint dir? Try moving' - ' or removing the contents of {0}.'.format(checkpoint_path)) - sys.exit(1) - - def train(): do_cache_dataset = True @@ -494,76 +471,29 @@ def train(): # Checkpointing checkpoint_saver = tfv1.train.Saver(max_to_keep=FLAGS.max_to_keep) - checkpoint_path = os.path.join(FLAGS.checkpoint_dir, 'train') + checkpoint_path = os.path.join(FLAGS.save_checkpoint_dir, 'train') best_dev_saver = tfv1.train.Saver(max_to_keep=1) - best_dev_path = os.path.join(FLAGS.checkpoint_dir, 'best_dev') + best_dev_path = os.path.join(FLAGS.save_checkpoint_dir, 'best_dev') # Save flags next to checkpoints - os.makedirs(FLAGS.checkpoint_dir, exist_ok=True) - - flags_file = os.path.join(FLAGS.checkpoint_dir, 'flags.txt') + os.makedirs(FLAGS.save_checkpoint_dir, exist_ok=True) + flags_file = os.path.join(FLAGS.save_checkpoint_dir, 'flags.txt') with open(flags_file, 'w') as fout: fout.write(FLAGS.flags_into_string()) - initializer = tfv1.global_variables_initializer() - with tfv1.Session(config=Config.session_config) as session: log_debug('Session opened.') - # Loading or initializing - loaded = False - - # Initialize training from a CuDNN RNN checkpoint - if FLAGS.cudnn_checkpoint: - if FLAGS.use_cudnn_rnn: - log_error('Trying to use --cudnn_checkpoint but --use_cudnn_rnn ' - 'was specified. The --cudnn_checkpoint flag is only ' - 'needed when converting a CuDNN RNN checkpoint to ' - 'a CPU-capable graph. If your system is capable of ' - 'using CuDNN RNN, you can just specify the CuDNN RNN ' - 'checkpoint normally with --checkpoint_dir.') - sys.exit(1) - - log_info('Converting CuDNN RNN checkpoint from {}'.format(FLAGS.cudnn_checkpoint)) - ckpt = tfv1.train.load_checkpoint(FLAGS.cudnn_checkpoint) - missing_variables = [] - - # Load compatible variables from checkpoint - for v in tfv1.global_variables(): - try: - v.load(ckpt.get_tensor(v.op.name), session=session) - except tf.errors.NotFoundError: - missing_variables.append(v) - - # Check that the only missing variables are the Adam moment tensors - if any('Adam' not in v.op.name for v in missing_variables): - log_error('Tried to load a CuDNN RNN checkpoint but there were ' - 'more missing variables than just the Adam moment ' - 'tensors.') - sys.exit(1) - - # Initialize Adam moment tensors from scratch to allow use of CuDNN - # RNN checkpoints. - log_info('Initializing missing Adam moment tensors.') - init_op = tfv1.variables_initializer(missing_variables) - session.run(init_op) - loaded = True - + # Prevent further graph changes tfv1.get_default_graph().finalize() - if not loaded and FLAGS.load in ['auto', 'last']: - loaded = try_loading(session, checkpoint_saver, 'checkpoint', 'most recent') - if not loaded and FLAGS.load in ['auto', 'best']: - loaded = try_loading(session, best_dev_saver, 'best_dev_checkpoint', 'best validation') - if not loaded: - if FLAGS.load in ['auto', 'init']: - log_info('Initializing variables...') - session.run(initializer) - else: - log_error('Unable to load %s model from specified checkpoint dir' - ' - consider using load option "auto" or "init".' % FLAGS.load) - sys.exit(1) + # Load checkpoint or initialize variables + if FLAGS.load == 'auto': + method_order = ['best', 'last', 'init'] + else: + method_order = [FLAGS.load] + load_or_init_graph(session, method_order) def run_set(set_name, epoch, init_op, dataset=None): is_train = set_name == 'train' @@ -682,7 +612,7 @@ def train(): def test(): - samples = evaluate(FLAGS.test_files.split(','), create_model, try_loading) + samples = evaluate(FLAGS.test_files.split(','), create_model) if FLAGS.test_output_file: # Save decoded tuples as JSON, converting NumPy floats to Python floats json.dump(samples, open(FLAGS.test_output_file, 'w'), default=float) @@ -811,7 +741,7 @@ def export(): saver = tfv1.train.Saver() # Restore variables from training checkpoint - checkpoint = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir) + checkpoint = tf.train.get_checkpoint_state(FLAGS.save_checkpoint_dir) checkpoint_path = checkpoint.model_checkpoint_path output_filename = FLAGS.export_name + '.pb' @@ -891,14 +821,11 @@ def do_single_file_inference(input_file_path): saver = tfv1.train.Saver() # Restore variables from training checkpoint - loaded = False - if not loaded and FLAGS.load in ['auto', 'last']: - loaded = try_loading(session, saver, 'checkpoint', 'most recent', load_step=False) - if not loaded and FLAGS.load in ['auto', 'best']: - loaded = try_loading(session, saver, 'best_dev_checkpoint', 'best validation', load_step=False) - if not loaded: - print('Could not load checkpoint from {}'.format(FLAGS.checkpoint_dir)) - sys.exit(1) + if FLAGS.load == 'auto': + method_order = ['best', 'last'] + else: + method_order = [FLAGS.load] + load_or_init_graph(session, method_order) features, features_len = audiofile_to_features(input_file_path) previous_state_c = np.zeros([1, Config.n_cell_dim]) diff --git a/bin/run-tc-transfer.sh b/bin/run-tc-transfer.sh new file mode 100755 index 00000000..eb127b99 --- /dev/null +++ b/bin/run-tc-transfer.sh @@ -0,0 +1,120 @@ +#!/bin/sh +''' +This bash script is for running minimum working examples +of transfer learning for continuous integration tests +to be run on Taskcluster. +''' +set -xe + +ru_csv="data/smoke_test/russian_sample_data/ru.csv" +epoch_count=$1 + +# Force only one visible device because we have a single-sample dataset +# and when trying to run on multiple devices (like GPUs), this will break +export CUDA_VISIBLE_DEVICES=0 + +echo "##### Train ENGLISH model and transfer to RUSSIAN #####" +echo "##### while iterating over loading logic #####" + +for LOAD in 'init' 'last' 'auto'; do + echo "########################################################" + echo "#### Train ENGLISH model with just --checkpoint_dir ####" + echo "########################################################" + python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + --alphabet_config_path "./data/alphabet.txt" \ + --load "$LOAD" \ + --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ + --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ + --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ + --checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --n_hidden 100 \ + --epochs 10 \ + "$@" + + echo "##############################################################################" + echo "#### Train ENGLISH model with --save_checkpoint_dir --load_checkpoint_dir ####" + echo "##############################################################################" + python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + --alphabet_config_path "./data/alphabet.txt" \ + --load "$LOAD" \ + --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ + --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ + --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --n_hidden 100 \ + --epochs 10 \ + "$@" + + echo "#################################################################################" + echo "#### Transfer Russian model with --save_checkpoint_dir --load_checkpoint_dir ####" + echo "#################################################################################" + python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + --drop_source_layers 1 \ + --alphabet_config_path "${ru_dir}/alphabet.ru" \ + --load 'last' \ + --train_files "${ru_dir}/ru.csv" --train_batch_size 1 \ + --dev_files "${ru_dir}/ru.csv" --dev_batch_size 1 \ + --test_files "${ru_dir}/ru.csv" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/ru-cudnn' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --n_hidden 100 \ + --epochs 10 \ + "$@" +done + +echo "#######################################################" +echo "##### Train ENGLISH model and transfer to RUSSIAN #####" +echo "##### while iterating over loading logic with CUDNN ###" +echo "#######################################################" + +for LOAD in 'init' 'last' 'auto'; do + echo "########################################################" + echo "#### Train ENGLISH model with just --checkpoint_dir ####" + echo "########################################################" + python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + --train_cudnn\ + --alphabet_config_path "./data/alphabet.txt" \ + --load "$LOAD" \ + --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ + --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ + --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ + --checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --n_hidden 100 \ + --epochs 10 \ + "$@" + + + echo "##############################################################################" + echo "#### Train ENGLISH model with --save_checkpoint_dir --load_checkpoint_dir ####" + echo "##############################################################################" + python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + --train_cudnn\ + --alphabet_config_path "./data/alphabet.txt" \ + --load "$LOAD" \ + --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ + --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ + --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --n_hidden 100 \ + --epochs 10 \ + "$@" + + echo "####################################################################################" + echo "#### Transfer to RUSSIAN model with --save_checkpoint_dir --load_checkpoint_dir ####" + echo "####################################################################################" + python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + --load_cudnn\ + --drop_source_layers 1 \ + --alphabet_config_path "${ru_dir}/alphabet.ru" \ + --load 'last' \ + --train_files "${ru_dir}/ru.csv" --train_batch_size 1 \ + --dev_files "${ru_dir}/ru.csv" --dev_batch_size 1 \ + --test_files "${ru_dir}/ru.csv" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/ru-cudnn' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --n_hidden 100 \ + --epochs 10 \ + "$@" +done diff --git a/data/smoke_test/russian_sample_data/alphabet.ru b/data/smoke_test/russian_sample_data/alphabet.ru new file mode 100644 index 00000000..6dc0e3cc --- /dev/null +++ b/data/smoke_test/russian_sample_data/alphabet.ru @@ -0,0 +1,34 @@ + +о +е +а +и +н +т +с +л +в +р +к +м +д +п +ы +у +б +я +ь +г +з +ч +й +ж +х +ш +ю +ц +э +щ +ф +ё +ъ diff --git a/data/smoke_test/russian_sample_data/ru.csv b/data/smoke_test/russian_sample_data/ru.csv new file mode 100644 index 00000000..18aeb63b --- /dev/null +++ b/data/smoke_test/russian_sample_data/ru.csv @@ -0,0 +1,2 @@ +wav_filename,wav_filesize,transcript +ru.wav,0,бедняга ребят на его месте должен был быть я \ No newline at end of file diff --git a/data/smoke_test/russian_sample_data/ru.wav b/data/smoke_test/russian_sample_data/ru.wav new file mode 100644 index 0000000000000000000000000000000000000000..668084e69b2337f8b5a84f64c57c1bc275870bf4 GIT binary patch literal 181372 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 0: + # This transfer learning approach requires supplying + # the layers which we exclude from the source model. + # Say we want to exclude all layers except for the first one, + # then we are dropping five layers total, so: drop_source_layers=5 + # If we want to use all layers from the source model except + # the last one, we use this: drop_source_layers=1 + if FLAGS.drop_source_layers >= 6: + log_warn('The checkpoint only has 6 layers, but you are trying to drop ' + 'all of them or more than all of them. Continuing and ' + 'dropping only 5 layers.') + FLAGS.drop_source_layers = 5 + + dropped_layers = ['2', '3', 'lstm', '5', '6'][-1 * int(FLAGS.drop_source_layers):] + # Initialize all variables needed for DS, but not loaded from ckpt + for v in load_vars: + if any(layer in v.op.name for layer in dropped_layers): + init_vars.add(v) + load_vars -= init_vars + + for v in load_vars: + log_info('Loading variable from checkpoint: %s' % (v.op.name)) + v.load(ckpt.get_tensor(v.op.name), session=session) + + for v in init_vars: + log_info('Initializing variable: %s' % (v.op.name)) + session.run(v.initializer) + + +def _checkpoint_path_or_none(checkpoint_filename): + checkpoint = tfv1.train.get_checkpoint_state(FLAGS.load_checkpoint_dir, checkpoint_filename) + if not checkpoint: + return None + return checkpoint.model_checkpoint_path + + +def _initialize_all_variables(session): + init_vars = tfv1.global_variables() + for v in init_vars: + session.run(v.initializer) + + +def load_or_init_graph(session, method_order): + ''' + Load variables from checkpoint or initialize variables following the method + order specified in the method_order parameter. + + Valid methods are 'best', 'last' and 'init'. + ''' + for method in method_order: + # Load best validating checkpoint, saved in checkpoint file 'best_dev_checkpoint' + if method == 'best': + ckpt_path = _checkpoint_path_or_none('best_dev_checkpoint') + if ckpt_path: + log_info('Loading best validating checkpoint from {}'.format(ckpt_path)) + return _load_checkpoint(session, ckpt_path) + log_info('Could not find best validating checkpoint.') + + # Load most recent checkpoint, saved in checkpoint file 'checkpoint' + elif method == 'last': + ckpt_path = _checkpoint_path_or_none('checkpoint') + if ckpt_path: + log_info('Loading most recent checkpoint from {}'.format(ckpt_path)) + return _load_checkpoint(session, ckpt_path) + log_info('Could not find most recent checkpoint.') + + # Initialize all variables + elif method == 'init': + log_info('Initializing all variables.') + return _initialize_all_variables(session) + + else: + log_error('Unknown initialization method: {}'.format(method)) + sys.exit(1) + + log_error('All initialization methods failed ({}).'.format(method_order)) + sys.exit(1) diff --git a/util/config.py b/util/config.py index 3cd23566..0e3a719b 100755 --- a/util/config.py +++ b/util/config.py @@ -124,4 +124,21 @@ def initialize_globals(): log_error('Path specified in --one_shot_infer is not a valid file.') sys.exit(1) + if FLAGS.train_cudnn and FLAGS.load_cudnn: + log_error('Trying to use --train_cudnn, but --load_cudnn ' + 'was also specified. The --load_cudnn flag is only ' + 'needed when converting a CuDNN RNN checkpoint to ' + 'a CPU-capable graph. If your system is capable of ' + 'using CuDNN RNN, you can just specify the CuDNN RNN ' + 'checkpoint normally with --save_checkpoint_dir.') + sys.exit(1) + + # If separate save and load flags were not specified, default to load and save + # from the same dir. + if not FLAGS.save_checkpoint_dir: + FLAGS.save_checkpoint_dir = FLAGS.checkpoint_dir + + if not FLAGS.load_checkpoint_dir: + FLAGS.load_checkpoint_dir = FLAGS.checkpoint_dir + ConfigSingleton._config = c # pylint: disable=protected-access diff --git a/util/flags.py b/util/flags.py index 9f31aae4..5b5fee0d 100644 --- a/util/flags.py +++ b/util/flags.py @@ -49,7 +49,6 @@ def create_flags(): f.DEFINE_float('augmentation_pitch_and_tempo_scaling_max_pitch', 1.2, 'max value of pitch scaling') f.DEFINE_float('augmentation_pitch_and_tempo_scaling_max_tempo', 1.2, 'max vlaue of tempo scaling') - # Global Constants # ================ @@ -84,9 +83,8 @@ def create_flags(): f.DEFINE_integer('inter_op_parallelism_threads', 0, 'number of inter-op parallelism threads - see tf.ConfigProto for more details. USE OF THIS FLAG IS UNSUPPORTED') f.DEFINE_integer('intra_op_parallelism_threads', 0, 'number of intra-op parallelism threads - see tf.ConfigProto for more details. USE OF THIS FLAG IS UNSUPPORTED') f.DEFINE_boolean('use_allow_growth', False, 'use Allow Growth flag which will allocate only required amount of GPU memory and prevent full allocation of available GPU memory') - f.DEFINE_boolean('use_cudnn_rnn', False, 'use CuDNN RNN backend for training on GPU. Note that checkpoints created with this flag can only be used with CuDNN RNN, i.e. fine tuning on a CPU device will not work') - f.DEFINE_string('cudnn_checkpoint', '', 'path to a checkpoint created using --use_cudnn_rnn. Specifying this flag allows one to convert a CuDNN RNN checkpoint to a checkpoint capable of running on a CPU graph.') - + f.DEFINE_boolean('load_cudnn', False, 'Specifying this flag allows one to convert a CuDNN RNN checkpoint to a checkpoint capable of running on a CPU graph.') + f.DEFINE_boolean('train_cudnn', False, 'use CuDNN RNN backend for training on GPU. Note that checkpoints created with this flag can only be used with CuDNN RNN, i.e. fine tuning on a CPU device will not work') f.DEFINE_boolean('automatic_mixed_precision', False, 'whether to allow automatic mixed precision training. USE OF THIS FLAG IS UNSUPPORTED. Checkpoints created with automatic mixed precision training will not be usable without mixed precision.') # Sample limits @@ -97,10 +95,16 @@ def create_flags(): # Checkpointing - f.DEFINE_string('checkpoint_dir', '', 'directory in which checkpoints are stored - defaults to directory "deepspeech/checkpoints" within user\'s data home specified by the XDG Base Directory Specification') + f.DEFINE_string('checkpoint_dir', '', 'directory from which checkpoints are loaded and to which they are saved - defaults to directory "deepspeech/checkpoints" within user\'s data home specified by the XDG Base Directory Specification') + f.DEFINE_string('load_checkpoint_dir', '', 'directory in which checkpoints are stored - defaults to directory "deepspeech/checkpoints" within user\'s data home specified by the XDG Base Directory Specification') + f.DEFINE_string('save_checkpoint_dir', '', 'directory to which checkpoints are saved - defaults to directory "deepspeech/checkpoints" within user\'s data home specified by the XDG Base Directory Specification') f.DEFINE_integer('checkpoint_secs', 600, 'checkpoint saving interval in seconds') f.DEFINE_integer('max_to_keep', 5, 'number of checkpoint files to keep - default value is 5') - f.DEFINE_string('load', 'auto', '"last" for loading most recent epoch checkpoint, "best" for loading best validated checkpoint, "init" for initializing a fresh model, "auto" for trying the other options in order last > best > init') + f.DEFINE_string('load', 'auto', '"last" for loading most recent epoch checkpoint, "best" for loading best validation loss checkpoint, "init" for initializing a fresh model, "transfer" for transfer learning, "auto" for trying several options.') + + # Transfer Learning + + f.DEFINE_integer('drop_source_layers', 0, 'single integer for how many layers to drop from source model (to drop just output == 1, drop penultimate and output ==2, etc)') # Exporting diff --git a/util/helpers.py b/util/helpers.py index bc143463..cd4f4b03 100644 --- a/util/helpers.py +++ b/util/helpers.py @@ -1,3 +1,7 @@ +import os +import semver +import sys + def keep_only_digits(txt): return ''.join(filter(lambda c: c.isdigit(), txt)) @@ -8,15 +12,12 @@ def secs_to_hours(secs): minutes, seconds = divmod(remainder, 60) return '%d:%02d:%02d' % (hours, minutes, seconds) -# pylint: disable=import-outside-toplevel -def check_ctcdecoder_version(): - import sys - import os - import semver +def check_ctcdecoder_version(): ds_version_s = open(os.path.join(os.path.dirname(__file__), '../VERSION')).read().strip() try: + # pylint: disable=import-outside-toplevel from ds_ctcdecoder import __version__ as decoder_version except ImportError as e: if e.msg.find('__version__') > 0: From f32fd7a33fb3ec6e69b9881831ed64d37c95902a Mon Sep 17 00:00:00 2001 From: Reuben Morais Date: Sun, 16 Feb 2020 19:22:57 +0100 Subject: [PATCH 2/6] Add transfer learning test --- bin/run-tc-ldc93s1_checkpoint.sh | 2 +- bin/run-tc-transfer.sh | 117 +++++++++--------- taskcluster/tc-transfer-tests.sh | 65 ++++++++++ .../test-transfer-linux-amd64-py36m-opt.yml | 12 ++ util/checkpoints.py | 4 +- 5 files changed, 140 insertions(+), 60 deletions(-) create mode 100644 taskcluster/tc-transfer-tests.sh create mode 100644 taskcluster/test-transfer-linux-amd64-py36m-opt.yml diff --git a/bin/run-tc-ldc93s1_checkpoint.sh b/bin/run-tc-ldc93s1_checkpoint.sh index 0602dada..9dc4e84e 100755 --- a/bin/run-tc-ldc93s1_checkpoint.sh +++ b/bin/run-tc-ldc93s1_checkpoint.sh @@ -23,7 +23,7 @@ python -u DeepSpeech.py --noshow_progressbar --noearly_stop \ --learning_rate 0.001 --dropout_rate 0.05 \ --scorer_path 'data/smoke_test/pruned_lm.scorer' | tee /tmp/resume.log -if ! grep "Restored variables from most recent checkpoint" /tmp/resume.log; then +if ! grep "Loading best validating checkpoint from" /tmp/resume.log; then echo "Did not resume training from checkpoint" exit 1 else diff --git a/bin/run-tc-transfer.sh b/bin/run-tc-transfer.sh index eb127b99..c315e749 100755 --- a/bin/run-tc-transfer.sh +++ b/bin/run-tc-transfer.sh @@ -1,13 +1,19 @@ #!/bin/sh -''' -This bash script is for running minimum working examples -of transfer learning for continuous integration tests -to be run on Taskcluster. -''' +# This bash script is for running minimum working examples +# of transfer learning for continuous integration tests +# to be run on Taskcluster. set -xe -ru_csv="data/smoke_test/russian_sample_data/ru.csv" -epoch_count=$1 +ru_dir="./data/smoke_test/russian_sample_data" +ru_csv="${ru_dir}/ru.csv" + +ldc93s1_dir="./data/smoke_test" +ldc93s1_csv="${ldc93s1_dir}/ldc93s1.csv" + +if [ ! -f "${ldc93s1_dir}/ldc93s1.csv" ]; then + echo "Downloading and preprocessing LDC93S1 example data, saving in ${ldc93s1_dir}." + python -u bin/import_ldc93s1.py ${ldc93s1_dir} +fi; # Force only one visible device because we have a single-sample dataset # and when trying to run on multiple devices (like GPUs), this will break @@ -20,101 +26,98 @@ for LOAD in 'init' 'last' 'auto'; do echo "########################################################" echo "#### Train ENGLISH model with just --checkpoint_dir ####" echo "########################################################" - python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + python -u DeepSpeech.py --noshow_progressbar --noearly_stop \ --alphabet_config_path "./data/alphabet.txt" \ --load "$LOAD" \ - --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ - --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ - --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ - --checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --train_files "${ldc93s1_csv}" --train_batch_size 1 \ + --dev_files "${ldc93s1_csv}" --dev_batch_size 1 \ + --test_files "${ldc93s1_csv}" --test_batch_size 1 \ + --scorer_path '' \ + --checkpoint_dir '/tmp/ckpt/transfer/eng' \ --n_hidden 100 \ - --epochs 10 \ - "$@" + --epochs 10 echo "##############################################################################" echo "#### Train ENGLISH model with --save_checkpoint_dir --load_checkpoint_dir ####" echo "##############################################################################" - python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + python -u DeepSpeech.py --noshow_progressbar --noearly_stop \ --alphabet_config_path "./data/alphabet.txt" \ --load "$LOAD" \ - --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ - --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ - --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ - --save_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ - --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --train_files "${ldc93s1_csv}" --train_batch_size 1 \ + --dev_files "${ldc93s1_csv}" --dev_batch_size 1 \ + --test_files "${ldc93s1_csv}" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/eng' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng' \ + --scorer_path '' \ --n_hidden 100 \ - --epochs 10 \ - "$@" + --epochs 10 echo "#################################################################################" echo "#### Transfer Russian model with --save_checkpoint_dir --load_checkpoint_dir ####" echo "#################################################################################" - python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ + python -u DeepSpeech.py --noshow_progressbar --noearly_stop \ --drop_source_layers 1 \ --alphabet_config_path "${ru_dir}/alphabet.ru" \ --load 'last' \ - --train_files "${ru_dir}/ru.csv" --train_batch_size 1 \ - --dev_files "${ru_dir}/ru.csv" --dev_batch_size 1 \ - --test_files "${ru_dir}/ru.csv" --test_batch_size 1 \ - --save_checkpoint_dir '/tmp/ckpt/transfer/ru-cudnn' \ - --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --train_files "${ru_csv}" --train_batch_size 1 \ + --dev_files "${ru_csv}" --dev_batch_size 1 \ + --test_files "${ru_csv}" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/ru' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng' \ + --scorer_path '' \ --n_hidden 100 \ - --epochs 10 \ - "$@" + --epochs 10 done echo "#######################################################" echo "##### Train ENGLISH model and transfer to RUSSIAN #####" -echo "##### while iterating over loading logic with CUDNN ###" +echo "##### while iterating over loading logic #####" echo "#######################################################" for LOAD in 'init' 'last' 'auto'; do echo "########################################################" echo "#### Train ENGLISH model with just --checkpoint_dir ####" echo "########################################################" - python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ - --train_cudnn\ + python -u DeepSpeech.py --noshow_progressbar --noearly_stop \ --alphabet_config_path "./data/alphabet.txt" \ --load "$LOAD" \ - --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ - --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ - --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ - --checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --train_files "${ldc93s1_csv}" --train_batch_size 1 \ + --dev_files "${ldc93s1_csv}" --dev_batch_size 1 \ + --test_files "${ldc93s1_csv}" --test_batch_size 1 \ + --checkpoint_dir '/tmp/ckpt/transfer/eng' \ + --scorer_path '' \ --n_hidden 100 \ - --epochs 10 \ - "$@" + --epochs 10 echo "##############################################################################" echo "#### Train ENGLISH model with --save_checkpoint_dir --load_checkpoint_dir ####" echo "##############################################################################" - python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ - --train_cudnn\ + python -u DeepSpeech.py --noshow_progressbar --noearly_stop \ --alphabet_config_path "./data/alphabet.txt" \ --load "$LOAD" \ - --train_files "./data/ldc93s1/ldc93s1.csv" --train_batch_size 1 \ - --dev_files "./data/ldc93s1/ldc93s1.csv" --dev_batch_size 1 \ - --test_files "./data/ldc93s1/ldc93s1.csv" --test_batch_size 1 \ - --save_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ - --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --train_files "${ldc93s1_csv}" --train_batch_size 1 \ + --dev_files "${ldc93s1_csv}" --dev_batch_size 1 \ + --test_files "${ldc93s1_csv}" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/eng' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng' \ + --scorer_path '' \ --n_hidden 100 \ - --epochs 10 \ - "$@" + --epochs 10 echo "####################################################################################" echo "#### Transfer to RUSSIAN model with --save_checkpoint_dir --load_checkpoint_dir ####" echo "####################################################################################" - python -u DeepSpeech.py --noshow_progressbar --noearly_stop\ - --load_cudnn\ + python -u DeepSpeech.py --noshow_progressbar --noearly_stop \ --drop_source_layers 1 \ --alphabet_config_path "${ru_dir}/alphabet.ru" \ --load 'last' \ - --train_files "${ru_dir}/ru.csv" --train_batch_size 1 \ - --dev_files "${ru_dir}/ru.csv" --dev_batch_size 1 \ - --test_files "${ru_dir}/ru.csv" --test_batch_size 1 \ - --save_checkpoint_dir '/tmp/ckpt/transfer/ru-cudnn' \ - --load_checkpoint_dir '/tmp/ckpt/transfer/eng-cudnn' \ + --train_files "${ru_csv}" --train_batch_size 1 \ + --dev_files "${ru_csv}" --dev_batch_size 1 \ + --test_files "${ru_csv}" --test_batch_size 1 \ + --save_checkpoint_dir '/tmp/ckpt/transfer/ru' \ + --load_checkpoint_dir '/tmp/ckpt/transfer/eng' \ + --scorer_path '' \ --n_hidden 100 \ - --epochs 10 \ - "$@" + --epochs 10 done diff --git a/taskcluster/tc-transfer-tests.sh b/taskcluster/tc-transfer-tests.sh new file mode 100644 index 00000000..f0a963a6 --- /dev/null +++ b/taskcluster/tc-transfer-tests.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +set -xe + +source $(dirname "$0")/tc-tests-utils.sh + +pyver_full=$1 + +if [ -z "${pyver_full}" ]; then + echo "No python version given, aborting." + exit 1 +fi; + +pyver=$(echo "${pyver_full}" | cut -d':' -f1) + +# 2.7.x => 27 +pyver_pkg=$(echo "${pyver}" | cut -d'.' -f1,2 | tr -d '.') + +py_unicode_type=$(echo "${pyver_full}" | cut -d':' -f2) +if [ "${py_unicode_type}" = "m" ]; then + pyconf="ucs2" +elif [ "${py_unicode_type}" = "mu" ]; then + pyconf="ucs4" +fi; + +unset PYTHON_BIN_PATH +unset PYTHONPATH +export PYENV_ROOT="${HOME}/ds-train/.pyenv" +export PATH="${PYENV_ROOT}/bin:${HOME}/bin:$PATH" + +mkdir -p ${PYENV_ROOT} || true +mkdir -p ${TASKCLUSTER_ARTIFACTS} || true +mkdir -p /tmp/train || true +mkdir -p /tmp/train_tflite || true + +install_pyenv "${PYENV_ROOT}" +install_pyenv_virtualenv "$(pyenv root)/plugins/pyenv-virtualenv" + +PYENV_NAME=deepspeech-train +PYTHON_CONFIGURE_OPTS="--enable-unicode=${pyconf}" pyenv install ${pyver} +pyenv virtualenv ${pyver} ${PYENV_NAME} +source ${PYENV_ROOT}/versions/${pyver}/envs/${PYENV_NAME}/bin/activate + +set -o pipefail +pip install --upgrade pip==19.3.1 setuptools==45.0.0 wheel==0.33.6 | cat +pip install --upgrade -r ${HOME}/DeepSpeech/ds/requirements.txt | cat +set +o pipefail + +pushd ${HOME}/DeepSpeech/ds/ + verify_ctcdecoder_url +popd + +platform=$(python -c 'import sys; import platform; plat = platform.system().lower(); arch = platform.machine().lower(); plat = "manylinux1" if plat == "linux" and arch == "x86_64" else plat; plat = "macosx_10_10" if plat == "darwin" else plat; sys.stdout.write("%s_%s" % (plat, platform.machine()));') +whl_ds_version="$(python -c 'from pkg_resources import parse_version; print(parse_version("'${DS_VERSION}'"))')" +decoder_pkg="ds_ctcdecoder-${whl_ds_version}-cp${pyver_pkg}-cp${pyver_pkg}${py_unicode_type}-${platform}.whl" + +decoder_pkg_url=${DECODER_ARTIFACTS_ROOT}/${decoder_pkg} + +LD_LIBRARY_PATH=${PY37_LDPATH}:$LD_LIBRARY_PATH pip install --verbose --only-binary :all: ${PY37_SOURCE_PACKAGE} ${decoder_pkg_url} | cat + +pushd ${HOME}/DeepSpeech/ds/ + time ./bin/run-tc-transfer.sh +popd + +deactivate diff --git a/taskcluster/test-transfer-linux-amd64-py36m-opt.yml b/taskcluster/test-transfer-linux-amd64-py36m-opt.yml new file mode 100644 index 00000000..dc084c98 --- /dev/null +++ b/taskcluster/test-transfer-linux-amd64-py36m-opt.yml @@ -0,0 +1,12 @@ +build: + template_file: test-linux-opt-base.tyml + dependencies: + - "linux-amd64-ctc-opt" + system_setup: + > + apt-get -qq -y install ${python.packages_trusty.apt} + args: + tests_cmdline: "${system.homedir.linux}/DeepSpeech/ds/taskcluster/tc-transfer-tests.sh 3.6.4:m" + metadata: + name: "DeepSpeech Linux AMD64 CPU transfer learning Py3.6" + description: "Training a DeepSpeech LDC93S1 model with transfer learning for Linux/AMD64 16kHz Python 3.6, CPU only, optimized version" diff --git a/util/checkpoints.py b/util/checkpoints.py index 837470f9..753c5fde 100644 --- a/util/checkpoints.py +++ b/util/checkpoints.py @@ -56,11 +56,11 @@ def _load_checkpoint(session, checkpoint_path): init_vars.add(v) load_vars -= init_vars - for v in load_vars: + for v in sorted(load_vars, key=lambda v: v.op.name): log_info('Loading variable from checkpoint: %s' % (v.op.name)) v.load(ckpt.get_tensor(v.op.name), session=session) - for v in init_vars: + for v in sorted(init_vars, key=lambda v: v.op.name): log_info('Initializing variable: %s' % (v.op.name)) session.run(v.initializer) From cedd72da9b74fc926cd4d764c3a56b3893e2d0a6 Mon Sep 17 00:00:00 2001 From: Reuben Morais Date: Mon, 17 Feb 2020 10:46:40 +0100 Subject: [PATCH 3/6] Force UTF-8 IO encoding --- bin/run-tc-transfer.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/run-tc-transfer.sh b/bin/run-tc-transfer.sh index c315e749..164e1b0b 100755 --- a/bin/run-tc-transfer.sh +++ b/bin/run-tc-transfer.sh @@ -19,6 +19,9 @@ fi; # and when trying to run on multiple devices (like GPUs), this will break export CUDA_VISIBLE_DEVICES=0 +# Force UTF-8 output +export PYTHONIOENCODING=utf-8 + echo "##### Train ENGLISH model and transfer to RUSSIAN #####" echo "##### while iterating over loading logic #####" From c46d8396bc8fc4ffc820feefc8b67e7fa23cd203 Mon Sep 17 00:00:00 2001 From: Reuben Morais Date: Mon, 17 Feb 2020 12:45:37 +0100 Subject: [PATCH 4/6] Respect --load when exporting --- DeepSpeech.py | 62 ++++++++++++++++++++------------------------------- 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/DeepSpeech.py b/DeepSpeech.py index ba4ce998..27f801b9 100755 --- a/DeepSpeech.py +++ b/DeepSpeech.py @@ -21,7 +21,6 @@ from datetime import datetime from ds_ctcdecoder import ctc_beam_search_decoder, Scorer from evaluate import evaluate from six.moves import zip, range -from tensorflow.python.tools import freeze_graph, strip_unused_lib from util.config import Config, initialize_globals from util.checkpoints import load_or_init_graph from util.feeding import create_dataset, samples_to_mfccs, audiofile_to_features @@ -733,49 +732,40 @@ def export(): if FLAGS.export_language: outputs['metadata_language'] = tf.constant([FLAGS.export_language.encode('utf-8')], name='metadata_language') + # Prevent further graph changes + tfv1.get_default_graph().finalize() + output_names_tensors = [tensor.op.name for tensor in outputs.values() if isinstance(tensor, Tensor)] output_names_ops = [op.name for op in outputs.values() if isinstance(op, Operation)] - output_names = ",".join(output_names_tensors + output_names_ops) + output_names = output_names_tensors + output_names_ops - # Create a saver using variables from the above newly created graph - saver = tfv1.train.Saver() + with tf.Session() as session: + # Restore variables from checkpoint + if FLAGS.load == 'auto': + method_order = ['best', 'last'] + else: + method_order = [FLAGS.load] + load_or_init_graph(session, method_order) - # Restore variables from training checkpoint - checkpoint = tf.train.get_checkpoint_state(FLAGS.save_checkpoint_dir) - checkpoint_path = checkpoint.model_checkpoint_path + output_filename = FLAGS.export_name + '.pb' + if FLAGS.remove_export: + if os.path.isdir(FLAGS.export_dir): + log_info('Removing old export') + shutil.rmtree(FLAGS.export_dir) - output_filename = FLAGS.export_name + '.pb' - if FLAGS.remove_export: - if os.path.isdir(FLAGS.export_dir): - log_info('Removing old export') - shutil.rmtree(FLAGS.export_dir) - try: output_graph_path = os.path.join(FLAGS.export_dir, output_filename) if not os.path.isdir(FLAGS.export_dir): os.makedirs(FLAGS.export_dir) - def do_graph_freeze(output_file=None, output_node_names=None, variables_blacklist=''): - frozen = freeze_graph.freeze_graph_with_def_protos( - input_graph_def=tfv1.get_default_graph().as_graph_def(), - input_saver_def=saver.as_saver_def(), - input_checkpoint=checkpoint_path, - output_node_names=output_node_names, - restore_op_name=None, - filename_tensor_name=None, - output_graph=output_file, - clear_devices=False, - variable_names_blacklist=variables_blacklist, - initializer_nodes='') + frozen_graph = tfv1.graph_util.convert_variables_to_constants( + sess=session, + input_graph_def=tfv1.get_default_graph().as_graph_def(), + output_node_names=output_names) - input_node_names = [] - return strip_unused_lib.strip_unused( - input_graph_def=frozen, - input_node_names=input_node_names, - output_node_names=output_node_names.split(','), - placeholder_type_enum=tf.float32.as_datatype_enum) - - frozen_graph = do_graph_freeze(output_node_names=output_names) + frozen_graph = tfv1.graph_util.extract_sub_graph( + graph_def=frozen_graph, + dest_nodes=output_names) if not FLAGS.export_tflite: with open(output_graph_path, 'wb') as fout: @@ -784,7 +774,7 @@ def export(): output_tflite_path = os.path.join(FLAGS.export_dir, output_filename.replace('.pb', '.tflite')) converter = tf.lite.TFLiteConverter(frozen_graph, input_tensors=inputs.values(), output_tensors=outputs.values()) - converter.optimizations = [ tf.lite.Optimize.DEFAULT ] + converter.optimizations = [tf.lite.Optimize.DEFAULT] # AudioSpectrogram and Mfcc ops are custom but have built-in kernels in TFLite converter.allow_custom_ops = True tflite_model = converter.convert() @@ -792,11 +782,7 @@ def export(): with open(output_tflite_path, 'wb') as fout: fout.write(tflite_model) - log_info('Exported model for TF Lite engine as {}'.format(os.path.basename(output_tflite_path))) - log_info('Models exported at %s' % (FLAGS.export_dir)) - except RuntimeError as e: - log_error(str(e)) def package_zip(): # --export_dir path/to/export/LANG_CODE/ => path/to/export/LANG_CODE.zip From 0e2f34f8cfb499538dad9aa55617a75ef24b0815 Mon Sep 17 00:00:00 2001 From: Reuben Morais Date: Mon, 17 Feb 2020 12:46:00 +0100 Subject: [PATCH 5/6] Synchronize TensorFlow logging with --log_level flag --- DeepSpeech.py | 10 +++++++++- util/flags.py | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/DeepSpeech.py b/DeepSpeech.py index 27f801b9..96a8ba5c 100755 --- a/DeepSpeech.py +++ b/DeepSpeech.py @@ -6,7 +6,8 @@ import os import sys LOG_LEVEL_INDEX = sys.argv.index('--log_level') + 1 if '--log_level' in sys.argv else 0 -os.environ['TF_CPP_MIN_LOG_LEVEL'] = sys.argv[LOG_LEVEL_INDEX] if 0 < LOG_LEVEL_INDEX < len(sys.argv) else '3' +DESIRED_LOG_LEVEL = sys.argv[LOG_LEVEL_INDEX] if 0 < LOG_LEVEL_INDEX < len(sys.argv) else '3' +os.environ['TF_CPP_MIN_LOG_LEVEL'] = DESIRED_LOG_LEVEL import absl.app import json @@ -17,6 +18,13 @@ import tensorflow as tf import tensorflow.compat.v1 as tfv1 import time +tfv1.logging.set_verbosity({ + '0': tfv1.logging.DEBUG, + '1': tfv1.logging.INFO, + '2': tfv1.logging.WARN, + '3': tfv1.logging.ERROR +}.get(DESIRED_LOG_LEVEL)) + from datetime import datetime from ds_ctcdecoder import ctc_beam_search_decoder, Scorer from evaluate import evaluate diff --git a/util/flags.py b/util/flags.py index 5b5fee0d..6f3d1bea 100644 --- a/util/flags.py +++ b/util/flags.py @@ -119,7 +119,7 @@ def create_flags(): # Reporting - f.DEFINE_integer('log_level', 1, 'log level for console logs - 0: INFO, 1: WARN, 2: ERROR, 3: FATAL') + f.DEFINE_integer('log_level', 1, 'log level for console logs - 0: DEBUG, 1: INFO, 2: WARN, 3: ERROR') f.DEFINE_boolean('show_progressbar', True, 'Show progress for training, validation and testing processes. Log level should be > 0.') f.DEFINE_boolean('log_placement', False, 'whether to log device placement of the operators to the console') From bd8b96c19dc1b640705279401a8d8fa17263e022 Mon Sep 17 00:00:00 2001 From: Reuben Morais Date: Mon, 17 Feb 2020 12:46:32 +0100 Subject: [PATCH 6/6] Remove unneeded Saver instances --- DeepSpeech.py | 3 --- evaluate.py | 3 --- 2 files changed, 6 deletions(-) diff --git a/DeepSpeech.py b/DeepSpeech.py index 96a8ba5c..dabb3143 100755 --- a/DeepSpeech.py +++ b/DeepSpeech.py @@ -811,9 +811,6 @@ def do_single_file_inference(input_file_path): with tfv1.Session(config=Config.session_config) as session: inputs, outputs, _ = create_inference_graph(batch_size=1, n_steps=-1) - # Create a saver using variables from the above newly created graph - saver = tfv1.train.Saver() - # Restore variables from training checkpoint if FLAGS.load == 'auto': method_order = ['best', 'last'] diff --git a/evaluate.py b/evaluate.py index 6a8149be..d0ce3231 100755 --- a/evaluate.py +++ b/evaluate.py @@ -81,9 +81,6 @@ def evaluate(test_csvs, create_model): except NotImplementedError: num_processes = 1 - # Create a saver using variables from the above newly created graph - saver = tfv1.train.Saver() - with tfv1.Session(config=Config.session_config) as session: if FLAGS.load == 'auto': method_order = ['best', 'last']