安装指南
已验证环境
表 1 已验证环境
源码编译
获取Monolith开源代码。假设安装路径为“/path/to”。
cd /path/to git clone https://github.com/bytedance/monolith下载并应用Patch。
git clone https://gitcode.com/boostkit/monolith k_monolith cd monolith patch -p1 < ../k_monolith/0001-boostsra-monolith.patch安装Bazel 3.4.0。
下载Bazel 3.4.0可执行文件。
cd /path/to wget https://github.com/bazelbuild/bazel/releases/download/3.4.0/bazel-3.4.0-linux-arm64将下载好的Bazel移至monolith目录:
cp /path/to/bazel-3.4.0-linux-arm64 /path/to/monolith/bazel-3.4.0-linux-arm64
安装LLVM 16.0.6。
假设安装目录为“/path/to/usr”,下载并安装:
cd /path/to/usr wget https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.6/clang+llvm-16.0.6-aarch64-linux-gnu.tar.xz tar -xf clang+llvm-16.0.6-aarch64-linux-gnu.tar.xz mv clang+llvm-16.0.6-aarch64-linux-gnu llvm-16.0.6LLVM官方在GitHub的release页面提供了多个平台的预编译二进制包。你也可以进入该页面,找到clang+llvm-16.0.6-aarch64-linux-gnu.tar.xz文件并下载。
添加到环境变量。
export PATH=/path/to/usr/llvm-16.0.6/bin:$PATH验证安装。
clang --version预期结果:
clang version 16.0.6 Target: aarch64-unknown-linux-gnu ...
安装鲲鹏系统库。
本项目依赖KQMalloc和kpglibc两个系统库,假设它们已被安装在“/usr/local/ksl/lib”目录下。openEuler系统可以按照鲲鹏社区提供的教程进行KQMalloc和kpglibc的安装。Debian系统需要提issue联系工作人员获取。
安装Python与NumPy。
假设Python环境安装在/path/to目录下。执行下列指令,即可创建Python虚拟环境,并安装NumPy库。
apt install python3 python3-pip python3-venv cd /path/to python -m venv emb source emb/bin/activate pip install numpy后续执行时,都要确认已激活安装NumPy的Python环境。
编译源码。
假设源码存放于“/path/to/monolith”目录下,在本目录下创建一个脚本,命名为test.sh,并写入以下内容。
export CC=clang-16 export CXX=clang++-16 KQMALLOC_USE_THP=-1 LD_PRELOAD=/usr/local/ksl/lib/libkqmalloc.so:/usr/local/ksl/lib/libkpglibc.so numactl -C 288-335 -m 6 ./bazel-3.4.0-linux-arm64 run --copt=-DENABLE_KP //monolith/native_training/runtime/hash_table:hash_table_benchmark保存并退出后,首先为test.sh脚本添加可执行权限。
chmod +x test.sh确保已将LLVM 16.0.6添加到环境变量后,执行test.sh脚本以编译并运行Embedding_Lookup性能测试。
sh test.sh- KQMALLOC_USE_THP:表示由系统控制透明大页(THP)是否启用。
- LD_PRELOAD:表示预加载鲲鹏优化库以替换默认内存管理和glibc行为。
- numactl -C 288-335 -m 6:表示绑定到指定NUMA节点和CPU核心,单NUMA执行。
故障排除
问题详细描述
编译过程中,使用较高版本的 GCC或Clang(如 GCC 12 及以上)编译时,可能会出现如下错误。
ERROR: /root/.cache/bazel/_bazel_root/xxxx/external/com_github_google_benchmark/BUILD.bazel:11:11: C++ compilation of rule "@com_github_google benchmark//:benchmark' failed (Exit 1)
In file included from external/com_github_google_benchmark/src/benchmark_register.cc:15:
external/com_github_google_benchmark/src/benchmark_register.h:22:30: error: no member named 'numeric_limits' in namespace 'std'原因分析
新版GCC或Clang对C++标准库头文件的依赖更加严格,某些符号(如std::numeric_limits)必须显式包含对应头文件<limits>才能使用。
解决方法
在报错提示的源文件中手动添加#include <limits>。例如,若错误发生在以下文件:
/root/.cache/bazel/_bazel_root/774c0a1e2be21d5e7cacc54e76797631/external/com_github_google_benchmark/src/benchmark_register.h 编辑benchmark_register.h文件,在其头部(通常在其他标准头文件之后)加入#include <limits>。保存后重新执行编译命令即可。