关于Unity3D5.X 动态批处理(Dynamic Batching)实测,区别于4.0版本(转)

本文通过实验探讨了Unity中动态批处理的特性及其版本间的差异。重点介绍了在不同物体缩放情况下批处理的表现,并对比了4.0版本与5.0版本之间的改进。

尊重原创:https://blog.youkuaiyun.com/a2587539515/article/details/51178308 

转自大佬见笑

网上看了几篇文章,觉得不如自己试试,果然发现了一些问题,又查了查官网,才知道版本更新的时候批处理也更新了。

 

新版本官网上的介绍中去掉了缩放的限制,增加了一条对于镜像物体无法进行批处理,比如Scale为(1,1,1)的物体与Scale为(-1,1,1)的物体无法进行批处理。而限制(1,1,1)与(1,2,3)可以进行批处理。

 

以下,实验过程,眼见为实嘛。

先看第一种情况。

1、创建几个物体大小相同时。

可以看出,3个物体,Save By Batching是2,说明有两个物体进行了一次批处理,SetPass Call是1,说明只有一个DrawCall,这是对的。在这个例子中,我是直接在场景中创建的物体。

2、创建几个物体大小不同时

多加了几个物体,Save By Batching是5,SetPass Call是1,就是说我们仍然做了批处理,DrawCall还是1。

网上有4.0版本的Dynamic Batching介绍,效果不一样这是,这是5.0版本对动态批处理进行的升级。

3、动态创建物体

等大的物体创建就不说了,仍然DrawCall是1。

看第一句,这是个等比例放大。

结果没有变。

第二句再来个非等比例放大。

结果没有变,最后来个最有意思的,第三句。

obj.transform.localScale = new Vector3((Random.value - 0.5f) * 2 * range, Random.value * range, Random.value * range);

这里仍然是非等比例放大,然而我将x的值改为-1~1之间。我们来看下效果。

 

因为这里我用的是随机,所以值会出现很多种,但是可以看出Save By Call发生了变化。同时DrawCall也发生了变化。

<think>嗯,我需要解释如何实现模型的动态批处理Dynamic Batching)。首先,我得回忆一下动态批处理的基本概念。动态批处理应该是在处理不同长度的输入时,能够动态地将样本组合成批次,以提高计算效率,尤其是在处理变长数据时,比如自然语言处理中的不同长度的句子。 那第一步可能需要确定输入数据的长度差异。比如在NLP中,每个句子的token数量可能不同。如果直接按固定批次处理,可能会有很多填充(padding),导致计算资源浪费。动态批处理应该是要减少这种填充,对吧? 然后,可能需要将输入数据按长度排序或者分组。比如,将长度相近的样本放在同一个批次里,这样填充的量就会减少。比如,按序列长度排序后分批次,这样每个批次内的样本长度差异小,填充少。这可能涉及到数据预处理阶段的排序,或者在数据加载时动态调整。 另外,需要考虑如何动态调整批次的大小。比如,在运行时根据当前样本的长度动态决定每个批次可以包含多少样本,使得总token数不超过某个阈值。例如,假设显存限制每次处理的总token数不超过4096,那么每个批次的总token数不能超过这个值,因此根据样本长度调整批次大小。 然后,可能需要实现一个调度器或者队列,将输入样本按长度存储,并在积累到足够数量或达到一定条件时,组合成一个批次。比如,维护多个队列,每个队列对应不同长度的样本,当某个队列中的样本数量足够组成一个批次时,就取出处理。 还有,在实现时需要考虑并行处理和异步机制。比如,在GPU计算的同时,CPU在准备下一个批次的数据,这样可以减少等待时间。动态批处理可能需要与数据加载、预处理等步骤协同工作,确保数据的连续供应。 另外,可能涉及到动态填充的策略。比如,每个批次内的样本按最大长度填充,但不同批次的最大长度可能不同。因此,在模型的前向传播中,需要处理不同批次的填充情况,可能需要在计算时忽略填充部分的影响,比如使用mask矩阵。 还需要考虑框架支持。比如,在PyTorch中,可以使用DataLoader的collate_fn函数来自定义批次的形成方式,根据当前样本的长度动态调整填充和批次组合。或者使用更高级的库,如Hugging Face的Transformers库中的DataCollator来处理动态填充。 然后,可能要考虑内存管理。动态批处理可能会导致显存使用波动,需要监控显存的使用情况,避免超出限制。可能需要动态调整批次大小,或者在显存不足时减少批次大小,或者使用梯度累积等方法。 可能还需要参考现有的实现方法。比如,在机器翻译或语音识别中,动态批处理是如何实现的。比如,Fairseq框架中的动态批处理策略,根据样本长度和批次的最大token数来动态组合批次。 另外,时间效率也是一个考虑因素。动态排序和分组可能会增加预处理的时间,因此需要在数据加载和计算效率之间找到平衡。有时候,可能采用缓存已排序的数据集,或者部分排序的策略。 总结下来,实现动态批处理的关键步骤可能包括:数据按长度排序或分组,动态调整批次大小,自定义数据加载器的批次组合逻辑,处理填充和掩码,以及优化内存和时间效率。需要结合具体的框架和任务需求来设计具体的实现方案。</think>实现模型的动态批处理Dynamic Batching)需通过以下步骤优化计算效率,尤其适用于变长输入(如文本、语音): --- ### **一、核心原理** 动态批处理的核心是**根据输入样本的实时特征(如序列长度)动态调整批次组合**,减少填充(padding)并提高硬件利用率。与传统固定批次不同,动态批处理允许: 1. 批次内样本长度相近 → 减少填充量 2. 不同批次的填充长度可不同 → 避免资源浪费 --- ### **二、实现步骤** #### **1. 输入数据预处理** - **按长度排序**:将数据集按序列长度降序/升序排列,使相邻样本长度接近。 ```python sorted_data = sorted(dataset, key=lambda x: len(x), reverse=True) ``` - **分桶(Bucketing)**:将长度相近的样本分组到同一桶(如0-5050-100长度区间),每个桶内独立采样。 #### **2. 动态批次生成** - **基于Token数量限制**:设定单批次最大Token数(如4096),动态合并样本直至达到上限。 ```python batch, current_tokens = [], 0 for sample in sorted_data: sample_tokens = len(sample) if current_tokens + sample_tokens > MAX_TOKENS: yield batch # 提交当前批次 batch, current_tokens = [], 0 batch.append(sample) current_tokens += sample_tokens ``` - **基于显存预估**:根据模型参数和输入大小动态调整批次量。 #### **3. 填充与掩码(Padding & Masking)** - **动态填充**:每个批次按本批次最大长度填充,而非全局最大长度。 ```python # 示例:PyTorch中的collate_fn def collate_fn(batch): max_len = max(len(x) for x in batch) padded_batch = [x + [PAD]*(max_len - len(x)) for x in batch] mask = [[1]*len(x) + [0]*(max_len - len(x)) for x in batch] return torch.tensor(padded_batch), torch.tensor(mask) ``` - **注意力掩码**:在模型计算时忽略填充部分(如Transformer中的`attention_mask`)。 #### **4. 框架级优化** - **PyTorch**:通过自定义`DataLoader`的`collate_fn`实现动态批次逻辑。 - **TensorFlow**:使用`tf.data.Dataset`的`window`和`padded_batch`方法。 - **专用库支持**:Hugging Face的`DataCollatorForSeq2Seq`支持动态填充。 #### **5. 异步计算优化** - **流水线并行**:GPU计算时,CPU异步准备下一批次数据。 - **内存复用**:避免重复申请释放内存,使用缓存机制。 --- ### **三、性能权衡** | 策略 | 优点 | 缺点 | |------|------|------| | **固定长度填充** | 实现简单 | 显存浪费严重 | | **动态批处理** | 显存利用率高 | 增加预处理复杂度 | --- ### **四、典型应用场景** 1. **机器翻译**:不同长度的源语言/目标语言句子 2. **语音识别**:变长音频帧序列 3. **文本生成**:生成长度不一的文本 --- ### **五、进阶优化** - **延迟批处理(Delayed Batching)**:等待若干样本到达后再动态组批(适用于流式输入)。 - **自适应桶大小**:根据数据分布动态调整分桶区间。 通过上述方法,动态批处理可显著提升模型训练/推理效率,尤其在高变长数据场景下效果显著。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值