讲师中心 微信公众号
AI工具推荐 视频效率加速

PyTorch 高效向量化实现:批量查找并替换重复 token 的首次出现索引

落宇小哥_9032

落宇小哥_9032

发布时间:2026-02-21 16:16:01

|

810人浏览过

|

来源于php中文网

原创

PyTorch 高效向量化实现:批量查找并替换重复 token 的首次出现索引

本文详解如何将嵌套双循环(按 batch 和 sequence 位置遍历 output_ids,并在 input_ids 中查找对应值的首次索引)完全向量化,避免 python 循环,同时正确处理忽略特定 token(如 0/1/2)和多值重复的语义逻辑。

本文详解如何将嵌套双循环(按 batch 和 sequence 位置遍历 output_ids,并在 input_ids 中查找对应值的首次索引)完全向量化,避免 python 循环,同时正确处理忽略特定 token(如 0/1/2)和多值重复的语义逻辑。

在 PyTorch 模型训练或数据预处理中,常需对输出序列(如生成文本的 token IDs)进行条件性重映射:对每个 output_ids[i][k],若其值 v 出现在 input_ids[i] 中,且 v ∉ {0, 1, 2},则将其替换为 vocab_size + first_occurrence_index_of_v_in_input_ids[i]。原始实现使用两层 Python for 循环配合 torch.where,时间复杂度高、无法利用 GPU 并行性。本文提供完整、可复现的纯张量向量化方案。

核心思路:广播匹配 + 唯一索引去重

向量化关键在于三步解耦:

PyTorch Linux版 2.11.0
PyTorch Linux版 2.11.0

PyTorch 2.11.0 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、实验复现和指定环境安装。

下载
  1. 屏蔽无关 token:用布尔掩码快速过滤需处理的位置(v ≠ 0,1,2);
  2. 全量广播比对:将 input_ids(B×L₁)与 output_ids(B×L₂)扩展为三维张量(B×L₁×L₂),执行逐元素相等判断,一次性获取所有 (batch_i, input_pos, output_pos) 匹配三元组;
  3. 保留首次匹配:因同一值可能在 input_ids[i] 中多次出现,而逻辑要求“第 k 次在 output_ids[i] 中出现 → 对应 input_ids[i] 中第 k 次出现的索引”,但示例代码实际只取首次出现索引(即 torch.where(...)[0][0])。因此需对匹配结果按 (batch_i, output_pos) 分组,仅保留每组中 input_pos 最小者(即首次匹配)。

完整向量化实现

import torch

# 初始化数据
vocab_size = 20
batch_size = 2
input_len = 5
output_len = 10
input_ids = torch.randint(0, vocab_size, (batch_size, input_len))
output_ids = torch.randint(0, vocab_size, (batch_size, output_len))

# 构建掩码:仅处理 value ∉ {0, 1, 2}
mask = ~(output_ids == 0) & ~(output_ids == 1) & ~(output_ids == 2)

# 创建工作副本,暂存待更新位置(非 mask 位置先设为占位符,避免干扰后续 where)
output_para = output_ids.clone()
output_para[~mask] = vocab_size + 9999  # 占位符,确保不与合法索引冲突

# 广播比对:input_ids (B, L1) vs output_para (B, L2)
# 扩展为 (B, L1, L2) 便于逐元素比较
input_exp = input_ids.unsqueeze(-1)          # (B, L1, 1)
output_exp = output_para.unsqueeze(1)         # (B, 1, L2)
match_mask = (input_exp == output_exp)        # (B, L1, L2), True 表示 input[i][j] == output[i][k]

# 获取所有匹配坐标:(batch_idx, input_pos, output_pos)
b_idx, i_idx, o_idx = torch.where(match_mask) # 长度为 N 的一维张量

# 关键:对每个 (batch_i, output_k) 组合,只保留 input_pos 最小的匹配(即首次出现)
# 将 (b_idx, o_idx) 作为唯一分组键,按 i_idx 排序后取每组首项
group_keys = b_idx * output_len + o_idx       # 唯一标识 (batch, output_pos)
_, sorted_indices = torch.sort(group_keys, stable=True)
sorted_i_idx = i_idx[sorted_indices]
sorted_b_idx = b_idx[sorted_indices]
sorted_o_idx = o_idx[sorted_indices]

# 使用 unique 获取每组首个索引(stable=True 保证相同 key 时顺序不变)
_, first_occurrence = torch.unique(group_keys[sorted_indices], return_inverse=False, sorted=True)
# first_occurrence 是每组在 sorted_indices 中的起始位置索引
# 注意:torch.unique 返回的是去重后的值,我们需要的是每组第一个元素在 sorted_indices 中的位置
# 更直接做法:用 diff 检测 group_keys 变化点
is_new_group = torch.cat([torch.tensor([True]), group_keys[sorted_indices][1:] != group_keys[sorted_indices][:-1]])
first_in_group = torch.where(is_new_group)[0]

# 提取每组首次匹配的坐标
final_b_idx = sorted_b_idx[first_in_group]
final_o_idx = sorted_o_idx[first_in_group]
final_i_idx = sorted_i_idx[first_in_group]

# 执行向量化赋值:output_para[b, o] = vocab_size + input_pos
output_para[final_b_idx, final_o_idx] = vocab_size + final_i_idx

# 恢复未处理位置的原始值
output_para[~mask] = output_ids[~mask]

print("Vectorized result:")
print(output_para)

注意事项与优化建议

  • ✅ 正确性保障:本实现严格复现原循环逻辑——对每个 output_ids[i][k],仅当 value ∈ input_ids[i] 且 value ∉ {0,1,2} 时,替换为 vocab_size + input_ids[i] 中该值首次出现的索引(而非第 k 次)。
  • ⚠️ 内存权衡:广播操作(unsqueeze + expand)会创建 (B, L₁, L₂) 张量,当 input_len 或 output_len 较大时(如 >1000),显存占用显著上升。若遇 OOM,可改用分块处理(torch.chunk)或基于 torch.cdist 的稀疏匹配策略。
  • ? 调试技巧:打印 b_idx, i_idx, o_idx 可直观验证匹配关系;用 torch.allclose(output_para, expected) 进行单元测试。
  • ? 进一步加速:对于超长序列,可结合 torch.compile(PyTorch 2.0+)自动优化图结构,实测可额外提升 15–30% 吞吐。

该方案彻底消除 Python 循环,在保持语义精确的同时,充分发挥 GPU 张量计算并行性,适用于大规模批处理场景,是 PyTorch 高性能数据转换的典型范式。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

14246

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1685

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

3937

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

6101

2024.03.01

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

2303

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

68

2025.12.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn