Разница между spacy v3 конвейером en_core_web_trf и конвейером en_core_web_lg
Я провожу несколько тестов производительности с помощью spacy версии 3, чтобы правильно определить размер моих экземпляров в производственной среде. Я наблюдаю следующее
Наблюдение:
Почему нет значительной разницы между сценариями с NER и без NER в случае модели трансформатора? Является ли NER просто дополнительной задачей после тегирования POS в случае en_core_web_trf?
Тестовая среда: экземпляр GPU
Код теста:
import spacy
assert(spacy.__version__ == '3.0.3')
spacy.require_gpu()
texts = load_sample_texts() # loads 10,000 texts from a file
assert(len(texts) == 10000)
def get_execution_time(nlp, texts, N):
return timeit.timeit(stmt="[nlp(text) for text in texts]",
globals={'nlp': nlp, 'texts': texts}, number=N) / N
# load models
nlp_lg_pos = spacy.load('en_core_web_lg', disable=['ner', 'parser'])
nlp_lg_all = spacy.load('en_core_web_lg')
nlp_trf_pos = spacy.load('en_core_web_trf', disable=['ner', 'parser'])
nlp_trf_all = spacy.load('en_core_web_trf')
# get execution time
print(f'nlp_lg_pos = {get_execution_time(nlp_lg_pos, texts, N=1)}')
print(f'nlp_lg_all = {get_execution_time(nlp_lg_all, texts, N=1)}')
print(f'nlp_trf_pos = {get_execution_time(nlp_trf_pos, texts, N=1)}')
print(f'nlp_trf_all = {get_execution_time(nlp_trf_all, texts, N=1)}')
1 ответ
Не эксперт, но думаю, что это может быть связано с конструкцией трубопроводов.
Обученное проектирование трубопроводов
Документы для _sm/md/lg
модели утверждают:
Компонент независим и имеет собственный внутренний уровень tok2vec.
И в документации к модели указано:
В трансформаторе (
trf
) модели,tagger
,parser
и (если присутствует) все слушают компонент.
Общие слои внедрения
Повторное использование слоя tok2vec между компонентами может значительно ускорить работу вашего конвейера и привести к значительному уменьшению размеров моделей. Однако это может сделать конвейер менее модульным и затруднить замену компонентов или переобучение частей конвейера.
Как видите, сделать компоненты независимыми, т.е. не делиться/прослушиватьtok2vec
/transformer
слоев, приводит к более медленному (но более модульному) конвейеру. Я считаю, что это причина того, чтоen_core_web_lg
модель заметно медленнее, когда вы добавляетеner
компонент, поскольку он по умолчанию независим.