ResNet-152 模型性能评估

ResNet-152 模型在渴望模式下的性能评估
为了预热 GPU,在进行 20 次额外迭代以获取模型的平均推理时间之前,先运行 ResNet-152 模型 10 次。
n_warmup = 10
n_test = 20
dtype = torch.bfloat16
inference_time=[]
mode=[]
t_warmup, _ = timed(lambda:model(input_batch), n_warmup, dtype)
t_test, output = timed(lambda:model(input_batch), n_test, dtype)
print(f"平均推理时间resnet152(warmup): dt_test={t_warmup} ms")
print(f"平均推理时间resnet152(test): dt_test={t_test} ms")
print_topk_labels(output, 5)
inference_time.append(t_test)
mode.append("eager")
输出:
resnet152的平均推理时间(warmup): dt_test=164.6312952041626 ms
resnet152的平均推理时间 (test): dt_test=18.761909008026123 ms
Samoyed 0.80078125
Pomeranian 0.0791015625
white wolf 0.037353515625
keeshond 0.0257568359375
Arctic fox 0.022705078125
5.1.3 ResNet-152 模型在 torch.compile(default) 模式下的性能评估
要将 torch.compile 应用于 ResNet-152,可以按照下面的代码进行封装。
1)mode:使用 default 编译模式,这是性能和开销之间的良好平衡。
2)fullgraph:如果为 True,torch.compile()要求整个函数都能捕获到一个单一的图中。如果这不可能,则会引发错误。
#使用torch._dynamo.reset()清理工作区
torch._dynamo.reset()
model_opt1 = torch.compile(model, fullgraph=True)
t_compilation, _ = timed(lambda:model_opt1(input_batch), 1, dtype)
t_warmup, _ = timed(lambda:model_opt1(input_batch), n_warmup, dtype)
t_test, output = timed(lambda:model_opt1(input_batch), n_test, dtype)
print(f"编译时间: dt_compilation={t_compilation} ms")
print(f"平均推理时间compiled resnet152(warmup): dt_test={t_warmup} ms")
print(f"平均推理时间compiled resnet152(test): dt_test={t_test} ms")
print_topk_labels(output, 5)
inference_time.append(t_test)
mode.append("default")
输出:
编译时间: dt_compilation=24626.18637084961 ms
编译的平均推理时间resnet152(warmup): dt_test=15.319490432739258 ms
编译的平均推理时间resnet152(test): dt_test=15.275216102600098 ms
Samoyed 0.80078125
Pomeranian 0.0791015625
white wolf 0.037353515625
keeshond 0.0257568359375
Arctic fox 0.022705078125
ResNet-152 模型在 torch.compile(reduce-overhead)模式下的性能评估
reduce-overhead 模式利用 CUDA图表来减少内核启动的开销,改善整体延迟。
torch._dynamo.reset()
model_opt2 = torch.compile(model, mode="reduce-overhead", fullgraph=True)
t_compilation, _ = timed(lambda:model_opt2(input_batch), 1, dtype)
t_warmup, _ = timed(lambda:model_opt2(input_batch), n_warmup, dtype)
t_test, output = timed(lambda:model_opt2(input_batch), n_test, dtype)
print(f"编译时间: dt_compilation={t_compilation} ms")
print(f"平均推理编译时间resnet152(warmup): dt_test={t_warmup} ms")
print(f"平均推理编译时间resnet152(test): dt_test={t_test} ms")
print_topk_labels(output, 5)
inference_time.append(t_test)
mode.append("reduce-overhead")
输出:
编译时间: dt_compilation=18916.11909866333 ms
编译的平均推理时间resnet152(warmup): dt_test=39.9461030960083 ms
编译的平均推理时间resnet152(test): dt_test=5.042397975921631 ms
Samoyed 0.80078125
Pomeranian 0.0791015625
white wolf 0.037353515625
keeshond 0.0257568359375
Arctic fox 0.022705078125
5.1.4 ResNet-152模型在torch.compile(最大自动调谐)模式下的性能评估
最大自动调谐模式利用基于Triton的矩阵乘法和卷积运算。它默认启用CUDA图。
torch._dynamo.reset()
model_opt3 = torch.compile(model, mode="最大自动调谐", fullgraph=True)
t_compilation, _ = timed(lambda:model_opt3(input_batch), 1, dtype)
t_warmup, _ = timed(lambda:model_opt3(input_batch), n_warmup, dtype)
t_test, output = timed(lambda:model_opt3(input_batch), n_test, dtype)
print(f"编译时间: dt_compilation={t_compilation} ms")
print(f"编译的平均推理时间resnet152(warmup): dt_test={t_warmup} ms")
print(f"编译的平均推理时间resnet152(test): dt_test={t_test} ms")
print_topk_labels(output, 5)
inference_time.append(t_test)
mode.append("最大自动调谐")
输出:
AUTOTUNE convolution(1x64x56x56, 256x64x1x1)
triton_convolution_49 0.0238 ms 100.0%
triton_convolution_48 0.0240 ms 99.3%
convolution 0.0242 ms 98.7%
triton_convolution_46 0.0325 ms 73.4%
triton_convolution_52 0.0326 ms 73.0%
triton_convolution_53 0.0331 ms 72.0%
triton_convolution_47 0.0333 ms 71.6%
triton_convolution_50 0.0334 ms 71.3%
triton_convolution_51 0.0341 ms 70.0%
triton_convolution_42 0.0360 ms 66.2%
SingleProcess AUTOTUNE takes 64.3134 seconds
...
AUTOTUNE convolution(1x256x14x14, 1024x256x1x1)
triton_convolution_538 0.0285 ms 100.0%
triton_convolution_539 0.0290 ms 98.3%
convolution 0.0299 ms 95.2%
triton_convolution_536 0.0398 ms 71.5%
triton_convolution_542 0.0400 ms 71.2%
triton_convolution_543 0.0406 ms 70.1%
triton_convolution_537 0.0411 ms 69.3%
triton_convolution_540 0.0443 ms 64.3%
triton_convolution_541 0.0464 ms 61.4%
triton_convolution_532 0.0494 ms 57.6%
SingleProcess AUTOTUNE takes 15.0623 seconds
...
AUTOTUNE addmm(1x1000, 1x2048, 2048x1000)
bias_addmm 0.0240 ms 100.0%
addmm 0.0240 ms 100.0%
triton_mm_2176 0.0669 ms 35.9%
triton_mm_2177 0.0669 ms 35.9%
triton_mm_2174 0.0789 ms 30.4%
triton_mm_2175 0.0789 ms 30.4%
triton_mm_2180 0.0878 ms 27.3%
SingleProcess AUTOTUNE takes 8.4102 seconds
编译时间: dt_compilation=820945.9936618805 ms
编译的平均推理时间resnet152(warmup): dt_test=41.12842082977295 ms
编译的平均推理时间resnet152(test): dt_test=5.32916784286499 ms
Samoyed 0.796875
Pomeranian 0.083984375
white wolf 0.037353515625
keeshond 0.025634765625
Arctic fox 0.0225830078125
可以看到Triton正在自主优化矩阵乘法和卷积操作。相比于其他模式,这个过程需要极长的时间。可以在这里将编译时间与之前测试的模式进行比较。
虽然使用了Triton调优,但在这种情况下,最大自动调谐模式并没有显著增强性能,和 reduce-overhead模式相比没有明显优势。表明在测试平台上,ResNet-152的瓶颈并不主要在于矩阵乘法或卷积操作。
5.1.5 比较从上述四种模式获得的推理时间
import matplotlib.pyplot as plt
# 绘制条形图
plt.bar(mode, inference_time)
print(inference_time)
print(mode)
# 添加标签和标题
plt.xlabel('mode')
plt.ylabel('推理时间 (ms)')
plt.title('ResNet-152')
# 显示绘图
plt.show()
输出:
[18.761909008026123, 15.275216102600098, 5.042397975921631, 5.32916784286499]
['eager', 'default', 'reduce-overhead', '最大自动调谐']
如图5-2所示,torch.compile显著提升了ResNet-152在AMD MI210与ROCm上的性能,达到了*3.5*倍以上的提升。
  
图5-2 torch.compile提升ResNet-152在AMD MI210与ROCm上的性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902297.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐专著1《AI芯片开发核心技术详解》、2《智能汽车传感器:原理设计应用》、3《TVM编译器原理与实践》、4《LLVM编译器原理与实践》

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

当巴别塔倒下。——从mygo到mujica

。序章 ???? 那时,天下人的口音,言语,都是一样。他们往东边迁移的时候,在示拿地遇见一片平原,就住在那里。他们彼此商量说,来吧,我们要作砖,把砖烧透了。他们就拿砖当石头,又拿石漆当灰泥。他们说,来吧,我们要建造一座城和一座塔,塔顶通天,为要传扬我们的名,…

一文速通Python并行计算:00 并行计算的基本概念

该文介绍了Python并行计算的核心概念、编程模型及其应用,并介绍了了并行程序的性能分析与优化方法,如并行效率、加速比及Amdahl定律。此外,该文介绍了共享内存、消息传递、数据并行和任务并行等并行编程模型,并提供Python环境配置指南。一文速通 Python 并行计算:00 并行计…

Pydantic配置继承抽象基类模式

title: Pydantic配置继承抽象基类模式 date: 2025/3/21 updated: 2025/3/21 author: cmdragon excerpt: Pydantic模型配置系统支持通过嵌套Config类定义字段校验、序列化等行为。配置继承需显式指定父类Config,子类可覆盖或扩展配置项。动态配置管理允许运行时通过工厂函数创…

Day19_java运算符_死锁

每日一题 题目 请解释死锁(Deadlock)的概念及其产生的必要条件,并说明常见的死锁处理策略及其优缺点。问题分析 此问题考察对操作系统资源管理机制的理解,需深入分析死锁的成因、判定条件及解决方法。回答时需结合理论模型与实际策略,体现系统性思维。参考答案 1. 死锁的定…

[AI/AIGC/GPT] 提示词工程1概述篇

概述:提示词工程提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。 研究人员可利用提示工程来提…

java综合开发-前后端分离-01前端html,css

java综合开发-前后端分离-01前端html,css[ 任务列表 ] 1.阶段目标 2.网页基础知识 3.html和css 4.html的常用标签 4.1. 标题标签:h1-h6 4.2. 图片标签:img 4.3. 水平分割线标签:hr 4.4. css的三种引入方式: 4.5. 颜色的三种表示形式: 4.6. css的三种选择器: 4.7. 无语义…

Unreal最佳实践——通过进程Hack资源

Q:接到一个需求说是要一个外部C++调用ReadProcessMemory 黑进UE的程序找到uimage的地址,然后把里面的png图片拷贝出来,一头雾水 A:ReadProcessMemory写过 A:进程的启动地址就是你的基址,不过UE的需要找到world基址,所有的world对象U指针基于world,如果不是world内的,直接…

数据、信息、知识、智慧:AI时代我们该如何思考?

时代的浪潮滚滚向前,AI技术的演进正悄然改变着我们认知世界和创造价值的方式。从数据、信息到知识、智慧,从大数据到大模型,从单一智能体到多智能体协作,这是一场深刻的认知革命,也是生产力解放的新纪元。 AI粉嫩特攻队,2025年3月15日。 最近跟几个朋友讨论AI发展,突然意…

3.20学习苍穹外卖

今天主要学习关于微信支付的流程问题 又微信官方文档和流程图整体来说十分复杂 不过通过一篇博客成功跳过这个问题 引文正真支付是需要部分密钥文件 黑马不会提供这个 所有无法实现 就是通过直接跳转到成功支付实现的这个功能 https://blog.csdn.net/XZY__one/article/details/…

GKI改造原则、机制和方法

Google在android11-5.4分支上开始要求所有下游厂商使用Generic Kernel Image(GKI),需要将SoC和device相关的代码从核心内核剥离到可加载模块中(下文称之为GKI改造),从而解决内核碎片化问题。GKI为内核模块提供了稳定的内核模块接口(KMI),模块和内核可以独立更新。本文…

鸿蒙特效教程07-九宫格幸运抽奖

鸿蒙特效教程07-九宫格幸运抽奖在移动应用中,抽奖功能是一种常见且受欢迎的交互方式,能够有效提升用户粘性。本教程将带领大家从零开始,逐步实现一个九宫格抽奖效果,适合HarmonyOS开发的初学者阅读。最终效果预览 我们将实现一个经典的九宫格抽奖界面,包含以下核心功能:3…