开发者
资源
文档评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

安装指南

已验证环境

表 1 已验证环境

项目

说明

操作系统

Debian12 5.15

CPU

鲲鹏920 7270Z/7280Z处理器

内存

16 × 64GB

编译器

Clang 16.0.6

其他

Bazel 3.4.0;Python 3.10.18

源码编译

  1. 获取Monolith开源代码。假设安装路径为“/path/to”。

    cd /path/to
    git clone https://github.com/bytedance/monolith
  2. 下载并应用Patch。

    git clone https://gitcode.com/boostkit/monolith k_monolith
    cd monolith
    patch -p1 < ../k_monolith/0001-boostsra-monolith.patch
  3. 安装Bazel 3.4.0。

    1. 下载Bazel 3.4.0可执行文件。

      cd /path/to
      wget https://github.com/bazelbuild/bazel/releases/download/3.4.0/bazel-3.4.0-linux-arm64
    2. 将下载好的Bazel移至monolith目录:

      cp /path/to/bazel-3.4.0-linux-arm64 /path/to/monolith/bazel-3.4.0-linux-arm64
  4. 安装LLVM 16.0.6。

    1. 假设安装目录为“/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.6

      LLVM官方在GitHub的release页面提供了多个平台的预编译二进制包。你也可以进入该页面,找到clang+llvm-16.0.6-aarch64-linux-gnu.tar.xz文件并下载。

    2. 添加到环境变量。

      export PATH=/path/to/usr/llvm-16.0.6/bin:$PATH
    3. 验证安装。

      clang --version

      预期结果:

      clang version 16.0.6
      Target: aarch64-unknown-linux-gnu
      ...
  5. 安装鲲鹏系统库。

    本项目依赖KQMalloc和kpglibc两个系统库,假设它们已被安装在“/usr/local/ksl/lib”目录下。openEuler系统可以按照鲲鹏社区提供的教程进行KQMalloc和kpglibc的安装。Debian系统需要提issue联系工作人员获取。

  6. 安装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环境。

  7. 编译源码。

    假设源码存放于“/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>。保存后重新执行编译命令即可。