From: Neuman Vong Date: Fri, 26 Jan 2024 13:14:58 +0000 (+1100) Subject: gpt-2 : clarify instructions for CLBlast on Android (#706) X-Git-Tag: upstream/0.0.1642~1052 X-Git-Url: https://git.djapps.eu/?a=commitdiff_plain;h=c2448f88d17395452a587d0176d19ed87e0f7ce1;p=pkg%2Fggml%2Fsources%2Fggml gpt-2 : clarify instructions for CLBlast on Android (#706) * Tabs to spaces * CLBlast build * Update README * Clarify pwd * Omit output * How to get libOpenCL.so * Clarify OpenCL limitations * Prefer parameters over envvar * @slaren Co-authored-by: slaren --------- Co-authored-by: slaren --- diff --git a/README.md b/README.md index 75b286d6..e430362d 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,64 @@ export LD_LIBRARY_PATH=/data/local/tmp ./bin/gpt-2-backend -m models/ggml-model.bin -p "this is an example" ``` +### CLBlast for Android + +Build CLBlast. + +```bash +# In CLBlast/build +$ANDROID_SDK_PATH/cmake/3.22.1/bin/cmake .. \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_SYSTEM_VERSION=33 \ + -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ + -DCMAKE_ANDROID_NDK=$ANDROID_NDK_PATH \ + -DCMAKE_ANDROID_STL_TYPE=c++_static \ + -DOPENCL_ROOT=$(readlink -f ../../OpenCL-Headers) \ + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH + +# Build libclblast.so +make -j4 +``` + +Pull `libGLES_mali.so` to `libOpenCL.so`. + +```bash +# In ggml project root. +mkdir arm64-v8a +adb pull /system/vendor/lib64/egl/libGLES_mali.so arm64-v8a/libOpenCL.so +``` + +Build ggml with CLBlast. + +```bash +# In ggml/build +cd build +$ANDROID_SDK_PATH/cmake/3.22.1/bin/cmake .. \ + -DGGML_CLBLAST=ON \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_SYSTEM_VERSION=33 \ + -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ + -DCMAKE_ANDROID_NDK=$ANDROID_NDK_PATH \ + -DCMAKE_ANDROID_STL_TYPE=c++_shared \ + -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH \ + -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH \ + -DCLBLAST_HOME=$(readlink -f ../../CLBlast) \ + -DOPENCL_LIB=$(readlink -f ../arm64-v8a/libOpenCL.so) + +# Run make, adb push, etc. +``` + +Then in `adb shell`... + +```bash +cd /data/local/tmp +export LD_LIBRARY_PATH=/system/vendor/lib64/egl:/data/local/tmp +./bin/gpt-2-backend -m models/ggml-model.bin -n 64 -p "Pepperoni pizza" +``` + +OpenCL does not have the same level of support in `ggml-backend` as CUDA or Metal. In the `gpt-2-backend` example, OpenCL will only be used for the matrix multiplications when evaluating large prompts. + ## Resources - [GGML - Large Language Models for Everyone](https://github.com/rustformers/llm/blob/main/crates/ggml/README.md): a description of the GGML format provided by the maintainers of the `llm` Rust crate, which provides Rust bindings for GGML diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5f9baa10..b1555dc1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -178,25 +178,28 @@ if (GGML_OPENBLAS) endif() if (GGML_CLBLAST) - set(CLBLAST_INCLUDE_SEARCH_PATHS - /usr/include - /usr/local/include - $ENV{CLBLAST_HOME} - $ENV{CLBLAST_HOME}/include - ) - find_path(CLBLAST_INC NAMES clblast.h PATHS ${CLBLAST_INCLUDE_SEARCH_PATHS}) - find_library(CLBLAST_LIB NAMES clblast) - find_library(OPENCL_LIB NAMES OpenCL) - if (CLBLAST_LIB AND OPENCL_LIB AND CLBLAST_INC) - message(STATUS "clBLAST found") + if(NOT CLBLAST_HOME) + set(CLBLAST_HOME + /usr + /usr/local + $ENV{CLBLAST_HOME} + ) + endif() + + find_path(CLBLAST_INC NAMES clblast.h PATHS ${CLBLAST_HOME} PATH_SUFFIXES include) + find_library(CLBLAST_LIB NAMES clblast PATHS ${CLBLAST_HOME} PATH_SUFFIXES build) + find_path(OPENCL_INC NAMES CL/opencl.h PATHS ${OPENCL_ROOT}) + find_library(OPENCL_LIB NAMES OpenCL) + if (CLBLAST_LIB AND OPENCL_LIB AND CLBLAST_INC AND OPENCL_INC) + message(STATUS "clBLAST found") - set(GGML_EXTRA_INCS ${GGML_EXTRA_INCS} ${CLBLAST_INC}) - set(GGML_EXTRA_LIBS ${GGML_EXTRA_LIBS} ${CLBLAST_LIB} ${OPENCL_LIB}) - set(GGML_EXTRA_FLAGS ${GGML_EXTRA_FLAGS} -DGGML_USE_CLBLAST) + set(GGML_EXTRA_INCS ${GGML_EXTRA_INCS} ${CLBLAST_INC} ${OPENCL_INC}) + set(GGML_EXTRA_LIBS ${GGML_EXTRA_LIBS} ${CLBLAST_LIB} ${OPENCL_LIB}) + set(GGML_EXTRA_FLAGS ${GGML_EXTRA_FLAGS} -DGGML_USE_CLBLAST) - set(GGML_OPENCL_SOURCES ggml-opencl.cpp ggml-opencl.h) + set(GGML_OPENCL_SOURCES ggml-opencl.cpp ggml-opencl.h) - link_libraries("-Wl,--copy-dt-needed-entries") + link_libraries("-Wl,--copy-dt-needed-entries") else() message(WARNING "clBLAST not found") endif()