腾讯vCUDA(gpu-manager)部署

2023-05-16

官网:https://github.com/tkestack/gpu-manager

先夸赞一下腾讯的开源精神,再吐槽一下,官方README写的真是过于随意了。踩了一堆坑,终于部署并测试成功了。下面尽可能详细的记录一下全流程。

这次用的k8s集群是用kubeadm搭建的,在部署gpu-admission自定义scheduler的时候也有些不同,后面会详细介绍。

0、配置go环境

0.1 go安装

参考:https://www.runoob.com/go/go-environment.html

0.2 go代理配置(中国特色步骤,墙外可忽略)

vim /etc/profile

在文件最后添加如下两行:

export GOPROXY=https://goproxy.cn,direct
export GO111MODULE=on

1、部署gpu-admission

用gpu-manager前,需要先启动并正确配置gpu-admission。

官网:https://github.com/tkestack/gpu-admission

1.1 下载源码

git clone https://github.com/tkestack/gpu-admission.git

1.2 编译

①进入源码目录

cd gpu-adminssion-master

②编译

make build

1.3 运行

bin/gpu-admission --address=127.0.0.1:3456 --v=4 --kubeconfig <your kubeconfig> --logtostderr=true

其中<your kubeconfig>是k8s的config文件,就是每次kubectl命令会读取的那个配置文件。通常目录是/etc/kubernetes/admin.conf。

正确输出如下:

[root@gxnzx1274 gpu-admission-master]# bin/gpu-admission --address=127.0.0.1:3456 --v=4 --kubeconfig /etc/kubernetes/admin.conf --logtostderr=true
I0805 10:42:10.514078   93447 main.go:83] Server starting on 127.0.0.1:3456
I0805 10:42:10.514895   93447 reflector.go:175] Starting reflector *v1.Node (30s) from pkg/mod/k8s.io/client-go@v0.18.12/tools/cache/reflector.go:125
I0805 10:42:10.514989   93447 reflector.go:211] Listing and watching *v1.Node from pkg/mod/k8s.io/client-go@v0.18.12/tools/cache/reflector.go:125
I0805 10:42:10.515134   93447 reflector.go:175] Starting reflector *v1.Pod (30s) from pkg/mod/k8s.io/client-go@v0.18.12/tools/cache/reflector.go:125
I0805 10:42:10.515259   93447 reflector.go:211] Listing and watching *v1.Pod from pkg/mod/k8s.io/client-go@v0.18.12/tools/cache/reflector.go:125

1.4 自定义调度器

 ①准备自定义调度器文件

创建一个scheduler-policy-config.json的调度器文件:

vim /<Your Path>/scheduler-policy-config.json

其中<Your Path>是一个任意的目录,只要后面步骤里的<Your Path>和这里保持一致就行。

在这个json文件里写入如下信息(内容来自官方github步骤2.2):

{
  "kind": "Policy",
  "apiVersion": "v1",
  "predicates": [
    {
      "name": "PodFitsHostPorts"
    },
    {
      "name": "PodFitsResources"
    },
    {
      "name": "NoDiskConflict"
    },
    {
      "name": "MatchNodeSelector"
    },
    {
      "name": "HostName"
    }
  ],
  "extenders": [
    {
      "urlPrefix": "http://127.0.0.1:10252/scheduler",
      "apiVersion": "v1beta1",
      "filterVerb": "predicates",
      "enableHttps": false,
      "nodeCacheCapable": false
    }
  ],
  "hardPodAffinitySymmetricWeight": 10,
  "alwaysCheckAllPredicates": false
}

其中"urlPrefix": "http://127.0.0.1:10252/scheduler"中的IP地址和端口号,如果有特殊需求则按照需求更换,没有特殊需求这样写就可以了。

后面的步骤,如果是kubeadm安装的k8s就看1.4.1分支,如果是其他方式安装的k8s就看1.4.2分支。

1.4.1 kubeadm部署的k8s

kubeadm部署的k8s集群,调度器是以pod形式运行的,kubelet会一直监听manifest文件的修改,发现文件被修改后会自动重启pod以加载新的配置。因此,这里我们只需要修改调度器的manifest文件即可。

②先复制一份调度器的manifest文件备份。

cp /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes/manifests/kube-scheduler.yaml.bak

③修改文件内容

vim /etc/kubernetes/manifests/kube-scheduler.yaml

command关键字下面加两行内容:

- --policy-config-file=/<Your Path>/scheduler-policy-config.json
- --use-legacy-policy-config=true

修改前是这样的:

……
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true
    image: registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.0
    imagePullPolicy: IfNotPresent
……

修改后是这样的:

……
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true
    - --policy-config-file=/<Your Path>/scheduler-policy-config.json
    - --use-legacy-policy-config=true
    image: registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.0
    imagePullPolicy: IfNotPresent
……

保存退出后就自动生效了。

可以用如下命令确定一下:

kubectl get po -A

输出中找到一个名字为 kube-scheduler-XXX 的pod,看后面对应的AGE项,是不是刚刚启动。如果刚启动过,代表调度器配置已经更新。

1.4.2 其他方式部署的k8s(gpu-admission官方步骤2.2)

非kubeadm部署的k8s是带有kube-scheduler工具的,使用kube-scheduler工具直接部署配置文件即可。具体操作如下。

②  执行命令

kube-scheduler --policy-config-file=/<Your Path>/scheduler-policy-config.json --use-legacy-policy-config=true

2、部署gpu-manager

2.1 下载源码

git clone https://github.com/tkestack/gpu-manager.git

2.2 编译源码

cd gpu-manager-master
make

2.3 构建gpu-manager镜像

① 修改源码(中国特色步骤,墙外跳过该步)

vim build/Dockerfile

找到如图所示第18行处

 添加内容:

ENV GO111MODULE on
ENV GOPROXY https://goproxy.cn,direct

保存退出。

②  构建镜像

make img

构建完成后用如下命令查看是否生成了一个名为thomassong/gpu-manager的容器:

docker images

我这里构建完的镜像tag是1.1.4,这个tag要记一下,后面会用到,用的的时候用*tag表示。(主要是官方gpu-manager.yaml里的tag和make img中的tag没匹配,需要自己改一下,也许后面官方会修正)

③ 创建资源

kubectl create sa gpu-manager -n kube-system
kubectl create clusterrolebinding gpu-manager-role --clusterrole=cluster-admin --serviceaccount=kube-system:gpu-manager

④ 打标签

所谓的打标签,就是找一个节点来运行gpu-manager。我这里遇见了一个问题是给master打标签没用,只能找一个非master的节点来打标签。也就是gpu-manager不能运行在master上。

kubectl label node <node> nvidia-device-enable=enable

其中<node>是想要运行gpu-manager的k8s节点名称。

这里注意一下,之前步骤②中构建的镜像要保证在你所选择即将运行gpu-manager的节点上有才行。如果之前在其他节点构建的镜像,要迁移到<node>中来。

⑤查看镜像tag是否匹配

还记得步骤②中的*tag吧。这里要看一下gpu-manager.yaml文件中,关键字image后面的镜像tag是不是和*tag一致,如下图。如果不一致则修改成*tag。我这里是修改成了1.1.4的。

⑥ 启动gpu-manager

kubectl create -f gpu-manager.yaml

此时查看集群pod,kube-system命名空间下,有一个名为gpu-manager-daemonset-XXX的pod启动。

查看<node>节点信息发现,有tencent.com/vcuda-core, tencent.com/vcuda-memory 资源存在,如下图。

至此gpu-manager部署完成!

3、测试

这里我自己准备了一个paddle的镜像,并配套写了一个提交任务的yaml文件提供测试。镜像使用cifar数据集,可自动下载,非常方便。

测试思路:测试过程各位可自行修改yaml文件中tencent.com/vcuda-core, tencent.com/vcuda-memory资源的数值,先调节的大一些,看容器是否正常Running,容器log是否正确。都正确无误后,给tencent.com/vcuda-memory改的非常小,容器运行时GPU显存溢出,程序报错,容器退出,表明vcuda生效。

① 下载镜像

docker pull haidee/paddle:cifar-resnet-cuda10.0-cudnn7

② 提交任务

vim test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: vcuda
spec:
  restartPolicy: Never
  containers:
  - name: nvidia
    image: paddle:zyy-cifar-resnet
    command: ["python3","/opt/train.py"]
    resources:
      requests:
        tencent.com/vcuda-core: 50
        tencent.com/vcuda-memory: 30
      limits:
        tencent.com/vcuda-core: 50
        tencent.com/vcuda-memory: 30
kubectl create -f test.yaml

③ 观察

集群中名为vcuda的pod是否正常运行,并查看其log是否符合预期。

查看pod运行状态命令:

kubectl get po

查看log命令:

kubectl logs vcuda
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

腾讯vCUDA(gpu-manager)部署 的相关文章

  • Caffe/pyCaffe:设置所有 GPU

    是否可以为Caffe 尤其是pyCaffe 设置所有GPU 就像是 caffe train solver examples mnist lenet solver prototxt gpu all 这两个分支现在都支持多 GPU 一段时间了
  • GPU 的延迟是多少?

    我可以找到 CPU 核心与其缓存 主内存等之间的 CPU 周期延迟 但似乎很难找到有关现代 GPU 的类似信息 有谁知道 GPU 的延迟 特别是现代 nvidia GPU GF110 或更高版本 与其内存之间的延迟 谢谢 GPU 内存确实具
  • Linux 上的 OpenCL,集成英特尔图形芯片

    我想用OpenCL在 Debian 8 上 我读到在本页 http streamcomputing eu blog 2011 12 29 opencl hardware support Linux 上不支持 Intel 的 GPU 这篇文章
  • PyTorch:tensor.cuda()和tensor.to(torch.device(“cuda:0”))之间有什么区别?

    在 PyTorch 中 以下两种将张量 或模型 发送到 GPU 的方法有什么区别 Setup X np array 1 3 2 3 2 3 5 6 1 2 3 4 X model X torch DoubleTensor X Method
  • 无法找到 zlibwapi.dll。请确保它在您的库路径中

    我正在开发一个对象检测项目 并希望使用我的 GPU 处理该项目 我已经完成了NVIDIA 设置教程 https medium com analytics vidhya build opencv from source with cuda f
  • Keras 不在具有 python 3.5 和 Tensorflow 1.4 的 Pycharm 上使用 GPU [重复]

    这个问题在这里已经有答案了 from tensorflow python client import device lib def get available gpus local device protos device lib list
  • 在 Cython 中使用半精度 NumPy 浮点数

    我正在尝试从一些 Cython 代码将 float16 数据发送到 Nvidia P100 卡 当我使用 float32 时 我可以在 Cython 中定义我的类型 如下所示 DTYPE np float32 ctypedef np flo
  • 有适用于 mac os X 10.8 的 opencl 分析器吗?

    我试图找到 OpenCL 内核中的瓶颈 是否可以在 mac os X 上分析 OpenCL 程序 我发现 gDebuggerhttp www gremedy com http www gremedy com 但需要 10 5 或 10 6
  • GPU编程简介[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每个人的桌面上都有一台以显卡 GPU 形式存在的巨大的大规模并行超级计算机 GPU 社区的 hello world 相当于什么 我该做什么 去哪
  • Ubuntu 11.10/12.04 上的 CUDA“无兼容设备”错误

    一段时间以来 我一直在尝试在我的笔记本电脑上设置 Ubuntu 环境来进行 CUDA 编程 我目前双启动 Windows 8 和 Ubuntu 12 04 并想在 Ubuntu 上安装 CUDA 5 该笔记本电脑配有 GeForce GT
  • 同时使用 2 个 GPU 调用 cudaMalloc 时性能较差

    我有一个应用程序 可以在用户系统上的 GPU 之间分配处理负载 基本上 每个 GPU 都有一个 CPU 线程来启动一个GPU处理间隔当由主应用程序线程定期触发时 考虑以下图像 使用 NVIDIA 的 CUDA 分析器工具生成 作为示例GPU
  • iOS 上的 OpenCV - GPU 使用情况?

    我正在尝试开发一个 iOS 应用程序 可以对来自相机的视频执行实时效果 就像 iPad 上的 Photobooth 一样 我熟悉 OpenCV 的 API 但如果大多数处理是在 CPU 上完成而不是在 GPU 上完成 我担心 iOS 上的性
  • “分页文件太小,无法完成此操作”尝试训练 YOLOv5 对象检测模型时出错

    我有大约 50000 个图像和注释文件用于训练 YOLOv5 对象检测模型 我在另一台计算机上仅使用 CPU 训练模型没有问题 但需要太长时间 因此我需要 GPU 训练 我的问题是 当我尝试使用 GPU 进行训练时 我不断收到此错误 OSE
  • 如何读取 GPU 负载?

    我正在编写一个程序 用于监控计算机的各种资源 例如CPU使用率等 我还想监控 GPU 使用情况 GPU 负载 而不是温度 using System using System Collections Generic using System
  • 将 nvidia 运行时添加到 docker 运行时

    我正在运行虚拟机GCP配备特斯拉 GPU 并尝试部署一个PyTorch基于应用程序使用 GPU 加速 我想让 docker 使用这个 GPU 可以从容器访问它 我设法在主机上安装了所有驱动程序 并且该应用程序在那里运行良好 但是当我尝试在
  • 错误:分配具有形状的张量时出现 OOM

    在使用 Apache JMeter 进行性能测试期间 我面临着初始模型的问题 错误 分配形状为 800 1280 3 和类型的张量时出现 OOM 通过分配器浮动在 job localhost replica 0 task 0 device
  • OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

    我的第一个问题是如何获取 Nvidia GPU 上 OpenCL 内核代码的寄存器使用信息 因为 nvcc 编译器给出了相同的使用信息nvcc ptxas options vCUDA 内核代码的标志 我还从 AMD GPU for Open
  • 如何在GPU支持下运行python代码

    我创建了一个 Flask 服务 用于接受以相机 URL 作为参数的请求 用于在相机框架中查找对象 桌子 椅子等 我已经在 Flask 中编写了用于接受 POST 请求的代码 app route rest detectObjects meth
  • CUDA 添加矩阵的行

    我试图将 4800x9600 矩阵的行加在一起 得到一个 1x9600 的矩阵 我所做的是将 4800x9600 分成 9 600 个矩阵 每个矩阵长度为 4800 然后我对 4800 个元素进行缩减 问题是 这真的很慢 有人有什么建议吗
  • 完全禁用 NVCC 优化

    我正在尝试测量 GPU 上的峰值单精度触发器 为此我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令 不幸的是 编译器正在删除所有代码 因为它实际上没有做任何有用的事情 因为我没有执行任何数据的加载 存储 是否有编译器标志或编译指

随机推荐

  • ovn原理与实践

    上篇文章简单介绍了ovs Open Virtual Switch 的原理和使用 xff0c 但是仔细想想 xff0c 单纯的ovs在云计算领域还存在着一些问题 xff0c 例如 xff1a ovs只能做二层转发 xff0c 没有三层的能力
  • 基于51单片机智能电子密码锁电路设计(毕设课设)

    基于AT89C51单片机的简易六位密码锁 输入三次锁定 密码输入错误蜂鸣器和LED灯报警 可以修改密码 资源下载 下载地址如下 xff08 912 xff09 xff1a https docs qq com doc DTlRSd01BZXN
  • CentOS7配置tomcat开机自启动

    文章目录 CentOS7配置tomcat开机自启动创建服务创建软连接刷新配置启动 重启 停止 状态开启自启动 关闭自启动 CentOS7配置tomcat开机自启动 创建服务 在 lib systemd system目录下创建一个脚本文件to
  • Jetson TX2 入门 ——打开摄像头

    Jetson TX2自带有一个板载摄像头 xff0c 当然也可以在TX2上连接usb摄像头和csi摄像头 1 打开板载摄像头 1 xff09 方法一 xff1a 视屏分辨率预览 nvgstcapture 1 0 prev res 61 3
  • 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

    package cn itcast test06 public class Test08 方法1 public static int method int num boolean flag 61 num gt 0 true false nu
  • 史上最强,Cas单点登录之服务端搭建

    目录 Cas Server搭建大浪淘沙 xff0c 沉者为金弱水三千 xff0c 只取一瓢 服务端配置介绍最常用的三个配置文件最常用的三个JSP页面 自定义数据源关闭HTTPS协议开启Restful接口1 加入jar包 2 配置web xm
  • C#创建子窗体、父窗体

    本文部分内容来自书籍 多文档界面 xff08 Multiple Document Interface xff0c MDI xff09 xff0c 其窗体用于同时显示多个文档 xff0c 每个文档显示在各自的窗口中 在MDI窗体中 xff0c
  • k8s部署报错network: failed to find plugin “flannel“ in path [/opt/cni/bin]]

    k8s在部署工作负载时 xff0c pod详情页提示以下问题 Failed to create pod sandbox rpc error code 61 Unknown desc 61 failed to set up sandbox c
  • VS各版本VC各版本对应关系

    Visual Studio 经过多年的发展 xff0c 有许多版本 xff0c 经常我们在拿到一份代码时不知道对应的VS版本 这时候可以打开工程目录下的vcproj vcxproj文件 xff0c 如下所示 span class token
  • 浅谈机场综合布线运维工作中的难点问题

    随着系统规模越来越大 体系越来越复杂 信息系统的作用越来越明显 运维保障的要求越来越高 xff0c 综合布线维护工作面临的问题也愈加凸显 以下以国内某大型机场在综合布线运维工作中面临的实际问题为例 xff0c 给大家分享综合布线运维利器 耐
  • 关于集成商转型

    前言 xff1a 集成商转型是一个老生常谈的话题 xff0c 集成服务一直以来就随着IT行业趋势而发展 xff0c IT行业从最初的硬件主导到硬件软件化 xff0c 再到软件服务化 xff0c 大趋势或将发展至服务产品化 xff0c 行业趋
  • centos系统开启vncserver

    yum y install tigervnc server 这个是安装命令 安装好以后输入vncserver就能开启 第一次开启会让设置密码 这个密码是用户vncclient 连接的时候需要输入的密码 vncserver kill 1 这个
  • 升降横移式立体车库设计机械设计毕业设计全套资料

    资源下载 下载地址如下1502 xff1a https docs qq com doc DTlRSd01BZXNpRUxl 本文选用了社会需求大 xff0c 最常见的一种立体车库 升降横移式立体停车库 介绍和分析了升降横移式立体停车库的结构
  • 在NVIDIA Jetson 平台上运行Deepstream速度慢的常见解决办法

    NVIDIA发布了最新的Deepstream 4 0 光说不练假把式 xff0c 光练不说傻把式 xff0c 不少用户发现在Jetson嵌入式平台上运行Deepstream会遭遇到速度变慢 xff0c 今天汇总几个常见解决方案 xff1a
  • Ubuntu18.04 安装ROS Melodic(官方版) 之不使用科学方法

    此前记录了官方安装流程 xff0c 参见Ubuntu18 04 安装ROS Melodic 官方版 xff0c 但是受限于无法访问raw githubusercontent com xff0c 需科学方法才能成功安装 xff0c 带来诸多不
  • 分层存储Stratis和管理快照

    分层存储Stratis Stratis称为卷管理文件系统 xff0c 以管理物理存储设备池的服务形式运行 xff0c 透明的为所创建的文件系统创建和管理卷 相较于Lvm操作简化了 xff0c Stratis可以动态管理卷层 xff0c 不需
  • 报错:AttributeError: NoneType object has no attribute device

    今天搞个测试 xff0c 测试是在horovod下进行的 问题就出在加载权重 xff08 参数 xff09 文件的地方 xff0c 加载权重命令load weights前要先build一下 xff0c 结果就build出这么一个错误 xff
  • ARM安装python模块

    ARM机器安装python模块绝对不不不不可以直接pip xff01 xff01 xff01 这里演示的是CentOS xff0c 其他linux系统类似 Step1 安装必备 yum install epel release yum in
  • k8s源码编译运行

    本文参考视频 xff1a https www bilibili com video BV1WK41137JA from 61 search amp seid 61 10758236638727752345 0 一定要用root用户 sudo
  • 腾讯vCUDA(gpu-manager)部署

    官网 xff1a https github com tkestack gpu manager 先夸赞一下腾讯的开源精神 xff0c 再吐槽一下 xff0c 官方README写的真是过于随意了 踩了一堆坑 xff0c 终于部署并测试成功了 下