在当今的计算环境中,GPU的高效利用变得愈加重要,尤其是在需要并行计算的AI和机器学习任务中。本文将深入探讨一个开源的GPU虚拟化方案——HAMi,涵盖其安装、配置和使用方法。
友情链接:ACEJoy
1. 为什么需要GPU共享与切分?
在深入HAMi之前,我们首先需要思考一个问题:为什么需要GPU共享和切分等方案?在裸机环境中,多个进程可以共享同一GPU,然而当我们转向Kubernetes(K8s)环境时,这种共享就变得复杂了。
资源感知
在K8s中,资源是与节点绑定的。NVIDIA提供的device-plugin可以帮助我们感知GPU资源,并将其上报到kube-apiserver。这样,我们就能在Node对象上看到相应的GPU资源。
例如,使用以下命令查看节点资源:
root@liqivm:~# k describe node gpu01 | grep Capacity -A 7
Capacity:
cpu: 128
memory: 1056457696Ki
nvidia.com/gpu: 8
可以看出,该节点上有8个GPU可用。
资源申请
当我们创建Pod时,可以申请相应的GPU资源。例如,申请一个GPU:
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: gpu-container
image: nvidia/cuda:11.0-base
resources:
limits:
nvidia.com/gpu: 1
command: ["nvidia-smi"]
这样,K8s调度器就会将该Pod调度到拥有足够GPU资源的节点上,同时该Pod申请的资源会被标记为已使用,无法再分配给其他Pod。
2. 什么是HAMi?
HAMi(Heterogeneous AI Computing Virtualization Middleware)是一个异构算力虚拟化平台,旨在为Kubernetes集群中的异构AI计算设备提供管理和调度功能。HAMi允许任务在不同类型的异构设备(如GPU、NPU等)之间共享资源,并基于设备的拓扑和调度策略做出更优的调度决策。
主要功能
HAMi支持GPU的细粒度隔离,可以对核心和内存使用进行1%级别的隔离。通过替换容器中的libvgpu.so
库,HAMi能够实现CUDA API的拦截,从而实现对GPU资源的有效管理。
例如,您可以在Pod中这样指定资源:
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: ubuntu-container
image: ubuntu:18.04
command: ["bash", "-c", "sleep 86400"]
resources:
limits:
nvidia.com/gpu: 1 # 请求1个vGPU
nvidia.com/gpumem: 3000 # 每个vGPU申请3000M显存
nvidia.com/gpucores: 30 # 每个vGPU使用30%的GPU算力
3. HAMi的部署
HAMi的安装使用Helm Chart,非常简单。首先,您需要部署NVIDIA的GPU Operator,以确保环境的兼容性。
部署步骤
- 添加HAMi仓库:
helm repo add hami-charts https://project-hami.github.io/HAMi/
- 获取集群服务端版本:
kubectl version
- 使用Helm安装HAMi:
helm install hami hami-charts/hami --set scheduler.kubeScheduler.imageTag=v1.27.4 -n kube-system
- 验证安装状态:
kubectl get pods -n kube-system | grep hami
如果vgpu-device-plugin
和vgpu-scheduler
的状态为Running,则表示安装成功。
4. 验证GPU资源
在安装完成后,您可以检查节点的GPU资源是否已经按照预期扩容。例如,使用以下命令:
kubectl get node xxx -oyaml | grep capacity -A 7
您将看到节点上可用的GPU资源数量增加。
5. 小结
HAMi作为一个开源vGPU方案,提供了细粒度的GPU资源隔离和管理能力,极大地提升了GPU的利用率。通过HAMi,用户可以在Kubernetes环境中实现对GPU资源的有效共享与管理,推动AI和机器学习任务的高效执行。
如需了解更多,欢迎访问HAMi的GitHub页面。