ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ufold-npu 数据流揭秘:RnaTokenizer 如何把 A/C/G/U 序列变成模型输入?

ufold-npu 数据流揭秘:RnaTokenizer 如何把 A/C/G/U 序列变成模型输入? ufold-npu 数据流揭秘RnaTokenizer 如何把 A/C/G/U 序列变成模型输入【免费下载链接】ufold-npu项目地址: https://ai.gitcode.com/atlasleong/ufold-npu如果你接触过 RNA 二级结构预测一定对A/C/G/U四个碱基字母不陌生。在 ufold-npu 这个把 UFold 模型适配到华为昇腾 NPU 的开源项目中一条看似普通的 RNA 序列比如 74 个核苷酸的 tRNA要经过RnaTokenizer的转换才能变成模型能理解的数字张量。本文就用最简单的方式拆解 RnaTokenizer 的完整数据流看看 A/C/G/U 序列究竟是如何一步步变成模型输入的。先认识 ufold-npu 与 RnaTokenizer ufold-npu 是 UFold RNA 二级结构预测模型在昇腾 NPU910B4上的可独立运行交付仓库模型基于 multimolecule 库的UfoldModel实现。而RnaTokenizer就是这条数据流水线的第一道闸门它负责把字符串形式的 RNA 序列转换成 PyTorch 张量。整个过程用一句话概括就是——把字母序列翻译成数字 ID 序列。上图是 ufold-npu 的真实运行验收结果可以看到INPUT_SEQUENCE输入 RNA 序列最终被转换成了模型输出的LOGITS_SHAPE(1, 74, 74)和CLASS_IDS_SHAPE(1, 74, 74)张量。RnaTokenizer 的词表设计只有 5 个 token 的秘密 与动辄几万词表的 NLP 模型不同RnaTokenizer 的词表极小。打开交付目录下的 vocab.txt你会发现总共只有 5 行A C G U N这 5 个 token 对应着 config.json 中的vocab_size5它们的 ID 分配如下碱基含义token IDA腺嘌呤0同时是 pad_tokenC胞嘧啶1同时是 bos_tokenG鸟嘌呤2同时是 eos_tokenU尿嘧啶3同时是 unk_tokenN任意/未知碱基4同时是 mask_token这个设计非常巧妙RNA 只有 4 种标准碱基加上一个N作为未知/任意碱基的兜底pad 与 unk 都指向它就构成了完整的输入空间。没有任何分词、子词切分一个字母就是一个 token。一条 tRNA 序列的 tokenizer 完整转换流程 在 inference.py 中核心调用只有一行inputs tokenizer(sequence, return_tensorspt)但这背后发生了四件事。我们用项目里的固定 tRNA 序列GGGCUAUUAGCUCA...74 nt来演示第一步字母归一化根据 tokenizer_config.json 中的replace_T_with_Utrue如果输入序列里出现 DNA 风格的TRnaTokenizer 会自动替换成 RNA 风格的U。这就是为什么模型词表里没有 T 这个字母。第二步逐字母查表74 个字母按顺序逐个查词表得到 74 个数字G → 2, G → 2, G → 2, C → 1, U → 3, A → 0, U → 3, ...第三步补全到模型要求长度config.json 中的min_size80和size_multiple16意味着输入长度不足 80 时用 pad token 补足最终长度需是 16 的倍数。74 nt 的 tRNA 会被填充到 80多出的 6 个位置填上NID0。第四步包装成张量return_tensorspt把 ID 列表封装成 PyTorch 张量input_idsshape 为(1, 80)并同时生成attention_mask。从 token 到 17 通道图像模型真正看到的输入 ️tokenizer 的输出只是第一步。UFold 模型并不直接吃一维 ID 序列而是把它表示成一张17 通道的图像16 个通道4 种碱基A/C/G/U两两组合的外积outer product编码任意两个位置是否为同一类配对1 个通道手工构造的经典/摆动配对分数canonical/wobble pairing score。这也是为什么 config.json 里写着input_channels17。tokenizer 产生的 ID 序列经过 one-hot 编码和特征构造后变成 shape 为(1, 17, L, L)的图像张量送入五层分辨率的 U-Net 网络最终输出逐位置碱基配对分数logits (B, L, L)。tokenizer 之后输入张量如何进入 NPU 运行 ⚡ufold-npu 的关键亮点是全程无 CPU 回退。在 inference.py 中tokenizer 产出的张量会立即被搬到 NPU 逻辑设备上inputs {k: v.to(npu:0) for k, v in tokenize(tokenizer, args.sequence).items()}运行日志中的INPUT_DEVICEnpu:0、MODEL_DEVICEnpu:0、CPU_FALLBACKfalse三个标记正是验证了从 tokenizer 输出到模型前向、再到 logits 产出全部在昇腾 NPU 上完成。单次前向仅约 19~20 毫秒performance 实测 median19.51 ms。总结RnaTokenizer 数据流一张图看懂 完整的数据流可以概括为四个阶段RNA 字符串A/C/G/U/N ↓ ① 归一化T→Unmers1 逐字母 ↓ ② 查词表 → 数字 ID 序列vocab_size5 ↓ ③ 补全到 80min_size / size_multiple16 ↓ ④ 包装为 PyTorch 张量 → 搬到 npu:0 UfoldModel 前向17 通道 U-Net ↓ logits (1, 74, 74) class_ids 配对图对于想学习 RNA 深度学习或 NPU 推理的开发者来说ufold-npu 是一个极佳的范例模型本身不复杂约 864 万参数但数据流的每个环节都清晰可查。从 inference.py 的 200 多行代码到 model/vocab.txt 的 5 行词表再到 README.md 的完整测试证据新手可以照着这条链路把字符串 → token ID → 张量 → NPU → 配对图每一步都看懂。想上手体验的话克隆仓库后运行python inference.py即可复现整个流程。下次当你再看到一段以GGGCUAUU...开头的 RNA 序列时不妨想想它正在经历一场从字母到数字、再到 17 通道图像的奇妙旅程而这一切的起点就是那 5 行词的 RnaTokenizer。【免费下载链接】ufold-npu项目地址: https://ai.gitcode.com/atlasleong/ufold-npu创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表