GPU 管理
gflow 会检测 NVIDIA GPU(通过 NVML),并通过设置 CUDA_VISIBLE_DEVICES 将 GPU 分配给任务。
快速开始
bash
# 启动守护进程(如未运行)
gflowd up
# 查看可用性与当前分配
ginfo
# 提交 GPU 任务
gbatch --gpus 1 python train.py
# 跟踪任务与分配
gqueue -s Running,Queued -f JOBID,NAME,ST,NODES,NODELIST(REASON)查看 GPU
bash
ginfo示例输出:
PARTITION GPUS NODES STATE JOB(REASON)
gpu 1 1 idle
gpu 1 0 allocated 5 (train-resnet)NODES为物理 GPU 索引。- 若 GPU 被占用但不是由 gflow 分配,可能会以“原因”的形式显示(如可获取)。
非 gflow 占用:
- 如果 NVML 检测到某张 GPU 上有运行中的计算进程,gflow 会将其视为不可用(常显示为
Unmanaged),不会去分配这张卡。 - gflow 不会抢占/终止非 gflow 进程;任务只会等待 GPU 变为空闲后再运行。
如需查看每张 GPU 是否被限制(allowed vs restricted):
bash
gctl show-gpus依赖条件
- NVIDIA GPU + 驱动
- NVML 库可用(
libnvidia-ml.so)
快速检查:
bash
nvidia-smi
gflowd up
ginfo无 GPU 的机器也可以正常使用 gflow;仅 GPU 分配不可用。
请求 GPU
bash
gbatch --gpus 1 python train.py
gbatch --gpus 2 python multi_gpu_train.py任务启动时,gflow 会分配物理 GPU 索引并导出到 CUDA_VISIBLE_DEVICES(多数框架会从 0 开始重新编号)。
查看某个任务实际分到的 GPU:
bash
gqueue -s Running -f JOBID,NAME,ST,NODES,NODELIST(REASON)
gjob show <job_id>GPU 共享模式
当你希望多个任务共用同一张物理 GPU 时,可使用共享模式。
bash
gbatch --gpus 1 --shared --gpu-memory 20G python train.py--shared任务只会和其他--shared任务共享。--shared必须配合每卡显存上限--gpu-memory(别名:--max-gpu-mem)。--memory(--max-mem)仍然表示主机内存,不是 GPU 显存。
GPU 可见性
bash
#!/bin/bash
# GFLOW --gpus 2
echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
python train.py限制 gflow 可用 GPU
限制调度器允许分配的物理 GPU(只影响新的分配):
bash
gctl set-gpus 0,2
gctl show-gpus
# 或使用守护进程 CLI 参数(覆盖配置文件)
gflowd restart --gpus 0-3另见:配置 -> GPU 选择。
选择 GPU 分配策略
当任务可用 GPU 不止一张时,可以选择 gflow 的分配方式:
sequential(默认):优先分配低索引 GPU。random:随机化可用 GPU 的选择顺序。
toml
[daemon]
gpu_allocation_strategy = "sequential"
# gpu_allocation_strategy = "random"也可在启动守护进程时覆盖:
bash
gflowd up --gpu-allocation-strategy random故障排除
任务拿不到 GPU
bash
ginfo
gqueue -j <job_id> -f JOBID,ST,NODES,NODELIST(REASON)
gctl show-gpus任务看到错误的 GPU
bash
echo "CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
gqueue -f JOBID,NODELIST(REASON)显存不足
bash
nvidia-smi --query-gpu=memory.free,memory.used --format=csv若共享任务出现显存 OOM,请优先检查 --gpu-memory 是否已设置且数值是否合理。