[WIP] llama: ABI split builds five .so artifacts.
However, all .so are performing on SVE level
This commit is contained in:
parent
eab502a735
commit
75d1abe24a
|
|
@ -1,92 +1,83 @@
|
||||||
# Sets the minimum CMake version required for this project.
|
|
||||||
cmake_minimum_required(VERSION 3.22.1)
|
cmake_minimum_required(VERSION 3.22.1)
|
||||||
|
|
||||||
project("llama_android" VERSION 1.0.0 LANGUAGES C CXX)
|
project("llama_android" VERSION 1.0.0 LANGUAGES C CXX)
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------
|
||||||
|
# 0. Global language & toolchain options
|
||||||
|
# --------------------------------------------------------------------
|
||||||
set(CMAKE_C_STANDARD 11)
|
set(CMAKE_C_STANDARD 11)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED true)
|
set(CMAKE_C_STANDARD_REQUIRED true)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED true)
|
set(CMAKE_CXX_STANDARD_REQUIRED true)
|
||||||
|
|
||||||
set(GGML_CPU_KLEIDIAI ON CACHE BOOL "" FORCE)
|
## ---- ggml / llama feature switches (configure-time) ----------------
|
||||||
|
#set(GGML_CPU_KLEIDIAI ON CACHE BOOL "" FORCE)
|
||||||
set(GGML_LLAMAFILE OFF CACHE BOOL "" FORCE)
|
set(GGML_LLAMAFILE OFF CACHE BOOL "" FORCE)
|
||||||
set(LLAMA_BUILD_COMMON ON CACHE BOOL "" FORCE)
|
set(LLAMA_BUILD_COMMON ON CACHE BOOL "" FORCE)
|
||||||
set(LLAMA_CURL OFF CACHE BOOL "" FORCE)
|
set(LLAMA_CURL OFF CACHE BOOL "" FORCE)
|
||||||
|
|
||||||
string(APPEND CMAKE_C_FLAGS " -march=armv8.7-a+dotprod+i8mm+sve")
|
# baseline ISA used for every source that is NOT in a tier wrapper
|
||||||
string(APPEND CMAKE_CXX_FLAGS " -march=armv8.7-a+dotprod+i8mm+sve")
|
string(APPEND CMAKE_C_FLAGS " -march=armv9.2-a+dotprod+i8mm+sve+sve2+sme")
|
||||||
|
string(APPEND CMAKE_CXX_FLAGS " -march=armv9.2-a+dotprod+i8mm+sve+sve2+sme")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "" FORCE)
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "" FORCE)
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "" FORCE)
|
||||||
|
|
||||||
## CMake definitions
|
# NOT NEEDED WHEN CMAKE_BUILD_TYPE PASSED IN BY GRADLE
|
||||||
#add_compile_definitions(
|
#message(DEBUG "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
||||||
# GGML_CPU_KLEIDIAI=ON
|
#if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
# GGML_LLAMAFILE=OFF
|
# string(APPEND CMAKE_C_FLAGS " -O3 -DNDEBUG")
|
||||||
# LLAMA_BUILD_COMMON=ON
|
# string(APPEND CMAKE_CXX_FLAGS " -O3 -DNDEBUG")
|
||||||
# LLAMA_CURL=OFF
|
#endif()
|
||||||
#)
|
|
||||||
|
|
||||||
# Force Release only when Gradle didn't specify one
|
# default to Release if Gradle hasn’t set a variant
|
||||||
if(NOT DEFINED CMAKE_BUILD_TYPE)
|
if(NOT DEFINED CMAKE_BUILD_TYPE)
|
||||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
## Also provides "common"
|
### Also provides "common"
|
||||||
#include(FetchContent)
|
##include(FetchContent)
|
||||||
#FetchContent_Declare(
|
##FetchContent_Declare(
|
||||||
# llama
|
## llama
|
||||||
# GIT_REPOSITORY https://github.com/ggml-org/llama.cpp
|
## GIT_REPOSITORY https://github.com/ggml-org/llama.cpp
|
||||||
# GIT_TAG master
|
## GIT_TAG master
|
||||||
#)
|
##)
|
||||||
#FetchContent_MakeAvailable(llama)
|
##FetchContent_MakeAvailable(llama)
|
||||||
|
|
||||||
# Add local llama.cpp as subdirectory
|
# --------------------------------------------------------------------
|
||||||
add_subdirectory(../../../../../../ build-llama)
|
# 1. Pull in llama.cpp (creates targets "llama" and "common")
|
||||||
|
# --------------------------------------------------------------------
|
||||||
|
set(LLAMA_SRC ${CMAKE_CURRENT_LIST_DIR}/../../../../../../)
|
||||||
|
add_subdirectory(${LLAMA_SRC} build-llama)
|
||||||
|
|
||||||
#function(build_llama_tier tier march_flag)
|
# -----------------------------------------------------------
|
||||||
# set(LIB_NAME "${CMAKE_PROJECT_NAME}_${tier}")
|
# 2. Helper to create one wrapper .so for a hardware tier
|
||||||
#
|
# -----------------------------------------------------------
|
||||||
## set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8.7-a+i8mm")
|
function(build_llama_tier tier march)
|
||||||
## set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8.7-a+i8mm")
|
set(wrapper llama_android_${tier})
|
||||||
#
|
add_library(${wrapper} SHARED llama-android.cpp)
|
||||||
# add_library(${LIB_NAME} SHARED llama-android.cpp)
|
|
||||||
#
|
|
||||||
|
|
||||||
# MIGHT NOT WORK????
|
# ISA tuning that belongs only to this tier
|
||||||
# target_include_directories(${LIB_NAME} PRIVATE
|
target_compile_options(${wrapper} PRIVATE "-march=${march}")
|
||||||
# ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../common)
|
|
||||||
# ?????
|
|
||||||
|
|
||||||
# target_compile_options(${LIB_NAME} PRIVATE "-march=${march_flag}")
|
# NOT NEEDED!
|
||||||
#
|
# # sampling.h lives in common/, ggml-impl.h lives in ggml/src
|
||||||
# target_link_libraries(${LIB_NAME}
|
# target_include_directories(${wrapper} PRIVATE
|
||||||
# llama
|
# ${LLAMA_SRC}/common
|
||||||
# common
|
# ${LLAMA_SRC}/ggml/src)
|
||||||
# android
|
|
||||||
# log
|
|
||||||
# )
|
|
||||||
#
|
|
||||||
# set_target_properties(${LIB_NAME} PROPERTIES
|
|
||||||
# OUTPUT_NAME "llama_android_${tier}"
|
|
||||||
# )
|
|
||||||
#endfunction()
|
|
||||||
#
|
|
||||||
#build_llama_tier(t0 "armv8-a+simd")
|
|
||||||
#build_llama_tier(t1 "armv8.2-a+dotprod")
|
|
||||||
#build_llama_tier(t2 "armv8.6-a+dotprod+i8mm")
|
|
||||||
#build_llama_tier(t3 "armv9-a+dotprod+i8mm+sve+sve2")
|
|
||||||
#build_llama_tier(t4 "armv9.2-a+dotprod+i8mm+sve+sve2+sme")
|
|
||||||
|
|
||||||
|
target_link_libraries(${wrapper} PRIVATE
|
||||||
add_library(${CMAKE_PROJECT_NAME} SHARED
|
|
||||||
# List C/C++ source files with relative paths to this CMakeLists.txt.
|
|
||||||
llama-android.cpp)
|
|
||||||
|
|
||||||
target_link_libraries(${CMAKE_PROJECT_NAME}
|
|
||||||
# List libraries link to the target library
|
|
||||||
llama
|
llama
|
||||||
common
|
common
|
||||||
android
|
android
|
||||||
log)
|
log)
|
||||||
|
|
||||||
|
set_target_properties(${wrapper} PROPERTIES OUTPUT_NAME ${wrapper})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# -----------------------------------------------------------
|
||||||
|
# 3. Build the five tiers (no KleidiAI for now)
|
||||||
|
# -----------------------------------------------------------
|
||||||
|
build_llama_tier(t0 "armv8-a+simd")
|
||||||
|
build_llama_tier(t1 "armv8.2-a+dotprod")
|
||||||
|
build_llama_tier(t2 "armv8.6-a+dotprod+i8mm")
|
||||||
|
build_llama_tier(t3 "armv9-a+dotprod+i8mm+sve+sve2")
|
||||||
|
build_llama_tier(t4 "armv9.2-a+dotprod+i8mm+sve+sve2+sme")
|
||||||
|
|
|
||||||
|
|
@ -240,7 +240,7 @@ class LLamaAndroid private constructor() : InferenceEngine {
|
||||||
private val TAG = LLamaAndroid::class.simpleName
|
private val TAG = LLamaAndroid::class.simpleName
|
||||||
|
|
||||||
// TODO-han.yin: replace with dynamic loader
|
// TODO-han.yin: replace with dynamic loader
|
||||||
private const val LIB_LLAMA_ANDROID = "llama_android"
|
private const val LIB_LLAMA_ANDROID = "llama_android_t4"
|
||||||
|
|
||||||
// Enforce only one instance of Llm.
|
// Enforce only one instance of Llm.
|
||||||
private val _instance: LLamaAndroid = LLamaAndroid()
|
private val _instance: LLamaAndroid = LLamaAndroid()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue