Hi Guys,
I ended up moving to the non-marginalized mixture model (here) and enforcing order using pm.potential. This worked as expected 
For anyone else interested in mixture models, code is below:
max_spindles_per_epoch = 6
n_r = data['rater_i'].max()+1
expected_std_for_accuracy = 0.2
n_t = data.shape[0]
max_spindle_per_rater = data['spindle_i'].max()
#set up model
with pm.Model() as model:
BoundedNormal = pm.Bound(pm.Normal, lower=0.)
p = pm.Dirichlet('p', a=np.ones(max_spindles_per_epoch),
testval=[2]*max_spindles_per_epoch) #proportion of rater spindles to each real spindle.
gss = pm.Uniform('gss', lower=0., upper=25., shape=max_spindles_per_epoch,
testval=[1, 2, 6, 9, 12, 24]) # Real spindles
gsd = pm.Normal('gsd', mu=duration_av, sd=duration_sd, shape=max_spindles_per_epoch,
testval=[1, 1, 1, 1, 1, 1]) # Real spindles
# Enforce ordering of markers
switching = tt.switch(gss[1] - gss[0] < 0, -np.inf, 0)
for i in range(1, max_spindles_per_epoch-1):
switching += tt.switch(gss[i+1]-gss[i] < 0, -np.inf, 0)
pm.Potential('order', switching)
catergory_w = pm.Categorical('w', p=p, shape=n_t)
rater_expertise = BoundedNormal('r_E', mu=expected_std_for_accuracy, sd=0.25, shape=n_r)
raters_spindle_location = pm.Normal('s',
mu=gss[catergory_w],
sd=rater_expertise[data['rater_i']],
observed=data['s'])
As for debugging the original error, here is a python notebook:
Interestingly the notebook gave more errors than pycharm did. @aseyboldt looks like you were right, its some sort of multiprocess error. Setting njobs=1 does not throw the multiprocess error, instead, it gives a bad initial energy error (i.e. model problems, not pymc3 bugs).
Given that I have moved to a different model, i dont think its worth your time debugging my old model 