使用Ray创建高效的深度学习数据管道


深度学习模型训练所需的gpu功能强大,但价格昂贵。为了充分利用gpu,开发人员需要一个高效的数据传输通道,以便在gpu准备好计算下一个训练步骤时,能够迅速将数据传输到gpu。使用ray能够显著提高数据传输通道的效率

1、训练数据管道的结构

首先,我们来看一下模型训练的伪代码

for step in range(num_steps):sample, target = next(dataset) # 步骤1train_step(sample, target) # 步骤2

在步骤1中,获取下一个小批量的样本和标签。在步骤2中,它们被传递给train_step函数,该函数会将它们复制到GPU上,执行前向传递和反向传递以计算损失和梯度,并更新优化器的权重。

请详细了解步骤1。当数据集太大无法放入内存时,步骤1将从磁盘或网络中获取下一个小批量数据。此外,步骤1还包括一定量的预处理。输入数据必须被转换为数字张量或张量集合,然后再馈送给模型。在某些情况下,还会在传递给模型之前对张量进行其他转换,如归一化、绕轴旋转、随机打乱等

如果工作流程是严格按顺序执行的,即先执行步骤1,然后再执行步骤2,那么模型将始终需要等待下一批数据的输入、输出和预处理操作。GPU将无法得到有效利用,它将在加载下一个小批量数据时处于空闲状态。

为了解决这个问题,可以将数据管道视为生产者——消费者的问题。数据管道生成小批量数据并写入有界缓冲区。模型/GPU从缓冲区中消费小批量数据,执行前向/反向计算并更新模型权重。如果数据管道能够以模型/GPU消费的速度快速生成小批量数据,那么训练过程将会非常高效。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

图片

2、Tensorflow tf.data API

Tensorflow tf.data API提供了一组丰富的功能,可用于高效创建数据管道,使用后台线程获取小批量数据,使模型无需等待。仅仅预先获取数据还不够,如果生成小批量数据的速度比GPU消费数据的速度慢,那么就需要使用并行化来加快数据的读取和转换。为此,Tensorflow提供了交错功能以利用多个线程并行读取数据,以及并行映射功能使用多个线程对小批量数据进行转换。

由于这些API是基于多线程的,所以可能会受到Python全局解释器锁(GIL)的限制。Python的GIL限制了一次只能运行单个线程的字节码。如果在管道中使用纯TensorFlow代码,通常不会受到这种限制,因为TensorFlow核心执行引擎在GIL的范围之外工作。但是,如果使用的第三方库没有解除GIL限制或者使用Python进行大量计算,那么依赖多线程来并行化管道就不可行

3、使用多进程并行化数据管道

考虑以下生成器函数,该函数模拟加载和执行一些计算以生成小批量数据样本和标签。

def data_generator():for _ in range(10):# 模拟获取# 从磁盘/网络time.sleep(0.5)# 模拟计算for _ in range(10000):passyield (np.random.random((4, 1000000, 3)).astype(np.float32), np.random.random((4, 1)).astype(np.float32))

接下来,在虚拟的训练管道中使用该生成器,并测量生成小批量数据所花费的平均时间。

generator_dataset = tf.data.Dataset.from_generator(data_generator,output_types=(tf.float64, tf.float64),output_shapes=((4, 1000000, 3), (4, 1))).prefetch(tf.data.experimental.AUTOTUNE)st = time.perf_counter()times = []for _ in generator_dataset:en = time.perf_counter()times.append(en - st)# 模拟训练步骤time.sleep(0.1)st = time.perf_counter()print(np.mean(times))

据观察,平均耗时约为0.57秒(在配备Intel Core i7处理器的Mac笔记本电脑上测量)。如果这是一个真实的训练循环,GPU的利用率将相当低,它只需花费0.1秒进行计算,然后闲置0.57秒等待下一个批次数据。

为了加快数据加载速度,可以使用多进程生成器。

from multiprocessing import Queue, cpu_count, Processdef mp_data_generator():def producer(q):for _ in range(10):# 模拟获取# 从磁盘/网络time.sleep(0.5)# 模拟计算for _ in range(10000000):passq.put((np.random.random((4, 1000000, 3)).astype(np.float32),np.random.random((4, 1)).astype(np.float32)))q.put("DONE")queue = Queue(cpu_count()*2)num_parallel_processes = cpu_count()producers = []for _ in range(num_parallel_processes):p = Process(target=producer, args=(queue,))p.start()producers.append(p)done_counts = 0while done_counts < num_parallel_processes:msg = queue.get()if msg == "DONE":done_counts += 1else:yield msgqueue.join()

现在,如果测量等待下一个小批次数据所花费的时间,得到的平均时间为0.08秒。速度提高了近7倍,但理想情况下,希望这个时间接近0。

如果进行分析,可以发现相当多的时间都花在了准备数据的反序列化上。在多进程生成器中,生产者进程会返回大型NumPy数组,这些数组需要进行准备,然后在主进程中进行反序列化。那么在进程间传递大型数组时,如何提高效率呢?

4、使用Ray并行化数据管道

这就是Ray发挥作用的地方。Ray是一个用于在Python中运行分布式计算的框架。它带有一个共享内存对象存储区,可在不同进程间高效地传输对象。特别的是,在不进行任何序列化和反序列化的情况下,对象存储区中的Numpy数组可在同一节点上的worker之间共享。Ray还可以轻松实现数据加载在多台机器上的扩展,并使用Apache Arrow高效地序列化和反序列化大型数组。

Ray带有一个实用函数from_iterators,可以创建并行迭代器,开发者可以用它包装data_generator生成器函数。

import raydef ray_generator():num_parallel_processes = cpu_count()return ray.util.iter.from_iterators([data_generator]*num_parallel_processes).gather_async()

使用ray_generator,测量等待下一个小批量数据所花费的时间为0.02秒,比使用多进程处理的速度提高了4倍。


# tensorflow  # 区中  # 时间为  # 然后再  # 情况下  # 可在  # 多个  # 加载  # 序列化  # 小批量  # 深度学习  # apache  # 对象  # 多线程  # 线程  # 循环  # numpy  # 分布式  # Python 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化91478 】 【 技术知识72672 】 【 云计算0 】 【 GEO优化84317 】 【 优选文章0 】 【 营销推广36048 】 【 网络运营41350 】 【 案例网站102563 】 【 AI智能45237


相关推荐: 5分钟教你用AI生成婚礼流程策划案,备婚新人必备  如何配置 DeepSeek 以支持企业级私有化部署  Docker MCP Toolkit:简化AI代理与外部工具的连接  豆包AI帮你写代码注释 豆包AI编程辅助教程  Excel Copilot:AI驱动的强大新功能与实用案例解析  教你用AI把照片变成动漫风格,3个简单步骤刷爆朋友圈  Tenorshare AI Bypass:终极AI内容人性化工具深度评测  怎么用AI帮你写一份客户感谢信?维系客户关系的利器  告别噪音:使用Adobe Podcast提升录音质量  豆包AI怎么用提示词生成短视频脚本_豆包AI脚本提示词编写【教程】  Depseek怎么生成员工成长总结_Depseek成长维度提取与案例整合【方法】  ChatGPT助力Instagram Reels脚本创作:提升内容质量  AI时代软件工程师如何破局?未来必备技能全解析  Jetson SegNet: 语义分割深度探索与实践  提升效率:使用AI代理自动生成视频标题的实用指南  N8N自动化营销:无需编程实现AI智能获客  通义千问怎么用_通义千问使用方法详细指南【教程】  豆包AI的发现页面有什么功能_探索热门智能体与话题  如何用豆包ai做SWOT分析_豆包ai快速生成个人或企业优劣势分析【指南】  利用 ChatGPT 设计高效的个人健身与饮食计划  BEILA:用AI驱动的低代码开发平台详解  Claude怎样用提示词控制输出长度_Claude输出长度设置【教程】  微信AI数字人能否识别语音消息_微信AI数字人语音识别与回复设置【教程】  美图AI海报设计怎样匹配品牌VI_美图AI海报设计VI匹配与色彩校准【教程】  Filmora AI 语音增强和降噪终极指南  CodeRabbit CLI: AI 代码审查工具,提升编码效率与代码质量  千问如何生成年终总结PPT_千问PPT模板选择与内容自动填充【攻略】  消除噪音,提升音质:Audo.ai终极指南  使用Autogen框架进行业务分析和执行报告生成  MAKA AI排版怎样设置动画效果_MAKA AI排版动画添加与参数调整【技巧】  探索Roblox:虚拟角色定制与互动乐园  Gemini 与 Google Drive 结合的文件智能检索  通义千问网页版怎么切换账号_通义千问账号切换步骤【指南】  Jasper AI的Recipes是什么 Jasper AI配方功能使用【详解】  轻松创建引人入胜短视频:Riverside.fm教程  3步教你用AI总结会议录音,再也不怕错过重点  ChatGPT 辅助自媒体博主进行选题与大纲策划  AI一键生成原创SEO文章  Dr.Job AI:职场简历优化终极指南,提升求职成功率  AI代码助手的崛起:软件工程的未来展望与实用指南  都灵裹尸布之谜:AI揭示耶稣基督的真实面貌?  Google NotebookLM:AI赋能的智能笔记与思维导图工具  如何通过 DeepSeek 优化 Kubernetes 配置文件  Amazon Rekognition: 图像与视频分析的强大AI工具  Veribix Demo Analytics: 优化呼叫录音分析,提升客服效率  蚂蚁阿福官方网站入口_网页版在线解读体检报告  打造AI Jarvis:停止功能、联网、中文与人脸集成  教你用AI将长视频内容切片,并自动生成短视频文案  历史影像解密:唇语专家如何还原一战士兵对话?  京东旅行AI能否抢返程票_京东AI返程票预约与自动抢购【技巧】 

 2023-11-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

南京市珐之弘网络技术有限公司


南京市珐之弘网络技术有限公司

南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 87067657

 13565296790

 87067657@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.