NVIDIA + BERT = ??

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


BERT — нейросеть для обработки естественного языка (Natural Language Processing, NLP). Если вы давно мечтали создать свою виртуальную Алису или Олега, то у нас хорошие новости: не так давно NVIDIA выложила в открытый доступ скрипты, позволяющие использовать BERT для рекомендательных систем и приложений «вопрос-ответ». Мы расскажем, в чём преимущество этой нейросети и как её обучить для конкретных задач.

В конце прошлого года команде NVIDIA удалось достичь четырёхкратного ускорения нейронной сети BERT (Bidirectional Encoder Representations from Transformers). С тех пор эта ускоренная реализация была доработана и выложена на GitHub и NGC. TensorFlow-скрипт поддерживает точную настройку SQuAD QA, конфигурации серверов DGX-1 и DGX-2, а также использует новую функцию Automatic Mixed Precision (автоматический режим смешанной точности).

BERT — современная NLP-сеть, способная по воспроизводимой точности превзойти человека. Одна из ключевых инноваций — её двунаправленность («B» — Biderectional). Предыдущие модели NLP обычно использовали однонаправленное сканирование (слева направо, справа налево или оба) для распознавания слов как в контекстном, так и в контекстно-свободном представлении. Кроме того, BERT может анализировать целые предложения для более точного изучения контекста, основываясь на окружении слова в обоих направлениях. Этот подход повышает точность модели, но предъявляет очень высокие вычислительные требования.

Чтобы обучить BERT с нуля, начните с большого набора данных (например, Википедии) или комбинации нескольких датасетов. Вы можете добавить 1?2 слоя в конце, чтобы настроить сеть для конкретной задачи, такой как классификация предложений или «вопрос-ответ». Поскольку новые слои требуют дополнительных параметров, вам необходимо использовать определённый набор данных для каждой модели. Для достижения оптимальных результатов вам понадобиться не только установить параметры для этих дополнительных слоёв, но ещё и точно настроить обучение всей BERT. Можете начать с параметров предварительно обученной сети или воспользоваться теми, которые предлагает Google для своей модели.

Команда разработчиков NVIDIA использовала версию BERT Large, у которой 340 миллионов параметров. Первоначальные результаты ускорения получены после тестирования на одном GPU. Обновлённые скрипты поддерживают системы 8-GPU DGX-1 и 16-GPU DGX-2. Хотя сценарии обычно не используют прямой вывод, они сообщают о скорости прогнозирования, достигнутой при оценке на тестовой выборке. Скрипт можно легко модифицировать для поддержки вывода.

Конфигурация модели

В зависимости от задачи, по умолчанию вам доступны две конфигурации BERT:

МодельСкрытые слоиРазмер скрытой единицы (hidden unit)Слои Attention HeadsРазмер фильтра прямой связиМаксимальная длина последовательностиПараметры
BERTBASE12768124 x 768512110M
BERTLARGE141024164 x 1024512330M

Установка

Требования

Репозиторий с BERT содержит Dockerfile, который расширяет контейнер TensorFlow NGC и инкапсулирует некоторые зависимости. Помимо этого, убедитесь, что у вас присутствуют следующие компоненты:

— NVIDIA Docker

— Контейнер TensorFlow 19.03-py3 NGC

— Графический процессор на базе NVIDIA Volta

Дополнительная информация о работе с контейнерами NGC доступна в документации по облачным GPU NVIDIA и документации Deep Learning:

— Начало работы с облачным графическим процессором NVIDIA

— Доступ и извлечение из реестра контейнеров NGC

— Запуск TensorFlow

Быстрый старт

Здесь описана предварительная подготовка и настройки модели для задач «вопрос-ответ» с использованием тензорных ядер и смешанной точности, или же с помощью FP32. Выполните следующие шаги с параметрами по умолчанию:

1. Клонируйте репозиторий

1

2

git clonehttps://github.com/NVIDIA/DeepLearningExamples

cd DeepLearningExamples/TensorFlow/LanguageModeling/BERT

2. Соберите контейнер BERT TensorFlow NGC

1

bash scripts/docker/build.sh

3. Загрузите и подготовьте набор данных

В репозитории есть скрипты, с помощью которых вы можете загрузить, проверить и извлечь датасет SQuaD и предварительно обученные веса для точной настройки, а также набор данных Wikipedia + BookCorpus для предварительного обучения.

1

hscripts/data_download.sh

Сценарий запускает Docker-контейнер в текущем каталоге и загружает датасеты в папку data/.

4. Запустите интерактивную сессию в контейнере NGS для начала обучения/вывода

После загрузки контейнера и подготовки данных вы можете запустить сессию CLI (Command Line Interface):

1

bash scripts/docker/launch.sh

Сценарий launch.sh предполагает, что наборы данных находятся в местах по умолчанию:

— Squad v1.1: data/squad/v1.1

— BERT: data/pretrained_models_google/uncased_L-24_H-1024_A-16

— Wikipedia: data/wikipedia_corpus/final_tfrecords_sharded

— BookCorpus: data/bookcorpus/final_tfrecords_sharded

5. Начните предварительное обучение

Следующие скрипты выполняют предварительное обучение BERT на датасете Wikipedia+Book Corpus. Вы можете использовать любой другой набор данных на ваш выбор.

1

bash scripts/run_pretraining.sh<train_batch_size_per_gpu><eval_batch_size><learning_rate_per_gpu><precision><num_gpus><warmup_steps><train_steps><save_checkpoint_steps><create_logfile>

Для обучения FP16 с XLA с использованием DGX-1 V100 32G выполните:

1

bash scripts/run_pretraining.sh1485e-5fp16_xla8500022850005000true

Для обучения FP32 без XLA с использованием DGX-1 V100 32G выполните:

1

bash scripts/run_pretraining.sh662e-5fp328200053333335000true

6. Начните точную настройку

Предварительно обученные представления BERT можно точно настроить с помощью одного дополнительного выходного слоя для системы «вопрос-ответ». Вы можете использовать следующий скрипт внутри контейнера для настройки SQuaD:

1

bash scripts/run_squad.sh<batch_size_per_gpu><learning_rate_per_gpu><precision><use_xla><num_gpus><checkpoint>

Для обучения FP16 с XLA с использованием DGX-1 V100 32G:

1

bash scripts/run_squad.sh105e-6fp16 true8/bert/bert_model.ckpt

Для обучения FP32 без XLA с использованием DGX-1 V100 32G:

1

bash scripts/run_squad.sh55e-6fp32 false8/bert/bert_model.ckpt

7. Начните проверку/оценку

Скрипт run_squad_inference.sh запускает вывод SQuaD на контрольной точке и оценивает прогнозирование с помощью полных совпадений и F1-меры.

1

bash scripts/run_squad_inference.sh<init_checkpoint><batch_size><precision><use_xla>

Для вывода FP16 с XLA с использованием DGX-1 V100 32G:

1

bash scripts/run_squad_inference.sh/results/model.ckpt8fp16 true

Для вывода FP32 без XLA с использованием DGX-1 V100 32G:

1

bash scripts/run_squad_inference.sh/results/model.ckpt8fp32 false

Подробности

В этом разделе вы можете подробнее узнать о наборах данных, обучении, выводе и результатах.

Параметры командной строки

Для просмотра полного списка доступных параметров и их описания, введите в командной строке -h или -help, например:

1

2

python run_pretraining.py--help

python run_squad.py--help

Помимо опций для настройки гиперпараметров скрипта run_pretraining.py также можно использовать:

1

2

3

4

5

6

7

8

9

10

11

--[no]amp:[не]включатьфункциюAMP(поумолчанию:'false')

--[no]amp_fastmath:[не]включатьAMP fasthmath(поумолчанию:'false')

--bert_config_file:файлконфигурацииjson,соответствующийпредварительнообученноймоделиBERT.Определяетархитектурумодели.

--[no]do_eval:[не]запускатьоценкунанабореdev(поумолчанию:'false')

--[no]do_train:[не]запускатьобучение(evaluation:'false')

--eval_batch_size:общийразмерпакетадляeval.(поумолчанию:'8')(целоечисло)

--[no]fastmath:[не]включатьмасштабированиепотерьдляоперацийfasthmath(поумолчанию:'false')

--[no]horovod:[не]использоватьHorovodдлянесколькихграфическихпроцессоров(поумолчанию:'false')

--init_checkpoint:начальнаяконтрольнаяточка(обычноизпредварительнообученноймоделиBERT).

--input_file:входныефайлыпримеровTF(могутбытьперечисленычереззапятуюилизаданымаской).

--iterations_per_loop:Сколькошаговвыполнятьдлякаждогооценивания(поумолчанию:'1000')

Для скрипта run_squad.py:

1

2

3

4

5

6

7

8

9

10

11

12

13

--bert_config_file:файлконфигурацииjson,соответствующийпредварительнообученноймоделиBERT.Определяетархитектурумодели.

--[no]do_predict:[не]запускатьоценкунанабореdev(поумолчанию:'false')

--[no]do_train:[не]запускатьобучение(поумолчанию:'false')

--learning_rate:начальнаяскоростьобучениядляAdam(поумолчанию:'5e-06')(число)

--max_answer_length:максимальнаядлинагенерируемогоответа.Необходимыйпараметр,таккакпогнозывначалеивконценесвязаныдругсдругом(поумолчанию:'30')(целоечисло)

--max_query_length:максимальноеколичествосимволовдлявопроса.Есливопросдлиннее,онбудетусечёндоэтойдлины(поумолчанию:'64')(целоечисло)

--max_seq_length:максимальнаядлинавходнойпоследовательностипослелексическогоанализаWordPiece.Болеедлинныепоследовательностиобрезаются,акороткие—дополняются(поумолчанию:'384')(целоечисло)

--predict_batch_size:общийразмерпакетадляпрогнозов(поумолчанию:'8')(целоечисло)

--train_batch_size:общийразмерпакетадляобучения(поумолчанию:'8')(целоечисло)

--[no]use_fp16:[не]использоватьарифметикуfp16вGPU(поумолчанию:'false')

--[no]use_xla:[не]включатькомпиляциюXLA JIT(поумолчанию:'false')

--[no]verbose_logging:еслиtrue,выводятсявсепредупреждения,связанныесобработкойданных(поумолчанию:'false').

--[no]version_2_with_negative:еслиtrue,вSQuADбудутвключеныпримерывопросов,накоторыенетответа(поумолчанию:'false')

Получение данных

Для предварительного обучения BERT используются совмещённые датасеты Википедии (2500 млн слов) и Book Corpus (800 млн слов). Из Википедии извлекаются только текстовые блоки без заголовков, списков и таблиц. Они структурированы в виде единого набора документов, а не набора предложений, поскольку важно сохранять контекст.

Следующий шаг — запуск create_pretraining_data.py, который генерирует входные данные и метки для моделирования регулярных выражений и прогнозирования следующего предложения. Предварительное обучение можно выполнить на любом другом датасете. Набор скриптов для генерирования данных должен быть модульным, чтобы можно было вносить изменения в этапы предварительной обработки или дополнять данные.

Для использования BERT в качестве модели «вопрос-ответ» можно взять датасет SQuaD. SQuaD v1.1 содержит более 100?000 пар вопросов и ответов в более чем 500 статьях. SQuaD v2.0 дополняет v1.1 50?000 вопросами без ответа и должен не только отвечать на вопросы, но и определять, когда это невозможно.

Обучение

Процесс обучения состоит из двух этапов: предварительное обучение и точная настройка.

Предварительное обучение

Предварительное обучение выполняется с помощью run_pretraining.py вместе с параметрами, определёнными в scripts/run_pretraining.sh.

run_pretraining.sh запускает процесс обучения модели BERT-Large с нуля, используя датасеты Wikipedia и Book corpus. По умолчанию он:

— работает на 8 GPU с размером обучающего пакета 14 и размером оценочного пакета 8 на каждом GPU

— использует точность FP16

— использует XLA

— работает за 1?144?000 шагов с 10?000 предварительных шагов

— сохраняет контрольную точку каждые 5000 итераций и в конце обучения. Все контрольные точки, результаты оценки и логи обучения сохраняются в каталоге /results (в контейнере, который можно установить в локальный каталог)

— создаёт лог-файл, содержащий все выходные данные

— оценивает модель в конце обучения. Чтобы пропустить оценку, измените --do_evalна False.

С этими параметрами можно обучить модель до приемлемой точности на DGX1 с графическими процессорами V100 32 ГБ. Если вы хотите добиться лучших результатов, продемонстрированных Google, нужно либо удвоить число шагов (до 2?288?000) на DGX1, либо проводить обучение с 16-ю графическими процессорами на DGX2.

Пример:

1

run_pretraining.sh<node_type><training_batch_size><eval_batch_size><learning-rate><precision><num_gpus><warmup_steps><training_steps><save_checkpoint_steps><create_logfile>

Где:

— <training_batch_size>: размер пакета для каждого процессора во время обучения. Чем больше размер пакета, тем эффективнее обучение, но это требует больше памяти

— <eval_batch_size>: размер пакета для каждого GPU во время оценки

— <learning_rate>: скорость обучения, по умолчанию 1e-4 (подходит для пакета размером 256)

— <precision>: тип арифметики вашей модели (fp32, fp16, fp16_xla, fastmath, amp_fm, amp_fm_xla, amp или amp_xla):

  1. fp32: 32-битное число IEEE с плавающей запятой одинарной точности
  2. fp16: заданное вручную 16- и 32-битное число с плавающей запятой смешанной точности
  3. fp16_xla: заданное вручную число с плавающей запятой смешанной точности, JIT-скомпилированное с XLA
  4. fastmath: Matmuls выполняется тензорными ядрами со смешанной точностью, остальное — в FP32
  5. amp_fm: альтернативная реализация FastMath, которая работает с вычислительным графом TensorFlow
  6. amp_fm_xla: amp_fm и компиляция XLA JIT
  7. amp: автоматически переназначает вычислительному графу TensorFlow использовать 16-битную арифметику всякий раз, когда это допустимо.
  8. amp_xla: amp и компиляция XLA JIT

— <num_gpus>: количество графических процессоров для обучения. Должно быть равно или меньше количества GPU, подключенных к вашему узлу

— <warmup_steps>: количество предварительных шагов в начале обучения

— <training_steps>: общее число шагов обучения

— <save_checkpoint_steps>: управляет частотой сохранения контрольных точек (по умолчанию каждые 5000 шагов)

— <create_logfile>: должен ли вывод быть записан в лог-файл (допустимые значения — «true» или «false»)

Например:

1

bert_tf/scripts/run_pretraining.sh1481e-4fp16_xla161000011440005000true

Эта команда запускает обучение BERT-Large с нуля на одном DGX-2 с использованием арифметики FP16. Это займёт около 156 часов (6,5 дней). Контрольные точки записываются каждые 5000 шагов, и все выводы сохраняются в лог-файл.

Точная настройка

Точная настройка выполняется с помощьюrun_squad.py вместе с параметрами, определёнными в scripts/run_squad.sh.

Скрипт run_squad.sh обучает модель и подготавливает оценку на датасете SQuaD v1.1. По умолчанию он:

— использует 8 графических процессоров и размер пакета 10 на каждом GPU

— использует точность FP16

— использует XLA

— работает в течение 2 эпох

— сохраняет контрольную точку каждые 1000 итераций и в конце обучения. Все контрольные точки, результаты оценки и логи обучения сохраняются в каталоге /results (в контейнере, который можно установить в локальный каталог)

— оценивает модель в конце обучения. Чтобы пропустить оценку, измените --do_predict на False.

Лог обучения содержит:

— потери на последнем шаге

— эффективность обучения и оценки

— F1-меру и оценку полного совпадения на наборе Dev.

Результат обучения выводится в следующем формате:

1

2

3

4

5

I031223:10:45.137036140287431493376run_squad.py:1332]0Total Training Time=3007.00Training TimeW/Ostart up overhead=2855.92Sentences processed=175176

I031223:10:45.137243140287431493376run_squad.py:1333]0Training Performance=61.3378sentences/sec

I031223:14:00.550846140287431493376run_squad.py:1396]0Total Inference Time=145.46Inference TimeW/Ostart up overhead=131.86Sentences processed=10840

I031223:14:00.550973140287431493376run_squad.py:1397]0Inference Performance=82.2095sentences/sec

{"exact_match":83.69914853358561,"f1":90.8477003317459}

Мультипроцессорное обучение можно включить с помощью модуля Horovod TensorFlow. Пример обучения на 8 GPU:

1

2

3

4

5

6

mpi_command=" mpirun -np 8 -H localhost: 8

     --allow-run-as-root -bind-to none -map-by slot

     -x NCCL_DEBUG = INFO

     -x LD_LIBRARY_PATH

     -x PATH -mca pml ob1 -mca btl ^ openib "

python run_squad.py--horovod

Обучение со смешанной точностью

Такое обучение значительно ускоряет вычисление, поскольку операции выполняются с половинной точностью, но при этом сохраняется минимальная информация с единичной точностью для критических участков сети. Это возможно благодаря тензорным ядрам в архитектурах Volta и Turing, которые обеспечивают ускорение до трёх раз.

Для обучения со смешанной точностью нужно:

1. Портировать модель для использования типа данных FP16 там, где это необходимо.

2. Добавить масштабирование потерь для сохранения малых значений градиента. Теперь это можно сделать автоматически с помощью механизма AMP (Automatic Mixed Precision) для Tensorflow (TF-AMP).

Более подробная информация:

— как обучить модель со смешанной точностью

— как получить доступ к AMP для TensorFlow и включить его

— методы обучения со смешанной точностью

Вывод

Вывод выполняется скриптом run_squad.py вместе с параметрами, определёнными в scripts/run_squad_inference.sh. Вывод поддерживает только один GPU.

Скриптrun_squad_inference.sh обучает модель и выполняет оценку на датасете SQuaD v1.1. По умолчанию он:

— использует точность FP16

— использует XLA

— оценивает последнюю контрольную точку в /results с размером пакета 8.

Скрипт создаёт файл прогнозов /results/predictions.json и вычисляет F1-меру и полные совпадения с помощью evaluate-v1.1.py.

Выходной лог содержит:

— оценку эффективности модели

— F1-меру и оценку полного совпадения на наборе Dev.

Результат вывода выглядит следующим образом:

1

2

3

I031223:14:00.550846140287431493376run_squad.py:1396]0Общеевремявывода=145,46Времявыводабезнакладныхрасходовпризапуске=131,86Обработанныепредложения=10840

I031223:14:00.550973140287431493376run_squad.py:1397]0Производительностьлогическоговывода=82,2095предложенийвсекунду

{" correct_match ":83.69914853358561," f1 ":90.8477003317459}

Результаты

Вы можете запустить тесты, измеряющие эффективность модели в режимах обучения и вывода. Оба скрипта запускают BERT для точной настройки. С помощью аргументов для них вы можете указать, выполнять ли сравнительный анализ FP16 или FP32.

Тест эффективности обучения

1

scripts/finetune_train_benchmark.sh squad&lt;fp16/fp32>&lt;use_xla>&lt;num_gpu>&lt;batch_size/gpu>&lt;lr>

Тест эффективности вывода

1

scripts/finetune_inference_benchmark.sh squad&lt;fp16/fp32>&lt;use_xla>&lt;batch_size>&lt;path-to-checkpoint>

Результаты Google

Результаты Google для обучающего скрипта run_squad.py были получены с контейнером TensorFlow 19.03-py3 NGC на NVIDIA DGX-1 с 8 видеокартами Tesla V100 32ГБ.

Количество графических процессоровРазмер партии на один графический процессорВремя обучения с FP16 (в минутах)Время обучения с FP32 (в минутах)
843146

В следующих таблицах сравниваются F1-меры для 5 запусков обучения с различными начальными значениями для FP16 и FP32 соответственно:

FP16, 8 GPUseed #1seed #2seed #3seed #4seed #5meanstd
F191.1690.6990.9990.9491.1790.990.196
Полное совпадение84.283.6884.1483.9584.3484.060.255
FP32, 8 GPUseed #1seed #2seed #3seed #4seed #5meanstd
F190.6790.890.9490.8390.9390.830.11
Полное совпадение83.5683.9683.9983.9584.1283.920.21

Таблица с результатами производительности (в предложениях в секунду). Числа усреднены для всех эпох обучения:

Число GPUРазмер партии на один GPUFP32 предл / секFP16 предл / секУскорение со смешанной точностьюMulti-GPU слабая масштабируемость с FP32Multi-GPU слабая масштабируемость с FP16
148,5518,142,121,01,0
4432,1352,851,643,762,91
8462,8395,281,517,355,25

Максимальная точность модели составила 91.17% для F1-меры и 84.34% для оценки полного совпадения.

BERT — большой шаг вперёд для NLP, и NVIDIA продолжает ускорять современные нейросети для любых применений Deep Learning. Теперь, используя открытый исходный код, любой может обучить свою вопросно-ответную систему для разных задач. Это должно послужить толчком к созданию не только развлекательных ботов, но и полноценных голосовых помощников.

С оригинальными материалами можно ознакомиться на сайте и в репозитории NVIDIA.

Редакция 24 июня 2019 19

Please enable JavaScript to view the comments powered by Disqus.

Источник: www.reg.ru

Комментарии: