PyMC3 (или Theano) выделяет слишком много виртуальной памяти во время выборки - PullRequest
1 голос
/ 04 апреля 2020

Я использую сэмплер PyMC3 на удаленном кластере с общим числом шагов настройки 3000, 3000 драм aws и 2 цепями. Данные, которые я пытаюсь уместить, состоят из ~ 6000 точек данных, и я устанавливаю 7 переменных (я думаю) для оптимизации сэмплером. Может быть, примерно через 20 шагов в выборке моя программа падает, потому что она достигает выделения виртуальной памяти 15G . Я могу увеличить выделение, но затем моя программа намного дольше остается в очереди заданий в кластере, прежде чем запускать, что не идеально.

Я относительно незнаком с тонкостями PyMC3 и Theano, но подозреваю, что один из этих двух ответственен. Я включил код для моей модели PyMC3 (которая включает в себя отдельную астрофизическую программу exopl anet) и код, в котором я настроил выборку. У меня уже включена сборка мусора Theano automati c, но, похоже, она мало помогает. Спасибо за любую помощь, которую вы можете оказать!

Это часть моего текущего сценария, использующего PyMC3 + Theano с другой астрофизической программой exopl anet:

import numpy as np
import pymc3 as pm
import exoplanet as xo

if mask is None:
    mask = np.ones(len(x), dtype=bool)
with pm.Model() as model:

    mean = pm.Normal("mean", mu=0.0, sd=1.0)

    BoundedNormal_t0 = pm.Bound(pm.Normal, lower=t0_true-0.5, upper=t0_true+0.5)
    t0 = BoundedNormal_t0("t0", mu=t0_true, sd=1.0, shape=1)

    BoundedNormal_per = pm.Bound(pm.Normal, lower=(per_true*0.9), upper=(per_true*1.1))
    period = BoundedNormal_per("period", mu=per_true, sd=1.0, shape=1)

    u = pm.Uniform("u", lower=0.0, upper=1.0, shape=2)
    rho = pm.Uniform("rho", lower=0.0, upper=1000, shape=1)

    BoundedNormal_logr = pm.Bound(pm.Normal, lower=-10.0, upper=0.0)
    logr = BoundedNormal_logr("logr", mu=np.log(rp_rs_true), sd=10.0, shape=1)
    r = pm.Deterministic("r", tt.exp(logr))

    b = xo.distributions.ImpactParameter("b", ror=r, shape=1)

    # Set up a Keplerian orbit for the planets
    orbit = xo.orbits.KeplerianOrbit(period=period, t0=t0, b=b, rho_star=rho)#, r_star=rstar)#, ecc=ecc, omega=omega)

    # Compute the model light curve using starry
    light_curves = xo.LimbDarkLightCurve(u).get_light_curve(
        orbit=orbit, r=r, t=x[mask], texp=texp)
    light_curve = pm.math.sum(light_curves, axis=-1) + mean

    # The likelihood function assuming known Gaussian uncertainty
    pm.Normal("obs", mu=light_curve, sd=yerr[mask], observed=y[mask], dtype='float32')

    map_soln = xo.optimize(start=start)
    map_soln = xo.optimize(start=map_soln, vars=[logr], verbose=False)
    map_soln = xo.optimize(start=map_soln, vars=[b], verbose=False)
    map_soln = xo.optimize(start=map_soln, vars=[period, t0], verbose=False)
    map_soln = xo.optimize(start=map_soln, vars=[u], verbose=False)
    map_soln = xo.optimize(start=map_soln, vars=[logr], verbose=False)
    map_soln = xo.optimize(start=map_soln, vars=[b], verbose=False)
    map_soln = xo.optimize(start=map_soln, vars=[rho], verbose=False)
    map_soln = xo.optimize(start=map_soln, vars=[mean], verbose=False)
    map_soln = xo.optimize(start=map_soln, verbose=False)

np.random.seed(42)
with model:
    tr = pm.sample(chains=2
                   start=map_soln,
                   step=xo.get_dense_nuts_step(target_accept=0.95,start=map_soln),
                   tune=3000,
                   draws=3000)
...