Авторы: Алексей Кучаев (старший научный сотрудник, NVIDIA), Пунам Читале (старший менеджер по продукту, NVIDIA)

Разговорный ИИ меняет способ нашего взаимодействия с компьютерами. Он включает три захватывающих направления исследований искусственного интеллекта (AI): автоматическое распознавание речи (ASR), обработка естественного языка (NLP) и синтез речи (или преобразование текста в речь, TTS). Мы стремимся демократизировать и ускорить прогресс в этих областях, облегчая исследователям и практикам доступ, повторное использование и построение на последних строительных блоках и предварительно обученных моделях в этих областях.

NVIDIA NeMo (Ne ural Mo dules) - это набор инструментов с открытым исходным кодом на основе PyTorch, который позволяет быстро создавать, обучать и настраивать диалоговые модели ИИ. NeMo состоит из NeMo Core, который обеспечивает единый внешний вид для всех моделей и модулей, и коллекций NeMo - групп модулей и моделей для конкретной предметной области. В NeMo’s Speech collection (nemo_asr) вы найдете модели и различные строительные блоки для распознавания речи, распознавания команд, идентификации говорящего, проверки говорящего и обнаружения голосовой активности. Коллекция НЛП NeMo (nemo_nlp) содержит модели для таких задач, как ответы на вопросы, пунктуация, распознавание именованных сущностей и многие другие. Наконец, в Синтезе речи NeMo (nemo_tts) вы найдете несколько генераторов спектрограмм и вокодеров, которые позволят вам генерировать синтетическую речь.

Пример замены голоса

Давайте начнем знакомство с NeMo с простого прототипа. В этом примере мы возьмем аудиофайл и заменим в нем голос синтетическим, сгенерированным моделью NeMo. Слушайте это здесь.

Концептуально это приложение демонстрирует все три этапа разговорной системы ИИ: (1) распознавание речи, (2) получение значения или понимание сказанного и (3) создание синтетической речи в качестве ответа. Если у вас есть PyTorch версии 1.6 или новее с поддержкой графического процессора, NeMo можно установить просто через PIP, например: «pip install nemo_toolkit [all] == 1.0.0b1```. Первым шагом приложений на основе NeMo является импорт необходимых коллекций. В этом приложении мы будем использовать все три из них.

Коллекции дают нам доступ к моделям NeMo, и мы можем использовать их для выполнения определенных диалоговых задач AI. Модели - одно из ключевых понятий NeMo. Мы обсудим их более подробно ниже, но пока воспользуемся только теми, которые нам нужны:

Большинство моделей NeMo могут быть созданы непосредственно из каталога NVIDIA NGC с помощью функции «from_pretrained (…)«. Вы можете просмотреть список доступных предварительно обученных весов для каждой модели, вызвав функцию «list_available_models (…)« «.

Как видно из фрагмента кода выше, мы будем использовать модель QuartzNet для распознавания речи, модель пунктуации на основе моделей DistillBert и Tacotron2 + WaveGlow для синтеза речи. Обратите внимание, что коллекция НЛП NeMo совместима с превосходной библиотекой преобразователей Hugging Face, и их языковые модели часто используются в качестве кодеров в моделях НЛП NeMo. Как только все модели созданы, они готовы к использованию. Вот пример использования модели ASR для расшифровки аудиофайла и модели NLP для добавления знаков препинания к расшифрованному тексту:

Пожалуйста, обратитесь к этой интерактивной записной книжке Google Colab для получения полного рабочего примера. Обратите внимание, как пунктуационная модель имеет огромное значение в качестве генерируемой речи. Речь, созданная на основе выходных данных модели пунктуации, намного легче понять, чем та, которая создана непосредственно из исходных выходных данных модели ASR, потому что она содержит паузы и интонации в нужных местах.

Модели NeMo, нейронные модули и нейронные типы

В NeMo есть три основных понятия: модель, нейронный модуль и нейронный тип. Модели - это «полные рецепты», содержащие всю информацию, необходимую для обучения и точной настройки. Таким образом, они инкапсулируют:

  1. Реализация нейронной сети - все нейронные модули, подключенные для обучения и оценки.
  2. Вся необходимая пре- и постобработка - токенизация, увеличение данных и т. Д.
  3. Классы наборов данных, которые можно использовать с этой моделью.
  4. Алгоритм оптимизации и график скорости обучения.
  5. Детали инфраструктуры - например, сколько графических процессоров, узлов и какая точность обучения следует использовать.

Как мы видели в демонстрации выше, большинство моделей могут быть созданы с определенными предварительно обученными весами непосредственно из репозитория в каталоге NVIDIA NGC.

Глубокие нейронные сети часто можно представить как состоящие из концептуальных строительных блоков, отвечающих за различные задачи. Архитектура кодер-декодер - известный пример. Кодеру поручено изучить входное представление, в то время как декодер отвечает за создание выходной последовательности на его основе. В NeMo мы называем эти блоки «нейронными модулями» (кстати, отсюда и произошло название NeMo). Нейронный модуль (nemo.core.NeuralModule) представляет собой логическую часть нейронной сети, такую ​​как языковая модель, кодировщик, декодер, алгоритм увеличения данных, функция потерь и т. Д. Они составляют основу для описания модели и процесс обучения этой модели. Класс NeuralModule является производным от torch.nn.Module, поэтому вы можете использовать модули из коллекций NeMo в своих приложениях PyTorch. В коллекциях есть сотни нейронных модулей, которые вы можете повторно использовать в своих моделях.

Входные и выходные данные для нейронных модулей имеют тип Neural Types. Нейронный тип - это пара, которая содержит информацию о компоновке осей тензора (аналогично именованному тензору в Pytorch) и семантике его элементов. Каждый нейронный модуль имеет свойства input_types и output_types, которые описывают (и помогают обеспечить соблюдение), какие типы входов принимает этот модуль и какие выходы он возвращает.

Давайте посмотрим, как модели, нейронные модули и типы взаимодействуют друг с другом. Если мы заглянем под капот метода forward () модели QuartzNet, мы увидим:

Модель QuartzNet содержит нейронные модули препроцессора, (необязательно) расширения спектрограммы, кодировщика и декодера. Обратите внимание, что они используются точно так же, как и модули torch.nn.Module, но с дополнительной безопасностью типов. Вот некоторые из типов ввода / вывода нейронных модулей этой модели:

Как видите, типы определяют как тензорные схемы, так и семантику своих элементов. Препроцессор не только проверяет, являются ли переданные ему тензоры двумерными тензорами [пакет, время], но также обеспечивает, чтобы элементы внутри тензора представляли аудиосигнал. Нейронные типы поддерживают наследование, поэтому вывод MelSpectrogramType принимается везде, где ожидается SpectrogramType. Типы применяются с помощью декоратора @typecheck, и принудительное применение может быть включено или отключено. Это экспериментальная функция, но мы сочли ее полезной, чтобы помочь пользователям модулей правильно их использовать.

Обучение и тонкая настройка с NeMo

NeMo создан для обучения и настройки разговорных моделей ИИ. Хотя вы можете использовать чистый PyTorch для работы с моделями и модулями NeMo, они наиболее эффективно используются с двумя другими проектами из экосистемы PyTorch: PyTorch Lightning и Hydra.

Модель NeMo является производной от модуля PyTorch Lightning и может использоваться с экземпляром Lightning's Trainer. Эта интеграция с Lightning упрощает обучение моделей со смешанной точностью с использованием тензорных ядер и позволяет масштабировать обучение для нескольких графических процессоров и вычислительных узлов. Например, мы масштабировали обучение для некоторых моделей NeMo, чтобы использовать 512 графических процессоров. Lightning также предоставляет пользователям множество других удобных функций, таких как ведение журнала, контрольные точки, проверки на соответствие требованиям и другие.

Пользователи NeMo могут использовать Гидру Facebook для параметризации своих скриптов. Типичный эксперимент по глубокому обучению может содержать сотни, если не тысячи параметров. Вот почему их удобно хранить в хорошо организованных файлах конфигурации. Модели и модули NeMo используют Hydra для параметризации, что дает нашим пользователям гибкость и возможности проверки ошибок, предоставляемые Hydra.

Интеграция с Pytorch Lightning и Hydra позволяет упростить общие задачи для наших пользователей. Рассмотрим пример ниже. Это полный сценарий Python, который может использовать файл конфигурации .yaml и обучать модель распознавания речи. NeMo + Lightning + Hydra стандартизируют многие вещи, и, изменив только две строки, мы можем превратить его в скрипт для обучения модели ответов на вопросы на основе BERT.

Вывод

NeMo создан для людей, интересующихся разговорным ИИ - распознаванием речи, обработкой естественного языка и синтезом речи. Мы также приложили много усилий и вычислительных мощностей для создания коллекций предварительно обученных моделей, которые были бы полезны для наших пользователей.

Мы рекомендуем вам попробовать NeMo. Перейдите на наш GitHub, чтобы ознакомиться с интерактивными учебниками с NeMo. Пример смены голоса, который мы обсуждали в начале этого сообщения в блоге, - отличное место для начала.

Наконец, NeMo разрабатывается как проект с открытым исходным кодом на GitHub, и мы приветствуем участие сторонних разработчиков. Вы можете внести свой вклад разными способами - от работы над кодом или документами до обучения моделей новым языкам.

Авторы хотели бы поблагодарить команду исследователей и разработчиков NeMo, а также наших партнеров PyTorch и PyTorch Lightning за то, что они предоставили вам эту запись в блоге.