使用 Termux 在 Android 上构建llama.cpp项目(翻译)

775 阅读3分钟

本文翻译自开源项目llama.cpp的官方操作说明

Termux 是一个安卓终端模拟器和 Linux 环境应用(无需 root 权限)。
截至撰写时,Termux 在 Google Play 商店中以实验性版本提供;
然而你可以从项目的代码仓库或 F-Droid 直接获取它。

使用 Termux,你可以像在 Linux 环境中一样安装和运行 llama.cpp
从而在安卓手机上跑量化模型

步骤

1. 进入Termux shell:后面,安装一些依赖项

apt update && apt upgrade -y
apt install git cmake

2. 按照 构建说明,特别是针对 CMake 的部分进行操作

一旦二进制文件构建完成,下载你选择的模型(例如,从 Hugging Face)。
为了获得最佳性能,建议将其放置在 ~/ 目录下:

curl -L {model-url} -o ~/{model}.gguf

3. 如果你还没有进入 llama.cpp 仓库目录,请 cd 进入该目录并执行以下命令

./build/bin/llama-cli -m ~/{model}.gguf -c {context-size} -p "{your-prompt}"

这里我们使用了 llama-cli,但实际上任何 examples 目录下的可执行文件理论上都应该可以工作。
请确保将 context-size 设置为一个合理的数值(比如 4096)开始,否则内存可能会激增并导致终端崩溃。

使用 Android NDK 进行交叉编译

可以通过 CMake 和 Android NDK 在主机系统上为 Android 构建 llama.cpp
如果你对这种方法感兴趣,请确保你已经准备好了一个用于交叉编译 Android 程序的环境(即安装了 Android SDK)。
请注意,与桌面环境不同,Android 环境附带的本地库数量有限,
因此在使用 Android NDK 构建时,CMake 只能使用这些库(参见:稳定 API)。

一旦准备就绪并克隆了 llama.cpp,在项目目录中执行以下命令:

$ cmake \
  -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a \
  -DANDROID_PLATFORM=android-28 \
  -DCMAKE_C_FLAGS="-march=armv8.7a" \
  -DCMAKE_CXX_FLAGS="-march=armv8.7a" \
  -DGGML_OPENMP=OFF \
  -DGGML_LLAMAFILE=OFF \
  -B build-android

注意事项

  • 尽管较新版本的 Android NDK 包含 OpenMP,但仍然需要由 CMake 安装它作为依赖项,这目前不被支持。
  • llamafile 目前不支持 Android 设备(参见:issue #325

上述命令应该会配置 llama.cpp 以获得现代设备的最佳性能。即使你的设备不运行 armv8.7allama.cpp 也会在运行时检查可用的 CPU 特性并加以利用。

可以根据目标调整 Android ABI。一旦项目配置完成:

cmake --build build-android --config Release -j{n}
cmake --install build-android --prefix {install-dir} --config Release

安装完成后,在主机系统上下载你选择的模型。然后:

adb shell "mkdir /data/local/tmp/llama.cpp"
adb push {install-dir} /data/local/tmp/llama.cpp/
adb push {model}.gguf /data/local/tmp/llama.cpp/
adb shell

adb shell 中:

cd /data/local/tmp/llama.cpp
LD_LIBRARY_PATH=lib ./bin/llama-simple -m {model}.gguf -c {context-size} -p "{your-prompt}"

就是这样!

请注意,Android 不会自动找到 lib 库路径,因此我们需要指定 LD_LIBRARY_PATH 才能运行已安装的可执行文件。
Android 在较新的 API 级别中支持 RPATH,因此这种情况在未来可能会改变。关于 context-size(非常重要!)和其他 examples 的运行信息,请参阅前面的部分。