我正在 Ubuntu 18.04 下配置一个小型 GPU 服务器。它应该支持交互式作业和批处理作业。
它由一个小团队专门用于运行机器学习任务。我们还有一些仅在 CPU 上进行大规模并行数据处理的任务。
我的目标是避免单个人无限期地占用 GPU,例如,这个人可以启动 IPython 控制台,import tensorflow
在其中发出问题然后离开办公室,因为他的工作时间已经结束。
从另一个方面来说,希望允许用户以交互方式(在 CPU 上)进行一些原型设计。
考虑到以上所有因素,我安装了 SLURM 工作负载管理器来支持作业队列和调度。
现在我想限制交互式会话对 GPU 的访问,并将它们完全置于 SLURM 的控制之下。
限制访问/dev/nvidia[0-3]
,如建议的那样这里,不起作用,因为 SLURM 将流程用户从 root 更改为实际任务所有者。
经过一番 Google 搜索,我找到了两个变体:cgroups 和 udev。
阅读这个话题在 systemd-devel 邮件列表中建议可以绕过 systemd 来限制使用 cgroups 的访问,只需发出如下命令即可 echo "c 195:*" > /sys/fs/cgroup/devices/ blah-blah-blah /device.deny
尽管如此,我还是读到了手动的systemd 支持 3 个切片。
我还发现,SLURM 守护进程启动的进程在 中运行system.slice
,而使用 ssh 或远程桌面连接连接到服务器的用户启动的进程在 中运行user.slice
。
原则上,我可以手动编辑文件并按说明/lib/systemd/system/user.slice
添加DeviceAllow="char-nvidia-frontend"
这里,但该文件可能会在下次更新软件包后发生变化。
device.deny
那么,在 Ubuntu 18.04 中设置属性的正确方法是什么?
Lennart Pottering,systemd 开发人员说限制访问的另一个选项是 udev。
我已经开始阅读手册,但似乎 udev 主要用于硬盘或 USB 设备,而不是视频卡。
有人可以分享一个配置设置权限的示例吗?
答案1
我认为,我已经用环境变量解决了我的任务CUDA_VISIBLE_DEVICES
。
我已经输入了/etc/environment
一行CUDA_VISIBLE_DEVICES=-1
,因此“恳请”交互式会话不要使用 GPU。