Команда 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