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

在上周的文章中,我们讲述了OrionX vGPU研发测试场景下最佳实践之SSH模式,今天,让我们走进 Jupyter模式下的最佳实践。

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

环境准备

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

硬件环境

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

操作系统为ubuntu 18.04

管理网络:千兆TCP

远程调用网络:100G RDMA

Kubernetes环境

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

  • • kubekey

  • • KUBOARD 喷雾

当前部署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

开发机场景:JupyterLab模式

jupyterlab包含了 的所有功能,并升级增加了很多功能。其支持python、R、java等多种编程语言及markdown、letex等写作语言及公式输入,可以集编程与写作于一身,非常适合于代码学习、笔记记录、演示及教学等。jupyter lab相比notebook最大的更新是模块化的界面,可以在同一个窗口以标签的形式同时打开好几个文档,同时插件管理非常强大,使用起来要比jupyter notebook功能丰富许多。jupyternotebook

JupyterLab作为一种基于web的集成开发环境,你可以使用它编写notebook、操作终端、编辑markdown文本、打开交互模式、查看csv文件及图片等功能。

本次场景,我们通过k8s部署jupyterlab来进行基本的机器学习开发,同时我们集成一个开源算法进行实践。

制作镜像

我们使用官方的pytorch镜像或者TensorFlow镜像作为Base镜像来编译一个新的jupyterlab镜像,在使用的时候就有cuda和框架了,省去很多时间。本次我们先以pytorch镜像来进行编译新镜像,新建一个Dockerfile

FROM pytorch/pytorch:1.8.1-cuda10.2-cudnn7-devel
#USER root
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    rm /etc/apt/sources.list.d/cuda.list && \
    rm /etc/apt/sources.list.d/nvidia-ml.list && \
    apt update -y  && \
    apt install -y nodejs npm curl vim wget git && \
    apt install -y language-pack-zh-hans  && \
    pip3 install  -i https://pypi.tuna.tsinghua.edu.cn/simple/ jupyterlab   && \
    pip3 install  -i https://pypi.tuna.tsinghua.edu.cn/simple/ jupyterlab-language-pack-zh-CN 

RUN pip install pillow && \
    pip install cmake && \
    pip install dlib && \
    pip install face_recognition && \
    pip install matplotlib && \
    pip install scipy

ENV LANG='zh_CN.utf8'
CMD ["/bin/bash","-c","jupyter lab --ip=0.0.0.0 --no-browser --allow-root --port=8888 --NotebookApp.token='' --NotebookApp.password=''  --NotebookApp.allow_origin='*'"]

我们使用了pytorch 1.8.1 cuda 10.2的镜像,然后将ubuntu的软件源改成阿里云的,同时删除nvidia的源,否则会因为网络问题无法安装其他软件。安装jupyterlab和一些基本的科学计算的库,重新build

docker build -t pytorch/pytorch:1.8.1-cuda10.2-cudnn7-devel-jupyterlab .

build完之后,我们得到一个新的镜像,接下来我们部署该镜像pytorch/pytorch:1.8.1-cuda10.2-cudnn7-devel-jupyterlab

部署jupyterlab

通过yaml部署,由于该Pod需要对外提供服务,所以我们要暴露8888端口,同时创建svc和ingress提供对外服务地址

jupyterlab的yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
  name: jupyterlab-orion
  namespace: orion
spec:
  replicas: 1
  selector:
    matchLabels:
      name: jupyterlab-orion
  template:
    metadata:
      labels:
        name: jupyterlab-orion
    spec:
      nodeName: sc-poc-worker-2
      #hostNetwork: true
      schedulerName: orion-scheduler
      containers:
      - name: jupyterlab-orion
        image: pytorch/pytorch:1.8.1-cuda10.2-cudnn7-devel-jupyterlab
        ports:
        - containerPort: 8888
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            virtaitech.com/gpu: 1
          limits:
            virtaitech.com/gpu: 1
        env:
          - name : ORION_GMEM
            value : "5000"
          - name : ORION_RATIO
            value : "50"
          - name: ORION_VGPU
            value: "1"
          - name: ORION_RESERVED
            value: "0"
          - name: ORION_CROSS_NODE
            value: "0"
          - name: ORION_TASK_IDLE_TIME
            value: "30s"
          - name: ORION_EXPORT_CMD
            value: "env | grep ORION; orion-smi -j"
          - 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
          - name: ORION_K8S_POD_NS
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace

---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: jupyterlab-orion
  name: jupyterlab-orion
  namespace: orion
spec:
  ports:
    - name: web
      port: 8888
      protocol: TCP
      targetPort: 8888
  selector:
    name: jupyterlab-orion
  type: ClusterIP

我这边是使用traefik搭建的ingress服务,所以给jupyterlab创建的ingress如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jupyterlab-ingress
  annotations:
    kubernetes.io/ingress.class: traefik  
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: jupyterlab.10.10.10.180.nip.io
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: jupyterlab-orion
            port:
              number: 8888

两个yaml文件部署完后,通过ingress地址可以访问该jupyterlab了

图片

 

简单测试下pytorch是否可以正常调用vGPU,代码样例:

import torch 
from torch import nn 

if_cuda = torch.cuda.is_available()
print("if_cuda=",if_cuda)

gpu_count = torch.cuda.device_count()
print("gpu_count=",gpu_count)

torch.cuda.get_device_name(0)

图片

 

通过pytorch的api我们可以直接拿到GPU的信息,跟物理卡是一致的,物理卡是T4,vGPU同样是T4,此时vGPU是分配了一块卡,所以显示的数量也是一样的,根据pytorch拿到的信息我们可以发现对于上层的框架而言调用vGPU资源跟调用物理GPU资源是一样的,不会有什么改变,那对于上层的应用来说也是透明的使用vGPU资源。

跑一个demo

我们在jupyterlab中跑一个pytorch线性回归代码测试下pytorch调用vGPU是否正常使用。我们之前启动pod的时候申请了50%的算力和5G的显存

代码如下:

import time
import torch 
from torch import nn 

# 准备数据
n = 1000000 #样本数量

X = 10*torch.rand([n,2])-5.0  #torch.rand是均匀分布 
w0 = torch.tensor([[2.0,-3.0]])
b0 = torch.tensor([[10.0]])
Y = X@w0.t() + b0 + torch.normal( 0.0,2.0,size = [n,1])  # @表示矩阵乘法,增加正态扰动

# 移动到GPU上
print("torch.cuda.is_available() = ",torch.cuda.is_available())
X = X.cuda()
Y = Y.cuda()
print("X.device:",X.device)
print("Y.device:",Y.device)



# 定义模型
class LinearRegression(nn.Module): 
    def __init__(self):
        super().__init__()
        self.w = nn.Parameter(torch.randn_like(w0))
        self.b = nn.Parameter(torch.zeros_like(b0))
    #正向传播
    def forward(self,x): 
        return x@self.w.t() + self.b
        
linear = LinearRegression() 

# 移动模型到GPU上
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
linear.to(device)

#查看模型是否已经移动到GPU上
print("if on cuda:",next(linear.parameters()).is_cuda)

# 训练模型
optimizer = torch.optim.Adam(linear.parameters(),lr = 0.1)
loss_func = nn.MSELoss()

def train(epoches):
    tic = time.time()
    for epoch in range(epoches):
        optimizer.zero_grad()
        Y_pred = linear(X) 
        loss = loss_func(Y_pred,Y)
        loss.backward() 
        optimizer.step()
        if epoch%50==0:
            print({"epoch":epoch,"loss":loss.item()})
    toc = time.time()
    print("time used:",toc-tic)
    
train(5000)

运行结果如下:

图片

 

OrionX 申请资源情况如下

图片

 

综上,我们在jupyterlab中通过pytorch调用vGPU能正常使用。

项目实践

我们基于一个开源项目在jupyterlab进行实际的开发体验,它可以将视频、人物、风景动漫化,我们本次使用的是pytorch版本的实现,项目地址为:animegan2-pytorchhttps://github.com/bryandlee/animegan2-pytorch

为了方便使用我们需要做一些准备工作,1、准备一个nfs server用来持久化 2、将该项目clone下来存入nfs中去,我在nfs server建了一个目录,然后把该项目拷贝进去;3、下载一个人脸关键点模型,后续可以直接使用该模型,当然你也可以训练自己的人脸关键点检测模型,该模型下载地址/mnt/nfs_share/animegan2-pytorchshape_predictor_68_face_landmarks.dat

https://github.com/davisking/dlib-models,将下载的模型同样拷贝到目录下面。接下来我们就将这个目录挂载给jupyterlab的pod里面,具体的挂载参考YAML文件如下:/mnt/nfs_share/animegan2-pytorch

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
  name: jupyterlab-orion
  namespace: orion
spec:
  replicas: 1
  selector:
    matchLabels:
      name: jupyterlab-orion
  template:
    metadata:
      labels:
        name: jupyterlab-orion
    spec:
      nodeName: sc-poc-worker-2
      #hostNetwork: true
      schedulerName: orion-scheduler
      volumes:
        - name: animegan2-data
          nfs:
           server: 10.10.10.180
           path: /mnt/nfs_share/animegan2-pytorch

      containers:
      - name: jupyterlab-orion
        image: pytorch/pytorch:1.8.1-cuda10.2-cudnn7-devel-jupyterlab
        volumeMounts:
          - name: animegan2-data
            mountPath: /workspace/animegan2-pytorch
        ports:
        - containerPort: 8888
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            virtaitech.com/gpu: 1
          limits:
            virtaitech.com/gpu: 1
        env:
          - name : ORION_GMEM
            value : "5000"
          - name : ORION_RATIO
            value : "50"
          - name: ORION_VGPU
            value: "1"
          - name: ORION_RESERVED
            value: "0"
          - name: ORION_CROSS_NODE
            value: "0"
          - name: ORION_TASK_IDLE_TIME
            value: "30s"
          - name: ORION_EXPORT_CMD
            value: "env | grep ORION; orion-smi -j"
          - 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
          - name: ORION_K8S_POD_NS
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace

---
apiVersion: v1
kind: Service
metadata:
  labels:
    name: jupyterlab-orion
  name: jupyterlab-orion
  namespace: orion
spec:
  ports:
    - name: web
      port: 8888
      protocol: TCP
      targetPort: 8888
  selector:
    name: jupyterlab-orion
  type: ClusterIP

我们把该nfs上的目录直接挂载在jupyterlab的目录下面,启动之后我们通过ingress方式登录该jupyterlab就可以看到挂载的项目了/workspace/animegan2-pytorch

图片

双击我们就可以运行该项目了,但是实际上在运行的时候他会在用户的根目录寻找一些文件,如果没有的话会自动下载,这些文件实际上就是项目里面的文件,由于github很不稳定,所以我们可以手动的在终端里面把这些文件复制到相关目录,需要复制两个目录,1、复制整个目录到;2、复制目录下的目录到 ,这样我们就可以在jupyterlab直接运行该demo了,我们可以通过点击来运行demo.ipynbanimegan2-pytorchanimegan2-pytorch/root/.cache/torch/hub/bryandlee_animegan2-pytorch_mainanimegan2-pytorchweights/root/.cache/torch/hub/checkpointsrun all cells

图片

 

运行的时候我们就可以看到他会调用我们复制的这些目录文件了。

该demo自带了马斯克的人像来进行动漫化,我们也可以找一些图片链接进行替换来运行该demo

图片

 

运行的时候我们通过OrionX GUI可以查看运行的任务和使用的资源

图片

 

以上就是OrionX vGPU在Jupyter模式下的开发机场景的最佳实践,OrionX AI算力资源池化解决方案针对GPU管理粗放给出了相应的解决思路,旨在为用户提高GPU利用率、提供灵活调度平台、统一管理算力资源,实现弹性扩展,按需使用。我们将在以后的文章中继续分享OrionX vGPU基于CodeServer模式下的开发实践,欢迎留言探讨!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB根据字段内容长度查询语句

db.getCollection("qlzx_penalties_business_raw").find({$expr: {$lt: [{ $strLenCP: "$punish_name" }, 5]},"punish_name_type" : "机构", "source_data" : /中国/,})解释: 1-"source_data" : /中…

召回02 Swing 召回通道

为了避免小圈子重合却误判物品相似度很高:降低小圈子对相似度的影响。

Element-ui el-table 全局表格排序

实现效果如下&#xff1a; 一、当页数据排序 如果只想要当前页面排序&#xff0c;只会涉及到前端&#xff0c;只需在<el-table-column>标签上添加 :sortable"true"即可 二、自定义排序 如果想要全局排序&#xff0c;需要自定义排序函数&#xff0c;请求后台排…

Unity Timeline

数据存储 TimeLine和Animation一样也是资源&#xff0c;以.playable的格式存储&#xff0c;可以通过Playable Director进行加载播放。 Playable具有以下优势&#xff1a; 结构简单&#xff1b; 运行时创建、添加和删除&#xff1b; 更加灵活&#xff0c;可以直接控制动画的各种…

计算机网络 ---- 计算机网络的体系结构【计算机网络的分层结构】

一、以快递网络来引入分层思想 1.1 “分层” 的设计思想【将庞大而复杂的问题&#xff0c;转化为若干较小的局部问题】 从我们最熟悉的快递网络出发&#xff0c;在你家附近会有一个快递终点站A&#xff0c;在其他的城市&#xff0c;也会有这种快递终点站&#xff0c;比如说快递…

Mac虚拟机Parallels Desktop 20 for Mac破解版发布 完整支持 Windows 11

Parallels Desktop 20 for Mac 破解版是一款虚拟化软件&#xff0c;允许用户在 Mac 设备上运行 Windows 和其他操作系统。Parallels Desktop 20 for Mac 特别适合需要同时使用 macOS 和 Windows 应用的用户&#xff0c;常用于开发、设计、办公等场景。 自从OpenAI推出ChatGPT之…

HarmonyOS开发之使用PhotoViewPicker(图库选择器)保存图片

一&#xff1a;效果图 二&#xff1a;添加依赖 import fs from ohos.file.fs;//文件管理 import picker from ohos.file.picker//选择器 三&#xff1a;下载&#xff0c;保存图片的实现 // 下载图片imgUrldownloadAndSaveImage(imgUrl: string) {http.createHttp().request(…

利士策分享,情商:解锁成功与幸福的隐形钥匙

利士策分享&#xff0c;情商&#xff1a;解锁成功与幸福的隐形钥匙 在这个快节奏、高压力的时代&#xff0c;我们每天都在与形色色的人打交道&#xff0c; 无论是职场上的合作伙伴、生活中的亲朋好友&#xff0c;还是网络上的虚拟社群&#xff0c; 人际关系的质量直接影响着…

尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)

目录&#xff1a; &#xff08;1&#xff09;拆单接口 &#xff08;2&#xff09;取消订单业务补充关闭支付记录 &#xff08;3&#xff09;支付宝关闭交易 &#xff08;4&#xff09;查询支付交易记录 &#xff08;5&#xff09;PaymentFeignClient 远程接口 &#xff08…

CrossOver24.0.5破解版免费下载和永久激活图文教程,苹果电脑怎么玩《黑神话:悟空》

CrossOver24可以玩《黑神话&#xff1a;悟空》么&#xff1f;答案是可以的。 1、首先我们需要下载CrossOver24软件。 CrossOver24安装包夸克网盘链接&#xff1a;https://pan.quark.cn/s/35e64d746778 2、下载完成后&#xff0c;我们双击CrossOver.pkg开始安装&#xff0c;然…

Uniapp + Vue3 + Vite +Uview + Pinia 实现购物车功能(最新附源码保姆级)

Uniapp Vue3 Vite Uview Pinia 实现购物车功能&#xff08;最新附源码保姆级&#xff09; 1、效果展示2、安装 Pinia 和 Uview3、配置 Pinia4、页面展示 1、效果展示 2、安装 Pinia 和 Uview 官网 https://pinia.vuejs.org/zh/getting-started.html安装命令 cnpm install pi…

搭建Windows下的Rust开发环境

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 2.1.1 安装vs_buildtools 在Windows系列操作系统中&#xff0c;Rust开发环境需要依…

机器学习课程学习周报十二

机器学习课程学习周报十二 文章目录 机器学习课程学习周报十二摘要Abstract一、机器学习部分1.1 fGAN: General Framework of GAN1.2 CycleGAN1.3 Auto-Encoder1.4 概率论复习&#xff08;一&#xff09; 总结 摘要 本周的学习内容涵盖了fGAN框架、CycleGAN、自编码器以及概率…

Linux | 探索 Linux 信号机制:信号的产生和自定义捕捉

信号是 Linux 操作系统中非常重要的进程控制机制&#xff0c;用来异步通知进程发生某种事件。理解信号的产生、阻塞、递达、捕捉等概念&#xff0c;可以帮助开发者更好地编写健壮的应用程序&#xff0c;避免由于未处理的信号导致程序异常退出。本文将带你从基础概念开始&#x…

数据结构基础详解:哈希表【C语言代码实践篇】开放地址法__拉链法_哈希表的创建_增删查操作详解

文章目录 1.哈希表代码实现之开放地址法1.1 开放地址法创建哈希表1.2 开放地址法之查找1.3 开放地址法之插入1.4 开放地址法之删除 2.哈希表代码实现之链地址法(拉链法)2.1 链地址法之创建哈希表2.2 链地址法之查找2.3 链地址法之插入2.4 链地址法之删除 1.哈希表代码实现之开放…

Mac电脑剪切板在哪里找 苹果电脑剪切板打开教程【详解】

Windows 和 Mac 电脑在使用方式上存在一些差异&#xff0c;许多习惯了 Windows 系统的用户初次接触 Mac 时可能会对某些操作感到困惑。比如&#xff0c;很多人会问&#xff1a;Mac 上的剪贴板在哪里&#xff1f;如果你也有这样的疑问&#xff0c;不妨看看下面这篇关于如何在 Ma…

MySQL查询执行(四):查一行也很慢

假设存在表t&#xff0c;这个表有两个字段id和c&#xff0c;并且我在里面插入了10万行记录。 -- 创建表t CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB;-- 通过存储过程向t写入10w行数据 delimiter ;; create procedure idat…

Android Studio新建工程(Java语言环境)

一、新建工程流程(java语言环境) 1、File->New->New Project 2、选择“Empty Views Activity” -> Next 3、创建项目名称/项目路径/语言环境 1&#xff09;项目名称&#xff1a;使用默认Name 或 修改Name 2) Package name&#xff1a;每个项目的这个名称唯一&…

饿了么基于Flink+Paimon+StarRocks的实时湖仓探索

摘要&#xff1a;本文整理自饿了么大数据架构师、Apache Flink Contributor 王沛斌老师在8月3日 Streaming Lakehouse Meetup Online&#xff08;Paimon x StarRocks&#xff0c;共话实时湖仓架构&#xff09;上的分享。主要分为以下三个内容&#xff1a; 饿了么实时数仓演进之…

self-play RL学习笔记

让AI用随机的路径尝试新的任务&#xff0c;如果效果超预期&#xff0c;那就更新神经网络的权重&#xff0c;使得AI记住多使用这个成功的事件&#xff0c;再开始下一次的尝试。——llya Sutskever 这两天炸裂朋友圈的OpenAI草莓大模型o1和此前代码能力大幅升级的Claude 3.5&…