Python中如何无需for循环一次性计算多个已训练神经网络的输出
解决方案
方案1:权重合并单网络推理(最优,适用于100个网络结构完全一致的场景)
该方案完全消除循环,仅需一次前向传播就能得到所有结果,速度最快:
- 将所有网络的对应层参数沿输出维度拼接,整合成一个输出维度为原来100倍的单个神经网络
- 输入单张测试样本,一次推理直接得到100个结果的张量,直接批量计算差值范数即可,没有任何循环开销
方案2:多进程并行推理(改动最小,适用于网络结构不同的场景)
直接用Python标准库concurrent.futures实现并行计算,不需要修改原有推理逻辑,示例代码如下:
import numpy as np from concurrent.futures import ProcessPoolExecutor # 单个网络的计算逻辑,和你原有代码逻辑完全一致 def calc_single_net_norm(model, test_sample): rec = model.predict(test_sample) diff = rec - test_sample return np.linalg.norm(diff) # 并行执行所有网络的计算,max_workers按你的CPU核心数设置即可 if __name__ == "__main__": with ProcessPoolExecutor(max_workers=8) as executor: task_list = [executor.submit(calc_single_net_norm, net, test_samples) for net in Nets] NormDiff = [task.result() for task in task_list]
注意事项:
- 必须使用进程池而非线程池,Python全局解释器锁(GIL)会导致线程池对CPU密集型推理任务没有加速效果
- 如果使用PyTorch框架,需要在
calc_single_net_norm函数开头添加torch.set_num_threads(1),避免进程内部多线程抢占资源导致减速
方案3:GPU批量推理(适用于有GPU的实时场景)
如果有可用GPU,你可以把测试样本复制100份拼接为batch维度,将所有网络的推理任务提交到同一个CUDA流中执行,利用GPU的并行计算能力批量完成推理,速度远高于CPU并行。
另外你示例代码中NormDiff.append = np.linalg.norm(Diff)是语法错误,正确写法为NormDiff.append(np.linalg.norm(Diff))。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

