Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
aa47c1c5
Commit
aa47c1c5
authored
Dec 06, 2024
by
xuxzh1
🎱
Browse files
update
parent
0cb78a2f
Changes
274
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
0 additions
and
884 deletions
+0
-884
llm/llama.cpp/examples/llama.android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
....android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
+0
-0
llm/llama.cpp/examples/llama.android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
...id/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
+0
-0
llm/llama.cpp/examples/llama.android/app/src/main/res/values/colors.xml
...examples/llama.android/app/src/main/res/values/colors.xml
+0
-10
llm/llama.cpp/examples/llama.android/app/src/main/res/values/strings.xml
...xamples/llama.android/app/src/main/res/values/strings.xml
+0
-3
llm/llama.cpp/examples/llama.android/app/src/main/res/values/themes.xml
...examples/llama.android/app/src/main/res/values/themes.xml
+0
-5
llm/llama.cpp/examples/llama.android/app/src/main/res/xml/backup_rules.xml
...mples/llama.android/app/src/main/res/xml/backup_rules.xml
+0
-13
llm/llama.cpp/examples/llama.android/app/src/main/res/xml/data_extraction_rules.xml
...ma.android/app/src/main/res/xml/data_extraction_rules.xml
+0
-19
llm/llama.cpp/examples/llama.android/build.gradle.kts
llm/llama.cpp/examples/llama.android/build.gradle.kts
+0
-6
llm/llama.cpp/examples/llama.android/gradle.properties
llm/llama.cpp/examples/llama.android/gradle.properties
+0
-23
llm/llama.cpp/examples/llama.android/gradle/wrapper/gradle-wrapper.jar
.../examples/llama.android/gradle/wrapper/gradle-wrapper.jar
+0
-0
llm/llama.cpp/examples/llama.android/gradle/wrapper/gradle-wrapper.properties
...es/llama.android/gradle/wrapper/gradle-wrapper.properties
+0
-6
llm/llama.cpp/examples/llama.android/gradlew
llm/llama.cpp/examples/llama.android/gradlew
+0
-185
llm/llama.cpp/examples/llama.android/llama/.gitignore
llm/llama.cpp/examples/llama.android/llama/.gitignore
+0
-1
llm/llama.cpp/examples/llama.android/llama/build.gradle.kts
llm/llama.cpp/examples/llama.android/llama/build.gradle.kts
+0
-68
llm/llama.cpp/examples/llama.android/llama/consumer-rules.pro
...llama.cpp/examples/llama.android/llama/consumer-rules.pro
+0
-0
llm/llama.cpp/examples/llama.android/llama/proguard-rules.pro
...llama.cpp/examples/llama.android/llama/proguard-rules.pro
+0
-21
llm/llama.cpp/examples/llama.android/llama/src/androidTest/java/android/llama/cpp/ExampleInstrumentedTest.kt
...oidTest/java/android/llama/cpp/ExampleInstrumentedTest.kt
+0
-24
llm/llama.cpp/examples/llama.android/llama/src/main/AndroidManifest.xml
...examples/llama.android/llama/src/main/AndroidManifest.xml
+0
-4
llm/llama.cpp/examples/llama.android/llama/src/main/cpp/CMakeLists.txt
.../examples/llama.android/llama/src/main/cpp/CMakeLists.txt
+0
-53
llm/llama.cpp/examples/llama.android/llama/src/main/cpp/llama-android.cpp
...amples/llama.android/llama/src/main/cpp/llama-android.cpp
+0
-443
No files found.
Too many changes to show.
To preserve performance only
274 of 274+
files are displayed.
Plain diff
Email patch
llm/llama.cpp/examples/llama.android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
deleted
100644 → 0
View file @
0cb78a2f
3.75 KB
llm/llama.cpp/examples/llama.android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
deleted
100644 → 0
View file @
0cb78a2f
7.6 KB
llm/llama.cpp/examples/llama.android/app/src/main/res/values/colors.xml
deleted
100644 → 0
View file @
0cb78a2f
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color
name=
"purple_200"
>
#FFBB86FC
</color>
<color
name=
"purple_500"
>
#FF6200EE
</color>
<color
name=
"purple_700"
>
#FF3700B3
</color>
<color
name=
"teal_200"
>
#FF03DAC5
</color>
<color
name=
"teal_700"
>
#FF018786
</color>
<color
name=
"black"
>
#FF000000
</color>
<color
name=
"white"
>
#FFFFFFFF
</color>
</resources>
llm/llama.cpp/examples/llama.android/app/src/main/res/values/strings.xml
deleted
100644 → 0
View file @
0cb78a2f
<resources>
<string
name=
"app_name"
>
LlamaAndroid
</string>
</resources>
llm/llama.cpp/examples/llama.android/app/src/main/res/values/themes.xml
deleted
100644 → 0
View file @
0cb78a2f
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style
name=
"Theme.LlamaAndroid"
parent=
"android:Theme.Material.Light.NoActionBar"
/>
</resources>
llm/llama.cpp/examples/llama.android/app/src/main/res/xml/backup_rules.xml
deleted
100644 → 0
View file @
0cb78a2f
<?xml version="1.0" encoding="utf-8"?>
<!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>
llm/llama.cpp/examples/llama.android/app/src/main/res/xml/data_extraction_rules.xml
deleted
100644 → 0
View file @
0cb78a2f
<?xml version="1.0" encoding="utf-8"?>
<!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>
llm/llama.cpp/examples/llama.android/build.gradle.kts
deleted
100644 → 0
View file @
0cb78a2f
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins
{
id
(
"com.android.application"
)
version
"8.2.0"
apply
false
id
(
"org.jetbrains.kotlin.android"
)
version
"1.9.0"
apply
false
id
(
"com.android.library"
)
version
"8.2.0"
apply
false
}
llm/llama.cpp/examples/llama.android/gradle.properties
deleted
100644 → 0
View file @
0cb78a2f
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs
=
-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX
=
true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style
=
official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass
=
true
llm/llama.cpp/examples/llama.android/gradle/wrapper/gradle-wrapper.jar
deleted
100644 → 0
View file @
0cb78a2f
File deleted
llm/llama.cpp/examples/llama.android/gradle/wrapper/gradle-wrapper.properties
deleted
100644 → 0
View file @
0cb78a2f
#Thu Dec 21 14:31:09 AEDT 2023
distributionBase
=
GRADLE_USER_HOME
distributionPath
=
wrapper/dists
distributionUrl
=
https
\:
//services.gradle.org/distributions/gradle-8.2-bin.zip
zipStoreBase
=
GRADLE_USER_HOME
zipStorePath
=
wrapper/dists
llm/llama.cpp/examples/llama.android/gradlew
deleted
100644 → 0
View file @
0cb78a2f
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG
=
"
$0
"
# Need this for relative symlinks.
while
[
-h
"
$PRG
"
]
;
do
ls
=
`
ls
-ld
"
$PRG
"
`
link
=
`
expr
"
$ls
"
:
'.*-> \(.*\)$'
`
if
expr
"
$link
"
:
'/.*'
>
/dev/null
;
then
PRG
=
"
$link
"
else
PRG
=
`
dirname
"
$PRG
"
`
"/
$link
"
fi
done
SAVED
=
"
`
pwd
`
"
cd
"
`
dirname
\"
$PRG
\"
`
/"
>
/dev/null
APP_HOME
=
"
`
pwd
-P
`
"
cd
"
$SAVED
"
>
/dev/null
APP_NAME
=
"Gradle"
APP_BASE_NAME
=
`
basename
"
$0
"
`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS
=
'"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD
=
"maximum"
warn
()
{
echo
"
$*
"
}
die
()
{
echo
echo
"
$*
"
echo
exit
1
}
# OS specific support (must be 'true' or 'false').
cygwin
=
false
msys
=
false
darwin
=
false
nonstop
=
false
case
"
`
uname
`
"
in
CYGWIN
*
)
cygwin
=
true
;;
Darwin
*
)
darwin
=
true
;;
MINGW
*
)
msys
=
true
;;
NONSTOP
*
)
nonstop
=
true
;;
esac
CLASSPATH
=
$APP_HOME
/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if
[
-n
"
$JAVA_HOME
"
]
;
then
if
[
-x
"
$JAVA_HOME
/jre/sh/java"
]
;
then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD
=
"
$JAVA_HOME
/jre/sh/java"
else
JAVACMD
=
"
$JAVA_HOME
/bin/java"
fi
if
[
!
-x
"
$JAVACMD
"
]
;
then
die
"ERROR: JAVA_HOME is set to an invalid directory:
$JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD
=
"java"
which java
>
/dev/null 2>&1
||
die
"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if
[
"
$cygwin
"
=
"false"
-a
"
$darwin
"
=
"false"
-a
"
$nonstop
"
=
"false"
]
;
then
MAX_FD_LIMIT
=
`
ulimit
-H
-n
`
if
[
$?
-eq
0
]
;
then
if
[
"
$MAX_FD
"
=
"maximum"
-o
"
$MAX_FD
"
=
"max"
]
;
then
MAX_FD
=
"
$MAX_FD_LIMIT
"
fi
ulimit
-n
$MAX_FD
if
[
$?
-ne
0
]
;
then
warn
"Could not set maximum file descriptor limit:
$MAX_FD
"
fi
else
warn
"Could not query maximum file descriptor limit:
$MAX_FD_LIMIT
"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if
$darwin
;
then
GRADLE_OPTS
=
"
$GRADLE_OPTS
\"
-Xdock:name=
$APP_NAME
\"
\"
-Xdock:icon=
$APP_HOME
/media/gradle.icns
\"
"
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if
[
"
$cygwin
"
=
"true"
-o
"
$msys
"
=
"true"
]
;
then
APP_HOME
=
`
cygpath
--path
--mixed
"
$APP_HOME
"
`
CLASSPATH
=
`
cygpath
--path
--mixed
"
$CLASSPATH
"
`
JAVACMD
=
`
cygpath
--unix
"
$JAVACMD
"
`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW
=
`
find
-L
/
-maxdepth
1
-mindepth
1
-type
d 2>/dev/null
`
SEP
=
""
for
dir
in
$ROOTDIRSRAW
;
do
ROOTDIRS
=
"
$ROOTDIRS$SEP$dir
"
SEP
=
"|"
done
OURCYGPATTERN
=
"(^(
$ROOTDIRS
))"
# Add a user-defined pattern to the cygpath arguments
if
[
"
$GRADLE_CYGPATTERN
"
!=
""
]
;
then
OURCYGPATTERN
=
"
$OURCYGPATTERN
|(
$GRADLE_CYGPATTERN
)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i
=
0
for
arg
in
"
$@
"
;
do
CHECK
=
`
echo
"
$arg
"
|egrep
-c
"
$OURCYGPATTERN
"
-
`
CHECK2
=
`
echo
"
$arg
"
|egrep
-c
"^-"
`
### Determine if an option
if
[
$CHECK
-ne
0
]
&&
[
$CHECK2
-eq
0
]
;
then
### Added a condition
eval
`
echo
args
$i
`
=
`
cygpath
--path
--ignore
--mixed
"
$arg
"
`
else
eval
`
echo
args
$i
`
=
"
\"
$arg
\"
"
fi
i
=
`
expr
$i
+ 1
`
done
case
$i
in
0
)
set
--
;;
1
)
set
--
"
$args0
"
;;
2
)
set
--
"
$args0
"
"
$args1
"
;;
3
)
set
--
"
$args0
"
"
$args1
"
"
$args2
"
;;
4
)
set
--
"
$args0
"
"
$args1
"
"
$args2
"
"
$args3
"
;;
5
)
set
--
"
$args0
"
"
$args1
"
"
$args2
"
"
$args3
"
"
$args4
"
;;
6
)
set
--
"
$args0
"
"
$args1
"
"
$args2
"
"
$args3
"
"
$args4
"
"
$args5
"
;;
7
)
set
--
"
$args0
"
"
$args1
"
"
$args2
"
"
$args3
"
"
$args4
"
"
$args5
"
"
$args6
"
;;
8
)
set
--
"
$args0
"
"
$args1
"
"
$args2
"
"
$args3
"
"
$args4
"
"
$args5
"
"
$args6
"
"
$args7
"
;;
9
)
set
--
"
$args0
"
"
$args1
"
"
$args2
"
"
$args3
"
"
$args4
"
"
$args5
"
"
$args6
"
"
$args7
"
"
$args8
"
;;
esac
fi
# Escape application args
save
()
{
for
i
do
printf
%s
\\
n
"
$i
"
|
sed
"s/'/'
\\\\
''/g;1s/^/'/;
\$
s/
\$
/'
\\\\
/"
;
done
echo
" "
}
APP_ARGS
=
`
save
"
$@
"
`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set
--
$DEFAULT_JVM_OPTS
$JAVA_OPTS
$GRADLE_OPTS
"
\"
-Dorg.gradle.appname=
$APP_BASE_NAME
\"
"
-classpath
"
\"
$CLASSPATH
\"
"
org.gradle.wrapper.GradleWrapperMain
"
$APP_ARGS
"
exec
"
$JAVACMD
"
"
$@
"
llm/llama.cpp/examples/llama.android/llama/.gitignore
deleted
100644 → 0
View file @
0cb78a2f
/build
llm/llama.cpp/examples/llama.android/llama/build.gradle.kts
deleted
100644 → 0
View file @
0cb78a2f
plugins
{
id
(
"com.android.library"
)
id
(
"org.jetbrains.kotlin.android"
)
}
android
{
namespace
=
"android.llama.cpp"
compileSdk
=
34
defaultConfig
{
minSdk
=
33
testInstrumentationRunner
=
"androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles
(
"consumer-rules.pro"
)
ndk
{
// Add NDK properties if wanted, e.g.
// abiFilters += listOf("arm64-v8a")
}
externalNativeBuild
{
cmake
{
arguments
+=
"-DCMAKE_BUILD_TYPE=Release"
cppFlags
+=
listOf
()
arguments
+=
listOf
()
cppFlags
(
""
)
}
}
}
buildTypes
{
release
{
isMinifyEnabled
=
false
proguardFiles
(
getDefaultProguardFile
(
"proguard-android-optimize.txt"
),
"proguard-rules.pro"
)
}
}
externalNativeBuild
{
cmake
{
path
(
"src/main/cpp/CMakeLists.txt"
)
version
=
"3.22.1"
}
}
compileOptions
{
sourceCompatibility
=
JavaVersion
.
VERSION_1_8
targetCompatibility
=
JavaVersion
.
VERSION_1_8
}
kotlinOptions
{
jvmTarget
=
"1.8"
}
packaging
{
resources
{
excludes
+=
"/META-INF/{AL2.0,LGPL2.1}"
}
}
}
dependencies
{
implementation
(
"androidx.core:core-ktx:1.12.0"
)
implementation
(
"androidx.appcompat:appcompat:1.6.1"
)
implementation
(
"com.google.android.material:material:1.11.0"
)
testImplementation
(
"junit:junit:4.13.2"
)
androidTestImplementation
(
"androidx.test.ext:junit:1.1.5"
)
androidTestImplementation
(
"androidx.test.espresso:espresso-core:3.5.1"
)
}
llm/llama.cpp/examples/llama.android/llama/consumer-rules.pro
deleted
100644 → 0
View file @
0cb78a2f
llm/llama.cpp/examples/llama.android/llama/proguard-rules.pro
deleted
100644 → 0
View file @
0cb78a2f
# Add project specific ProGuard rules here.
#
You
can
control
the
set
of
applied
configuration
files
using
the
#
proguardFiles
setting
in
build
.
gradle
.
#
#
For
more
details
,
see
#
http
://
developer
.
android
.
com
/
guide
/
developing
/
tools
/
proguard
.
html
#
If
your
project
uses
WebView
with
JS
,
uncomment
the
following
#
and
specify
the
fully
qualified
class
name
to
the
JavaScript
interface
#
class
:
#-
keepclassmembers
class
fqcn
.
of
.
javascript
.
interface
.
for
.
webview
{
#
public
*
;
#
}
#
Uncomment
this
to
preserve
the
line
number
information
for
#
debugging
stack
traces
.
#-
keepattributes
SourceFile
,
LineNumberTable
#
If
you
keep
the
line
number
information
,
uncomment
this
to
#
hide
the
original
source
file
name
.
#-
renamesourcefileattribute
SourceFile
llm/llama.cpp/examples/llama.android/llama/src/androidTest/java/android/llama/cpp/ExampleInstrumentedTest.kt
deleted
100644 → 0
View file @
0cb78a2f
package
android.llama.cpp
import
androidx.test.platform.app.InstrumentationRegistry
import
androidx.test.ext.junit.runners.AndroidJUnit4
import
org.junit.Test
import
org.junit.runner.RunWith
import
org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith
(
AndroidJUnit4
::
class
)
class
ExampleInstrumentedTest
{
@Test
fun
useAppContext
()
{
// Context of the app under test.
val
appContext
=
InstrumentationRegistry
.
getInstrumentation
().
targetContext
assertEquals
(
"android.llama.cpp.test"
,
appContext
.
packageName
)
}
}
llm/llama.cpp/examples/llama.android/llama/src/main/AndroidManifest.xml
deleted
100644 → 0
View file @
0cb78a2f
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
</manifest>
llm/llama.cpp/examples/llama.android/llama/src/main/cpp/CMakeLists.txt
deleted
100644 → 0
View file @
0cb78a2f
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.
# Sets the minimum CMake version required for this project.
cmake_minimum_required
(
VERSION 3.22.1
)
# Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
# Since this is the top level CMakeLists.txt, the project name is also accessible
# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
# build script scope).
project
(
"llama-android"
)
#include(FetchContent)
#FetchContent_Declare(
# llama
# GIT_REPOSITORY https://github.com/ggerganov/llama.cpp
# GIT_TAG master
#)
# Also provides "common"
#FetchContent_MakeAvailable(llama)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#
# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define
# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME}
# is preferred for the same purpose.
#
#load local llama.cpp
add_subdirectory
(
../../../../../../ build-llama
)
# In order to load a library into your app from Java/Kotlin, you must call
# System.loadLibrary() and pass the name of the library defined here;
# for GameActivity/NativeActivity derived applications, the same library name must be
# used in the AndroidManifest.xml file.
add_library
(
${
CMAKE_PROJECT_NAME
}
SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
llama-android.cpp
)
# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
target_link_libraries
(
${
CMAKE_PROJECT_NAME
}
# List libraries link to the target library
llama
common
android
log
)
llm/llama.cpp/examples/llama.android/llama/src/main/cpp/llama-android.cpp
deleted
100644 → 0
View file @
0cb78a2f
#include <android/log.h>
#include <jni.h>
#include <iomanip>
#include <math.h>
#include <string>
#include <unistd.h>
#include "llama.h"
#include "common.h"
// Write C++ code here.
//
// Do not forget to dynamically load the C++ library into your application.
//
// For instance,
//
// In MainActivity.java:
// static {
// System.loadLibrary("llama-android");
// }
//
// Or, in MainActivity.kt:
// companion object {
// init {
// System.loadLibrary("llama-android")
// }
// }
#define TAG "llama-android.cpp"
#define LOGi(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGe(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
jclass
la_int_var
;
jmethodID
la_int_var_value
;
jmethodID
la_int_var_inc
;
std
::
string
cached_token_chars
;
bool
is_valid_utf8
(
const
char
*
string
)
{
if
(
!
string
)
{
return
true
;
}
const
unsigned
char
*
bytes
=
(
const
unsigned
char
*
)
string
;
int
num
;
while
(
*
bytes
!=
0x00
)
{
if
((
*
bytes
&
0x80
)
==
0x00
)
{
// U+0000 to U+007F
num
=
1
;
}
else
if
((
*
bytes
&
0xE0
)
==
0xC0
)
{
// U+0080 to U+07FF
num
=
2
;
}
else
if
((
*
bytes
&
0xF0
)
==
0xE0
)
{
// U+0800 to U+FFFF
num
=
3
;
}
else
if
((
*
bytes
&
0xF8
)
==
0xF0
)
{
// U+10000 to U+10FFFF
num
=
4
;
}
else
{
return
false
;
}
bytes
+=
1
;
for
(
int
i
=
1
;
i
<
num
;
++
i
)
{
if
((
*
bytes
&
0xC0
)
!=
0x80
)
{
return
false
;
}
bytes
+=
1
;
}
}
return
true
;
}
static
void
log_callback
(
ggml_log_level
level
,
const
char
*
fmt
,
void
*
data
)
{
if
(
level
==
GGML_LOG_LEVEL_ERROR
)
__android_log_print
(
ANDROID_LOG_ERROR
,
TAG
,
fmt
,
data
);
else
if
(
level
==
GGML_LOG_LEVEL_INFO
)
__android_log_print
(
ANDROID_LOG_INFO
,
TAG
,
fmt
,
data
);
else
if
(
level
==
GGML_LOG_LEVEL_WARN
)
__android_log_print
(
ANDROID_LOG_WARN
,
TAG
,
fmt
,
data
);
else
__android_log_print
(
ANDROID_LOG_DEFAULT
,
TAG
,
fmt
,
data
);
}
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_android_llama_cpp_LLamaAndroid_load_1model
(
JNIEnv
*
env
,
jobject
,
jstring
filename
)
{
llama_model_params
model_params
=
llama_model_default_params
();
auto
path_to_model
=
env
->
GetStringUTFChars
(
filename
,
0
);
LOGi
(
"Loading model from %s"
,
path_to_model
);
auto
model
=
llama_load_model_from_file
(
path_to_model
,
model_params
);
env
->
ReleaseStringUTFChars
(
filename
,
path_to_model
);
if
(
!
model
)
{
LOGe
(
"load_model() failed"
);
env
->
ThrowNew
(
env
->
FindClass
(
"java/lang/IllegalStateException"
),
"load_model() failed"
);
return
0
;
}
return
reinterpret_cast
<
jlong
>
(
model
);
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_android_llama_cpp_LLamaAndroid_free_1model
(
JNIEnv
*
,
jobject
,
jlong
model
)
{
llama_free_model
(
reinterpret_cast
<
llama_model
*>
(
model
));
}
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_android_llama_cpp_LLamaAndroid_new_1context
(
JNIEnv
*
env
,
jobject
,
jlong
jmodel
)
{
auto
model
=
reinterpret_cast
<
llama_model
*>
(
jmodel
);
if
(
!
model
)
{
LOGe
(
"new_context(): model cannot be null"
);
env
->
ThrowNew
(
env
->
FindClass
(
"java/lang/IllegalArgumentException"
),
"Model cannot be null"
);
return
0
;
}
int
n_threads
=
std
::
max
(
1
,
std
::
min
(
8
,
(
int
)
sysconf
(
_SC_NPROCESSORS_ONLN
)
-
2
));
LOGi
(
"Using %d threads"
,
n_threads
);
llama_context_params
ctx_params
=
llama_context_default_params
();
ctx_params
.
seed
=
1234
;
ctx_params
.
n_ctx
=
2048
;
ctx_params
.
n_threads
=
n_threads
;
ctx_params
.
n_threads_batch
=
n_threads
;
llama_context
*
context
=
llama_new_context_with_model
(
model
,
ctx_params
);
if
(
!
context
)
{
LOGe
(
"llama_new_context_with_model() returned null)"
);
env
->
ThrowNew
(
env
->
FindClass
(
"java/lang/IllegalStateException"
),
"llama_new_context_with_model() returned null)"
);
return
0
;
}
return
reinterpret_cast
<
jlong
>
(
context
);
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_android_llama_cpp_LLamaAndroid_free_1context
(
JNIEnv
*
,
jobject
,
jlong
context
)
{
llama_free
(
reinterpret_cast
<
llama_context
*>
(
context
));
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_android_llama_cpp_LLamaAndroid_backend_1free
(
JNIEnv
*
,
jobject
)
{
llama_backend_free
();
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_android_llama_cpp_LLamaAndroid_log_1to_1android
(
JNIEnv
*
,
jobject
)
{
llama_log_set
(
log_callback
,
NULL
);
}
extern
"C"
JNIEXPORT
jstring
JNICALL
Java_android_llama_cpp_LLamaAndroid_bench_1model
(
JNIEnv
*
env
,
jobject
,
jlong
context_pointer
,
jlong
model_pointer
,
jlong
batch_pointer
,
jint
pp
,
jint
tg
,
jint
pl
,
jint
nr
)
{
auto
pp_avg
=
0.0
;
auto
tg_avg
=
0.0
;
auto
pp_std
=
0.0
;
auto
tg_std
=
0.0
;
const
auto
context
=
reinterpret_cast
<
llama_context
*>
(
context_pointer
);
const
auto
model
=
reinterpret_cast
<
llama_model
*>
(
model_pointer
);
const
auto
batch
=
reinterpret_cast
<
llama_batch
*>
(
batch_pointer
);
const
int
n_ctx
=
llama_n_ctx
(
context
);
LOGi
(
"n_ctx = %d"
,
n_ctx
);
int
i
,
j
;
int
nri
;
for
(
nri
=
0
;
nri
<
nr
;
nri
++
)
{
LOGi
(
"Benchmark prompt processing (pp)"
);
llama_batch_clear
(
*
batch
);
const
int
n_tokens
=
pp
;
for
(
i
=
0
;
i
<
n_tokens
;
i
++
)
{
llama_batch_add
(
*
batch
,
0
,
i
,
{
0
},
false
);
}
batch
->
logits
[
batch
->
n_tokens
-
1
]
=
true
;
llama_kv_cache_clear
(
context
);
const
auto
t_pp_start
=
ggml_time_us
();
if
(
llama_decode
(
context
,
*
batch
)
!=
0
)
{
LOGi
(
"llama_decode() failed during prompt processing"
);
}
const
auto
t_pp_end
=
ggml_time_us
();
// bench text generation
LOGi
(
"Benchmark text generation (tg)"
);
llama_kv_cache_clear
(
context
);
const
auto
t_tg_start
=
ggml_time_us
();
for
(
i
=
0
;
i
<
tg
;
i
++
)
{
llama_batch_clear
(
*
batch
);
for
(
j
=
0
;
j
<
pl
;
j
++
)
{
llama_batch_add
(
*
batch
,
0
,
i
,
{
j
},
true
);
}
LOGi
(
"llama_decode() text generation: %d"
,
i
);
if
(
llama_decode
(
context
,
*
batch
)
!=
0
)
{
LOGi
(
"llama_decode() failed during text generation"
);
}
}
const
auto
t_tg_end
=
ggml_time_us
();
llama_kv_cache_clear
(
context
);
const
auto
t_pp
=
double
(
t_pp_end
-
t_pp_start
)
/
1000000.0
;
const
auto
t_tg
=
double
(
t_tg_end
-
t_tg_start
)
/
1000000.0
;
const
auto
speed_pp
=
double
(
pp
)
/
t_pp
;
const
auto
speed_tg
=
double
(
pl
*
tg
)
/
t_tg
;
pp_avg
+=
speed_pp
;
tg_avg
+=
speed_tg
;
pp_std
+=
speed_pp
*
speed_pp
;
tg_std
+=
speed_tg
*
speed_tg
;
LOGi
(
"pp %f t/s, tg %f t/s"
,
speed_pp
,
speed_tg
);
}
pp_avg
/=
double
(
nr
);
tg_avg
/=
double
(
nr
);
if
(
nr
>
1
)
{
pp_std
=
sqrt
(
pp_std
/
double
(
nr
-
1
)
-
pp_avg
*
pp_avg
*
double
(
nr
)
/
double
(
nr
-
1
));
tg_std
=
sqrt
(
tg_std
/
double
(
nr
-
1
)
-
tg_avg
*
tg_avg
*
double
(
nr
)
/
double
(
nr
-
1
));
}
else
{
pp_std
=
0
;
tg_std
=
0
;
}
char
model_desc
[
128
];
llama_model_desc
(
model
,
model_desc
,
sizeof
(
model_desc
));
const
auto
model_size
=
double
(
llama_model_size
(
model
))
/
1024.0
/
1024.0
/
1024.0
;
const
auto
model_n_params
=
double
(
llama_model_n_params
(
model
))
/
1e9
;
const
auto
backend
=
"(Android)"
;
// TODO: What should this be?
std
::
stringstream
result
;
result
<<
std
::
setprecision
(
2
);
result
<<
"| model | size | params | backend | test | t/s |
\n
"
;
result
<<
"| --- | --- | --- | --- | --- | --- |
\n
"
;
result
<<
"| "
<<
model_desc
<<
" | "
<<
model_size
<<
"GiB | "
<<
model_n_params
<<
"B | "
<<
backend
<<
" | pp "
<<
pp
<<
" | "
<<
pp_avg
<<
" ± "
<<
pp_std
<<
" |
\n
"
;
result
<<
"| "
<<
model_desc
<<
" | "
<<
model_size
<<
"GiB | "
<<
model_n_params
<<
"B | "
<<
backend
<<
" | tg "
<<
tg
<<
" | "
<<
tg_avg
<<
" ± "
<<
tg_std
<<
" |
\n
"
;
return
env
->
NewStringUTF
(
result
.
str
().
c_str
());
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_android_llama_cpp_LLamaAndroid_free_1batch
(
JNIEnv
*
,
jobject
,
jlong
batch_pointer
)
{
llama_batch_free
(
*
reinterpret_cast
<
llama_batch
*>
(
batch_pointer
));
}
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_android_llama_cpp_LLamaAndroid_new_1batch
(
JNIEnv
*
,
jobject
,
jint
n_tokens
,
jint
embd
,
jint
n_seq_max
)
{
// Source: Copy of llama.cpp:llama_batch_init but heap-allocated.
llama_batch
*
batch
=
new
llama_batch
{
0
,
nullptr
,
nullptr
,
nullptr
,
nullptr
,
nullptr
,
nullptr
,
0
,
0
,
0
,
};
if
(
embd
)
{
batch
->
embd
=
(
float
*
)
malloc
(
sizeof
(
float
)
*
n_tokens
*
embd
);
}
else
{
batch
->
token
=
(
llama_token
*
)
malloc
(
sizeof
(
llama_token
)
*
n_tokens
);
}
batch
->
pos
=
(
llama_pos
*
)
malloc
(
sizeof
(
llama_pos
)
*
n_tokens
);
batch
->
n_seq_id
=
(
int32_t
*
)
malloc
(
sizeof
(
int32_t
)
*
n_tokens
);
batch
->
seq_id
=
(
llama_seq_id
**
)
malloc
(
sizeof
(
llama_seq_id
*
)
*
n_tokens
);
for
(
int
i
=
0
;
i
<
n_tokens
;
++
i
)
{
batch
->
seq_id
[
i
]
=
(
llama_seq_id
*
)
malloc
(
sizeof
(
llama_seq_id
)
*
n_seq_max
);
}
batch
->
logits
=
(
int8_t
*
)
malloc
(
sizeof
(
int8_t
)
*
n_tokens
);
return
reinterpret_cast
<
jlong
>
(
batch
);
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_android_llama_cpp_LLamaAndroid_backend_1init
(
JNIEnv
*
,
jobject
)
{
llama_backend_init
();
}
extern
"C"
JNIEXPORT
jstring
JNICALL
Java_android_llama_cpp_LLamaAndroid_system_1info
(
JNIEnv
*
env
,
jobject
)
{
return
env
->
NewStringUTF
(
llama_print_system_info
());
}
extern
"C"
JNIEXPORT
jint
JNICALL
Java_android_llama_cpp_LLamaAndroid_completion_1init
(
JNIEnv
*
env
,
jobject
,
jlong
context_pointer
,
jlong
batch_pointer
,
jstring
jtext
,
jint
n_len
)
{
cached_token_chars
.
clear
();
const
auto
text
=
env
->
GetStringUTFChars
(
jtext
,
0
);
const
auto
context
=
reinterpret_cast
<
llama_context
*>
(
context_pointer
);
const
auto
batch
=
reinterpret_cast
<
llama_batch
*>
(
batch_pointer
);
const
auto
tokens_list
=
llama_tokenize
(
context
,
text
,
1
);
auto
n_ctx
=
llama_n_ctx
(
context
);
auto
n_kv_req
=
tokens_list
.
size
()
+
(
n_len
-
tokens_list
.
size
());
LOGi
(
"n_len = %d, n_ctx = %d, n_kv_req = %d"
,
n_len
,
n_ctx
,
n_kv_req
);
if
(
n_kv_req
>
n_ctx
)
{
LOGe
(
"error: n_kv_req > n_ctx, the required KV cache size is not big enough"
);
}
for
(
auto
id
:
tokens_list
)
{
LOGi
(
"%s"
,
llama_token_to_piece
(
context
,
id
).
c_str
());
}
llama_batch_clear
(
*
batch
);
// evaluate the initial prompt
for
(
auto
i
=
0
;
i
<
tokens_list
.
size
();
i
++
)
{
llama_batch_add
(
*
batch
,
tokens_list
[
i
],
i
,
{
0
},
false
);
}
// llama_decode will output logits only for the last token of the prompt
batch
->
logits
[
batch
->
n_tokens
-
1
]
=
true
;
if
(
llama_decode
(
context
,
*
batch
)
!=
0
)
{
LOGe
(
"llama_decode() failed"
);
}
env
->
ReleaseStringUTFChars
(
jtext
,
text
);
return
batch
->
n_tokens
;
}
extern
"C"
JNIEXPORT
jstring
JNICALL
Java_android_llama_cpp_LLamaAndroid_completion_1loop
(
JNIEnv
*
env
,
jobject
,
jlong
context_pointer
,
jlong
batch_pointer
,
jint
n_len
,
jobject
intvar_ncur
)
{
const
auto
context
=
reinterpret_cast
<
llama_context
*>
(
context_pointer
);
const
auto
batch
=
reinterpret_cast
<
llama_batch
*>
(
batch_pointer
);
const
auto
model
=
llama_get_model
(
context
);
if
(
!
la_int_var
)
la_int_var
=
env
->
GetObjectClass
(
intvar_ncur
);
if
(
!
la_int_var_value
)
la_int_var_value
=
env
->
GetMethodID
(
la_int_var
,
"getValue"
,
"()I"
);
if
(
!
la_int_var_inc
)
la_int_var_inc
=
env
->
GetMethodID
(
la_int_var
,
"inc"
,
"()V"
);
auto
n_vocab
=
llama_n_vocab
(
model
);
auto
logits
=
llama_get_logits_ith
(
context
,
batch
->
n_tokens
-
1
);
std
::
vector
<
llama_token_data
>
candidates
;
candidates
.
reserve
(
n_vocab
);
for
(
llama_token
token_id
=
0
;
token_id
<
n_vocab
;
token_id
++
)
{
candidates
.
emplace_back
(
llama_token_data
{
token_id
,
logits
[
token_id
],
0.0
f
});
}
llama_token_data_array
candidates_p
=
{
candidates
.
data
(),
candidates
.
size
(),
false
};
// sample the most likely token
const
auto
new_token_id
=
llama_sample_token_greedy
(
context
,
&
candidates_p
);
const
auto
n_cur
=
env
->
CallIntMethod
(
intvar_ncur
,
la_int_var_value
);
if
(
llama_token_is_eog
(
model
,
new_token_id
)
||
n_cur
==
n_len
)
{
return
nullptr
;
}
auto
new_token_chars
=
llama_token_to_piece
(
context
,
new_token_id
);
cached_token_chars
+=
new_token_chars
;
jstring
new_token
=
nullptr
;
if
(
is_valid_utf8
(
cached_token_chars
.
c_str
()))
{
new_token
=
env
->
NewStringUTF
(
cached_token_chars
.
c_str
());
LOGi
(
"cached: %s, new_token_chars: `%s`, id: %d"
,
cached_token_chars
.
c_str
(),
new_token_chars
.
c_str
(),
new_token_id
);
cached_token_chars
.
clear
();
}
else
{
new_token
=
env
->
NewStringUTF
(
""
);
}
llama_batch_clear
(
*
batch
);
llama_batch_add
(
*
batch
,
new_token_id
,
n_cur
,
{
0
},
true
);
env
->
CallVoidMethod
(
intvar_ncur
,
la_int_var_inc
);
if
(
llama_decode
(
context
,
*
batch
)
!=
0
)
{
LOGe
(
"llama_decode() returned null"
);
}
return
new_token
;
}
extern
"C"
JNIEXPORT
void
JNICALL
Java_android_llama_cpp_LLamaAndroid_kv_1cache_1clear
(
JNIEnv
*
,
jobject
,
jlong
context
)
{
llama_kv_cache_clear
(
reinterpret_cast
<
llama_context
*>
(
context
));
}
Prev
1
…
9
10
11
12
13
14
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment