---
title: 安装指南
description: "**表 1**  已验证环境"
url: https://www.hikunpeng.com/document/detail/zh/boostsra/krecall/monolith/docs/zh/installation_guide.md
sourcePath: /source/zh/boostsra/krecall/monolith/docs/zh/installation_guide.md
indexId: 3056bc10d5a656f0579597381294a8105a878bd360c4adff312ab913db75127366
---
# 安装指南

## 已验证环境

**表 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”。

    ```bash
    cd /path/to
    git clone https://github.com/bytedance/monolith
    ```

2. 下载并应用Patch。

    ```bash
    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可执行文件。

        ```bash
        cd /path/to
        wget https://github.com/bazelbuild/bazel/releases/download/3.4.0/bazel-3.4.0-linux-arm64
        ```

    2. 将下载好的Bazel移至monolith目录：

        ```bash
        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”，下载并安装：

        ```bash
        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](https://github.com/llvm/llvm-project/releases)页面提供了多个平台的预编译二进制包。你也可以进入该页面，找到**clang+llvm-16.0.6-aarch64-linux-gnu.tar.xz**文件并下载。

    2. 添加到环境变量。

        ```bash
        export PATH=/path/to/usr/llvm-16.0.6/bin:$PATH
        ```

    3. 验证安装。

        ```bash
        clang --version
        ```

        预期结果：

        ```bash
        clang version 16.0.6
        Target: aarch64-unknown-linux-gnu
        ```

5. 安装鲲鹏系统库。

    本项目依赖KQMalloc和kpglibc两个系统库，假设它们已被安装在“/usr/local/ksl/lib”目录下。openEuler系统可以按照[鲲鹏社区](https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2530/accel/kunpengaccel_ksl_16_0004.html)提供的教程进行KQMalloc和kpglibc的安装。Debian系统需要提issue联系工作人员获取。

6. 安装Python与NumPy。

    假设Python环境安装在/path/to目录下。执行下列指令，即可创建Python虚拟环境，并安装NumPy库。

    ```bash
    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，并写入以下内容。

    ```bash
    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脚本添加可执行权限。

    ```bash
    chmod +x test.sh
    ```

    确保已将LLVM 16.0.6添加到环境变量后，执行test.sh脚本以编译并运行Embedding_Lookup性能测试。

    ```bash
    sh test.sh
    ```

    > **说明：** 
    >
    >- KQMALLOC_USE_THP：表示由系统控制透明大页（THP）是否启用。
    >- LD_PRELOAD：表示预加载鲲鹏优化库以替换默认内存管理和glibc行为。
    >- numactl -C 288-335 -m 6：表示绑定到指定NUMA节点和CPU核心，单NUMA执行。

## 故障排除

**问题详细描述**

编译过程中，使用较高版本的 GCC或Clang（如 GCC 12 及以上）编译时，可能会出现如下错误。

```bash
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>`。例如，若错误发生在以下文件：

```bash
/root/.cache/bazel/_bazel_root/774c0a1e2be21d5e7cacc54e76797631/external/com_github_google_benchmark/src/benchmark_register.h 
```

编辑`benchmark_register.h`文件，在其头部（通常在其他标准头文件之后）加入`#include <limits>`。保存后重新执行编译命令即可。
