背景
yolo设置gpu:1但是在启动之后, 会发现gpu:0上也会出现相同进程号的进程, 并且gpu:0的利用率在波动, 而gpu1没有波动.
一、现象总结
设置了 device=1 / gpu:1
但 nvidia-smi 里 gpu:0 也出现了同一个 PID
gpu:0 显存占用 + 利用率波动
gpu:1 几乎不动 / 不波动
二、真实原因
PyTorch 会默认在 GPU:0 上初始化 CUDA 上下文,即使指定用 GPU:1 做主训练卡。
也就是说:
真正的模型、前向、反向、数据 → 99% 都在 GPU:1
GPU:0 只是被占了一个 "CUDA 上下文" + 少量显存
GPU:0 波动 = CUDA 初始化 + 少量通信开销
GPU:1 不波动 = 它在认真干活,但显示不明显(YOLO 推理 / 训练本来就快)
三、为什么 GPU:0 会有同一个 PID?
因为:
一个进程 = 一个 PID
这个进程启动 CUDA → 默认一定会初始化 GPU:0
你指定用 gpu:1 → 模型在 1 上跑
但 进程还是同一个 → 所以两边显示同一个 PID
这是 CUDA 底层机制,不是 YOLO 的问题。
四、为什么 GPU:1 不波动?
因为:
YOLO 推理 / 训练速度极快
GPU 利用率不是持续 100%
它是间歇性干活
nvidia-smi 是一秒采样一次
→ 所以你看到 GPU:1 几乎不动,但它其实在干活
五、如何确认模型真的在 GPU:1 上跑?
运行这段代码,100% 确认模型设备:
python
运行
import torch
model = torch.load("your_weights.pt")
print(next(model.parameters()).device)
输出:
plaintext
cuda:1
✅ 说明模型 100% 在 GPU1
六、如何彻底让 GPU0 不出现任何进程?
如果希望 GPU0 完全干净,必须在 程序最开头 设置环境变量:
python
运行
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
import torch
后面再写 YOLO 代码
效果:
只会看到 GPU:1
GPU:0 完全干净
不会出现双 GPU 现象
这是唯一能彻底解决的方法。
七、最终结论
✅ 配置没有错
✅ 模型确实在 GPU1 跑
✅ GPU0 只是 CUDA 上下文,不影响性能
✅ 想彻底干净 → 用 CUDA_VISIBLE_DEVICES=1
八. 解决方案
在 YOLO 启动脚本 /train.py 最最开头,加入这行:
python
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
说明: 必须放在 import torch 之前!必须第一行!
示例
- 情况 1:用 Python 脚本启动(train.py/detect.py)
在文件第 1 行加:
python
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
import torch
import utils
- 情况 2:用命令行启动(bash / 命令行)
直接运行:
bash
export CUDA_VISIBLE_DEVICES=1
python train.py --device 1
改完之后效果
✅ GPU:0 完全不出现任何进程
✅ GPU:1 正常占用、正常波动
✅ 模型 100% 跑在 GPU1
✅ 不会再出现 "同 PID 双 GPU" 现象