ubuntu安装k8s+docker运行英伟达gpu cuda
创始人
2025-01-11 03:05:53
0

 安装k8s+docker

sealos reset  sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes-docker:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 --single
英伟达Ubuntu驱动下载地址:https://us.download.nvidia.cn/XFree86/Linux-x86_64/550.78/NVIDIA-Linux-x86_64-550.78.run  ./NVIDIA-Linux-x86_64-550.78.run  nvidia-smi  Fri Jul 12 23:18:31 2024        +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 550.78                 Driver Version: 550.78         CUDA Version: 12.4     | |-----------------------------------------+------------------------+----------------------+ | 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 GeForce GTX 1060 6GB    Off |   00000000:02:00.0  On |                  N/A | | 38%   39C    P8              8W /  150W |     273MiB /   6144MiB |      0%      Default | |                                         |                        |                  N/A | +-----------------------------------------+------------------------+----------------------+                                                                                           +-----------------------------------------------------------------------------------------+ | Processes:                                                                              | |  GPU   GI   CI        PID   Type   Process name                              GPU Memory | |        ID   ID                                                               Usage      | |=========================================================================================| |    0   N/A  N/A       969      G   /usr/lib/xorg/Xorg                            184MiB | |    0   N/A  N/A      1597      G   /usr/bin/gnome-shell                           65MiB | |    0   N/A  N/A      2143      G   ...in/bin/sunloginclient --cmd=autorun         11MiB | |    0   N/A  N/A      2379      G   ...) Chrome/58.0.3029.81 Safari/537.36          1MiB | |    0   N/A  N/A      2405      G   ...en=DA4D3A8EA9B98D974368ACD3390ED795          5MiB |   distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update --fix-missing sudo apt-get install -y nvidia-container-toolkit nvidia-docker2 sudo apt-get --only-upgrade install nvidia-docker2  sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {   "registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker  sudo docker run --rm -it --gpus all nvidia/cuda:11.8.0-devel-ubuntu22.04 /bin/bash

kubernetes 使用运行时 docker,需要编辑通常存在的配置文件 /etc/docker/daemon.json, 以设置 nvidia-container-runtime 为默认的低级运行时:

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


然后重新启动 docker:

sudo systemctl restart docker

NVIDIA 设备插件

安装工作的 CUDA 驱动程序、设置 NVIDIA 容器工具包和将 containerd 配置为使用 NVIDIA 运行时环境,我们现在可以使用其 Helm chart 来应用 NVIDIA 设备插件。

代码语言:javascript

复制

helm repo add nvdp https://nvidia.github.io/k8s-device-plugin helm repo update helm upgrade -i nvdp nvdp/nvidia-device-plugin \   --namespace nvidia-device-plugin \   --include-crds \   --create-namespace \   --version 0.14.3
时间切片(可选)

NVIDIA 设备插件的默认行为是将整个 GPU 分配给单个 pod,这意味着如果有多个 pod 请求 GPU 时间,每次只会调度一个 pod。

为了克服这个问题,我们可以配置 GPU 的时间切片,即 GPU 在 pod 之间共享。

首先创建一个 ConfigMap,配置最大 10 个副本(第 14 行)来配置时间切片。

代码语言:javascript

复制

# cm-time-slicing.yaml apiVersion: v1 kind: ConfigMap metadata:   name: cm-time-slicing   namespace: nvidia-device-plugin data:   time-slicing: |-     version: v1     sharing:       timeSlicing:         resources:           - name: nvidia.com/gpu             replicas: 10

然后应用 ConfigMap,并通过名称(第 5 行)和提供的默认配置键(第 8 行)配置 nvidia-device-plugin 使用它。

代码语言:javascript

复制

kubectl apply -f cm-time-slicing.yaml  helm upgrade nvdp nvdp/nvidia-device-plugin \   --reuse-values \   --set config.name=cm-time-slicing \   --set config.default=time-slicing

现在您应该通过运行下面的命令看到每个节点每个 GPU 有 10 个 nvidia.com/gpu 的容量:

代码语言:javascript

复制

kubectl get node -o 'jsonpath={.items[*].status.capacity}' | jq

代码语言:javascript

复制

{   ...   "nvidia.com/gpu": "10",   ... }

请注意,工作负载从同一 GPU 获取副本,每个工作负载都可以访问相同的 GPU 内存,并在同一故障域中运行,这意味着如果一个工作负载崩溃,它们都会崩溃。

有关配置设备插件的更多详细信息,请参阅 GitHub 上的自述文件。

运行工作负载

假设配置都正常,我们现在可以尝试运行一个测试工作负载,通过启动一个请求 GPU 资源的 pod 来使用 GPU(第 11-13 行)。

代码语言:javascript

复制

apiVersion: v1 kind: Pod metadata:   name: cuda-vectoradd   namespace: cuda-test spec:   restartPolicy: OnFailure   containers:   - name: cuda-vectoradd     image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"     resources:       limits:         nvidia.com/gpu: "1"

代码语言:javascript

复制

kubectl create ns cuda-test kubectl apply -f cuda-vectoradd.yaml

如果一切顺利,工作负载的日志应该显示:

代码语言:javascript

复制

kubectl logs -n cuda-test cuda-vectoradd [Vector addition of 50000 elements] ... Test PASSED

如果一切正常,只需在每个您想要访问 GPU 资源的工作负载上添加 nvidia.com/gpu 的资源限制即可。

代码语言:javascript

复制

resources:   limits:     nvidia.com/gpu: "1"

查看请求 GPU 资源的 pod 内部,我们也会发现两个与 NVIDIA 相关的环境变量:

代码语言:javascript

复制

kubectl exec -it  -- env | grep NVIDIA NVIDIA_DRIVER_CAPABILITIES=compute,video,utility NVIDIA_VISIBLE_DEVICES=GPU-

这表明我们在 pod 中有可用的 GPU 加速计算和视频编码/解码。

故障排除

如果您遇到类似的 pod 启动错误:

代码语言:javascript

复制

0/1 nodes are available: 1 Insufficient nvidia.com/gpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod..

可能是您没有足够的 GPU 资源,请尝试从“时间切片”部分增加时间切片副本数量,或者购买另一个 GPU,无论对您更划算。

我也遇到过这样的错误,即在重新启动节点后,多个长时间运行的工作负载试图启动时发生错误。重新启动 nvidia-device-plugin pod 和请求 GPU 资源的工作负载似乎可以解决该问题。

使用 Argo CD,我添加了一个负的 sync-wave注解,以确保在工作负载之前启动 nvidia-device-plugin 以避免此问题。

代码语言:javascript

复制

annotations:   argocd.argoproj.io/sync-wave: "-1"

附录

我首先尝试使用 NVIDIA GPU Operator,我认为这是一个全能的解决方案,它可以安装设备插件以及驱动程序和容器工具包。但是,我无法让它工作,所以我选择了不幸更多的手动方法,将设备插件、驱动程序和容器工具包作为单独的组件进行安装。

可能是我的设置问题,或者我在文档中理解错了什么。如果您有解决方案,我很乐意倾听!

总结

我正在使用 Argo CD 与 Kustomize + Helm 尝试遵循 GitOps 最佳实践。 在撰写本文时,我的完整家庭实验室配置可在 GitHub 上作为参考。

代码语言:javascript

复制

# kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization commonAnnotations:   argocd.argoproj.io/sync-wave: "-1"  resources:   - namespace.yaml   - cm-time-slicing.yaml  helmCharts:   - name: nvidia-device-plugin     repo: https://nvidia.github.io/k8s-device-plugin     version: 0.14.2     releaseName: "nvidia-device-plugin"     namespace: nvidia-device-plugin     includeCRDs: true     valuesFile: values.yaml

代码语言:javascript

复制

# namespace.yaml apiVersion: v1 kind: Namespace metadata:   name: nvidia-device-plugin

代码语言:javascript

复制

# values.yaml config:   name: cm-time-slicing   default: time-slicing

代码语言:javascript

复制

# cm-time-slicing.yaml apiVersion: v1 kind: ConfigMap metadata:   name: cm-time-slicing   namespace: nvidia-device-plugin data:   time-slicing: |-     version: v1     sharing:       timeSlicing:         resources:           - name: nvidia.com/gpu             replicas: 10

相关内容

热门资讯

推荐一下!青橙竞技卡五星辅助,... 推荐一下!青橙竞技卡五星辅助,新518互游脚本下载,好像是真的有挂(哔哩哔哩)青橙竞技卡五星辅助透视...
总结一下!老友广东麻将辅助,杭... 总结一下!老友广东麻将辅助,杭州都莱辅助,切实真的是有挂(哔哩哔哩)1、在老友广东麻将辅助插件功能辅...
解迷一下!创思维激k怎么开挂,... 解迷一下!创思维激k怎么开挂,创思维辅助软件,切实真的有挂(哔哩哔哩)1、创思维激k怎么开挂辅助器安...
辅助一下!微信微乐游戏辅助脚本... 辅助一下!微信微乐游戏辅助脚本,拱趴大菠萝有辅助吗,总是有挂(哔哩哔哩)辅助一下!微信微乐游戏辅助脚...
辅助一下!时光互娱房卡辅助,新... 辅助一下!时光互娱房卡辅助,新漫游免费辅助器,本来真的有挂(哔哩哔哩)1、让任何用户在无需时光互娱房...
关于一下!多乐跑得快私人房间作... 关于一下!多乐跑得快私人房间作弊视频,来来拼十辅助,都是真的有挂(哔哩哔哩)1、打开软件启动之后找到...
教你一下!卡五星游戏源码,决战... 教你一下!卡五星游戏源码,决战卡五星辅助器,其实是有挂(哔哩哔哩)1)决战卡五星辅助器辅助插件:进一...
普及一下!同乡游有辅助软件码,... 普及一下!同乡游有辅助软件码,老友广东辅助器,总是是有挂(哔哩哔哩)1、上手简单,内置详细流程视频教...
曝光一下!创思维激k有辅助器吗... 曝光一下!创思维激k有辅助器吗,hhpoker辅助是真的吗,好像存在有挂(哔哩哔哩)创思维激k有辅助...
总结一下!边锋干瞪眼小程序辅助... 总结一下!边锋干瞪眼小程序辅助,心悦踢辅助软件,真是存在有挂(哔哩哔哩)1、这是跨平台的边锋干瞪眼小...