gflow 0.4.13

A lightweight, single-node job scheduler written in Rust.
Documentation
# 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 选择](./configuration#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` 是否已设置且数值是否合理。

## 另见

- [任务提交]./job-submission - 完整的任务提交指南
- [任务依赖]./job-dependencies - 工作流管理
- [时间限制]./time-limits - 任务超时管理
- [快速参考]../reference/quick-reference - 命令速查表