[Python] Memory leak for Optuna trial with multiprocessing

Discussão em 'Python' iniciado por Stack, Fevereiro 8, 2025.

  1. Stack

    Stack Membro Participativo

    The Background


    I have a machine learning pipeline that consists of N boosted models (LGBMRegressor), each with identical hyperparameters. Each of the N LGBMRegressors is trained on a separate chunk of data. My current workstation has a lot of cores, so I multiprocess each regressor on a separate thread.

    The Problem


    I am trying to tune the parameters that go into the LGBMRegressors through optuna. When I use the multiprocessing inside an optuna trial, it has a memory leak and I run out of memory. Can I use multiprocessing inside an optuna trial and not run into a memory leak?

    Minimal Reproducible Example


    import optuna
    import pandas as pd
    import numpy as np
    import multiprocessing
    from lightgbm import LGBMRegressor

    N = 500
    n_cores = 30
    rows_per_N = 1000
    cols_per_N=50
    data = [ [np.random.normal(size=(rows_per_N, cols_per_N)), np.random.normal(size=(rows_per_N, ))] for i in range(N)]

    def get_metric(data):
    (X, y), params = data
    model =LGBMRegressor(**params)
    model.fit(X, y)
    return np.abs( model.predict(X) - y )


    def objective(trial):
    param = {
    "n_jobs": "1",
    "num_leaves": trial.suggest_int("num_leaves", 2, 256)
    }
    lgb_params = [param for _ in range(N)]
    p = multiprocessing.Pool(n_cores)
    results = p.map(get_metric, zip(data,lgb_params))
    return np.mean(results)


    study = optuna.create_study(direction="minimize")
    study.optimize(objective, n_trials=100)

    Alternative Solutions


    I have written the above code as a for loop and it has not had memory issues. The drawback here is that this is 30x slower than the multiprocessed solution.

    Continue reading...

Compartilhe esta Página