从监控到隔离,阿里云容器服务提升您的GPU资源使用体验

简介: 通过使用阿里云容器服务的GPU支持,可以提升GPU资源管理的可见性,了解到需要多少的GPU资源可以支撑图像识别,语音识别,在线翻译等业务,如何能用最少的成本满足业务需求;而可以在无需修改现有GPU程序的前提下,保障多个容器共享同一个GPU时,实现彼此互相隔离。

从监控到隔离,阿里云容器服务提升您的GPU资源使用体验

推动人工智能不断向前的动力来自于强大的算力,海量的数据和优化的算法,而Nvidia GPU是最流行的异构算力提供者,是高性能深度学习的基石。但是GPU不菲的价格一直是用户的心头之痛,而从使用率的角度来看,模型预测场景下,应用独占GPU模式实际上会对这种宝贵的资源造成大量的浪费。但是共享GPU实际上也不是一蹴而就,比如一方面用户需要判断多少的分配GPU资源可以达到成本和QPS平衡的最优,另一方面也要考虑同时当多个应用运行在一个GPU设备上时,应用的SLA如何保障。
image.png
而通过使用阿里云容器服务,一方面借助托管的Prometheus,提升GPU资源管理的可见性,快速了解到需要多少的GPU资源可以支撑图像识别,语音识别,在线翻译等业务,如何能用最少的成本满足业务需求;而另一方面,借助昊天cGPU,在无需修改现有GPU程序的前提下,保障多个容器共享同一个GPU时,彼此互相隔离。
我们通过一个实际的例子向您展示如何利用托管Prometheus的监控能力查看GPU的显存使用,并且通过昊天cGPU进行资源隔离。

前置条件

使用步骤

通过托管Prometheus监控独享GPU

  1. 登录ARMS控制台, 选择Kubernetes所在的集群
  2. 在ARMS控制台中Prometheus界面中,点击集群列表中需要监控集群的安装按钮。此过程需要2分钟左右,请点击确认。

image.png

  1. 在该集群的已安装插件中可以看到 GPU NodeGPU APP,分别从节点维度和应用维度监控GPU资源

image.png

  1. 运行测试应用

利用命令行部署如下应用, 参考文档

apiVersion: apps/v1beta1
kind: StatefulSet

metadata:
  name: app-3g-v1
  labels:
    app: app-3g-v1
spec:
  replicas: 1
  serviceName: "app-3g-v1"
  podManagementPolicy: "Parallel"
  selector: # define how the deployment finds the pods it manages
    matchLabels:
      app: app-3g-v1
  updateStrategy:
    type: RollingUpdate
  template: # define the pods specifications
    metadata:
      labels:
        app: app-3g-v1
    spec:
      containers:
      - name: app-3g-v1
        image: registry.cn-shanghai.aliyuncs.com/tensorflow-samples/cuda-malloc:3G
        resources:
          limits:
            nvidia.com/gpu: 1

部署成功后,查看应用的状态,可以知道应用的名称是app-3g-v1-0

kubectl get po
NAME          READY   STATUS    RESTARTS   AGE
app-3g-v1-0   1/1     Running   1          2m56s
  1. 通过应用角度监控, 点击GPU App进入可以观察到GPU的显存使用率, 可以发现这个应用的GPU显存占用率仅为20%,有80%的浪费。而它使用的显存也是比较稳定在3.4GB左右,而该GPU总的显存是16GB左右。

image.png
此时可以发现一个应用独占一张GPU卡的模式非常浪费。因此可以考虑通过使用cGPU(container GPU)可以将多个应用部署在同一个GPU卡上。
可以先将该容器移除

kubectl delete sts app-3g-v1

使用cGPU保障多容器共享

为带有GPU设备的节点打标签

在安装cGPU相关组件之前,需要给gpu节点打上标签"cgpu=true",步骤如下:
(1)登录容器服务 Kubernetes 版控制台
(2)在 Kubernetes 菜单下,单击左侧导航栏中的集群 > 节点,进入节点列表页面。选择所需的集群,在页面右上角单击标签管理。
(3)选择所需的集群,在页面右上角单击标签管理。

(4)在节点列表中,批量选择节点,然后单击添加标签。

(5)填写标签名称和值(名称为cgpu,值为true),点击确定。

安装cGPU相关组件

(1)登录容器服务 Kubernetes 版控制台。(2)在左侧导航栏选择市场 > 应用目录,在右侧选中 ack-cgpu。(3)在应用目录 -> ack-cgpu页面上,在右侧的创建面板中选择前提条件中创建的集群和命名空间,并单击创建。
image.png

  1. 安装kubectl-inspect-cgpu

kubectl-inspect-gpushare是一个查询节点GPU分配情况的工具,它依赖集群的kubeconfig配置文件。请登录到linux客户端进行安装。请确保"~/.kube/config"文件已经存在,如何下载集群的kubeconfig文件,请参考用kubectl管理集群。kubeconfig文件配置完成以后,接着在该节点上执行如下操作安装kubectl-inspect-cgpu:

# cd /usr/local/bin
# wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/cgpu/kubectl-inspect-cgpu
# chmod u+x /usr/local/bin/kubectl-inspect-cgpu
  1. 通过kubectl-inspect-cgpu检查GPU资源
# kubectl inspect cgpu
NAME                       IPADDRESS      GPU0(Allocated/Total)  GPU Memory(GiB)
cn-hangzhou.192.168.2.167  192.168.2.167  0/15                   0/15
----------------------------------------------------------------------
Allocated/Total GPU Memory In Cluster:
0/15 (0%)
此时可以发现该节点的GPU资源维度已经从卡变成GPU显存

部署共享GPU工作负载

  1. 按照GPU显存维度调度重新创建工作负载

只需要将之前的部署yaml做两处的修改:

  • 将实例的副本数从1改为2,这样可以指定部署两个负载。而在原有GPU独享的配置下,单个GPU卡智能调度单个容器;修改配置后,可以部署两个Pod实例。
  • 将资源维度从nvidia.com/gpu变为aliyun.com/gpu-mem, 单位也从个变成了GiB

由于每个应用不足以独享GPU资源,因此它们可以部署到同一个GPU设备上。

apiVersion: apps/v1beta1
kind: StatefulSet

metadata:
  name: app-3g-v1
  labels:
    app: app-3g-v1
spec:
  replicas: 2
  serviceName: "app-3g-v1"
  podManagementPolicy: "Parallel"
  selector: # define how the deployment finds the pods it manages
    matchLabels:
      app: app-3g-v1
  template: # define the pods specifications
    metadata:
      labels:
        app: app-3g-v1
    spec:
      containers:
      - name: app-3g-v1
        image: registry.cn-shanghai.aliyuncs.com/tensorflow-samples/cuda-malloc:3G
        resources:
          limits:
            aliyun.com/gpu-mem: 4

从运行结果看,可以看到两个Pod都运行在同一个GPU设备上

#  kubectl inspect cgpu -d

NAME:       cn-hangzhou.192.168.2.167
IPADDRESS:  192.168.2.167

NAME         NAMESPACE  GPU0(Allocated)
app-3g-v1-0  default    4
app-3g-v1-1  default    4
Allocated :  8 (53%)
Total :      15
--------------------------------------------------------

Allocated/Total GPU Memory In Cluster:  8/15 (53%)
  1. 而分别登陆两个容器的时候可以看到他们各自的GPU显存的上限已经设置为4301MiB, 也就是在容器内使用的GPU显存不会超过这个上限
kubectl exec -it app-3g-v1-0 nvidia-smi
Mon Apr 13 01:33:10 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
| N/A   37C    P0    57W / 300W |   3193MiB /  4301MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

kubectl exec -it app-3g-v1-1 nvidia-smi
Mon Apr 13 01:36:07 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
| N/A   38C    P0    57W / 300W |   3193MiB /  4301MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
  1. 而登陆到节点后,可以看到该GPU被使用的显存资源为两个容器之和6396MiB。这里可以看到cGPU资源已经起到了按容器隔离的效果。
# nvidia-smi
Mon Apr 13 09:36:43 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
| N/A   37C    P0    57W / 300W |   6396MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      2174      C   cuda_malloc                                 3193MiB |
|    0      2209      C   cuda_malloc                                 3193MiB |
+-----------------------------------------------------------------------------+
  1. 此时登录到容器内试图申请更多的GPU资源时,会直接报出显存分配失败的错误
kubectl exec -it app-3g-v1-1 bash
root@app-3g-v1-1:/# cuda_malloc -size=1024
cgpu_cuda_malloc starting...
Detected 1 CUDA Capable device(s)

Device 0: "Tesla V100-SXM2-16GB"
  CUDA Driver Version / Runtime Version          10.1 / 10.1
  Total amount of global memory:                 4301 MBytes (4509925376 bytes)
Try to malloc 1024 MBytes memory on GPU 0
CUDA error at cgpu_cuda_malloc.cu:119 code=2(cudaErrorMemoryAllocation) "cudaMalloc( (void**)&dev_c, malloc_size)"

通过托管Prometheus监控共享GPU

  1. 实际上用户并不需要到每个容器内执行nvidia-smi,这样做监控一方面效率低,也无法获得资源趋势。用户可以通过登录到ARMS控制台,选择相应的Kubernetes集群,进入GPU App。可以直接看到每个应用的GPU显存用量和占比

image.png

  1. 如果希望从节点维度观测,可以通过GPU Node查看GPU卡的显存使用量。可以看到恰好其显存使用率是两个GPU应用的使用之和为40%。

image.png

  1. 接下来,我们演示如何将一个害群之马关到笼子里,即当某个应用程序的声明使用GPU显存用量超过了资源上限后,cGPU如何确保当其他应用不受影响。

部署一个新的GPU应用,该应用声明使用的GPU显存是4GiB,但是它实际使用的GPU显存为6GiB

apiVersion: apps/v1beta1
kind: StatefulSet

metadata:
  name: app-6g-v1
  labels:
    app: app-6g-v1
spec:
  replicas: 1
  serviceName: "app-6g-v1"
  podManagementPolicy: "Parallel"
  selector: # define how the deployment finds the pods it manages
    matchLabels:
      app: app-6g-v1
  template: # define the pods specifications
    metadata:
      labels:
        app: app-6g-v1
    spec:
      containers:
      - name: app-6g-v1
        image: registry.cn-shanghai.aliyuncs.com/tensorflow-samples/cuda-malloc:6G
        resources:
          limits:
            aliyun.com/gpu-mem: 4

将该应用部署之后可以发现该pod一直处于CrashLoopBackOff, 而之前两个Pod还是正常运行的状态

# kubectl get po
NAME          READY   STATUS             RESTARTS   AGE
app-3g-v1-0   1/1     Running            0          7h35m
app-3g-v1-1   1/1     Running            0          7h35m
app-6g-v1-0   0/1     CrashLoopBackOff   5          3m15s

而该容器的日志报错,也很明确的显示是由于cudaErrorMemoryAllocation造成的

kubectl logs app-6g-v1-0
CUDA error at cgpu_cuda_malloc.cu:119 code=2(cudaErrorMemoryAllocation) "cudaMalloc( (void**)&dev_c, malloc_size)"

而此时其他的容器并没有收到影响,从托管的Prometheus监控中也可以看到之前的容器一直处于平稳运行之中,并没有受到新部署应用的影响。
image.png

总结

通过使用阿里云容器服务的GPU支持,可以提升GPU资源管理的可见性,了解到需要多少的GPU资源可以支撑图像识别,语音识别,在线翻译等业务,如何能用最少的成本满足业务需求;而可以在无需修改现有GPU程序的前提下,保障多个容器共享同一个GPU时,实现彼此互相隔离。帮助用户在享受低成本的同时,保障了应用的可靠性。

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
370 1
|
3月前
|
人工智能 城市大脑 运维
喜讯!阿里云国产异构GPU云平台技术荣获“2025算力中国·年度重大成果”
2025年8月23日,在工业和信息化部新闻宣传中心、中国信息通信研究院主办的2025中国算力大会上,阿里云与浙江大学联合研发的“国产异构GPU云平台关键技术与系统”荣获「算力中国·年度重大成果」。该评选旨在选拔出算力产业具有全局性突破价值的重大成果,是业内公认的技术创新“风向标”。
456 0
|
8月前
|
存储 机器学习/深度学习 数据库
阿里云服务器X86/ARM/GPU/裸金属/超算五大架构技术特点、场景适配参考
在云计算技术飞速发展的当下,云计算已经渗透到各个行业,成为企业数字化转型的关键驱动力。选择合适的云服务器架构对于提升业务效率、降低成本至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供大家了解和选择参考。
1274 61
|
4月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
551 2
|
9月前
|
存储 机器学习/深度学习 算法
阿里云X86/ARM/GPU/裸金属/超算等五大服务器架构技术特点、场景适配与选型策略
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别。本文将深入解析这些架构的特点、优势及适用场景,帮助用户更好地根据实际需求做出选择。
|
10月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
370 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
11月前
|
存储 机器学习/深度学习 人工智能
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)
|
11月前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
介绍如何使用ACK Edge与虚拟节点满足DeepSeek部署的弹性需求。
|
11月前
|
机器学习/深度学习 存储 人工智能
2025年阿里云GPU服务器的租赁价格与选型指南
随着AI、深度学习等领域的发展,GPU服务器成为企业及科研机构的核心算力选择。阿里云提供多种GPU实例类型(如NVIDIA V100、A100等),涵盖计算型、共享型和弹性裸金属等,满足不同场景需求。本文详解2025年阿里云GPU服务器的核心配置、价格策略及适用场景,帮助用户优化选型与成本控制,实现高效智能计算。

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版