K8S节点GPU虚拟化(vGPU)

这篇具有很好参考价值的文章主要介绍了K8S节点GPU虚拟化(vGPU)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vGPU实现方案

4paradigm提供了k8s-device-plugin,该插件基于NVIDIA官方插件(NVIDIA/k8s-device-plugin),在保留官方功能的基础上,实现了对物理GPU进行切分,并对显存和计算单元进行限制,从而模拟出多张小的vGPU卡。在k8s集群中,基于这些切分后的vGPU进行调度,使不同的容器可以安全的共享同一张物理GPU,提高GPU的利用率。此外,插件还可以对显存做虚拟化处理(使用到的显存可以超过物理上的显存),运行一些超大显存需求的任务,或提高共享的任务数。

部署

需要在节点上将nvidia runtime做为你的docker runtime预设值。我们将编辑docker daemon的配置文件,此文件通常在/etc/docker/daemon.json路径:

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
    "default-shm-size": "2G"
}

虚拟化之前,在GPU节点启动一个GPU应用pod,通过nvidia-smi 查看GPU分配及使用情况。
pod资源请求:

    Limits:
      cpu:             4
      memory:          16Gi
      nvidia.com/gpu:  1
    Requests:
      cpu:             2
      memory:          8Gi
      nvidia.com/gpu:  1

pod内执行nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| 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  A10                 On   | 00000000:00:08.0 Off |                  Off |
|  0%   53C    P0    71W / 150W |   1475MiB / 24258MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

可以看到此时占用A10节点整张卡显存 24Gi 。

关闭NVIDIA官方插件

关闭NVIDIA官方插件(NVIDIA/k8s-device-plugin)。

把nvidia-device-plugin ds描述文件移除即可,为安全可以移动到其它目录,如下移动到家目录做备份保存。

[root@gpua10_1 ~]# mv /etc/kubernetes/manifests/nvidia-device-plugin.yml .

如上操作后,原来的nvidia pod:

(base) ➜  ~ kubectl -n kube-system get po |grep nvidia                                                     
nvidia-device-plugin-gpua10_1            1/1     Running     0              5d

移除ds描述文件后,以上pod会消失。

启动4paradigm新的k8s-device-plugin

ds文件如下:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nvidia-device-plugin-daemonset
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: nvidia-device-plugin-ds
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ""
      labels:
        name: nvidia-device-plugin-ds
    spec:
      tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
      - key: nvidia.com/gpu
        operator: Exists
        effect: NoSchedule
      priorityClassName: "system-node-critical"
      containers:
      - image: 4pdosc/k8s-device-plugin:latest
        # - image: m7-ieg-pico-test01:5000/k8s-device-plugin-test:v0.9.0-ubuntu20.04
        imagePullPolicy: Always
        name: nvidia-device-plugin-ctr
        args: ["--fail-on-init-error=false", "--device-split-count=6", "--device-memory-scaling=2", "--device-cores-scaling=1"]
        # args: ["--fail-on-init-error=false", "--device-split-count=3", "--device-memory-scaling=3", "--device-cores-scaling=1"]
        env:
        - name: PCIBUSFILE
          value: "/usr/local/vgpu/pciinfo.vgpu"
        - name: NVIDIA_MIG_MONITOR_DEVICES
          value: all
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
            add: ["SYS_ADMIN"]
        volumeMounts:
          - name: device-plugin
            mountPath: /var/lib/kubelet/device-plugins
          - name: vgpu-dir
            mountPath: /usr/local/vgpu
          - mountPath: /tmp
            name: hosttmp
      volumes:
        - name: device-plugin
          hostPath:
            path: /var/lib/kubelet/device-plugins
        - name: vgpu-dir
          hostPath:
            path: /usr/local/vgpu
        - hostPath:
            path: /tmp
          name: hosttmp
      nodeSelector: 
        nvidia-vgpu: "on"
  • fail-on-init-error: 布尔类型, 预设值是true。当这个参数被设置为true时,如果装置插件在初始化过程遇到错误时程序会返回失败,当这个参数被设置为false时,遇到错误它会打印信息并且持续阻塞插件。持续阻塞插件能让装置插件即使部署在没有GPU的节点(也不应该有GPU)也不会抛出错误。这样你在部署装置插件在你的集群时就不需要考虑节点是否有GPU,不会遇到报错的问题。然而,这么做的缺点是如果GPU节点的装置插件因为一些原因执行失败,将不容易察觉。现在预设值为当初始化遇到错误时程序返回失败,这个做法应该被所有全新的部署采纳。
  • device-split-count: 整数类型,预设值是2。NVIDIA装置的分割数。对于一个总共包含N张NVIDIA GPU的Kubernetes集群,如果我们将device-split-count参数配置为K,这个Kubernetes集群将有K * N个可分配的vGPU资源。注意,我们不建议将NVIDIA 1080 ti/NVIDIA 2080 ti device-split-count参数配置超过5,将NVIDIA T4配置超过7,将NVIDIA A100配置超过15。
  • device-memory-scaling: 浮点数类型,预设值是1。NVIDIA装置显存使用比例,可以大于1(启用虚拟显存,实验功能)。对于有M​显存大小的NVIDIA GPU,如果我们配置device-memory-scaling参数为S,在部署了我们装置插件的Kubenetes集群中,这张GPU分出的vGPU将总共包含 S * M显存。每张vGPU的显存大小也受device-split-count参数影响。在先前的例子中,如果device-split-count参数配置为K,那每一张vGPU最后会取得 S * M / K 大小的显存。
  • device-cores-scaling: 浮点数类型,预设值与device-split-count数值相同。NVIDIA装置算力使用比例,可以大于1。如果device-cores-scaling​参数配置为S​ device-split-count参数配置为K,那每一张vGPU对应的一段时间内 SM 利用率平均上限为S / K。属于同一张物理GPU上的所有vGPU SM利用率总和不超过1。
  • enable-legacy-preferred: 布尔类型,预设值是false。对于不支持 PreferredAllocation 的kubelet(<1.9)可以设置为true,以更好的选择合适的设备,开启时,本插件需要有对pod的读取权限,可参看 legacy-preferred-nvidia-device-plugin.yml。对于 kubelet >= 1.9 时,建议关闭。

如上"--device-split-count=6", "--device-memory-scaling=2", 表示在原显存基础上扩充二倍切成六份使用,也就是24Gi*2/6=8Gi,虚拟化之后原GPU可以切成6份使用,每份占用显存8Gi,虚拟化之后多出的显存实际是用内存作显存使用,所以注意节点的内存大小(要留够节点正常运行所需的内存),不然会出现OOM的情况,在需要进行虚拟化的节点打上标签nvidia-vgpu: "on"即可。

部署以上ds,且节点打上标签后会出现:

(base) ➜  ~ kubectl -n kube-system get pod |grep nvidia
nvidia-device-plugin-daemonset-pm21x                      1/1     Running     0               3d12h

此时pod内再次执行nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| 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 A10          On   | 00000000:00:0A.0 Off |                    0 |
|  0%   43C    P0    68W / 150W |   4375MiB /  7676MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

可以看到pod分配了8Gi的显存。

注意

以上是在nvidia版本NVIDIA-SMI 460.91.03 Driver Version: 460.91.03 CUDA Version: 11.3执行的操作。在升级到NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 版本的时候遇到vGPU虚拟化不生效的问题,解决方案是:文章来源地址https://www.toymoban.com/news/detail-792252.html

  1. 升级libvgpu.so到最新
  2. 在server.go中添加/tmp/vgpulock文件权限。
os.MkdirAll("/tmp/vgpulock", 0777)
os.Chmod("/tmp/vgpulock", 0777)
response.Mounts = append(response.Mounts,
             &pluginapi.Mount{"containerPath": "/usr/local/vgpu/libvgpu.so",
                                "HostPath": "/usr/local/vgpu/libvgpu.so", ReadOnly: true},
 			&pluginapi.Mount{"containerPath": "/etc/ld.so.preload",
                                "HostPath": "/usr/local/vgpu/ld.so.preload", ReadOnly: true},
 			&pluginapi.Mount{"containerPath": "/usr/local/vgpu/pciinfo.vgpu",
                                "HostPath": os.Getenv("PCIBUSFILE"), ReadOnly: true},
 			&pluginapi.Mount{"containerPath": "/tmp/vgpulock",
                                "HostPath": "/tmp/vgpulock", ReadOnly: true},

到了这里,关于K8S节点GPU虚拟化(vGPU)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GPU虚拟化理解包含直通,k8s安装,GPU-manager

    vGPU,即真正意义上的GPU虚拟化方案,就是将一块GPU卡的计算能力进行切片,分成多个逻辑上虚拟的GPU,以vGPU为单位分配GPU的计算能力, 并将单块GPU卡分配给多台虚拟机使用,使得虚拟机能够运行3D软件、播放高清视频等,极大地提升了用户体验。真正实现了GPU资源的按需分

    2024年02月13日
    浏览(41)
  • GPU虚拟化

    须知: 文章内容大程度参考B站王利明老师对《GPU虚拟化技术分享》的主题演讲 视频链接: https://b23.tv/uQKBpcK GPU可以用于图形渲染,GPU 作为加速图形绘制的芯片时,它主要面向的产品主要是会集中在 PC 和游戏两个市场。也能够用于高性能计算领域(GPGPU)和编解码场景(子模块)等。

    2024年02月05日
    浏览(56)
  • 【架构】GPU虚拟化

    局限:授权付费 Hardware Partition:Ampere 架构的 A100 GPU 所支持的 MIG,即是一种 Hardware Partition。它的问题是不灵活: 只有高端 GPU 支持;只支持 CUDA 计算;A100 只支持 7 个 MIG 实例。 nVidia MPS:它通过将多个进程的 CUDA Context,合并到一个 CUDA Context 中,省去了 Context Switch 的开销,也

    2024年02月21日
    浏览(34)
  • AMD GPU虚拟化

    在GPU虚拟化场景下Linux内核层一般需要二套driver,一套是是常规的VF driver(比如amdgpu.ko、amdkfd.ko), 另一套是PF driver(比如gim.ko)用来sriov的初始化(SR-IOV extended capability),vfid的配置等。其中PF driver运行于Host侧,而VF driver运行于虚拟化VM侧,gim.ko和amdkfd.ko/amdgpu.ko之间可以通过Mailbox和

    2024年02月06日
    浏览(40)
  • Nvidia GPU虚拟化

    目录 1 背景 2 GPU虚拟化 2.1 用户态虚拟化 2.2 内核态虚拟化 2.3 硬件虚拟化 3 其他 3.1 vGPU 3.2 MPS(Multi-Process Service) ​编辑 3.3 远程GPU 随着Nvidia GPU在渲染、编解码和计算领域发挥着越来越重要的作用,各大软件厂商对于Nvidia GPU的研究也越来越深入,尽管Nvidia倾向于生态闭源,

    2024年02月06日
    浏览(42)
  • GPU桌面虚拟化HyperV实践

      目录 创建虚拟机 添加GPU 刷入显卡驱动 a说科技:1台电脑当10台用,在家开网吧,显卡分割术,Gpu虚拟化 (下) https://www.bilibili.com/video/BV1Dm4y1A7XR/?spm_id_from=333.880.my_history.page.clickvd_source=473f5de900547235e222613fd986ab31 额外补充说明:镜像可用Wintogo快速制作,刷入wintogo EFI到虚拟

    2024年02月06日
    浏览(40)
  • GPU 容器虚拟化新能力发布和全场景实践

    今天给大家分享的主题是百度智能云在「GPU 容器虚拟化」方面的最新进展和全场景实践,希望通过这次分享和大家一起探讨如何在实际业务场景更好的应用 GPU 容器虚拟化技术。 本次分享将首先介绍百度智能云 GPU 容器虚拟化 2.0 的升级变化,然后介绍新版本中的技术实现方

    2024年02月14日
    浏览(39)
  • 创建K8s节点的虚拟机

    30、Root密码,设置密码,再点击完成

    2024年01月23日
    浏览(40)
  • 虚拟机挂起/重启后导致K8s网络不通或服务启动后主节点无法访问问题

    3台linux服务器搭建的一个 kubeadm-k8s 的集群环境,(1 Master 2 Worker),  当断电或者虚拟机挂起恢复后出现 service 访问不了,pod之间ping不通或者集群搭建失败问题,但是K8s集群还是正常可以创建 deployment 以及调度 pod 到各个 node 上, 并且 node都处于 ready 的状态。 找到其中的 kube

    2024年02月08日
    浏览(56)
  • 【K8S】docker和K8S(kubernetes)理解?docker是什么?K8S架构、Master节点 Node节点 K8S架构图

    一、docker的问世         在LXC(Linux container)Linux容器虚拟技术出现之前,业界网红是虚拟机。虚拟机技术的代表,是VMWare和OpenStack。 虚拟机是什么?         虚拟机其实就是 在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。

    2024年03月26日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包