Skip to content

Commit

Permalink
Free pointers in parser activations (#4486)
Browse files Browse the repository at this point in the history
* Free pointers in ActivationsC

* Restructure alloc/free for parser activations

* Rewrite/restructure to have allocation and free in parallel functions
in `_parser_model` rather than partially in `_parseC()` in `Parser`.

* Remove `resize_activations` from `_parser_model.pxd`.
  • Loading branch information
adrianeboyd authored and honnibal committed Oct 22, 2019
1 parent 388ea03 commit 3dfc764
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 4 deletions.
4 changes: 3 additions & 1 deletion spacy/syntax/_parser_model.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ cdef WeightsC get_c_weights(model) except *

cdef SizesC get_c_sizes(model, int batch_size) except *

cdef void resize_activations(ActivationsC* A, SizesC n) nogil
cdef ActivationsC alloc_activations(SizesC n) nogil

cdef void free_activations(const ActivationsC* A) nogil

cdef void predict_states(ActivationsC* A, StateC** states,
const WeightsC* W, SizesC n) nogil
Expand Down
15 changes: 15 additions & 0 deletions spacy/syntax/_parser_model.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,21 @@ cdef SizesC get_c_sizes(model, int batch_size) except *:
return output


cdef ActivationsC alloc_activations(SizesC n) nogil:
cdef ActivationsC A
memset(&A, 0, sizeof(A))
resize_activations(&A, n)
return A


cdef void free_activations(const ActivationsC* A) nogil:
free(A.token_ids)
free(A.scores)
free(A.unmaxed)
free(A.hiddens)
free(A.is_valid)


cdef void resize_activations(ActivationsC* A, SizesC n) nogil:
if n.states <= A._max_size:
A._curr_size = n.states
Expand Down
7 changes: 4 additions & 3 deletions spacy/syntax/nn_parser.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ from thinc.neural.util import get_array_module
from thinc.linalg cimport Vec, VecVec
import srsly

from ._parser_model cimport resize_activations, predict_states, arg_max_if_valid
from ._parser_model cimport alloc_activations, free_activations
from ._parser_model cimport predict_states, arg_max_if_valid
from ._parser_model cimport WeightsC, ActivationsC, SizesC, cpu_log_loss
from ._parser_model cimport get_c_weights, get_c_sizes
from ._parser_model import ParserModel
Expand Down Expand Up @@ -312,8 +313,7 @@ cdef class Parser:
WeightsC weights, SizesC sizes) nogil:
cdef int i, j
cdef vector[StateC*] unfinished
cdef ActivationsC activations
memset(&activations, 0, sizeof(activations))
cdef ActivationsC activations = alloc_activations(sizes)
while sizes.states >= 1:
predict_states(&activations,
states, &weights, sizes)
Expand All @@ -327,6 +327,7 @@ cdef class Parser:
states[i] = unfinished[i]
sizes.states = unfinished.size()
unfinished.clear()
free_activations(&activations)

def set_annotations(self, docs, states_or_beams, tensors=None):
cdef StateClass state
Expand Down

0 comments on commit 3dfc764

Please sign in to comment.