当前位置:AIGC资讯 > AIGC > 正文

关于使用Bing AI或Copilot时GPU占用高的问题分析与解决

就在上周,我使用Bing AI时,发现单位老机子的风扇响个不停,开始没在意,后来在Bing的对话框长度越来越长后,电脑震动的越来越厉害,所以习惯性打开的WIN10的任务管理器一看,好家伙,Edge浏览器的GPU占用好高,达到了30%-40%,处于一种分析问题的本能,我开始了接下来的各种实验,希望能找到根源。

本人的单位电脑是i3-4130,内存16G DDR3,集成显卡。

我开始是以为我的电脑配置问题导致的, 所以试了下家里的电脑i3-9100t,还是有10-20%的GPU占用,显然这是不正常的,我换了台独显(GTX-750)再试,还是一样的超过10%的占用。

然后我开始怀疑是Bing AI的网页问题,而且我发现一个问题,只要当前网页不是Bing AI或Copilot时,或者最小化Bing AI时,GPU占用都几乎为0。我对比了其他网页,比如GPT、视频网站等,包括不停翻动网页,最大的占用也不会超过20,(GPT生成代码时占用很低,只有0.5-1%),显然时Bing AI网页的问题,因为不单单是在生成回答时占用高,连上下翻动Bing的对话网页也很高。

我估计看到这里,有些网友都要怀疑微软是不是偷偷在生成AI回答时,做什么计算,好减轻它云计算的压力了。我当时也是抱有这个想法,当时怀疑是不是微软在Edge浏览器中藏了什么后门,所以我搜索了下GPT,怎么才能分析出GPU占用高的程序的代码位置,它给出我下面的答案。

这么多工具,我选择了GPUView用用看, 这是一个微软的实习生编写的工具,使用Bing AI找到它的下载方法:

GPUView 是一个用于分析和诊断Windows系统中图形处理单元(GPU)性能的工具。您可以通过以下方式获取GPUView:

Windows Performance Toolkit (WPT):

GPUView和其他相关文件包含在Windows Performance Toolkit(WPT)中,这是Windows评估和部署工具包(ADK)的可安装选项。 WPT MSI(Microsoft软件安装程序)会安装多个文件和目录,其中包括一些GPUView特定的文件。 您可以从这里下载WPT。

安装步骤:

下载并安装WPT。 默认安装目录位于\\Microsoft Windows Performance Toolkit目录下,例如x86平台的WPT可能安装在类似\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\gpuview的目录中。 您也可以选择自定义安装选项,以自定义二进制文件和相关支持文件的位置。

至于更多使用介绍,请查看如下链接(Matt 的网页角 - GPUView (stanford.edu)) ,使用此软件时,就是它需要先打开系统记录事件功能,先录制一段GPU事件,然后会合并保存为Merged.etl文件,用GPUView.exe打开它就可以看了。其中还有一个坑,录制时,需先运行log.cmd,命令提示符脚本,先开一个cmd,把这个脚本拖进去运行,不然后一闪而过,啥输出也看不到,运行后会报错"此时不应有4000",网上的解决方法是,用记事本打开这个log.cmd,搜索"if %TRACE_LOGGING_MEMORY% Gtr 4000 goto Set_Large_Buffers"这句代码(没有引号),然后在代码上面添加上"goto Set_Large_Buffers",至于原因是因为这个微软实习生编写时,没有考虑到多语言的问题,所以除了英文的其他国家都会报错,具体看这个链接(Solving GPUView 4000 was unexpected at this time error. – Yosoygames)

 添加代码后,运行修改后的log.cmd,就不会报错了,然后我们操作下Bing AI,把gpu占用高事件的记录下来,然后再次点击log.cmd关闭记录,接着程序就会自动合并一个Merged.etl,然后和上面说的一样用GPUView打开就可以了。

详细情况可以看上图,我们需要的就是左侧列表中的线程运行GPU占用高的代码偏移地址,可以给我们调试代码使用。

现在我们可以使用任意的调试工具,如X64dbg、Wingdbg、IDA等加载msedge.exe查看分析上面得到的偏移地址。这里我选择windbg,使用它的附加功能,附加到msedge中去,我们可以看到有很多msedge线程,选择我们在GPUView得到的PID就可以了(请看上图最左侧,因为本文是后写的,所以windbg中的PID和GPUView中不一样,实际请忽略这个问题)。

幸运的是,微软提供了msedge的符号表,我们可以查看里面的程序方便一点,输入u msedge.exe+0x125FD0,可以看到如下的反汇编代码:

显然msedge.exe+0x125FD0的偏移地址和主程序的0号线程是一个东西,那我们切换到0号线程看看,输入命令~0s,如下图:

在stack堆栈里发现了一个有趣的函数,msedge!base::MessagePumpForUI::WaitForWork,问问GPT看看,得到如下说明:

分析到这,情况逐渐明朗,显然这是一个Chromium的代码库里的函数,有处理渲染等作用,显然应该找Chrome浏览器渲染方面的资料,于是我搜索了Chrome浏览器GPU占用高的问题,倒是有几个帖子如下:

Chrome 的 GPU 进程的背后 | ladjzero's blog

这篇文章简单解释了下Chrome浏览器GPU工作的原理。

Chrome中的GPU加速合成_skia 的 opengl 后端(ganesh)-CSDN博客

这篇文章详细说明了Chrome的GPU渲染的原理、构架等方面的内容,相当不错。

上面的文章中,提到一个东西,如下:

 显然所有的关键就是CSS样式表里调用了transform,为了验证,我又问了下BING,如下:

那我们来验证下BING AI网页里是否调用了GPU加速。选择好网页,按F12打开edge浏览器的开发者模式,如下图:

 点击源代码选项卡,按ctrl+shirt+F快捷键搜索下"transform:"得到超多的transform结果,显然微软在Bing AI里大量调用了GPU加速渲染,所以是GPU占用相当高,顺便说一句,css的transform渲染在IE、火狐、chrome、edge等主流浏览器都能开启gpu加速,终于知道了原因,现在来说下解决方法。

我搜索了下chrome浏览器GPU占用高的网友帖子,有不少,既然chrome不行,我们试试火狐浏览器,结果如下图:

我的分析完成,收工了,各位下周见! 

更新时间 2023-12-08