【发布时间】:2020-05-12 22:39:36
【问题描述】:
我正在尝试使用 optuna 搜索超参数空间。
在一个特定场景中,我在一台带有几个 GPU 的机器上训练模型。 模型和批量大小允许我每 1 个 GPU 运行 1 次训练。 所以,理想情况下,我想让 optuna 将所有试验分布在可用的 GPU 上 这样每个 GPU 上总是运行 1 个试验。
在docs 中它说,我应该在一个单独的终端中为每个 GPU 启动一个进程,例如:
CUDA_VISIBLE_DEVICES=0 optuna study optimize foo.py objective --study foo --storage sqlite:///example.db
我想避免这种情况,因为在那之后整个超参数搜索会继续进行多轮。我不想总是手动启动每个 GPU 的进程,检查所有进程何时完成,然后开始下一轮。
我看到study.optimize 有一个n_jobs 参数。
乍一看,这似乎是完美的。
例如我可以这样做:
import optuna
def objective(trial):
# the actual model would be trained here
# the trainer here would need to know which GPU
# it should be using
best_val_loss = trainer(**trial.params)
return best_val_loss
study = optuna.create_study()
study.optimize(objective, n_trials=100, n_jobs=8)
这会启动多个线程,每个线程都开始训练。
但是,objective 中的培训师不知何故需要知道它应该使用哪个 GPU。
有什么诀窍可以做到吗?
【问题讨论】:
标签: python multithreading gpu optuna