1

次のコードを使用して NER モデルをトレーニングしています。

コードの開始:

def train_spacy(nlp, training_data, iterations):
    
    if "ner" not in nlp.pipe_names:
        ner = nlp.create_pipe('ner')
        nlp.add_pipe("ner", last = True)
    
    training_examples = []
    faulty_dataset = []
    
    for text, annotations in training_data:
        doc = nlp.make_doc(text)
        try:
            training_examples.append(Example.from_dict(doc, annotations)) #creating examples for training as per spaCy v3.
        except:
            faulty_dataset.append([doc, annotations])        
        for ent in annotations['entities']:
            ner.add_label(ent[2])
    
    other_pipes = [pipe for pipe in nlp.pipe_names if pipe!= 'ner']
    
    with nlp.disable_pipes(*other_pipes):
        optimizer = nlp.begin_training()
    
        for iter in range(iterations):
    
            print('Starting iteration: ' + str(iter))
            random.shuffle(training_examples)
            losses = {}
            batches = minibatch(training_examples, size=compounding(4.0, 32.0, 1.001))
            for batch in batches:
                nlp.update(
                            batch,
                            drop = 0.2,
                            sgd = optimizer,
                            losses = losses
                            )
            print(losses)
    
            for i in range(deviceCount): #to see how much GPU cores I am using:
                handle = nvmlDeviceGetHandleByIndex(i)
                util = nvmlDeviceGetUtilizationRates(handle)
                print(util.gpu)
    
    return nlp, faulty_dataset, training_examples

spacy.require_gpu() #this returns "True"

nlp = spacy.blank('en')
word_vectors = 'w2v_model.txt'
model_name = "nlp"
load_word_vectors(model_name, word_vectors) #I have some trained word vectors that I try to load them here.

test = train_spacy(nlp, training_data, 30) #training for 30 iterations

コードの終わり。

問題:

問題は、各反復に約 30 分かかることです。非常に長いテキストと 6 つのラベルを含む 8000 のトレーニング レコードがあります。

したがって、より多くの GPU コアを使用して削減したいと考えていましたが、使用されているコアは 1 つだけのようです。上記のコードで print(util.gpu) を実行すると、最初のコアだけがゼロ以外の値を返します。

質問 1: トレーニング プロセスを高速化するために、より多くの GPU コアを使用する方法はありますか? リードをいただければ幸いです。

さらに調査した結果、spacy-ray は並列トレーニングを可能にすることを目的としているようです。しかし、私が見つけたのは「python -m spacy ray train config.cfg --n-workers 2.

質問 2: Ray は GPU を使用した並列処理を有効にしますか? それは CPU コアのみですか?
質問 3: 「python -m spacy ray train config.cfg --n-workers 2」を使用するのではなく、nlp.update を使用して Python コードに Ray を統合するにはどうすればよいですか。?

ありがとうございました!

環境:

上記のコードはすべて、ml.p3.2xlarge EC2 インスタンスを使用する AWS Sagemaker 上の 1 つの conda_python3 ノートブックにあります。
使用したPython バージョン: 3
spaCy 使用したバージョン: 3.0.6

4

0 に答える 0