CPU 时间是如何耗费在 llama.cpp 程序和 LLaMA2 模型内部的(使用 OpenResty XRay)
llama.cpp 和 LLaMA 2 是两个流行的 AI 软件项目,它们旨在让大家能够更方便、更高效地使用大型语言模型(LLMs)。llama.cpp 是用 C/C++ 语言实现的 Meta 公司的 LLaMA 模型。LLaMA 2 是一系列基于分组查询注意力(grouped-query attention)技术的生成式文本模型,它们针对编程任务进行了专门的微调。然而,这些模型的运行需要消耗大量的 CPU 资源。
在这个教程中,我们会一步步地教您如何使用 OpenResty XRay 来分析运行 LLaMA2 模型的 llama.cpp 程序。我们会快速定位该程序中最耗 CPU 资源的 C++ 代码路径。这些代码路径消耗最多的 CPU 时间,会影响 llama 应用程序的性能。
问题: 高 CPU 使用率
进入 llama.cpp
目录。
首先来编译这个 C++ 项目。我们使用 -g
这个选项来开启调试符号。
运行 make
命令。
编译结束了,没有出现错误。
运行 llama.cpp
的 main
程序。Llama2 是微软和 Meta 联合开源的最新大语言模型。这里我们使用了 llama.cpp
可以运行的量化后的 7B 模型。
指定生成的 token 数。
使用 “Linux” 作为提示来生成内容。
运行这个命令。可以看到下面已经在不断地输出生成的文本内容了。
打开另一个终端,运行 top
命令查看 CPU 的使用情况。
可以看到 llama.cpp
的 main
命令消耗了接近 400% 的 CPU 核心资源。
使用 OpenResty XRay 的引导式分析功能定位最热的 C++ 代码路径
我们可以使用 OpenResty XRay 来检查这个未经修改的进程。在浏览器中打开 OpenResty XRay 的 Web 控制台。
我们可以在这里对刚才看到的进程进行实时分析,查看 CPU 时间具体消耗在哪里了。
确保我们当前分析的是正确的机器。
如果当前显示的机器不对,您可以从下面的列表中选择一个正确的。
进入 “Guided Analysis” 页面。
这里可以看到系统能分析哪些类型的问题。
选择 “High CPU usage”。
点击 “Next”。
通过选择 “进程” 来选择要分析的目标。
选择 llama.cpp
的 main
进程。
确保应用程序的类型是正确的。通常默认值就是对的。
这里的语言级别就只有 ”C 和 C++“。
我们还可以设置最大分析时间,这里保持默认的 300 秒不变。
开始分析。
系统将持续执行多轮分析,现在它正在运行第一轮分析。
第一轮分析已经完成,现在进入第二轮分析。对这个例子来说,运行一轮分析就够了。
现在停止分析。
这里显示了系统正在为本次分析生成报告。
可以看到自动生成了一份分析报告。
这是现在我们要分析的问题类型,CPU。
这个是占用 CPU 时间最多的 C++ 代码路径。
第一个函数 ggml_compute_forward_mul_mat
是 ggml
库中的通用矩阵乘法函数。
而其上一级调用它的函数 ggml_graph_compute_thread
负责进行单个线程的计算。
点击 “More” 查看细节信息。
上面的代码路径是从这个 CPU 火焰图中推导出来的。
下面是对当前问题更详细的解释和建议。
它提到了 ggml_compute_forward_mul_mat
函数。
这个函数进行矩阵乘法操作。
现在来看看占用 CPU 时间排名第二的 C++ 代码路径。
第一个函数 ggml_vec_dot_q4_K_q8_K
是 ggml
库中用于计算两个向量点积的函数。
点击 “More” 查看细节信息。
它提到了 ggml_vec_dot_q4_K_q8_K
函数。
也提到了它是计算两个向量的点积的。
让我们回到第二条代码路径上来。把鼠标放在第一个函数的绿色框上。
可以看到这个函数的源文件名。在提示框中还可以看到 k_quants.c
文件的完整路径。
这行源码的行号是 2608。
点击这个图标,复制这个函数完整的 C 源文件路径。
使用 vim 编辑器,查看这个文件里的 C 代码。您可以使用任何您喜欢的编辑器。
正如 OpenResty XRay 建议的那样跳转到第 2608 行。
我们可以看到这行代码使用了 C 语言的位运算来对数组的元素进行一些操作。
在状态栏中可以看到这行代码也确实在之前报告里提到的 ggml_vec_dot_q4_K_q8_K
函数中。
全自动分析与报告
OpenResty XRay 也可以自动监控在线进程,并显示分析报告。
跳转到 “Insights” 页面。
您可以在 “Insights” 页面中找到以日和周为周期的报告。
所以您不是非得用 “Guided Analysis” 功能。当然,“Guided Analysis” 对于应用程序的开发和演示是很有用的。
关于 OpenResty XRay
OpenResty XRay 是一个动态追踪产品,它可以自动分析运行中的应用程序,以解决性能问题、行为问题和安全漏洞,并提供可行的建议。在底层实现上,OpenResty XRay 由我们的 Y 语言驱动,可以在不同环境下支持多种不同的运行时,如 Stap+、eBPF+、GDB 和 ODB。
关于本文和关联视频
本文和相关联的视频都是完全由我们的 OpenResty Showman 产品从一个简单的剧本文件自动生成的。
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!