Skip to content

Commit

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

* 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`.

* Try and fix pytest


Co-authored-by: Ines Montani <[email protected]>
  • Loading branch information
adrianeboyd and ines committed Oct 28, 2019
1 parent 04113a8 commit d677f89
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 5 deletions.
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ pathlib==1.0.1; python_version < "3.4"
jsonschema>=2.6.0,<3.1.0
# Development dependencies
cython>=0.25
pytest>=4.0.0,<4.1.0
pytest>=4.6.5
pytest-timeout>=1.3.0,<2.0.0
mock>=2.0.0,<3.0.0
flake8>=3.5.0,<3.6.0
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 @@ -306,8 +307,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 @@ -321,6 +321,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 d677f89

Please sign in to comment.