You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单GPU上运行多Optuna试验以充分利用显存?

问题描述

我有一个用于超参数调优的Optuna脚本,目前通过以下命令在4块GPU上运行:

CUDA_VISIBLE_DEVICES=0 python 'optuna script.py' &
CUDA_VISIBLE_DEVICES=1 python 'optuna script.py' &
CUDA_VISIBLE_DEVICES=2 python 'optuna script.py' &
CUDA_VISIBLE_DEVICES=3 python 'optuna script.py' &

每块GPU拥有24GB显存,但当前每块GPU仅同时运行1个试验(每个试验仅占用约1GB显存,算力消耗极低),导致调优过程非常缓慢。我希望通过在每块GPU上同时运行多个试验,充分利用可用显存。

以下是我的代码相关部分:

def objective(trial):
    # Defined my neural network architecture, data loaders, loss function, and optimizer here
    ...

def main():
    storage_url = "mysql://optuna_user:optuna_password@localhost/optuna_db"
    study_name = "distributed-relapse-prediction-full"
    study = optuna.create_study(study_name=study_name, direction="maximize", storage=storage_url, load_if_exists=True)
    study.optimize(objective, n_trials=100)

if __name__ == "__main__":
    main()

请问是否可以修改脚本或命令,实现每块GPU运行多个试验,以高效利用全部可用显存?恳请提供相关指导或建议。


解决方案

方法1:单GPU进程内启用多试验并行

Optuna原生支持在单个进程内并行运行多个试验,只需修改study.optimize()的n_jobs参数,指定单GPU上同时运行的试验数量。按你的显存条件,每块GPU可并行20+个试验,修改代码如下:

def main():
    storage_url = "mysql://optuna_user:optuna_password@localhost/optuna_db"
    study_name = "distributed-relapse-prediction-full"
    study = optuna.create_study(study_name=study_name, direction="maximize", storage=storage_url, load_if_exists=True)
    # 设置n_jobs为单GPU并行的试验数,示例设为20
    study.optimize(objective, n_trials=100, n_jobs=20)

启动命令保持原有形式即可,每个GPU对应一个进程,进程内部自动并行多个试验:

CUDA_VISIBLE_DEVICES=0 python 'optuna script.py' &
CUDA_VISIBLE_DEVICES=1 python 'optuna script.py' &
CUDA_VISIBLE_DEVICES=2 python 'optuna script.py' &
CUDA_VISIBLE_DEVICES=3 python 'optuna script.py' &

额外注意:如果objective函数涉及CUDA操作,需确保每个试验的模型绑定到当前GPU,可在函数开头添加:

import torch
torch.cuda.set_device(0)  # 进程已被限制到单个GPU,此处固定为0即可

方法2:单GPU启动多个独立Optuna进程

若不想修改代码,可直接在每个GPU上启动多个独立进程,比如每块GPU启动20个:

# GPU 0启动20个进程
for i in {1..20}; do
    CUDA_VISIBLE_DEVICES=0 python 'optuna script.py' &
done
# GPU 1启动20个进程
for i in {1..20}; do
    CUDA_VISIBLE_DEVICES=1 python 'optuna script.py' &
done
# GPU 2启动20个进程
for i in {1..20}; do
    CUDA_VISIBLE_DEVICES=2 python 'optuna script.py' &
done
# GPU 3启动20个进程
for i in {1..20}; do
    CUDA_VISIBLE_DEVICES=3 python 'optuna script.py' &
done

这种方式无需改代码,但进程数量较多,需注意不要超出系统进程上限。

通用注意事项

  • 先小批量测试:先在单GPU上跑5个并行试验,确认显存占用和稳定性后,再逐步增加并行数。
  • 数据库性能:多个试验同时更新MySQL存储,需确保数据库能承受并发写入,避免锁等待拖慢调优。
  • 显存泄漏排查:若长时间运行后显存持续上升,需在objective函数末尾添加torch.cuda.empty_cache(),释放未使用的显存资源。

内容的提问来源于stack exchange,提问作者Murtaza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:30:54