实验室一台服务器大概有 10 多个人用,以前都是使用一个账号,大家合理分配时间。
现在老师要求各自建立自己的账号,但是有一个问题,因为大家的运行环境不一样,包括 cuda/python 版本等。
所以我想建立一个隔离环境,大家有一定的 sudo apt 权限,但是又不会因为环境冲突装坏系统。
目前看到的是有的用 docker/LCX ,感觉有些臃肿,求问有没有更好的方式?
如果有管理器就更好了,方便及时添加/删除用户。
另外我们有多台机器,有什么好的方法可以智能分配账号/算力资源吗?

docker 。我记得站里有个这种帖子的。

装好必要的软件,不给 sudo 权限,每个人自己用 conda多台服务器用 ansible 分发/管理帐号gpu 没必要做分配/虚拟化,抢占式/商量着来就行了

docker 或者 lxd个人更喜欢后面这个,因为和虚拟机用起来差不多

和 2 楼差不多,不给 sudo 权限,每个人自己用 conda 管理自己的环境就行,驱动管理员负责更新。然后大家去抢就好了 10 个人。

要是想在操作系统级别支持自定义安装软件,那还是 docker / LCX 吧。不是臃肿的问题,是你给了 sudo 一定滥用和冲突。

硬盘够大就行,每个人登录在自己目录下面安装自己的 conda 环境。不用给 sudo 权限,有必须要装的系统包打申请

github.com/shenuiuin/LXD_GPU_SERVER目前在用是这个方案,确实如楼上朋友所说,需要硬盘够大。但其实用下来,除了 lxc 完全隔离之外,小问题还是有不少的,如果实验室对 linux 都比较熟悉,直接分帐号使用就好了。

cuda 统一版本每个人建自己的账户,/home/xxx ,用 conda 安装自己的 python 环境不给 sudo 权限,需要安装软件的统一一个人负责

Docker 大法好。非计算机专业很难保证每个人的水平,还是各玩各的好。

用 pve+container(LXC),pve 宿主机上装显卡的 kernel 驱动,container 里装运行时(不过这样驱动版本是需要一致匹配的)大家各自拿着一个 container 有 root 权限,除了动不了 kernel ,换不了驱动版本外其他都能自己装

CUDA 就装一个,包括一些臃肿的数据集都是在管理员目录,有命令可以软链接;其他的 python 环境用户自己 conda 虚拟。

一人买一台服务器不久好了

可以使用英伟达的 MIG 方案,切分 GPU 卡

hyper-v 开小鸡分给大家,虽然臃肿,但大家想怎么搞怎么搞

不太理解。既然是服务器,当然每个人有自己的账号啊,不然怎么写代码、debug 、看数据?至于计算资源的分配,用专门的资源调度软件管理不就行了吗,例如 slurm 、htcondor 。你把作业提交上去,别人的作业结束了,你的任务就开始了啊,大家协商一下最大作业时间就行了,例如 48h 、72h 。我是做物理的,蒙卡模拟啥的,要是说错了,勿喷!

Docker ,每个用户独立使用私钥登录,都加入到 docker 组

遇到了同样的情况,4 个人用,而且并没有专人负责服务器的维护工作。因此为了方便起见,每个人都申请自己独立的拥护,自己维护自己的开发环境,然后配上了足够大容量的硬盘。GPU 分配就更粗暴了,在微信群里喊一声,用了哪张卡,要用多久,就行了。

不要给 sudu 权限,遇到不懂非要硬来的直接给你搞崩

我这边用下来有个提醒。楼上说的 Docker 方案,假如 Docker 自身不是 rootless 的,那么有权限使用 docker 的用户实质上都能提权到 root 。我这边就遇到挂载 / 然后搞事的同学。该帖其它楼的方案,比如 Proxmox VE 用 CT 共享 GPU 或者 LXD 共享,相比 Docker 的坏处是,对于缺少虚拟化经验的同学而言容易接触的资料不如 docker pull 来得多。但是话又说回来,写不明白 Dockerfile 只会连进容器内部敲命令的大有人在。搞不好他还会想装个 openssh-server ,这时候有着完整 systemd 支持的 LXC 容器,比 docker container 那就阳间太多了。对于 LXD 有一个挺漂亮的 Web 面板,可以试试: lxdware.com/

几种办法1.设备独享型,使用 openlava 配置一下,没人按需按时间抓机器丢任务去跑,优点:应用兼容性好。缺点:容易造成资源浪费(比如一个人跑的任务可能只用很少的 GPU ,但是整个机器都归他了)2.vgpu 共享型,去买个 NVIDIA vgpu 的授权,然后每台服务器可以去配置资源分割。优点:不浪费 GPU ,缺点:应用程序支持可能有限。3 VGPU+调度器型:算是 1,2 的合体,用 vgpu+opennebula 。缺点是一二缺点的集合体,再加上配置估计不简单。

把服务器部署成 runner 你们提交任务上去 排队执行

目前实验室正在使用的方案:- Kubernetes 作为集群基础架构- GitLab 提供单点登录服务- Harbor 提供自定义环境的镜像托管- JupyterLab ( z2jh.jupyter.org/en/stable/)为每个人提供可选配置的独立执行环境

open ondemand ,开源 HPC 管理 github.com/OSC/ondemand

这类环境最好不要用 docker 。。docker 在这类环境下隔离不太好做。要上的话建议 lxc 或者它的上层 lxd 。

这个 ondemond 可以分账号,一个账号搞坏不破坏系统,cuda python 不同版本环境隔离,有网页管理,支持多机集群,支持网页直接开 Jupyter notebook 。一开始是给学校用超算开发的,所以和楼主描述的实验室环境的需求几乎完全一致

#25 感谢推荐,不过部署 HPC 有点大炮打蚊子的感觉😂

kubeflow

鄙人有五年 HPC 使用经验,推荐使用:slurm这个已经是很完善的体系,在北美非常常见,从高校到美国国防部都在使用。由于系统发展比较成熟,部署难度很可能远小于自己捣鼓 docker 之类的。具体的我没有了解,还请楼主移步: slurm.schedmd.com/documentation.html

只有一台服务器的话就 Docker 部署 JupyterHub 吧,文件上传下载还可以部署一个 file browser ,如果能多几台服务器再考虑 K8S 或者 SLURM 。我现在用的方案是 K8S 底座 + Kubeflow

看了楼上诸位回复,受益良多,哈哈

SLURM 或者 Docker 挂显卡

看到很多人推荐 HPC ,想问一下单台服务器怎么部署和使用 HPC ?

多账号 ssh 和 condaconda 可以管理 cuda 版本的吧?

用 nvidia-container-runtime 来在 docker 里面跑 GPU 。大家约定好一个固定的 cuda 版本,硬性要求环境用容器部署就行了。

我的想法是 lsf ,虚拟化都不用做,大家的任务都丢队列,顺序处理,架构上来说很省事,原生 linux os 该咋用咋用,没有虚拟化、容器化的运维负载。

cuda 不统一版本最好用 docker ,宿主机上用最新的 nvdriver ,容器内 cuda 版本随意。用 conda 只能解决 python 环境,很多上古代码需要很低的 cuda 版本才能跑起来,很多 torch 2 的新功能需要新的 cuda ,不是说一句统一版本就能解决的

正解

用 LXD ,有大佬已经写过教程了: zhuanlan.zhihu.com/p/421271405目前白嫖朋友的工作站就是这样的,除了 GPU 外,自己装 tailscale 这种组网工具也可以,而且有 systemd 的支持.