0%

Nvidia GPU中Persistence-M模式介绍与打开

本文主要参考该文章

1 简介

实验室同门在使用GPU服务器时遇到模型加载初始化时间过长(有时甚至达到10min)的情况,查询之后发现可以通过打开Nvidia GPU的Persistence-M模式来解决该情况,在此,也对该模式进行一个介绍以及启动方式进行记录。

首先介绍一下Persistence-M模式。

NVIDIA显卡持久模式(Persistence Mode)是一种让GPU驱动和内核模块保持加载和初始化状态的运行模式(即便没有程序在运行),避免了频繁的驱动加载/卸载开销,显著减少了首次调用GPU应用(如CUDA、深度学习任务)的延迟,确保了高性能和稳定性,对服务器、专业工作站、需要快速启动GPU任务的场景尤其重要。

​ —Gemini

该模式默是关闭的,打开之后可以提高模型加载速度,而且会一定程度上减小掉驱动的风险;代价就是会增加一定的功耗与温度。该模式的状态可以通过nvidia-smi命令来查看,如下图中的绿框所示,On表示该持久模式已经打开了。

2 启动Persistence-M模式

2.1 临时启动

使用如下命令可以启动Persistence-M模式:

1
sudo nvidia-smi -pm 1

关闭命令如下:

1
sudo nvidia-smi -pm 0

以上两个命令是临时的,只在当前有效,重启服务器之后会失效。

2.2 永久启动

若想要重启服务器之后保持打开Persistence-M模式,则需要添加启动进程。

首先,确定是否存在nvidia-persistenced命令:

1
2
❯ which nvidia-persistenced
/usr/bin/nvidia-persistenced

如果该命令不存在,则需要参考该文章来安装该命令。

然后,即可创建服务文件/etc/systemd/system/nvidia-persistenced.service(如果不存在的话):

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=NVIDIA Persistence Daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced
Restart=always

[Install]
WantedBy=multi-user.target

以上命令通过限定使用用户nvidia-persistenced来运行,从而提高安全性。接下来就是创建该用户(如果不存在的话):

1
sudo useradd -r -s /sbin/nologin nvidia-persistenced

上述创建用户的命令的两个选项:

  • 使用-r表明创建的是一个系统账号(System Account),默认不会在\home下创建文件夹,且不会像普通账号一样有密码过期策略;
  • 使用-s /sbin/nologin是指定该用户使用一个特殊的“假Shell“/sbin/nologin,表明该账号仅供后台服务使用,无法用于登录系统。

完成以上任务之后,就可以重新加载systemd:

1
2
sudo systemctl daemon-reload
sudo systemctl enable --now nvidia-persistenced

此时,可以使用以下命令检查是否正常开启:

1
2
❯ ps aux | grep nvidia-persistenced
nvidia-+ 1084550 0.0 0.0 5260 1956 ? Ss 16:11 0:02 /usr/bin/nvidia-persistenced --user nvidia-persistenced

在User列中写的是nvidia-p+就表明使用系统账号正常启动了。

2.3 文件指向/dev/null

在创建文件/etc/systemd/system/nvidia-persistenced.service时发现该文件已经存在了,且指向/dev/nullnvidia-persistenced.service -> /dev/null)。经过查询得知,当一个systemd服务文件指向/dev/null时,在Linux中被称为“Masked”(屏蔽/打标签掩盖)状态。这个状态比简单的“停止”或“禁用”更彻底,可以有效禁用文件、防止意外启动。

这里记录一下其启动及禁止命令:

1
2
sudo systemctl mask nvidia-persistenced
sudo systemctl unmask nvidia-persistenced