Почему Spacy 3 NER использует другой конвейер для GPU и CPU?

Команда Spacy 'train' использует параметр командной строки --gpu 0, позволяющий «в последнюю минуту» выбирать между обучением с использованием графического процессора и без него - с использованием только центрального процессора.

Однако с помощью https://spacy.io/usage/training#quickstart можно выбирать между Графический процессор и процессор приводят к существенной разнице в (базовой) конфигурации. В моем случае (имея дело с NER) я получаю два разных конвейера:

  • для ЦП: pipeline = [tok2vec, ner]
  • для графического процессора: pipeline = [transformer, ner]

(с совсем другой настройкой следующих компонентов).

Поскольку у моего графического процессора всего 6 ГБ памяти, у меня довольно быстро заканчивается память графического процессора - я не могу ее использовать. Но когда я переключаюсь на использование только ЦП, поведение обучения между двумя конвейерами сильно различается:

Конвейер [tok2vec, ner] работает в значительной степени на одном ядре, обучая мою модель (8000 тренировок, 2000 документов для разработки / проверки) за пару часов. Заметно быстрее, чем Spacy 2 (даже с графическим процессором), хотя временами использует много памяти (до 30 ГБ).

Конвейер [трансформатор, нерв] требует использования до 20 ядер (на машине с 40 логическими ядрами), поэтому я ожидал, что он будет работать быстро. Но, похоже, он бежит вечно. Через час я завершаю только первую «эпоху», а затем (в следующую эпоху) происходит сбой (см. Ниже). Поскольку мои данные (файлы DocBin, содержащие 100 «документов» в каждом) одинаковы, сбой, приведенный ниже (тег B / I вне последовательности), трудно объяснить.

Мой главный вопрос: ПОЧЕМУ конвейер отличается при ориентации на GPU и CPU? Где векторы в случае таргетинга на GPU?

Крушение: ...

 File "C:\Work\ML\Spacy3\lib\site-packages\spacy\training\loop.py", line 98, in train
    for batch, info, is_best_checkpoint in training_step_iterator:
  File "C:\Work\ML\Spacy3\lib\site-packages\spacy\training\loop.py", line 194, in train_while_improving
    nlp.update(
  File "C:\Work\ML\Spacy3\lib\site-packages\spacy\language.py", line 1107, in update
    proc.update(examples, sgd=None, losses=losses, **component_cfg[name])
  File "spacy\pipeline\transition_parser.pyx", line 350, in spacy.pipeline.transition_parser.Parser.update
  File "spacy\pipeline\transition_parser.pyx", line 604, in spacy.pipeline.transition_parser.Parser._init_gold_batch
  File "spacy\pipeline\_parser_internals\ner.pyx", line 273, in spacy.pipeline._parser_internals.ner.BiluoPushDown.init_gold
  File "spacy\pipeline\_parser_internals\ner.pyx", line 53, in spacy.pipeline._parser_internals.ner.BiluoGold.__init__
  File "spacy\pipeline\_parser_internals\ner.pyx", line 69, in spacy.pipeline._parser_internals.ner.create_gold_state
  File "spacy\training\example.pyx", line 240, in spacy.training.example.Example.get_aligned_ner
  File "spacy\tokens\doc.pyx", line 698, in spacy.tokens.doc.Doc.ents.__get__
ValueError: [E093] token.ent_iob values make invalid sequence: I without B

person mbrunecky    schedule 03.05.2021    source источник


Ответы (1)


Обычно, если вы выбираете GPU в быстром запуске, spaCy использует конвейер Transformers, который архитектурно сильно отличается от конвейера CPU. Настройки в быстром запуске являются рекомендуемыми базовыми настройками, в то время как настройки, которые действительно может использовать spaCy, намного шире (и флаг -gpu в обучении является одним из таких).

Трансформаторы используют внимание для создания контекстных встраиваний, поэтому нет реальной концепции единственного вложения для слова. Эти контекстные вложения обычно лучше, чем вложения слов. По этой причине модели spaCy Transformers не включают в себя вложения слов. Обратной стороной Transformers является то, что для их работы требуется довольно мощное оборудование, в том числе графический процессор. Если у вас действительно мощный графический процессор, обычно имеет смысл использовать трансформаторы.

Модели, используемые конвейером ЦП, не требуют специального оборудования и, как правило, работают намного быстрее, но при этом обеспечивают достаточную точность для многих приложений. Если у вас нет графического процессора, они также в основном ваш единственный вариант. Если у вас есть графический процессор, вы можете использовать его для обучения конвейеров, не относящихся к Transformers, и он может обеспечить ускорение, но преимущества обычно не столь значительны. Итак, spaCy поддерживает обучение моделей без трансформаторов на графическом процессоре, но если у вас есть графический процессор, обычно лучше использовать трансформаторы.

person polm23    schedule 04.05.2021
comment
Спасибо. Это очень четкое описание - я должен был догадаться об этом из документации Spacy. Еще немного поиграв с «Quickstart», при использовании CPU разница между «эффективностью» и «точностью» составляет include_static_vectors = false / true и кодирует ширину и глубину. - person mbrunecky; 06.05.2021
comment
Я попробовал преобразователь в режиме ЦП, чтобы показать, какое (если есть) улучшение точности, которое я могу получить от графического процессора в моем домене, но независимо от образца данных он не работает в update () - очевидно, проблема / ошибка Spacy3 (я пробовал несколько torch [CPU] версий, и ошибка сохраняется). Моя проблема в том, что для моего проекта NER точность Spacy 3 снизилась на 10% по сравнению с Spacy 2.4. - person mbrunecky; 06.05.2021
comment
Использование одной и той же модели на GPU и CPU не должно существенно повлиять на точность. Также нет spaCy v2.4, может ты про 2.3? В любом случае, если у вас есть ошибка, не стесняйтесь открывать проблему в репозитории Github. - person polm23; 06.05.2021
comment
Правильно, это был Spacy 2.3 (а не 2.4 - извините за опечатку). У меня сложилось впечатление, что когда НЕ используется графический процессор, «модель» spacy.TransitionBasedParser.v2, используемая для NER в Spacy3 (со статическими векторами), отличается от «модели», используемой для NER в Spacy 2.3 (с векторами загрузки из модели _lg). Хотелось бы, чтобы модель 2.3 была еще доступна. - person mbrunecky; 06.05.2021