k8s volcano + deepspeed多机训练 + RDMA ROCE+ 用户权限安全方案【建议收藏】

前提:nvidia、cuda、nvidia-fabricmanager等相关的组件已经在宿主机正确安装,如果没有安装可以参考我之前发的文章
GPU A800 A100系列NVIDIA环境和PyTorch2.0基础环境配置【建议收藏】_a800多卡运行环境配置-CSDN博客文章浏览阅读1.1k次,点赞8次,收藏16次。Ant系列GPU支持 NvLink & NvSwitch,若您使用多GPU卡的机型,需额外安装与驱动版本对应的nvidia-fabricmanager服务使GPU卡间能够互联,否则可能无法正常使用GPU实例。【摘要】 Nvidia A系列裸金属服务器安装NVIDIA和CUDA驱动,安装conda和pytorch2.0并验证cuda的有效性。选择安装环境相关版本: GPU驱动版本为530.30.02、CUDA版本为12.1.0。注意事项: 不能选择Driver, 否则会覆盖已安装的NVIDIA驱动._a800多卡运行环境配置https://blog.csdn.net/weixin_43798031/article/details/136853839?spm=1001.2014.3001.5501

一、k8s环境配置

1.安装gpu-operator

使用官方的helm chart进行安装 gpu-operator-v24.3.0.tgz

# 创建namespace
kubectl  create  ns gpu-operator# 下载chart
wget https://github.com/NVIDIA/gpu-operator/releases/download/v24.3.0/gpu-operator-v24.3.0.tgz# 解压
tar xf gpu-operator-v24.3.0.tgz# 其中有一些插件是可选择的,可以根据环境的情况进行修改
# 安装
helm isntall -f values.yaml  gpu-operator -n gpu-operator

2. 安装 rdma-shared-plugin

k8s-rdma-shared-dev-plugin-config-map.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: rdma-devicesnamespace: kube-system
data:config.json: |{"periodicUpdateInterval": 300,"configList": [{"resourceName": "shared_ibs","rdmaHcaMax": 1000,"selectors": {"ifNames": ["GPU0", "GPU1", "GPU2", "GPU3"]  #根据实际的ib网卡名称修改}}]}
k8s-rdma-shared-dev-plugin-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:name: rdma-shared-dp-dsnamespace: kube-system
spec:selector:matchLabels:name: rdma-shared-dp-dstemplate:metadata:labels:name: rdma-shared-dp-dsspec:hostNetwork: truepriorityClassName: system-node-criticalcontainers:- image: mellanox/k8s-rdma-shared-dev-pluginname: k8s-rdma-shared-dp-dsimagePullPolicy: IfNotPresentsecurityContext:privileged: truevolumeMounts:- name: device-pluginmountPath: /var/lib/kubelet/- name: configmountPath: /k8s-rdma-shared-dev-plugin- name: devsmountPath: /dev/volumes:- name: device-pluginhostPath:path: /var/lib/kubelet/- name: configconfigMap:name: rdma-devicesitems:- key: config.jsonpath: config.json- name: devshostPath:path: /dev/
测试是否安装成功,登陆到容器中查看ib网卡
rdma-test-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mofed-test-pod
spec:restartPolicy: OnFailurecontainers:- image: mellanox/rping-testname: mofed-test-ctrsecurityContext:capabilities:add: [ "IPC_LOCK" ]resources:limits:rdma/shared_ibs: 1command:- sh- -c- |ls -l /dev/infiniband /sys/class/infiniband /sys/class/netsleep 1000000

3. 安装volcano调度器

相关的部署文件在这里

https://download.csdn.net/download/weixin_43798031/89397746icon-default.png?t=N7T8https://download.csdn.net/download/weixin_43798031/89397746

kubectl  apply -f volcano-development.yaml #测试一下
kubectl  apply -f  test-job.yamlapiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:name: test-job4
spec:minAvailable: 1schedulerName: volcanopolicies:- event: PodEvictedaction: RestartJobplugins:ssh: []env: []svc: []maxRetry: 5queue: defaulttasks:- name: "postproc"replicas: 1template:metadata:name: postprocspec:containers:- image: nginximagePullPolicy: IfNotPresentname: postprocresources:requests:cpu: "1"restartPolicy: OnFailure- name: "agent"replicas: 1template:metadata:name: agentspec:containers:- image: nginximagePullPolicy: IfNotPresentname: agentresources:requests:cpu: "1"restartPolicy: OnFailure

4. 创建research rbac认证

可以参考我的这篇文章

k8s rbac 权限管理控制创建过程+理论知识_子账号无权限执行kubectl config get-contexts命令-CSDN博客

openssl genrsa -out research.key 2048opensopenssl req -new -key research.key -out research.csr -subj "/CN=research/O=default"openssl x509 -req -in research.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out research.crt -days 3650kubectl config set-credentials research --client-certificate=research.crt --client-key=research.key kubectl config set-context research-context --cluster=kubernetes --namespace=default --user=research --kubeconfig=research.conf切到research-context 用户上下文
kubectl config use-context research-context 显示当前上下文
kubectl config get-contexts切回admin 
kubectl config use-context kubernetes-admin@kubernetes 

 二、宿主机环境配置

1. 安装docker 客户端

因为我们已经使用containerd 为runtime,

2. 创建系统用户

# 创建research用户并指定uid和gid, 指定uid和gid时一定要选择一个没有占用的,因为我们要在每台机器都要指定
ansible -i ip.txt all -m shell -a 'sudo useradd -m -s /bin/bash -u 2000 -g 2000 research'# 将research用户加入到docker 组,这样research 用户就可以使用docker命令了
ansible -i ip.txt all -m shell -a 'sudo usermod -aG docker research' # 创建.kube目录
ansible -i ip.txt all -m shell -a 'mkdir /home/research/.kube/'# 将上面的k8s config 发送到每台机器
ansible -i ip.txt  all -m copy -a 'src=/home/sunwenbo/rbac/research.conf dest=/home/research/.kube/config'# 修改权限
ansible -i ip.txt all -m shell -a 'chown -R research:research /home/research/.kube/'

3. 修改docker /etc/docker/daemon.json 文件如下

普通用户启动docker 挂载宿主机目录,如果容器使用的root用户,则输出的文件权限为root,那么普通用户在宿主机则无法读取和使用则会有问题
 


{"userns-remap": "research",   "max-concurrent-downloads": 10,"log-driver": "json-file","log-level": "warn","log-opts": {"max-size": "10m","max-file": "5"},"data-root": "/var/lib/data/docker","exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"],"insecure-registries": [ "a800-harbor.bigmodel.cn"],"storage-driver": "overlay2","storage-opts": ["overlay2.override_kernel_check=true"]
}

 配置说明: "userns-remap": "research",   这个配置代表Docker将会使用research用户和组进行用户命名空间映射,说白了就是将系统的research用户映射到容器里,但是这么设置会有一个问题就是root导入到镜像或者是容器就看不到了。

4. 修改系统 /etc/subuid

每台机器都要修改research的uid为2000

research:2000:65536

ansible -i ip.txt all -m shell -a "sed  -i  's/^research:[0-9]\+:65536/research:2000:65536/' /etc/subuid"

简单描述一下3,4步骤,主要目的就是为了解决当启动一个容器挂载宿主机数据时解决文件权限的问题。通过3,4的设置我们在容器中产生的数据的权限会保持为research

三、制作基于deepspeed的基础镜像

所需要的文件

Dockerfile  ssh  ssh_config  sshd_config  start.sh./ssh:
authorized_keys  id_rsa  id_rsa.pub  known_hosts  known_hosts.old

文件说明:

Dockerfile:制作镜像

ssh: 我们需要提前创建好公钥和私钥并下发给集群的每台机器,实现可以免密ssh登陆

ssh_config:  镜像中sshd服务的客户端配置文件,需要指定连接时使用的默认端口和关闭登录时验证

sshd_config: 镜像中sshd服务的服务端配置文件, 需要修改默认端口

start.sh: 镜像启动脚本



1. Dockerfile

research用户说明:

考虑到安全问题,因为我们在gpu服务器上同时部署了共享存储Glusterfs,我们的每台机器只对算法开放普通用户权限。

过程中遇到使用k8s时启动训练任务因为挂载了宿主机共享存储的数据,而容器中默认情况下使用的都是root用户,这个时候就会导致训练输出的产物权限变为了root。 系统用户research 则没有权限去对这个文件进行操作

# 使用基础镜像
FROM nvcr.io/nvidia/pytorch:23.12-py3# 创建research用户并设置密码
RUN groupadd -g 2000 research && \useradd -m -u 2000 -g 2000 -s /bin/bash research# COPY start script
COPY start.sh /start.sh#COPY ssh config to /etc/ssh
COPY ssh /home/research/.ssh/# Install SSH server
RUN apt-get update && apt-get install -y --no-install-recommends openssh-server ssh net-tools pdsh && \apt-get clean && \chown -R root:root /usr/lib && \chown -R research:research /home/research/.ssh && \rm -rf /var/lib/apt/lists/* && \chmod 600 /home/research/.ssh/authorized_keys && \chmod 700 /home/research/.ssh && \mkdir /var/run/sshd# 安装deepspeed
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \                                                                                                       pip install deepspeed && \                                                                                                                                                          pip install tiktoken && \                                                                                                                                                          pip install lmdb  && \                                                                                                                                                          pip install sentencepiece   # 设置环境变量,指定时区
ENV TZ=Asia/Shanghai \DEBIAN_FRONTEND=noninteractiveENV CUDA_DEVICE_MAX_CONNECTIONS="1"RUN apt update \&& apt install -y tzdata \&& ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \&& echo ${TZ} > /etc/timezone \&& dpkg-reconfigure --frontend noninteractive tzdata \&& rm -rf /var/lib/apt/lists/*COPY ssh_config sshd_config /etc/ssh/EXPOSE 2222CMD ["/start.sh"]

2. ssh_config  

Include /etc/ssh/ssh_config.d/*.confHost *StrictHostKeyChecking noPort 2222SendEnv LANG LC_*HashKnownHosts yesGSSAPIAuthentication yes

3. sshd_config

Include /etc/ssh/sshd_config.d/*.conf
Port 2222
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem       sftp    /usr/lib/openssh/sftp-server

4. start.sh

#!/bin/bash# Start the SSH server
/usr/sbin/sshd -D# 执行传入的命令
exec "$@"

执行docker build后我们会得到一个镜像

docker build -t xxx.service.xxx.cn/xxx/xxx-base:v2 .

备注:根据docker 可以看到我们创建了一个research用户,当开始训练时我们需要使用research 用户去连接其他机器。同时需要做到免密登陆和认证 。另外

 四、k8s yaml文件

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:name: xxxxxx  #可以修改名字,防止跟别人冲突导致K8S Pod无法启动namespace: default
spec:minAvailable: 5schedulerName: volcanopolicies:- event: PodFailedaction: TerminateJob- event: PodEvictedaction: TerminateJob- event: TaskFailedaction: TerminateJob- event: TaskCompletedaction: CompleteJobplugins:env: []svc: []maxRetry: 5queue: defaultttlSecondsAfterFinished: 10tasks:- name: "main"replicas: 1template:metadata:name: trainingspec:securityContext:runAsUser: 2000   # research 用户的 UIDfsGroup: 2000     # research 用户的 GIDvolumes:- name: dshmemptyDir:medium: MemorysizeLimit: 50Gi- name: glm-code-pathhostPath:path: /home/bmm-system/data/private/xxx   #挂载代码路径type: Directorycontainers:- name: mainimage: xxx.service.xxx.cn/delivery/xxxx:v2.1#imagePullPolicy: IfNotPresentimagePullPolicy: AlwayssecurityContext:capabilities:add:- IPC_LOCKvolumeMounts:- name: dshmmountPath: /dev/shm- name: glm-code-pathmountPath: /home/bmm-system/data/private/xxx    #挂载代码路径#args: ["/bin/sh", "-c", "cd xxxx"]  #执行的命令args: ["/bin/sh", "-c", "sleep 600000"]env:- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: NODE_IPvalueFrom:fieldRef:fieldPath: status.hostIP- name: TRITON_CACHE_DIRvalue: "/tmp/.triton"restartPolicy: OnFailureimagePullSecrets:- name: xxx-registry- name: "worker"replicas: 4    #副本数,也就是训练所需要的节点数template:metadata:name: trainingspec:hostNetwork: trueaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: TrainingMachineoperator: Invalues: ["5", "6", "7", "8"]        #制定训练用的节点,A800的8台机器按照1,2...8来指定volumes:- name: dshmemptyDir:medium: MemorysizeLimit: 50Gi- name: user-roothostPath:path: /home/bmm-system/data/private/xxxx   #宿主机挂载路径,指定数据所在位置type: Directory- name: glm-ckpt-pathhostPath:path: /home/bmm-system/data/ckpt   #宿主机挂载路径,指定到权重所在位置type: Directorycontainers:- name: workerimage: xxx.service.xxx.cn/delivery/xxx-base:v2.1#imagePullPolicy: IfNotPresentimagePullPolicy: AlwayssecurityContext:capabilities:add:- IPC_LOCKvolumeMounts:- name: dshmmountPath: /dev/shm- name: user-rootmountPath: /home/bmm-system/data/private/xxx   #宿主机挂载路径,指定数据所在位置- name: xxx-ckpt-pathmountPath: /home/bmm-system/data/ckpt   #宿主机挂载路径,指定到权重所在位置readOnly: truecommand: ["/bin/bash"]args: ["-c", "/start.sh"]env:- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: NODE_IPvalueFrom:fieldRef:fieldPath: status.hostIP- name: TRITON_CACHE_DIRvalue: "/tmp/.triton"resources:requests:nvidia.com/gpu: 8limits:nvidia.com/gpu: 8restartPolicy: OnFailureimagePullSecrets:- name: xxx-registry

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

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

相关文章

leetcode 动态规划(基础版)三角形最小路径和

题目&#xff1a; 题解&#xff1a; 一种可行的方案是从下到上&#xff0c;避免了从上到下的下标特判。走到每一个位置的最小值等于该位置的上两个位置中的最小值加上该位置的值。 int minimumTotal(vector<vector<int>>& triangle) {int dp[205][205]{0};f…

Desoutter智能拧紧中枢Connect过压维修

马头智能拧紧中枢过压维修是马头拧紧设备维护中的重要环节。当出现马头拧紧设备中枢过压现象时&#xff0c;会导致设备性能下降&#xff0c;甚至损坏设备&#xff0c;因此及时对过压中枢进行维修是保障设备正常运转的关键。 Desoutter电动螺丝刀控制器过压的原因可能有很多&am…

Vue60-TodoList案例-全局事件总线

一、全局事件总线的适用场景 虽然全局事件总线使用于任意组件之间的通信&#xff0c;但是没有必要处处用它。 数据在哪里&#xff0c;操作数据的方法就在哪里&#xff01; 二、TodoList案例-全局事件总线 适用于全局总线的场景&#xff1a;Item和App&#xff08;爷孙关系&…

FFmpeg+javacpp+javacv使用

FFmpegjavacppjavacv使用 Bytedeco官网案例1、导入opencv、ffmpeg依赖包2、FFmpeg 数据结构2.1 AVFormatContext 格式化I/O上下文2.1.1 metadata2.1.2 Duration、start、bitrate等其他信息2.1.3 dump信息 Bytedeco GitHub&#xff1a;javacpp Bytedeco官网案例 FFmpeg – [示例…

Qt Object:智能即时聊天室项目

目录 1.项目介绍 2.设计思路 3.Pro文件配置 4.项目演示 5.项目开源 项目介绍 智能即时聊天室系统&#xff08;AIChatProject&#xff09;是一个高效、灵活的即时通讯解决方案。它融合了百度的开源大型语言模型——文心一言&#xff0c;通过API接口实现深度集成。系统专为聊天和…

Ubuntu使用 NVIDIA GPU 和 CUDA 设置 LLM 的训练、微调和推理

0.引言 近年来&#xff0c;人工智能领域取得了令人瞩目的进步&#xff0c;其核心是图形处理单元&#xff08;GPU&#xff09;和并行计算平台的强大组合。 大模型如 GPT、BER能够理解和生成具有前所未有的流畅性和连贯性的类人文本。然而&#xff0c;训练这些模型需要大量的数据…

【SAP ME 42】关于SAP ME自定义开发中NWDS中配置JDK

1、NWDS启动配置JDK -vm C:/Java/jdk1.8.0_361/bin 2、开发组件配置JDK

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术&#xff0c;项目包含完整的前端HTML&#xff0c;以及Flask构成完整的前后端分离系统 爬虫文件基于selenium&#xff0c;需要配合登录账号 简介 主页 登录页面&#xff0c;用户打开浏…

YIA主题侧边栏如何添加3D旋转标签云?

WordPress站点侧边栏默认的标签云排版很一般&#xff0c;而3D旋转标签云就比较酷炫了。下面boke112百科就以YIA主题为例&#xff0c;跟大家说一说如何将默认的标签云修改成3D旋转标签云&#xff0c;具体步骤如下&#xff1a; 1、点此下载3d标签云文件&#xff08;密码&#xf…

氢氧化铝佐剂,完美替代进口品牌明矾佐剂

氢氧化铝佐剂 氢氧化铝佐剂是使用历史最为悠久的疫苗佐剂&#xff0c;已有近百年历史&#xff0c;广泛用于各种人用疫苗和兽用疫苗。氢氧化铝佐剂能够极大地促进体液免疫&#xff08;抗体&#xff09;反应和TH2类细胞免疫反应。 用途 1、免疫各种实验动物制备多克隆或单克隆抗…

【大作业】今日事、今日毕任务管理系统

一份声明文档,描述你的程序的功能,包括你的输入输出、程序提供的数据、预期输出等内容。 这是一个任务管理系统,功能列表如下。 一、这是主界面: === 欢迎使用 今日事今日毕 任务管理系统 === 查看所有任务查看未完成任务查看已完成任务添加新任务标记任务为已完成修改当天…

Oracle表中的数据量达到30万条

当Oracle表中的数据量达到30万条&#xff0c;并且查询性能过慢时&#xff0c;增加索引是一个有效的优化方案。以下是一些建议来增加索引以提高查询性能&#xff1a; 分析查询需求&#xff1a; 首先&#xff0c;需要明确哪些查询是经常执行的&#xff0c;以及这些查询的WHERE子…

基于物理信息的深度神经网络模拟混凝土中氯离子的扩散

氯离子在混凝土中的扩散是一个复杂的化学物理过程,对混凝土腐蚀起始时间的预测具有重要意义。但考虑到混凝土的非线性氯离子结合能力,模拟氯离子扩散的方程是有限的。本研究提出了一种基于物理信息的深度神经网络来模拟氯离子在混凝土中的扩散机制并预测氯离子浓度的分布。物…

数据挖掘与分析——特征选择

数据读取 wine葡萄酒数据集是来自UCI的公开数据集&#xff0c;也scikit-learn库自带的数据集&#xff0c;它是对意大利同一地区种植的葡萄酒进行化学分析的结果&#xff0c;这些葡萄酒来自三个不同的品种。该分析确定了三种葡萄酒中每种葡萄酒中含有的13种成分的数量。 每行代…

【Java面试】二十、JVM篇(上):JVM结构

文章目录 1、JVM2、程序计数器3、堆4、栈4.1 垃圾回收是否涉及栈内存4.2 栈内存分配越大越好吗4.3 方法内的局部变量是否线程安全吗4.4 栈内存溢出的情况4.5 堆和栈的区别是什么 5、方法区5.1 常量池5.2 运行时常量池 6、直接内存 1、JVM Java源码编译成class字节码后&#xf…

用C++做一个猫吃鱼的函数代码

要求&#xff1a; 写一个类Fish&#xff0c;有品种和重量两个属性&#xff0c;属性的类型自己选择&#xff0c;要求属性封装。 写一个类Cat&#xff0c;Cat中有一个公有的成员函数&#xff1a; Fish& eat(Fish &f); eat函数的功能要求判断Fish的品种&#xff1a; ●如果…

qt 获取系统主机名、UID序列号、以及磁盘空间等其他信息

使用qt接口获取系统主机名、UID序列号、以及磁盘空间、当前网络传输速率&#xff0c;显卡参数等 void logPCInfo() { LOG_FUN(LOG_LEVEL_INFO, "Host Name: %s", QSysInfo::machineHostName().toStdString().c_str()); LOG_FUN(LOG_LEVEL_INFO, "Machin…

Open3D点云处理学习

Color ICP Colored point cloud registration — Open3D 0.11.0 documentation Colored point cloud registration - Open3D 0.18.0 documentation 展示了使用color-icp结果 对比gicp错误处理结果 intel自己的论文 Colored Point Cloud Registration Revisited 优化方程 参…

临时关闭Windows安全中心

在使用WindowsOS是&#xff0c;微软安全中心是我们必不可少的安全防护&#xff0c;但有时我们也会产生想要将其关闭的需求&#xff0c;下面将要介绍如何临时关闭Windows的安全中心 一、打开安全中心、选择“病毒与威胁防护”&#xff0c;点击“管理设置” 之后将其实时保护关闭…

PPT的精细化优化与提升策略

&#x1f44f;&#x1f44f;&#x1f44f;欢迎来到我的博客 ! 亲爱的朋友们&#xff0c;欢迎您们莅临我的博客&#xff01;这是一个分享知识、交流想法、记录生活的温馨角落。在这里&#xff0c;您可以找到我对世界独特视角的诠释&#xff0c;也可以与我一起探讨各种话题&#…