OrionX vGPU研发测试场景下最佳实践之SSH模式

news2024/12/23 20:46:11

开发机场景概述

目前很多企业在做AI开发的场景时,对GPU资源的管理都是非常简单粗暴的。他们大多都是以开发小组为管理单位、由运维以台为单位分配给开发工程师使用。而在AI开发中涉及开发的场景和测试的场景,很多是将开发测试甚至训练任务都放在一起来使用资源,这时用户就会在资源使用方面遇到一些问题:

从管理角度看,用户会遇到资源无法统一管理和调度、也无法做到很好的监控和资源统计的问题;从算法人员的角度看,他们面临的问题就是资源紧张须相互协调、无法灵活动态地使用和申请资源的问题。

基于上述问题,OrionX AI算力资源池化解决方案给出了相应的解决思路,旨在为用户提高GPU利用率、提供灵活调度平台、统一管理算力资源,实现弹性扩展,按需使用。

根据算法工程师的使用习惯,我们归纳了三种开发机场景:

  • • SSH模式:该模式就给算法人员一台机器,无论是物理机还是虚机或者是容器,由算法人员直接远程连接进行算法的开发使用资源。

  • • Jupyter模式:Jupyter也是最近几年算法人员使用比较多的一种工具,很多企业已经将其改造集成开发工具,可以将Jupyter部署在容器或者虚机给算法人员使用。

  • • CodeServer模式:微软的VSCode的服务器版本,近年也有很多企业在采用该工具,使用资源的方式类似Jupyter,也是部署在虚机或者容器当中。

我们将通过三篇文章逐一介绍OrionX vGPU基于这三种场景的最佳实践,今天,让我们从SSH开始探索。

环境准备

环境包含物理机器或者虚机、网络环境、GPU卡,操作系统以及容器平台。

硬件环境

本次POC环境准备三台虚机,其中一台CPU节点,两台GPU节点,每台GPU节点有一块T4卡。

操作系统为ubuntu 18.04

管理网络:千兆TCP

远程调用网络:100G RDMA

Kubernetes环境

三个节点安装K8s环境,可以使用kubeadm来安装,或者一些部署工具:

  • • kubekey

  • • kuboard-spray

当前部署Kubernetes环境如下:

root@sc-poc-master-1:~# kubectl get node
NAME              STATUS   ROLES                         AGE    VERSION
sc-poc-master-1   Ready    control-plane,master,worker   166d   v1.21.5
sc-poc-worker-1   Ready    worker                        166d   v1.21.5
sc-poc-worker-2   Ready    worker                        166d   v1.21.5

其中master为CPU节点,worker节点为2个T4 GPU节点。

OrionX vGPU池化环境

参考趋动科技《OrionX 实施方案-K8s版》,部署完之后我们可以在orion的namespace查看OrionX组件:

root@sc-poc-master-1:~# kubectl get pod -n orion 
NAME                                 READY   STATUS    RESTARTS   AGE
orion-container-runtime-hgb5p        1/1     Running   3          63d
orion-container-runtime-qmghq        1/1     Running   1          63d
orion-container-runtime-rhc7s        1/1     Running   1          46d
orion-exporter-fw7vr                 1/1     Running   0          2d21h
orion-exporter-j98kj                 1/1     Running   0          2d21h
orion-gui-controller-all-in-one-0    1/1     Running   2          87d
orion-plugin-87grh                   1/1     Running   6          87d
orion-plugin-kw8dc                   1/1     Running   8          87d
orion-plugin-xpvgz                   1/1     Running   8          87d
orion-scheduler-5d5bbd5bc9-bb486     2/2     Running   7          87d
orion-server-6gjrh                   1/1     Running   1          74d
orion-server-p87qk                   1/1     Running   4          87d
orion-server-sdhwt                   1/1     Running   1          74d

开发机场景:SSH远程连接模式

本次测试,我们启动一个Pod资源,分配OrionX vGPU资源,然后通过kubectl exec的方式进入Pod进行开发,该Pod使用的镜像是官方的TensorFlow镜像:tensorflow/tensorflow:2.4.3-gpu。

部署的Yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
  name: tf-243
  namespace: orion
spec:
  replicas: 1
  selector:
    matchLabels:
      name: tf-243
  template:
    metadata:
      labels:
        name: tf-243
    spec:
            #nodeName: sc-poc-master-1
      hostNetwork: true
      schedulerName: orion-scheduler
      containers:
      - name: tf-243
        image: tensorflow/tensorflow:2.4.3-gpu 
        imagePullPolicy: Always 
        #imagePullPolicy: IfNotPresent
        command: ["bash", "-c"]
        args: ["while true; do sleep 30; done;"]
        resources:
          requests:
            virtaitech.com/gpu: 1
          limits:
            virtaitech.com/gpu: 1
        env:
          - name : ORION_GMEM
            value : "5000"
          - name : ORION_RATIO
            value : "60"
          - name: ORION_VGPU
            value: "1"
          - name: ORION_RESERVED
            value: "1"
          - name: ORION_CROSS_NODE
            value: "1"
          - name: ORION_EXPORT_CMD
            value: "orion-smi -j" 
          - name: ORION_CLIENT_ID
            name: "orion"
          - name : ORION_GROUP_ID
            valueFrom:
              fieldRef:
                fieldPath: metadata.uid
          - name: ORION_K8S_POD_NAME
            valueFrom:
             fieldRef:
               fieldPath: metadata.name
          - name: ORION_K8S_POD_UID
            valueFrom:
              fieldRef:
                fieldPath: metadata.uid

关于OrionX详细参数可以参考《OrionX 用户手册》,此处介绍几个常用的参数:

  • • ORION_VGPU:指的是申请的OrionX vGPU个数,比如1个或者多个

  • • ORION_GMEM:指的是申请的显存大小,以MB计算,5000就是5GB的显存大小

  • • ORION_RATIO:指的是申请的算力大小,OrionX vGPU的算力切分是按照物理卡的百分比进行切分的,此处填入的数字是一个百分比的数字,60就代表申请了单张物理卡60%的算力,最小单位是1%,最大是100%。100%的时候表示该vGPU申请了整张物理卡的资源。

  • • ORION_RESERVED:指的是申请的资源是预留模式,OrionX申请资源时有两种模式一种是预留,一种是非预留。预留模式就是资源预分配,在Pod启动时就已经分配了,不论该Pod是否运行了AI任务跟使用物理GPU时类似;非预留模式就是Pod启动时并没有分配资源,只有当有AI任务运行的时候才会真正的分配,等任务结束,资源就会被自动释放。

采用预留模式申请资源

本次测试先使用预留模式申请资源,部署TF镜像:

# kubectl create -f 09-deploy-tf-243-gpu.yaml

# kubectl get pod
NAME                                READY   STATUS              RESTARTS   AGE
tf-243-84657d76b5-jqqc8             0/1     ContainerCreating   0          30m
# 等着拉镜像启动

通过查看OrionX GUI,该OrionX vGPU资源已经被分配。由于是预留模式,所以无论资源是否被使用,都会预分配资源。

图片

启动Pod之后,我们进入Pod查看申请的资源是否已经生效

root@sc-poc-master-1:~# kubectl exec -it tf-243-84657d76b5-jqqc8  -- bash

________                               _______________                
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ / 
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...

root@sc-poc-master-1:/# env | grep -iE "vgpu|gmem|ratio|rese"
ORION_GMEM=5000
ORION_RESERVED=1
ORION_RATIO=60
ORION_VGPU=1

通过环境变量查看,申请的资源已经生效了。

由于该镜像是官方的镜像,该TensorFlow的base os镜像是Ubuntu 18.04,所以更新下国内源,然后安装下Git,我们后续下载一个TensorFlow benchmark作为测试脚本来模拟开发测试。

#  sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# apt update
# apt install git -y
# git clone https://github.com/tensorflow/benchmarks

下载完TensorFlow Benchmark之后,我们就可以直接跑该Benchmark模拟一个训练的任务,该运行模式就跟实际研发场景类似,在Pod里面写代码之后运行代码,Benchmark运行代码如下:

python3 ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \
--forward_only=False \
--data_name=imagenet \
--model=resnet50 \
--num_batches=200 \
--num_gpus=1 \
--batch_size=32

正常跑起来之后,我们会看到窗口有一个输出

图片

该结果显示每秒训练了81.3张图片,通过OrionX GUI的任务界面我们也能看到该任务的运行,该任务被分配了60%的算力和5G显存,跟实际申请的资源一样。

图片

采用非预留模式申请资源

前面是预留模式,本次将yaml文件部署的参数ORION_RESERVED改成0,就是非预留模式。非预留模式在Pod启动时并不会分配资源,只有当有任务运行的时候才会分配资源。该模式能将GPU资源分时复用的效率提升数倍,同时有了该功能在研发测试场景也可以将GPU资源进行超分配,进一步提高资源利用率。

Pod启动之后,通过OrionX GUI界面发现,并没有资源被申请。

图片

我们同样来运行一个上面的Benchmark任务,发现在任务启动时候资源已经被申请到了。

python3 ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \
--forward_only=False \
--data_name=imagenet \
--model=resnet50 \
--num_batches=200 \
--num_gpus=1 \
--batch_size=32

图片

等任务结束我们再去OrionX GUI查看资源又被动态释放掉,通过该模式我们能提高GPU资源的分时复用效率,可以将平均利用率提升3-5倍。

通过SSH远程POD

前面都是通过kubectl命令行进入Pod,那么在很多企业中是不会直接给算法人员该权限的,那么我们是否可以通过远程虚机的方式远程一个Pod呢,答案是肯定的。接下来我们就介绍如何通过SSH远程一个Pod进行开发。远程连接Pod需要的条件跟远程虚机一样:开启SSH端口、配置用户名密码(或者秘钥方式)、开启远程连接的端口和连接方式。

  • • 开启Pod的SSH端口

要开启SSH端口,我们就需要改造原有的镜像,我们需要安装SSH服务,并在启动是时候启动sshd服务,改造的Dockerfile如下,同时为了测试方便,我们把benchmark脚本也clone到镜像里面:

FROM tensorflow/tensorflow:2.4.3-gpu
#USER root
WORKDIR /root
RUN  sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN rm /etc/apt/sources.list.d/cuda.list
RUN rm /etc/apt/sources.list.d/nvidia-ml.list

# Install necessary packages
RUN apt-get update && apt-get install -y \
        software-properties-common \
        wget \
        git \
        curl \
        openssh-server \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/tensorflow/benchmarks
RUN mkdir /run/sshd

CMD ["/usr/sbin/sshd","-D"]
  • • 配置秘钥

为了保证安全,我们本次通过秘钥的方式远程连接Pod,首先我们可以通过xshell或者直接Linux命令行生成我们自己的秘钥,然后通过configmap的方式把秘钥挂载给Pod,configmap如下:

# cat ssh-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: ssh-config
data:
  sshd_config: |
    PasswordAuthentication no
    ChallengeResponseAuthentication no
    UsePAM no
  authorized_keys: |
    ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwgGoBqurkauiio8zhh6HRX/8PJ0daXmnW38EyvIghW9au7qG3yBjxEzsDcPpUILne1gMmb6WO1+IdENPIsqZ1ycsfrKjpCbeXUKL7vbuUasBKlkoG/xvhCy1G+GTEwSdyPQnjYsE5cnTedIvbd0wfSjgtMqa3D4fKT/1eCBoGs8n4yPKOZo8l/jKFv5/ph8qi5uvNPMdWx43+4prpOVN8oPLWRSFJ1WZ8zTRGOwnkdi0LZLrbQ7OqMaEsUKrMndAH56e9MToex2J3ngbTYceFGo2SWCKGAmy32RFvmoxHfCjUQlcGvElNh5OEPlBSGMc5RLXQlrzpD5iVm7hkzgxzQ==
  • • 修改该镜像的启动参数和挂载configmap,Pod启动Yaml如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
  name: tf-243
  namespace: orion
spec:
  replicas: 1
  selector:
    matchLabels:
      name: tf-243
  template:
    metadata:
      labels:
        name: tf-243
    spec:
      nodeName: sc-poc-worker-1
      #hostNetwork: true
      schedulerName: orion-scheduler
      containers:
      - name: tf-243
        image: tensorflow/tensorflow:2.4.3-gpu-ssh
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: IfNotPresent
        #command: ["bash", "-c"]
        #args: ["while true; do sleep 30; done;"]
        resources:
          requests:
            virtaitech.com/gpu: 1
          limits:
            virtaitech.com/gpu: 1
        env:
          - name : ORION_GMEM
            value : "5000"
          - name : ORION_RATIO
            value : "60"
          - name: ORION_VGPU
            value: "1"
          - name: ORION_RESERVED
            value: "0"
          - name: ORION_CROSS_NODE
            value: "1"
          - name: ORION_EXPORT_CMD
            value: "orion-smi -j" 
          - name: ORION_CLIENT_ID
            name: "orion"
          - name : ORION_GROUP_ID
            valueFrom:
              fieldRef:
                fieldPath: metadata.uid
          - name: ORION_K8S_POD_NAME
            valueFrom:
             fieldRef:
               fieldPath: metadata.name
          - name: ORION_K8S_POD_UID
            valueFrom:
              fieldRef:
                fieldPath: metadata.uid
        ports:
        - containerPort: 22
        volumeMounts:
        - name: ssh-volume
          subPath: sshd_config
          mountPath: /etc/ssh/sshd_config
        - name: ssh-volume
          subPath: authorized_keys
          mountPath: /root/.ssh/authorized_keys
      volumes:
      - name: ssh-volume
        configMap:
          name: ssh-config   
  • • 通过NodePort方式远程连接Pod

如果有条件的可以通过LB的方式,目前我们这里通过NodePort方式提供Pod一个连接地址,创建svc如下:

apiVersion: v1
kind: Service
metadata:
  name: ssh-service
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 22
    targetPort: 22
  selector:
    name: tf-243
  • • 部署该TensorFlow镜像并通过xshell远程

将以上yaml文件直接部署,部署出来如下:

# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
tf-243-9fb569b9d-klmtj              1/1     Running   0          12m

# kubectl get svc
NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                        AGE
ssh-service                       NodePort    172.16.7.214     <none>        22:32550/TCP                                   2d

通过svc查看,映射了一个32550的端口,我们通过xshell远程宿主机IP加32550端口,就可以远程该服务了。我们使用前面的脚本再跑下benchmark,可以正常运行,至此我们就可以通过SSH远程该Pod进行开发了。

以上就是OrionX vGPU在SSH模式下的开发机场景的最佳实践。我们将在以后的文章中继续分享OrionX vGPU基于Jupyter和CodeServer模式下的开发实践,欢迎留言探讨!

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

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

相关文章

<<编码>> 第 11 章 逻辑门电路--门电路 示例电路

作为门电路的继电器开关电路 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch11-06-relay-as-gate.txt 作为反相器的继电器开关电路 …

EPON光模块介绍

EPON光模块在依靠光纤网络实现快速可靠的数据传输、增强带宽能力和提高网络效率的过程中发挥着至关重要的作用。在这篇文章中&#xff0c;我们将深入研究EPON光模块的基本概念、各种类型、优点和局限性&#xff0c;全面了解它们在现代电信中的重要性。 EPON光模块的定义 EPON…

ZYNQ 入门笔记(二):动态时钟

文章目录 1 概述1.1 DRP1.2 AXI4-Lite 2 示例2.1 单时钟输出2.2 多时钟输出 3 参考文档 1 概述 Clocking Wizard 可通过配置内部寄存器动态调整输出频率&#xff0c;配置接口可选 DRP 或 AXI4-Lite&#xff0c;其中 AXI4-Lite 实际上是对 DRP 接口的封装 1.1 DRP 通过 DRP 接…

Python文件操作:上下文管理器(with语句)②

文章目录 1. 上下文管理器概述1.1 什么是上下文管理器&#xff1f;1.2 为什么使用上下文管理器&#xff1f;1.3 with语句的基本语法 2. 文件操作中的上下文管理器2.1 使用with语句打开文件2.2 读取文件2.2.1 读取整个文件内容2.2.2 逐行读取文件 2.3 写入文件2.3.1 覆盖写入2.3…

JavaWeb使用web.xml配置Servlet路径映射的相关操作以及易错问题分析与解决

前言 我们在使用Servlet创建JavaWeb项目时&#xff0c;想要绑定url路径和Servlet的映射关系&#xff0c;需要在web.xml中配置映射关系。Servlet从2.5版本开始支持注解。具体来说&#xff0c;Servlet 2.5引入了注解配置方式&#xff0c;使得Servlet应用程序的配置更加简单、灵活…

文档智能:OCR+Rocketqa+layoutxlm

此次先记录LayoutLMv2&#xff0c;梳理相关论文&#xff0c;记录如下&#xff1a; 首先认识一下 visually-rich document understanding tasks → \to → VrDU 其次&#xff0c;the text fields of interest&#xff0c;与图像识别的感兴趣区域 region of Interest 类似&…

MySQL数据的增删改查(一)

目录 新增&#xff08;create&#xff09; 插入单条记录 插入多条记录 查询&#xff08;retrieve&#xff09; 查询所有列 查询特定列 查询字段为表达式 别名 去重 排序 按单列排序 按多列排序 使用表达式或别名排序 排序NULL值 条件查询 比较运算符 逻辑运算…

双向dfs,多次dfs

前言&#xff1a;这个答案给我们提供了一种多次dfs的思路&#xff0c;记录queue的size&#xff0c;每次只取size个&#xff0c;就刚刚好只处理了上一次的‘ 题目地址 #include<bits/stdc.h> using namespace std;//定义队列节点 struct node {int x,y; }rear,front; //Q[…

Leetcode面试经典150题-350.两个数组的交集II

题目比较简单&#xff0c;散散心吧 这个题竟然是349更简单的版本&#xff0c;可以先看看349题的解法&#xff1a; Leetcode面试经典150题-349.两个数组的交集-CSDN博客 349会了&#xff0c;这个也就会了 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/…

C51单片机矩阵键盘输入数码管静态显示

【实验目的】 学会矩阵键盘的检测&#xff0c;掌握数码管静态显示原理。 【实验现象】 依次按下4*4矩阵键盘上从第1到第20个键&#xff0c;同时在六位数码管上依次显示0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。 【实验说明】 本开发板上数码管为共阴极。静态数码管显示…

R与机器学习系列|15.可解释的机器学习算法(Interpretable Machine Learning)(下)

今天我们介绍可解释机器学习算法的最后一部分&#xff0c;基于XGBoost算法的SHAP值可视化。关于SHAP值其实我们之前的很多个推文中都介绍到&#xff0c;不论是R版本的还是Python版本的&#xff0c;亦不论是普通的分类问题还是生存数据模型的。在此推文中我们将基于XGBoost模型理…

付费进群付费入群流量掘金入群系统九牧云版源码系统搭建

适用于各类资源类付费进群领取&#xff0c;私域类项目经营等 简洁大气直观。流量掘金类必备。 前端展示视频&#xff1a; https://pan.baidu.com/s/1lqyGCOrfmE4LDXb1cm-eDQ?pwdvnk6 https://yun.ktbf.xyz/s/by6jIzghpb 大致功能&#xff1a; 支持域名防红模式 支持对接…

QT+OSG+OSG-earth如何在窗口显示一个地球

1、环境配置 系统&#xff1a;windows10系统 QT:版本5.15.2 编译器&#xff1a;MSVC2019_64bit 编辑器&#xff1a;QT Creator OSG版本&#xff1a;3.7.0 64位 为MSVC环境下编译 osgQt:为第三方编译的库&#xff0c;OSG因为版本不同已经不提供osgQt的…

【一文就懂】计算机视觉期刊和会议缩写

下面IEEE相关的期刊及其缩写&#xff0c;并重新整理为期刊和会议两个部分。 期刊缩写 期刊全称缩写IEEE Transactions on Pattern Analysis and Machine IntelligenceIEEE Trans. Pattern Anal. Mach. Intell.IEEE Transactions on Image ProcessingIEEE Trans. Image Proce…

用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响

高效的数据处理对于依赖大数据分析做出明智决策的企业和组织至关重要。显著影响数据处理性能的一个关键因素是数据的存储格式。本文探讨了不同存储格式&#xff08;特别是 Parquet、Avro 和 ORC&#xff09;对 Google Cloud Platform &#xff08;GCP&#xff09; 上大数据环境…

机器学习--支持向量机(SVM)

支持向量机(线性) S V M SVM SVM 引入 S V M SVM SVM 用于解决的问题也是 c l a s s i f i c a t i o n classification classification&#xff0c;这里 y ∈ { − 1 , 1 } y \in \{-1, 1\} y∈{−1,1} 比如说这样一个需要分类的训练数据&#xff1a; 我们可以有很多直线来…

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉&#xff0c;那么对 shallowRef 和 shallowReactive 是否了解呢&#xff1f; 在编程和数据结构中&#xff0c;“shallow”&#xff08;浅层&#xff09;通常指对数据结构的最外层进行操作&#xff0c;而不递归地处理其内部或嵌套的数据…

Brave编译指南2024 Windows篇:安装Git(四)

1.引言 在编译Brave浏览器的过程中&#xff0c;Git是必不可少的工具之一。作为最流行的分布式版本控制系统&#xff0c;Git允许开发者高效地管理和协作开发源码。通过Git&#xff0c;您可以轻松获取、更新和提交Brave的源码版本&#xff0c;并跟踪所有更改记录。无论是独立开发…

大模型入门 ch 03:注意力机制

本文是github上的大模型教程LLMs-from-scratch的学习笔记&#xff0c;教程地址&#xff1a;教程链接 Chapter 3&#xff1a; Attention Mechanism 本文首先从固定参数的注意力机制说起&#xff0c;然后拓展到可以训练的注意力机制&#xff0c;然后加入掩码mask&#xff0c;最后…

基于 onsemi NCV78343 NCV78964的汽车矩阵式大灯方案

一、方案描述 大联大世平集团针对汽车矩阵大灯&#xff0c;推出 基于 onsemi NCV78343 & NCV78964的汽车矩阵式大灯方案。 开发板搭载的主要器件有 onsemi 的 Matrix Controller NCV78343、LED Driver NCV78964、Motor Driver NCV70517、以及 NXP 的 MCU S32K344。 二、开…