深度学习模型训练所需的gpu功能强大,但价格昂贵。为了充分利用gpu,开发人员需要一个高效的数据传输通道,以便在gpu准备好计算下一个训练步骤时,能够迅速将数据传输到gpu。使用ray能够显著提高数据传输通道的效率
首先,我们来看一下模型训练的伪代码
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 模型☜☜☜
图片Tensorflow tf.data API提供了一组丰富的功能,可用于高效创建数据管道,使用后台线程获取小批量数据,使模型无需等待。仅仅预先获取数据还不够,如果生成小批量数据的速度比GPU消费数据的速度慢,那么就需要使用并行化来加快数据的读取和转换。为此,Tensorflow提供了交错功能以利用多个线程并行读取数据,以及并行映射功能使用多个线程对小批量数据进行转换。
由于这些API是基于多线程的,所以可能会受到Python全局解释器锁(GIL)的限制。Python的GIL限制了一次只能运行单个线程的字节码。如果在管道中使用纯TensorFlow代码,通常不会受到这种限制,因为TensorFlow核心执行引擎在GIL的范围之外工作。但是,如果使用的第三方库没有解除GIL限制或者使用Python进行大量计算,那么依赖多线程来并行化管道就不可行
考虑以下生成器函数,该函数模拟加载和执行一些计算以生成小批量数据样本和标签。
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数组,这些数组需要进行准备,然后在主进程中进行反序列化。那么在进程间传递大型数组时,如何提高效率呢?
这就是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
南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。