3

I am trying to make a custom NER model using Spacy. I wish to use my GPU for training. This is my config.cfg

[paths]
train = "../training_dataset/training.spacy"
dev = "../training_dataset/dev.spacy"
vectors = null
init_tok2vec = null

[system]
gpu_allocator = "pytorch"
seed = 0

[nlp]
lang = "en"
pipeline = ["transformer","ner"]
batch_size = 128
disabled = []
before_creation = null
after_creation = null
after_pipeline_creation = null
tokenizer = {"@tokenizers":"spacy.Tokenizer.v1"}

[components]

[components.ner]
factory = "ner"
incorrect_spans_key = null
moves = null
update_with_oracle_cut_size = 100

[components.ner.model]
@architectures = "spacy.TransitionBasedParser.v2"
state_type = "ner"
extra_state_tokens = false
hidden_width = 64
maxout_pieces = 2
use_upper = false
nO = null

[components.ner.model.tok2vec]
@architectures = "spacy-transformers.TransformerListener.v1"
grad_factor = 1.0
pooling = {"@layers":"reduce_mean.v1"}
upstream = "*"

[components.transformer]
factory = "transformer"
max_batch_items = 4096
set_extra_annotations = {"@annotation_setters":"spacy-transformers.null_annotation_setter.v1"}

[components.transformer.model]
@architectures = "spacy-transformers.TransformerModel.v1"
name = "roberta-base"

[components.transformer.model.get_spans]
@span_getters = "spacy-transformers.strided_spans.v1"
window = 128
stride = 96

[components.transformer.model.tokenizer_config]
use_fast = true

[corpora]

[corpora.dev]
@readers = "spacy.Corpus.v1"
path = ${paths.dev}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null

[corpora.train]
@readers = "spacy.Corpus.v1"
path = ${paths.train}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null

[training]
accumulate_gradient = 3
dev_corpus = "corpora.dev"
train_corpus = "corpora.train"
seed = ${system.seed}
gpu_allocator = ${system.gpu_allocator}
dropout = 0.1
patience = 1600
max_epochs = 0
max_steps = 20000
eval_frequency = 200
frozen_components = []
annotating_components = []
before_to_disk = null

[training.batcher]
@batchers = "spacy.batch_by_padded.v1"
discard_oversize = true
size = 2000
buffer = 256
get_length = null

[training.logger]
@loggers = "spacy.ConsoleLogger.v1"
progress_bar = false

[training.optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
L2_is_weight_decay = true
L2 = 0.01
grad_clip = 1.0
use_averages = false
eps = 0.00000001

[training.optimizer.learn_rate]
@schedules = "warmup_linear.v1"
warmup_steps = 250
total_steps = 20000
initial_rate = 0.00005

[training.score_weights]
ents_f = 1.0
ents_p = 0.0
ents_r = 0.0
ents_per_type = null

[pretraining]

[initialize]
vectors = ${paths.vectors}
init_tok2vec = ${paths.init_tok2vec}
vocab_data = null
lookups = null
before_init = null
after_init = null

[initialize.components]

[initialize.tokenizer]

I created my training.spacy file using this bit of code:

nlp = spacy.load("en_core_web_sm")
def create_traning(TRAIN_DATA, split=0.8):
    db = DocBin()
    db_dev = DocBin()
    length = len(TRAIN_DATA)
    for i, (text, annot) in tqdm(enumerate(TRAIN_DATA)):
        doc = nlp.make_doc(text)
        ents = []
        for start, end, label in annot["entities"]:
            span = doc.char_span(start, end, label=label, alignment_mode="contract")
            if span is None:
                print("Skipping")
            else:
                ents.append(span)
        
        doc.ents = ents

        if i < length * split:
            db.add(doc)
        else:
            db_dev.add(doc)

    
    return db, db_dev
db, db_dev = create_traning(train_data["annotations"])

I am saving these two files to the correct locations as I've given in the config file. When I run this command:python -m spacy train config.cfg -o ../models/spacy_ner

The training starts but it says that it is using CPU rather than the GPU.

ℹ Saving to output directory: ..\models\spacy_ner
ℹ Using CPU

When I run this command:python -m spacy train config.cfg -o ../models/spacy_ner -g 0

I get this output:

TypeError: can not serialize 'cupy._core.core.ndarray' object

Spacy version 3.2.1 with Cuda 10.2(spacy[cuda102,transformers,lookups])
TensorFlow version 2.7.0
PyTorch version 1.10.2

I don't know why is spacy using torch for GPU allocation when I have specified it to use TensorFlow.

I have no idea what to do about this. Please help.

EDIT: I did a full reinstall of spacy with cuda 10.2, torch with cuda 10.2

Vedant Jumle
  • 133
  • 2
  • 11
  • In the same environment as Spacy, can you confirm that you are able to run `tf.config.list_physical_devices('GPU')`? – pedropedro Jan 29 '22 at 11:14
  • yes, my GPU shows up ```[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]``` – Vedant Jumle Jan 29 '22 at 11:17
  • Can you try with a capitalized `-G` or with `--gpu`? Its a boolean flag, so the command should be around something like: `python -m spacy train config.cfg -o ../models/spacy_ner -G` (no `0` or `1` needs to be provided, as its a flag) – pedropedro Jan 29 '22 at 11:28
  • I did a full reinstall of all the modules with Cuda 10.2, and reinstall Cuda 10.2 from scratch. I now have a new error – Vedant Jumle Jan 29 '22 at 12:08
  • The `gpu_allocator` in your config is set to `pytorch`, not `tensorflow`? – polm23 Jan 30 '22 at 04:53
  • For questions that require back-and-forth debugging, the spaCy Discussions are probably easier to use than Stack Overflow. https://github.com/explosion/spaCy/discussions – polm23 Jan 30 '22 at 05:45

0 Answers0