ubuntu安装k8s+docker运行英伟达gpu cuda

 安装k8s+docker

sealos resetsealos 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.runnvidia-smiFri 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-docker2sudo 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 dockersudo 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-slicingnamespace: nvidia-device-plugin
data:time-slicing: |-version: v1sharing:timeSlicing:resources:- name: nvidia.com/gpureplicas: 10

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

代码语言:javascript

复制

kubectl apply -f cm-time-slicing.yamlhelm 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-vectoraddnamespace: cuda-test
spec:restartPolicy: OnFailurecontainers:- name: cuda-vectoraddimage: "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 <pod> -- env | grep NVIDIA
NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
NVIDIA_VISIBLE_DEVICES=GPU-<UUID>

这表明我们在 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.yamlhelmCharts:- name: nvidia-device-pluginrepo: https://nvidia.github.io/k8s-device-pluginversion: 0.14.2releaseName: "nvidia-device-plugin"namespace: nvidia-device-pluginincludeCRDs: truevaluesFile: values.yaml

代码语言:javascript

复制

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

代码语言:javascript

复制

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

代码语言:javascript

复制

# cm-time-slicing.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: cm-time-slicingnamespace: nvidia-device-plugin
data:time-slicing: |-version: v1sharing:timeSlicing:resources:- name: nvidia.com/gpureplicas: 10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch 查询超10000的解决方案

前言 默认情况下&#xff0c;Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页&#xff0c;以及查询批量数据更新的情况 问题&#xff1a;当请求form size >10000 时&#xff0c…

【FreeRTOS】IAR的FreeRTOSConfig.h中在添加头文件的问题

1、今天在\FreeRTOSConfig.h中添加个头文件&#xff0c;总是在头文件的函数定义处报错&#xff1a; Error[40]: Bad instruction 2、百度了半天也没有找到问题 3、原来是这个原因&#xff1a; IAR的Freertos中需加上一个portasm.s的驱动文件&#xff0c;而该文件需要调…

印尼Facebook直播网络需要达到什么要求?

在全球化浪潮的推动下&#xff0c;海外直播正受到企业、个人和机构的广泛关注和青睐。无论是用于营销、推广还是互动&#xff0c;海外直播为各种组织提供了更多机会和可能性。本文将探讨在进行印尼Facebook直播前&#xff0c;需要满足哪些网络条件以确保直播的质量和用户体验。…

南通网站制作基本步骤有哪些

南通网站制作是一个非常重要的工作&#xff0c;它可以帮助企业展示产品、服务和品牌形象&#xff0c;吸引更多的客户和创造更多的商机。网站制作的基本步骤包括需求分析、规划设计、页面制作、网站测试和上线等。 首先是需求分析。在南通网站制作的初期阶段&#xff0c;需要和客…

批量提取PDF指定区域内容到 Excel , 根据PDF文件第一行文字来自动重命名v1.3-附思路和代码实现

本次文章更新内容&#xff0c;图片以及扫描的PDF也可以支持批量提取指定区域内容了&#xff0c;主要是通过截图指定区域&#xff0c;然后使用OCR来识别该区域的文字来实现的&#xff0c;所以精度可能会有点不够&#xff0c;但是如果是数字的话&#xff0c;问题不大&#xff1b;…

一周年——相遇知音

——献给ZINCFFO 有梦便追&#xff0c;何惧&#xff1f; “杂乱无章”的代码片在昏暗的灯光下显得让人心生些许倦意。“我为什么天天都要练习呢&#xff1f;”无奈地合上笔记本电脑&#xff0c;当时多么想把电脑䣹&#xff08;fāi&#xff09;在地上&#xff0c;那就仿佛放下…

OpenGL笔记五之VBO与VAO

OpenGL笔记五之VBO与VAO 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记五之VBO与VAO1.VBO2.VAO3.VBO与VAO对比 1.VBO 代码 void prepareVBO() {//1 创建一个vbo *******还没有真正分配显存*********GLuint vbo 0;GL_CALL(glGenBuffers(1, &vbo))…

使用uni-app和Golang开发影音类小程序

在数字化时代&#xff0c;影音内容已成为人们日常生活中不可或缺的一部分。个人开发者如何快速构建一个功能丰富、性能优越的影音类小程序&#xff1f;本文将介绍如何使用uni-app前端框架和Golang后端语言来实现这一目标。 项目概述 本项目旨在开发一个个人影音类小程序&#…

微分方程建模

微分方程建模是数学建模的重要方法&#xff0c;因为许多实际问题的数学描述将导致求解微分方程的定解问题。在高教杯数学建模竞赛中每年都会有一道微分方程建模问题&#xff0c;大体上可以按以 下几步&#xff1a; 1. 根据实际要求确定要研究的量(自变量、未知函数、必要的参数…

云盘挂载 开机自动模拟 cmd- alist server

云盘挂载 开机自动模拟 cmd- alist server 打开Kimi智能助手, 网址:Kimi.ai - 帮你看更大的世界 (moonshot.cn) 问他: 帮我写一个vbs命令:在D:\sky目录下, 然后cmd, 进入命令行后, 输入 alist server 然后回车 这里 这个目录, 换成自己的 alist.exe所在目录 下面是我完善的示…

GitHub连接超时问题 Recv failure: Connection was reset

用手机热点WIF拉取git项目的时候&#xff0c;遇到Recv failure: Connection was reset问题。 解决办法 一、手动开启本地代理 二、在终端&#xff08;cmd&#xff09;输入命令 git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy https:…

大模型-基于大模型的数据标注

法来自于这篇论文&#xff1a;Can Generalist Foundation Models Outcompete Special-Purpose Tuning? Case Study in Medicine。 一.背景 假设&#xff0c;存在一批标注好的数据D_labeled&#xff0c;其包含m个标注样本(x, y)。 目标是&#xff0c;基于D_labeled&#xff…

Linux安全技术与防火墙

一、安全技术和防火墙 1.1 安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要是提供报警和时候报警&#xff0c;不主动介入。 入侵防御系统&#xff1a;透明模式工作&#xff0c;对数据包、网络监控、服务攻击、木马蠕虫、系统漏洞等等进行准确的分析和…

MySql 数据库 (基础) - 下载安装

MySQL数据库 简单介绍 数据库 数据存储的仓库数据库管理系统 操作和管理数据库的大型软件SQL 操作关系型数据库的变成语言&#xff0c;是一套标准 版本 MySQL官方提供了两种不同的版本&#xff1a; 社区版 免费&#xff0c;MySQL不提供任何的技术支持商业版 收费&#xff0c…

【研路导航】重庆大学计算机保研面试真题分享交流

写在前面 在保研的道路上&#xff0c;面试是非常重要的一环。这里是成功保研到重庆大学的学长的计算机保研面试的部分真题及详细解答 ! Q 快速排序和合并排序&#xff1a; 快速排序(quicksort) 和合并排序(merge sort) 两种方法都将输入的待排序序列划分为2个子序列&#xf…

树的概念与二叉树的实现

目录 一. 树的概念 二. 访问树的方法 1. 左孩子右兄弟法 2. 双亲表示法 3. 顺序表存孩子的指针&#xff08;孩子表示法&#xff09; 三. 二叉树 1. 二叉树的定义 2. 特殊二叉树 3. 二叉树的性质 4. 存储方式 四. 二叉树的前中后序遍历 1. 前序遍历 2. 中序遍历 3. …

通用型I2C接口的应用之综合应用(N32G45XVL-STB)

通用型I2C接口的应用之综合应用&#xff08;N32G45XVL-STB&#xff09; 目录 概述 1 软硬件接口 1.1 硬件接口 1.2 开发软硬件信息 1.3 SHT-20模块电路 1.4 0.9寸OLED模块介绍 2 驱动接口实现 2.1 SHT20驱动接口 2.2 OLED驱动接口 3 应用接口实现 3.1 软件框架 3.…

C语言基础and数据结构

C语言程序和程序设计概述 程序:可以连续执行的一条条指令的集合 开发过程:C源程序(.c文件) --> 目标程序(.obj二进制文件,目标文件) --> 可执行文件(.exe文件) -->结果 在任何机器上可以运行C源程序生成的 .exe 文件 没有安装C语言集成开发环境,不能编译C语言程…

Open-TeleVision——通过VR沉浸式感受人形机器人视野的远程操作

前言 7.3日&#xff0c;我司大模型机器人(具身智能)线下营群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接&#xff0c;我当时快速看了一遍&#xff0c;还是有价值的一个工作(其有受mobile aloha工作的启发)&#x…

锂电池剩余寿命预测 | Matlab基于Transformer的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer的锂电池剩余寿命预测 Matlab基于Transformer的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2023b及以上 NASA数据集&#xff0c;B0005号电池数据训练&#xff0c;B00…