Project-HAMi / HAMi

Heterogeneous AI Computing Virtualization Middleware
http://project-hami.io
Apache License 2.0
1.05k stars 208 forks source link

使用vgpu创建的JupyterHub服务,资源隔离未生效,且多用户执行nvidia-smi报错 #604

Open Hugh-yw opened 3 weeks ago

Hugh-yw commented 3 weeks ago

What happened: 使用vgpu创建JupyterHub服务,发现只有通过kubectl exec ... 查询nvidia-smi 显存是切分符合预期的,但通过jupyter UI访问发现资源没有进行切分,并且多用户下执行nvidia-smi报错,详情见附件截图

What you expected to happen:

How to reproduce it (as minimally and precisely as possible):

Anything else we need to know?:

+-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+

- Your docker or containerd configuration file (e.g: `/etc/docker/daemon.json`)
- The hami-device-plugin container logs
- The hami-scheduler container logs
- The kubelet logs on the node (e.g: `sudo journalctl -r -u kubelet`)
- Any relevant kernel output lines from `dmesg`

**Environment**:
- HAMi version:  hami-2.4.0
- nvidia driver or other AI device driver version:  Driver Version: 525.60.13    CUDA Version: 12.0 
- Docker version from `docker version` : 26.1.1
- Docker command, image and tag used
- Kernel version from `uname -a`  : 5.4.0-100-generic
- Others:

1、JupyterHub deploy资源配置:
```ruby
...
        resources:
          limits:
            cpu: "64"
            memory: 512Gi
            nvidia.com/gpu: "8"
            nvidia.com/gpucores: "50"
...

2、kubectl exec 进入Pod,发现显存是切分ok的

(base) root@jupyter-54d8c99f59-jv7dw:~# nvidia-smi 
[HAMI-core Msg(999:140248332105536:libvgpu.c:836)]: Initializing.....
Mon Nov 11 12:09:37 2024       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.60.13    Driver Version: 525.60.13    CUDA Version: 12.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA A800-SXM...  On   | 00000000:10:00.0 Off |                    0 |
| N/A   26C    P0    62W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA A800-SXM...  On   | 00000000:16:00.0 Off |                    0 |
| N/A   23C    P0    57W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA A800-SXM...  On   | 00000000:49:00.0 Off |                    0 |
| N/A   25C    P0    59W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   3  NVIDIA A800-SXM...  On   | 00000000:4D:00.0 Off |                    0 |
| N/A   26C    P0    62W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   4  NVIDIA A800-SXM...  On   | 00000000:8A:00.0 Off |                    0 |
| N/A   25C    P0    59W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   5  NVIDIA A800-SXM...  On   | 00000000:8F:00.0 Off |                    0 |
| N/A   25C    P0    59W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   6  NVIDIA A800-SXM...  On   | 00000000:C6:00.0 Off |                    0 |
| N/A   24C    P0    61W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   7  NVIDIA A800-SXM...  On   | 00000000:CA:00.0 Off |                    0 |
| N/A   26C    P0    62W / 400W |      0MiB / 40960MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
[HAMI-core Msg(999:140248332105536:multiprocess_memory_limit.c:468)]: Calling exit handler 999

image image

Nimbus318 commented 2 weeks ago

@Hugh-yw

  1. 2、kubectl exec 进入Pod,发现显存是切分ok的

    这里说的 Pod 是哪个 Pod,贴一下 get -o yaml 的输出

  2. 通过jupyter UI访问发现资源没有进行切分

    这里说的没有切分的 Pod 是哪个 Pod,贴一下 get -o yaml 的输出


1、JupyterHub deploy资源配置:

        resources:
          limits:
            cpu: "64"
            memory: 512Gi
            nvidia.com/gpu: "8"
            nvidia.com/gpucores: "50"

然后这里看起来应该是 JupyterHub 本身的 Pod 的资源请求和限制,应该与为每个用户创建的 独立的 Jupyter Notebook Pod 没有关系吧,如果是这样的话可能需要有地方配置 每个用户 Notebook Pod 的资源配置

Nimbus318 commented 2 weeks ago

因为如果 每个用户 Notebook Pod 的资源配置 没有 GPU 相关资源的限制,是默认可以看到所有 GPU 资源的

Hugh-yw commented 1 week ago

@Hugh-yw

  1. 2、kubectl exec 进入Pod,发现显存是切分ok的

    这里说的 Pod 是哪个 Pod,贴一下 get -o yaml 的输出

  2. 通过jupyter UI访问发现资源没有进行切分

    这里说的没有切分的 Pod 是哪个 Pod,贴一下 get -o yaml 的输出

1、JupyterHub deploy资源配置:

        resources:
          limits:
            cpu: "64"
            memory: 512Gi
            nvidia.com/gpu: "8"
            nvidia.com/gpucores: "50"

然后这里看起来应该是 JupyterHub 本身的 Pod 的资源请求和限制,应该与为每个用户创建的 独立的 Jupyter Notebook Pod 没有关系吧,如果是这样的话可能需要有地方配置 每个用户 Notebook Pod 的资源配置

回复1: Kubectl exec -it 进入的就是Jupyterhub pod(是可以提供多用户协作)

回复2: 访问jupyter ui发现没有资源切分,访问的是jupyterhub服务本身(就一个deploy资源--->1个pod),按理来说他不应该看到全局的资源才对,8卡的算力和显存是我做了切分的

Hugh-yw commented 1 week ago

因为如果 每个用户 Notebook Pod 的资源配置 没有 GPU 相关资源的限制,是默认可以看到所有 GPU 资源的

部署的jupyterhub服务只有一个pod,这个服务本身是支持多用户协作开发的,通过kubectl exec -it 进去查看资源限制是ok的,但访问jupyter发现是没有隔离的,可以看到全局资源

Nimbus318 commented 1 week ago

通过 kubectl exec 检查 JupyterHub 服务资源限制符合预期,因为你配置的是 JupyterHub 的 deploy,这没问题

但是 JupyterHub 的服务本质是一个管理和调度的控制平面,实际上是给每个用户都创了一个 独立的 Jupyter Notebook 环境 (一个 Pod),这个事情主要是 JupyterHub 的 Spawner 组件做的,我在官方的 helm 里面找到了这个 c.KubeSpawner.namespace = os.environ.get("POD_NAMESPACE", "default"),看起来是会默认把用户的 Pod 创建在 default ns 下,可以找找是不是有相关的 Pod

如果确实有,那么就得找找有没有地方可以配置 用户 Pod 的 resources.limits

如果最后确认 kubectl exec -it 进去 的 Pod 和用户 Jupyter 连入的 Pod 确实是同一个,那么再提供一下安装的 helm chart 在哪里找到,以及版本,安装的命令或者文档连接最好也提供一下,我目前找到的 chart 和安装文档如下,我这边才好复现一下

https://hub.jupyter.org/helm-chart/#jupyterhub https://z2jh.jupyter.org/en/stable/jupyterhub/installation.html#initialize-a-helm-chart-configuration-file