在modelarts上使用notebook上使用evs空间默认大小是5G,能满足大部分文本和图片训练模型的需求。如果训练数据稍微超过这个限额,可以适当的扩增下空间。但如果训练对象是视频,或是实际生成过程中的海量数据,这个空间就显得小了,这时候扩增evs空间就显得很不经济了。

最近老山便碰到这样的案例,客户的训练数据大约在1T的量级,在obs上存储的数据结构大概如下图所示。

your-obs-name
└── ...└── video├── folder1│   ├── text.txt│   └── video.mp4├── folder2│   ├── text.txt│   └── video.mp4├── folder3│   ├── text.txt│   └── video.mp4├── folder4│   ├── text.txt│   └── video.mp4├── folder5│   ├── text.txt│   └── video.mp4├── ...

虽然使用华为云自带的moxing模块可以直接读取obs的数据,但由于实质是通过http实时读取数据,这个速度比从evs的ssd硬盘上读取数据要慢得多。而解决方案也比较直接,在evs上开辟一个固定大小的空间作为缓存区,一方面不断把obs数据读入缓存区,如果缓存区满了,就等待其腾出空间,另一方面训练任务消费evs数据,当消费完后便删除数据。

程序上也自然选用生产者-消费者模型。程序定义了管道类Pipeline,有生产者线程producer用于将obs数据保存到evs;同时输出evs数据用于外部模型的消费。由于每个视频文件都单独放在一个文件夹下,所以程序的输出对象也是这个文件夹在evs上保存的地址,如folder1,folder2等。至于读取文件夹内部文件信息等消费工作,由用户自行定义。

不多说,直接上代码。

import moxing as mox
mox.file.shift('os', 'mox')
import os, shutil
from queue import Queue
from time import sleep
import threading
import logging
logging.basicConfig(level=logging.INFO,format="%(asctime)s %(name)s %(levelname)s %(message)s",)class ObsClient:def __init__(self, root):'''获取obs路径上需要读取的文件夹的相关信息'''self.root = rootself.directory = self.list_directory()self.maxSize = self.getMaxSize()def getMaxSize(self):'''最大的文件夹的大小'''return max([size for *_, size in self.directory])def list_directory(self):'''输出用于训练的文件夹的路径,输出directory:[(文件夹相对路径,文件夹绝对路径,文件夹大小), ...]'''directory = []folders = mox.file.list_directory(self.root)for folder in folders:folderPath = os.path.join(self.root, folder)if mox.file.is_directory(folderPath):size = self.get_size(folderPath)directory.append((folder, folderPath, size))return directorydef get_size(self, path):'''获取文件(夹)的大小'''if mox.file.is_directory(path):return self.get_size_folder(path)return self.get_size_file(path)def get_size_file(self, path):'''获取文件的大小'''return mox.file.get_size(path)def get_size_folder(self, path):'''获取文件夹的大小'''size = 0for filename in mox.file.list_directory(path, recursive=True):filepath = os.path.join(path, filename)if not mox.file.is_directory(filepath):size+= self.get_size_file(filepath)return sizeclass EvsClient:def __init__(self, root, memory, queue, directory, interval = 0.1):self.root = root # evs缓存区根目录self.directory = directory # obs文件夹信息self.size = 0 # evs缓存区已使用的空间self.memory = memory # evs上用于缓存的空间大小self.queue = queue # 队列,存储了evs缓存区文件夹的信息self.interval = interval # 如果缓存区满后,查询缓存大小的间隔时间def remove(self, folder, size):'''删除evs文件夹,在文件夹被消费后调用'''logging.info(f"consumer: start removing folder {folder} with size {size}|{self.size}")shutil.rmtree(folder, True)self.size -= sizelogging.info(f"consumer: end removing folder {folder} with size -{size}|{self.size}")def work(self):'''生成者主程序,用于从obs中copy文件夹到evs'''for relObsFolder, absObsFolder, size in self.directory:while True:# 缓存区没满,就copy文件if not self.waitOrDo(size):self.copy(relObsFolder, absObsFolder, size)break# 如果缓存区满了,就等待sleep(self.interval)# 当所有文件都拷贝后,置入结束符(None, None)self.queue.put((None, None))def waitOrDo(self, size):'''返回True时等待,返回False时工作'''return self.size + size > self.memorydef copy(self, relObsFolder, absObsFolder, size):'''从obs中copy文件夹到evs'''evsFolder = os.path.join(self.root, relObsFolder)logging.info(f"producer: start copying folder {relObsFolder} with size {size}|{self.size}")mox.file.copy_parallel(absObsFolder, evsFolder)self.queue.put((evsFolder, size))self.size += sizelogging.info(f"producer: end copying folder {relObsFolder} with size +{size}|{self.size}")class Pipeline:def __init__(self, evsRoot, obsRoot, memory = '1g', timeout = 300, interval = 0.1):self.memory = self.rescript(memory) # evs上用于缓存的空间大小self.timeout = timeout # 消费者获取evs缓存区文件夹的最长等待时间self.queue = Queue() # 队列,存储了evs缓存区文件夹的信息self.obsClient = ObsClient(obsRoot) # 存储obs上的文件夹信息# evs上的操作self.evsClient = EvsClient(evsRoot, self.memory, self.queue, self.obsClient.directory, interval)self.checkMemory() # 验证evs上用于缓存的空间大小是否足够大       def checkMemory(self):'''evs上用于缓存的空间大小不能小于obs上最大文件夹大小'''if self.memory<self.obsClient.maxSize:raise Exception("memory should bigger than maxFolderSize!")def rescript(self, memory):'''将文本或数值类型的memory转写成数值'''try:if isinstance(memory, str):if memory[-1].lower()=='g':return int(float(memory[:-1])*1024*1024*1024)elif memory[-1].lower()=='m':return int(float(memory[:-1])*1024*1024)elif memory[-1].lower()=='k':return int(float(memory[:-1])*1024)else:return int(float(memory))else:return int(float(memory))except:raise Exception("Error when rescripting memory!")def __iter__(self):'''生成器,yield输出evs文件夹路径和大小'''# 生产者线程producer = threading.Thread(target = self.evsClient.work)producer.start()# 主程序提供生成器用于消费,输出evs文件夹路径和大小while True:logging.info(f"consumer: start to get the queue")path, size = self.queue.get(timeout=self.timeout)logging.info(f"consumer: get the queue {path}, {size} ")if path is None and size is None:breakyield path, sizeself.evsClient.remove(path, size)# 主程序等待producer.join()if __name__ == '__main__':# 使用示例for path, size in Pipeline('./video', 's3://your-obs-name/.../video'):do_job(path, size)

如果你觉得老山的文章不错,不妨点击下关注。

作者::山找海味

如何使用modelarts训练海量数据相关推荐

  1. 基于ModelArts和CANN的端到端行人检测和跟踪Demo(Python版本)【训练篇】

    前言 基于华为云ModelArts和昇腾CANN实现从训练到部署的端到端行人检测和跟踪Demo,这里的CANN使用的是Python接口(Python版本). 在ModelArts完成开发和模型训练 华 ...

  2. Modelarts与无感识别技术生态总结(浅出版)

    [摘要] Modelarts技术及相关产业已成为未来AI与大数据重点发展行业模式之一,为了促进人工智能领域科学技术快速发展,modelarts现状及生态前景成为研究热点.笔者首先总结modelarts ...

  3. 华为云端服务器使用ModelArts跑MindSpore框架Yolov5

    华为云端服务器使用Modlearts跑MindSpore框架Yolov5 环境准备 云平台登录,用于购买服务器https://uconsole.xckpjs.com/ 我这里用的是昇腾Ascend 9 ...

  4. 绿盟赛—ModelArts实现智能花卉识别

    目录 概述 人工智能的概念 人工智能的应用 为什么需要花卉识别 传统花卉识别智能化的诉求 智能花卉识别的概念 ModelArts实现智能花卉识别的优势 智能化的趋势 人工智能的市场 解决方案 传统AI ...

  5. 绿盟大赛-ModelArts实现智能花卉识别

    目录 一.ModelArts实现智能花卉识别的概述 1.为什么需要花卉识别? 2.传统花卉识别智能化的诉求 3.智能花卉识别的概念 4.ModelArts实现智能花卉识别的优势 二.ModelArts ...

  6. 【玩转华为云】手把手教你利用ModelArts实现垃圾自动分类

    本篇推文共计2000个字,阅读时间约3分钟. 华为云-华为公司倾力打造的云战略品牌,2011年成立,致力于为全球客户提供领先的公有云服务,包含弹性云服务器.云数据库.云安全等云计算服务,软件开发服务, ...

  7. 【玩转华为云】手把手教你利用ModelArts实现数据集的图像标注

    本篇推文共计2000个字,阅读时间约3分钟. 华为云-华为公司倾力打造的云战略品牌,2011年成立,致力于为全球客户提供领先的公有云服务,包含弹性云服务器.云数据库.云安全等云计算服务,软件开发服务, ...

  8. 数据不够,怎么训练数据集?别怕,有TA

    前言  前一段时间接触了几位用户提的问题,发现很多人在使用训练的时候,给的数据集寥寥无几,有一些甚至一类只有5张图片.modelarts平台虽然给出了每类5张图片就能训练的限制,但是这种限制对一个工业 ...

  9. 【华为云技术分享】【昇腾】ModelArts与Atlas 200 DK云端协同开发——行人检测Demo(提供完整Demo)

    基于ModelArts与Atlas 200 DK 端云协同开发,基于开源数据集,使用ModelArts训练行人检测模型,在本地MindStudio完成模型转换,最终部署到Atlas 200 DK,从数 ...

最新文章

  1. 【C++】C++11 STL算法(七):排列操作(Permutation operations)、数值操作(Numeric operations)
  2. leetcode 378. Kth Smallest Element in a Sorted Matrix
  3. 神经网络上采样之:反卷积
  4. 快速读书的方法(对于理工科的可能适用)
  5. recycleviewitem 列表加载动画_2019年Q4动画数据报告 | 伍六七之最强发型师评论数破十万...
  6. ES6新特性_ES6的数值扩展---JavaScript_ECMAScript_ES6-ES11新特性工作笔记039
  7. 纯css打造菜单响应,纯 CSS 打造标准的导航菜单-1
  8. Spring Boot 2.3.3 正式发布!2.4.0 正式版即将发布!
  9. 4.Prometheus 监控技术与实践 --- 服务发现
  10. objdump选项解释
  11. Spring中实现AOP的三种方式
  12. mysql 授予用户权限_mysql授权用户权限
  13. iPhone手机上最不起眼的5款APP,用过的人都赞不绝口!
  14. c语言单片机避障小车应用,51单片机控制寻迹避障小车各种源程序(功能很多)
  15. vue引入百度地图使用JavaScript API GL渲染点位的图片
  16. SPSS学习资料汇总
  17. ViewPager报UnsupportedOperationException: Required method instantiateItem was not overridden错误
  18. 快速“美女找茬”(辅助工具)
  19. MATLAB(1)---将mat文件转换为csv文件
  20. python中eval什么意思_python中eval函数作用

热门文章

  1. linux基础配置脚本,Linux中selinux基础配置教程详解
  2. java登录功能多线程_java之多线程
  3. vc6 设置静态文本框透明_微信还能这么玩?半透明的微信背景主题用起来!
  4. 报错:此版本的SQL Server Data Tools与此计算机中安装的数据库运行时组件不兼容...
  5. HTML 颜色值及脚本
  6. poj 3278 Catch That Cow (bfs)
  7. 偶然搜索看到的杂谈——什麼東西是.NET程序員可以掌握並且可倚仗十年而不管微軟存在與否的技術呢?...
  8. 领域驱动设计学习心得
  9. 浅谈BFS模板思路(一)
  10. 广度优先搜索——USACO08FEB(洛谷 P2895)