PyTorch重排序模型推理效率问题:Tokenizer耗时异常飙升原因排查
PyTorch Reranker推理效率问题解答
1. 哪个环节更耗时?
从统计数据来看,包含.to(self.device)操作的self.tokenizer环节远比模型推理耗时:
- 原测试场景中,
self.tokenizer(含张量迁移至GPU)总耗时29.99s - 模型推理仅耗时4.39s
2. 为什么self.tokenizer耗时会骤降?
核心原因是PyTorch的CUDA异步执行特性,结合你的计时逻辑产生了统计偏差:
.to(self.device)是异步CUDA操作:调用该方法后,Python代码会立即返回,实际的CPU→GPU数据传输在后台异步进行,不会阻塞当前线程。- 保留模型推理代码时:
self.model(**inputs)需要读取GPU上的输入张量,这会触发同步等待机制——程序必须等.to(device)的异步数据传输完全完成,才能启动模型计算。而你的计时逻辑把从token_start到token_end(即包含了等待异步传输完成的时间)全部计入token_times,这就导致统计出的self.tokenizer耗时被大幅拉高。 - 注释掉模型推理代码时:没有后续操作依赖GPU上的输入张量,
.to(device)的异步传输可能还未完成,程序就已经记录了token_end时间。此时token_times仅统计了self.tokenizer本身的CPU预处理时间(4.16s),GPU数据传输的真实耗时并未被计入(因为没有同步点强制等待传输完成)。
注意:这并非.to(device)的实际耗时减少,只是计时逻辑在无同步触发的情况下,没有统计到异步传输的完整时间。
内容的提问来源于stack exchange,提问作者Frank.Fan
相关产品推荐
相关产品推荐

