> For the complete documentation index, see [llms.txt](https://book.ncrnalab.org/teaching/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.ncrnalab.org/teaching/getting-started/run-gpu-jobs-advanced.md).

# Run GPU jobs \[Advanced]

### 一、GPU使用注意事项

#### **1.1 多人共享使用方式和注意事项**

资源占用原则：多人使用CPU/GPU集群时需合理分配资源，避免长时间独占所有CPU/GPU核心；若需运行耗时较长的任务，建议避开服务器使用高峰时段（如工作日白天），优先选择夜间、周末运行。

**第一步：检查 GPU 状态，寻找空闲资源**

在终端输入 `nvidia-smi` 命令

```bash
nvidia-smi
```

> 会输出一张当前 GPU 的状态表。寻找空闲 GPU 时，只需重点看以下 4 个参数：\
> 1\. **GPU 编号 (GPU ID)**：表格最左侧的数字（如 0、1）。找到空闲卡后，后续运行代码需通过这个数字来指定显卡（例如指定用 0 号卡）。\
> 2\. **显存占用 (Memory-Usage)**：**最核心的指标**（格式如 `0MiB / 24564MiB`）。如果已用显存接近总量，说明卡被占满，强行去挤会导致显存溢出（OOM）报错崩溃；如果已用显存为 0 或极小，说明容量充足。\
> 3\. **算力利用率 (GPU-Util)**：表格右侧的百分比。`0%` 代表显卡核心正在闲置，高百分比（如 `99%`）代表正在满负荷计算。\
> 4\. **底部进程列表 (Processes)**：表格最下方会列出当前正在运行的程序占用了哪张卡。如果某张卡的编号没有出现在这里，说明它是完全纯净、无人在用的。\
> **💡 选卡总结**：挑选 GPU 时，尽量满足\*\*“显存占用极小 + 利用率接近 0% + 底部进程列表中没有该卡编号”\*\*这三个条件。

**第二步：合理分配 GPU 并提交后台任务**

在第一步观察好 GPU 状态后，我们需要在运行代码时明确指定使用哪几张卡，并将任务挂载到后台，以防断网或关闭电脑导致训练中断。推荐的标准命令格式如下：

```python
# 以使用 0 号和 1 号卡为例的python code 
model = torch.nn.DataParallel(model, device_ids=[0, 1])
# 以使用 0 号卡为例的python code 
model = torch.nn.DataParallel(model, device_ids=[0])
```

> **🔍** 详细的python 脚本见下文 [**2.1 Python脚本**](#id-2.1-python-jiao-ben)\
> **🔍** 也可以在bash、zsh等环境变量中定义可见的GPU，例如：\
> `CUDA_VISIBLE_DEVICES=0,2`\
> 但注意不要和python code中定义的冲突，除非特殊需要，一般建议就**不要**在环境变量里加限制了。

```bash
# run the python file: train.py
nohup python train.py > train.log 2>&1 &
```

> **🔍 后台无间断运行:** `nohup python train.py > train.log 2>&1 &` 训练任务通常耗时较长，如果直接运行，一旦你的电脑休眠或 SSH 终端断开，任务就会立刻终止。将 nohup 放在命令最前，& 放在最后，就能让程序在服务器后台持续运行，哪怕你关掉终端窗口也不受影响。任务转入后台后，屏幕上就不再显示打印信息了。加上这段命令，程序的所有正常输出（如进度条）和报错信息，都会自动写入到 train.log 文件中，方便你随时复盘。\
> **💡 提交后操作：**&#x6572;击回车执行后，终端会返回一个进程号（PID）。你可以随时输入 tail -f train.log 来实时滚动查看训练进度，按 Ctrl+C 即可退出日志查看（此时后台训练仍在安全进行）。

**第三步：检查与监视任务运行状态**

任务提交到后台后，不要立刻关闭终端。建议先通过以下几个常用命令，确认程序是否已经顺利跑起来了，并在后续随时监控或管理该任务。

**🔍 核心监视命令与操作说明：**

1. **实时查看训练日志 (`tail -f`)：**
   1. **命令**：`tail -f train.log`
   2. **作用**：这是最直观的监视方式。它会像放电影一样，实时滚动显示程序的输出（如 loss 变化、进度条）。如果代码一开始就有报错（比如缺包、路径写错、显存溢出），也会立刻在这里显示出来。按 `Ctrl+C` 即可退出查看界面（此操作**不会**中断后台训练）。
2. **确认 GPU 是否正常工作 (`nvidia-smi`)**：
   1. **命令**：再次输入 `nvidia-smi`
   2. **作用**：重点核对两件事：一是你刚才指定的 GPU（如 0、2 号卡）的**显存**和**算力利用率**是否已经升上去了；二是底部的进程列表里是否出现了你的 Python 任务。如果显存占满了但利用率长时间是 0%，说明程序可能卡死了，或者正在用 CPU 龟速处理数据，需要检查代码。
3. **查找后台进程号 (`ps` 命令)**：
   1. **命令**：`ps -ef | grep python`
   2. **作用**：如果你忘记了提交任务时系统返回的进程号（PID），或者想看看自己当前挂了几个后台任务，可以用这个命令查找。在输出的结果中，找到你对应的训练命令那一行，**第二列的数字**就是该任务的 PID。
4. **中止/结束任务 (`kill` 命令)**：
   1. **命令**：`kill -9 PID #(PID: 你的进程号)`
   2. **作用**：如果发现参数写错了、代码报错卡死，或者想提前结束训练，**直接关闭终端是没用的**（因为你用了 `nohup`）。必须通过 `kill -9` 加上你的 PID 来强制杀掉进程，这样才能彻底释放被你占用的 GPU 资源，方便自己或他人下次使用。

> **💡 监视避坑指南**：深度学习任务在刚启动的前 5 分钟最容易崩溃（通常是因为显存溢出 OOM 或读取数据报错）。强烈建议提交任务后，先用 `tail -f train.log` 盯一会儿，直到看见模型成功打印出第一个 Epoch 或 Step 的训练指标（如 Loss），确认跑通了，再放心去忙别的事情。

#### **1.2 其他事项**

1. 数据存储规范：登录服务器后，务必在 `/home/data/` 路径下创建以个人姓名/账号命名的专属文件夹，所有个人数据、项目文件、脚本均存储在该文件夹内，严禁在 `/home/` 根路径下直接创建文件夹或存储文件，避免占用公共空间、干扰服务器正常运行。
2. 权限与安全：请勿修改、删除他人文件夹及文件，不得擅自更改服务器系统设置、安装无关软件；退出服务器时请正常关闭运行中的任务，避免后台进程持续占用GPU资源。
3. 备份要求：重要数据请定期备份至本地设备或实验室云存储，服务器不保证数据永久安全，因误操作、系统故障导致的数据丢失，责任由个人承担。

### 二、GPU使用Python脚本示例

在Python、Shell等脚本中调用GPU时，需明确指定GPU设备，避免默认占用所有GPU，常用框架的调用方式如下：

#### 2.1 Python脚本

PyTorch框架，同时使用多个GPU的示例

```python
import torch
# 方法1：指定单个GPU（如编号为0的GPU）
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = model.to(device)
data = data.to(device)

# 方法2：指定多个GPU（如编号0、1的GPU），使用DataParallel
if torch.cuda.device_count() > 1:
    model = torch.nn.DataParallel(model, device_ids=[0, 1])
model = model.cuda()
```

> 说明：GPU编号从0开始，可通过后续命令查看服务器GPU编号及状态。

#### 2.2 脚本运行时指定GPU

也可在运行脚本时通过环境变量临时指定GPU，命令如下：

```bash
python your_script.py  
```

### 三、GPU使用常用命令

以下命令用于查看GPU状态、筛选空闲GPU、管理GPU任务，涵盖日常使用核心场景，建议熟练掌握。

#### 3.1 查看GPU整体使用情况

```bash
nvidia-smi
```

输出内容说明：

* GPU：GPU编号（0、1、2...），后续调用需使用该编号。
* Fan：风扇转速（%），反映GPU负载情况。
* Temp：GPU温度，超过85℃需注意，可能影响性能或硬件安全。
* Perf：性能状态，从P0（最高性能）到P12（最低性能）。
* Memory Usage：GPU内存占用情况，剩余内存不足时需更换空闲GPU。
* Processes：当前占用GPU的进程，包含进程ID（PID）、占用GPU编号、内存使用量、运行用户。

#### 3.2 实时监控GPU状态

```bash
watch -n 1 nvidia-smi
```

说明：-n 1 表示每1秒刷新一次显示，按Ctrl+C退出监控。

#### 3.3 筛选空闲GPU

通过命令快速识别无进程占用、内存空闲率高的GPU，适合批量任务调度：

```bash
# 查看空闲GPU编号（无进程占用、内存使用率低于10%）
nvidia-smi --query-gpu=index,memory.used,memory.total --format=csv,noheader,nounits | awk -F ',' '{if($2/$3 < 0.1) print "空闲GPU编号："$1}'
```

补充判断标准：优先选择内存剩余多、温度低、无其他用户占用的GPU。

#### 3.4 其他重要命令

* 查看GPU详细信息（型号、内存、驱动版本）：

`nvidia-smi --query-gpu=all --format=csv,noheader,nounits`

* 查看CUDA版本（适配深度学习框架版本）：

`nvcc -V # 或 nvcc --version`

### 四、GPU使用参考资料

#### 4.1 官方文档

* NVIDIA官方GPU命令手册：<https://docs.nvidia.com/deploy/nvidia-smi/index.html>
* PyTorch GPU使用指南：<https://pytorch.org/docs/stable/notes/cuda.html>

#### 4.2 实用技巧补充

* 调用空闲GPU时，建议在脚本开头添加GPU状态检测逻辑，自动选择空闲设备，避免手动指定错误。
* 若服务器GPU数量较多，可使用工具（如gpustat）简化状态查看，安装命令：`pip install gpustat`，运行：`gpustat`。
* 长时间运行任务时，建议使用`nohup`命令后台运行，避免终端断开导致任务终止，示例：`nohup python your_script.py` &。
