十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 llama.cpp 中集成 BLIS:BLAS 后端编译安装与多线程调优指南

在 llama.cpp 中集成 BLIS:BLAS 后端编译安装与多线程调优指南 在 llama.cpp 中集成 BLISBLAS 后端编译安装与多线程调优指南【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cppBLIS 是一套可移植的高性能 BLAS 稠密线性代数框架本文以其在 llama.cpp含本仓库 ik_llama.cpp中的集成为主线完整讲解 BLIS 的编译安装、通过 Makefile 与 CMake 两种方式接入 llama.cpp 构建、以及用 OpenMP 环境变量做线程与 CPU 亲和性调优的实战方法并给出 Intel 平台上libimf.so缺失问题的处理方向。读完本文你将能够独立完成一套可运行的「llama.cpp BLIS」CPU 构建并正确配置其多线程行为。BLIS 是什么BLISBLAS-like Library Instantiation Software是一个可移植的软件框架用于构建高性能的 BLAS 风格稠密线性代数库。它在数值软件领域获得过权威认可包括2023 年 James H. Wilkinson 数值软件奖与2020 年 SIAM 超级计算活动组最佳论文奖。BLIS 的工程特点主要体现在三套 API 形态上object-based API面向对象的、参数更丰富的核心 APItyped API按数据类型特化的高性能入口BLAS / CBLAS 兼容层可直接替代传统 BLAS 例程调用便于既有代码无缝切换。正是这最后一点让 BLIS 可以作为一个透明的 BLAS 后端接入 llama.cpp 这类依赖 BLAS 例程的项目。它提供了诸如blis的动态链接库与 CBLAS 头文件CMake 侧通过GGML_BLAS_VENDORFLAME进行识别。在 llama.cpp 生态中BLIS 属于 CPU 侧的 BLAS 加速选项之一与 OpenBLAS、Intel MKL 处于同一生态位见 docs/build.md 中 BLAS 一节的编排其中 OpenBLAS、BLIS、Intel oneMKL、CUDA 等后端并列介绍。准备阶段编译并安装 BLIS在接入 llama.cpp 之前需要先把 BLIS 本体构建出来并安装到系统中。编译 BLISgit clone https://github.com/flame/blis cd blis ./configure --enable-cblas -t openmp,pthreads auto make -j命令要点说明--enable-cblas启用 CBLAS 兼容层llama.cpp 侧通过 CBLAS 接口调用 BLIS这一选项必须开启-t openmp,pthreads指定线程模型openmp与pthreads二者都可用auto让 configure 自动探测本机 CPU 特性并选择最优的 kernel 配置。文档建议优先使用openmp线程模型原因是 OpenMP 的线程数量与 CPU 亲和性更容易在运行时调整这一点与后文的环境变量调优直接相关。安装 BLISsudo make install按默认配置BLIS 会被安装到/usr/local/目录下头文件进入/usr/local/include库文件进入/usr/local/lib。安装完成后确认以下文件存在即可进入下一步头文件/usr/local/include/blis.h或 cblas.h 相关头库文件/usr/local/lib/libblis.*在 llama.cpp 中启用 BLISllama.cpp及其 fork如本仓库 ik_llama.cpp提供两种构建系统入口Makefile 与 CMake。方式一Makefilemake GGML_BLIS1 -j通过向 make 传递GGML_BLIS1变量即可让构建系统链接 BLIS 库。文档还给出了只构建矩阵乘法基准程序的示例make GGML_BLIS1 llama-benchmark-matmult这里的llama-benchmark-matmult对应仓库中的矩阵乘法基准程序其源码位于 examples/benchmark/benchmark-matmult.cpp。用它可以在不改动业务代码的前提下快速对比「有 BLIS / 无 BLIS」两种构建在稠密矩阵乘法上的吞吐差异是验证 BLIS 集成是否生效的最直接手段。注意Makefile 构建方式源自上游 llama.cpp 构建系统。本仓库ik_llama.cpp当前根目录下未提供 Makefile因此在该 fork 上需要走 CMake 方式构建若你使用的是官方 llama.cpp 或其保留 Makefile 的版本上述命令可直接使用。方式二CMakemkdir build cd build cmake -DGGML_BLASON -DGGML_BLAS_VENDORFLAME .. make -j参数含义-DGGML_BLASON启用 BLAS 后端支持-DGGML_BLAS_VENDORFLAME指定 BLAS 供应商为 FLAME即 BLIS 的开发机构名CMake 据此查找 libblis。从本仓库构建配置看ggml 的 CMake 体系为 BLAS 后端预留了源文件挂载点ggml/src/CMakeLists.txt 中的${GGML_SOURCES_BLAS} ${GGML_HEADERS_BLAS}并定义了ggml_cpu_has_blas()等 CPU 特性探测函数见 ggml/src/ggml.c说明该 fork 沿用了上游的 BLAS 集成框架。由于该 fork 当前未在 ggml/CMakeLists.txt 中保留GGML_BLAS_VENDOR选项实际启用 BLIS 时建议以官方 llama.cpp 的 CMake 参数为准GGML_BLAS/GGML_BLAS_VENDOR的语义与上游一致。作为对照同目录下其他 BLAS 供应商的 CMake 用法来自 docs/build.md可供参考帮助理解GGML_BLAS_VENDOR的取值模式# OpenBLAS cmake -B build -DGGML_BLASON -DGGML_BLAS_VENDOROpenBLAS # Intel oneMKL需要先 source Intel oneAPI 环境 cmake -B build -DGGML_BLASON -DGGML_BLAS_VENDORIntel10_64lp \ -DCMAKE_C_COMPILERicx -DCMAKE_CXX_COMPILERicpx -DGGML_NATIVEON可以看到GGML_BLAS_VENDOR就是「BLAS 实现选型」的总开关FLAME、OpenBLAS、Intel10_64lp分别对应 BLIS、OpenBLAS 与 Intel MKL。若你已经 source 了 Intel 环境脚本默认值Generic会自动选中 MKL 版本。运行配置线程数量与 CPU 亲和性BLIS 安装好并编译进 llama.cpp 之后运行阶段还需要做多线程配置。依据 BLIS 官方多线程文档可以通过环境变量直接调整 OpenMP 线程模型下的行为无需修改任何代码export GOMP_CPU_AFFINITY0-19 export BLIS_NUM_THREADS14然后照常运行 llama.cpp 的可执行文件即可。两个变量的作用GOMP_CPU_AFFINITY0-19GNU OpenMP 运行时libgomp的 CPU 亲和性设置将 OpenMP 线程绑定到指定的 CPU 核区间这里为 019 号核可避免线程在核间频繁迁移带来的缓存抖动对提升矩阵乘法的访存局部性有明显帮助。取值应按你机器的实际核数调整。BLIS_NUM_THREADS14显式指定 BLIS 参与计算的线程数通常设为可用物理核数或略低于核数以避免与系统其他负载争抢。这正是文档推荐 openmp 线程模型的原因GOMP_CPU_AFFINITY让你能精细控制 BLIS 的 OpenMP 线程落在哪些核上从而在大核/小核混合架构如 Intel 的大小核 CPU或与其他进程共存的机器上获得更可控的性能表现。Intel 平台常见问题libimf.so 找不到在部分 Intel 环境下编译或运行启用了 BLIS 的 llama.cpp 时可能会遇到如下报错libimf.so: cannot open shared object file: No such file or directory该错误的典型成因是BLIS或其一侧的 Intel 组件在编译时链接了 Intel 编译器运行时库而运行环境的动态库搜索路径中没有包含 Intel oneAPI 的运行时库目录。libimf.so属于 Intel oneAPI 的运行时组件。处理方向通常是确认 Intel oneAPI 已正确安装在运行前 source Intel oneAPI 的环境初始化脚本如source /opt/intel/oneapi/setvars.sh使动态链接器能找到 oneAPI 运行时库或将对应库目录显式加入LD_LIBRARY_PATH。具体细节可参考 Intel oneAPI 2022 相关问题的公开讨论原文档指向的 stackoverflow 讨论页主题即为 intel oneapi 2022 libimf.so no such file or directory。验证与注意事项完成构建与配置后建议按以下顺序验证集成是否真正生效构建层面确认编译输出中出现了 BLIS 的链接记录如-lblis且构建无未定义符号错误基准层面用llama-benchmark-matmult源码见 examples/benchmark/benchmark-matmult.cpp对比开启 BLIS 前后的矩阵乘法吞吐确认有可观测的提升运行层面用nproc、taskset或GOMP_CPU_AFFINITY组合验证线程确实被绑定到预期核区间。需要特别说明的适用前提本仓库ik_llama.cpp当前的源码结构显示其已不再保留 Makefile且 ggml/CMakeLists.txt 中未再定义GGML_BLAS_VENDOR选项ggml/src/ggml.c 中ggml_cpu_has_blas()恒返回 0因此 BLIS 集成选项属于源自上游 llama.cpp 构建系统的能力在其官方版本上可直接使用本文命令在本 fork 上如需启用 BLIS 建议回退到保留 BLAS 选项的上游构建或按上游参数自行适配GOMP_CPU_AFFINITY仅对 GNU OpenMP 有效若 BLIS 以pthreads线程模型编译则应改用BLIS_NUM_THREADS之外的线程绑定手段如taskset。参考BLIS 官方项目主页与 Getting Started 指南BLIS 官方文档中的 Multithreading 章节环境变量BLIS_NUM_THREADS、GOMP_CPU_AFFINITY的完整语义说明本仓库 docs/build.md 中 BLIS、OpenBLAS、Intel oneMKL 等 BLAS 后端构建章节【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表