I get a bit of an improvement if I break the Binomial down in a list comprehension:
visit_rate_like=pm.Mixture(
'visit_rate_like',
w,
[pm.Binomial.dist(
p=pm.math.invlogit(dpmm_comp_mu[i]),
n=d1.astype('int32')[:, None]
) for i in range(30)],
observed=d0.astype('int32')[:, None]
)
But in general, these are tricky to sample.