Demostración de incrustación:
Referencia: Flujos de trabajo de GitHub
git submodule update --init
1.configurar el NDK
Reemplace NDK con su ruta y versión de NDK local (mi ejemplo local de macOS)
export ANDROID_HOME= $HOME /Library/Android/sdk
export ANDROID_NDK_HOME= $HOME /Library/Android/sdk/ndk/26.1.10909125
export TOOLCHAIN= $ANDROID_NDK_HOME /toolchains/llvm/prebuilt/darwin-x86_64
export TARGET=aarch64-linux-android
export API=34
export AR= $TOOLCHAIN /bin/llvm-ar
export CC= $TOOLCHAIN /bin/ $TARGET$API -clang
export AS= $CC
export CXX= $TOOLCHAIN /bin/ $TARGET$API -clang++
export LD= $TOOLCHAIN /bin/ld
export RANLIB= $TOOLCHAIN /bin/llvm-ranlib
export STRIP= $TOOLCHAIN /bin/llvm-strip
export PATH= $PATH : $ANDROID_HOME /cmdline-tools/latest/bin
export PATH= $PATH : $TOOLCHAIN /bin
2.configurar el objetivo de Rust
rustup target add armv7-linux-androideabi i686-linux-android arm-linux-androideabi x86_64-linux-android aarch64-linux-android
3.enlazador de configuración
Después de eso, agregue lo siguiente como a $HOME/.cargo/config
(cree el archivo de configuración si no existe):
Siga: https://doc.rust-lang.org/beta/rustc/platform-support.html
PD: recuerda cambiar la ruta a tu NDK
[ target . i686-linux-android ]
linker = " /Users/phodal/Library/Android/sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android34-clang "
[ target . arm-linux-android ]
linker = " /Users/phodal/Library/Android/sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-android34-clang "
[ target . x86_64-linux-android ]
linker = " /Users/phodal/Library/Android/sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android34-clang "
[ target . aarch64-linux-android ]
linker = " /Users/phodal/Library/Android/sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android34-clang "
4.construir FFI
./gradlew cargoBuild
para iOS (muestra, no funciona)
rustup target add aarch64-apple-ios
cargo build --target=x86_64-apple-ios --release
5.ejecutar la aplicación
Herramientas: https://github.com/huggingface/optimum
1.configuración
pip install optimum[exporters,onnxruntime]
2.convertir ennx
optimum-cli export onnx -m Helsinki-NLP/opus-mt-zh-en --optimize O2 optus-mt-zh-en-onnx
3.cuantizar Onnx
optimum-cli onnxruntime quantize
--avx512
--onnx_model bert-tiny-onnx
-o quantized_bert-tiny-onnx
Ejemplos: https://github.com/unit-mesh/onnx-convert-test
Otros modelos de prueba:
Modelo de búsqueda en todas partes de IntelliJ IDEA:
Modelo de globo:
Caused by: ai.djl.engine.EngineException: Failed to load Huggingface native library.
at ai.djl.huggingface.tokenizers.jni.LibUtils.<clinit>(LibUtils.java:43)
at ai.djl.huggingface.tokenizers.jni.LibUtils.checkStatus(LibUtils.java:50)
at ai.djl.huggingface.tokenizers.HuggingFaceTokenizer.newInstance(HuggingFaceTokenizer.java:170)
at org.unitmesh.llmpoc.embedding.STSemantic$Companion.create(STSemantic.kt:78)
at org.unitmesh.llmpoc.MainActivity.onCreate(MainActivity.kt:33)
at android.app.Activity.performCreate(Activity.java:8143)
at android.app.Activity.performCreate(Activity.java:8114)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3513)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3700)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:8060)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
Caused by: java.lang.IllegalStateException: Cannot copy jni files
at ai.djl.huggingface.tokenizers.jni.LibUtils.copyJniLibraryFromClasspath(LibUtils.java:108)
at ai.djl.huggingface.tokenizers.jni.LibUtils.loadLibrary(LibUtils.java:66)
at ai.djl.huggingface.tokenizers.jni.LibUtils.<clinit>(LibUtils.java:41)
at ai.djl.huggingface.tokenizers.jni.LibUtils.checkStatus(LibUtils.java:50)
at ai.djl.huggingface.tokenizers.HuggingFaceTokenizer.newInstance(HuggingFaceTokenizer.java:170)
at org.unitmesh.llmpoc.embedding.STSemantic$Companion.create(STSemantic.kt:78)
at org.unitmesh.llmpoc.MainActivity.onCreate(MainActivity.kt:33)
at android.app.Activity.performCreate(Activity.java:8143)
at android.app.Activity.performCreate(Activity.java:8114)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3513)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3700)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:8060)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
Asunto: 2170
Solución: complemento Rust para Android Gradle
Error al crear el proyecto Rust para Android (Flutter): arm-linux-androideabi-ranlib no encontrado para la compilación OpenSSL
https://stackoverflow.com/questions/75943717/error-building-rust-project-for-android-flutter-arm-linux-androideabi-ranlib
Necesita actualizar la versión de Onnx Runtime
El hilo 'tokio-runtime-worker' entró en pánico al llamar Result::unwrap()
en un valor Err
: CreateSession(Msg("Error al cargar el modelo con error: /Users/runner/work/1/s/onnxruntime/core/ gráfico/model_load_utils.h:56 void onnxruntime:: model_load_utils::ValidateOpsetForDomain(const std::unordered_map<std::string, int> &, const logging::Logger &, bool, const std::string &, int) ONNX Runtime solo garantiza soporte para modelos estampados con las versiones oficiales de onnx opset publicadas. en desarrollo y el soporte para esto es limitado. Los esquemas del operador y otras funciones pueden cambiar antes del próximo lanzamiento de ONNX y, en este caso, ONNX Runtime no garantizará la compatibilidad con versiones anteriores. para el dominio com.ms.internal.nhwc es hasta el opset 18.n"))', /Volumes/source/ai/Inference/inference_core/src/embed.rs:49:18
Otros problemas: falló el uso de v1.9.0 para cargar ONNX Opset 15
Función de carga: System.LoadLibrary("tokenizers");
No se encontró ninguna implementación para org.unitmesh.tokenizer.huggingface.tokenizers.jni.TokenizersLibrary.createTokenizerFromString(java.lang.String) largo (probé Java_org_unitmesh_tokenizer_huggingface_tokenizers_jni_TokenizersLibrary_createTokenizerFromString y Java_org_unitmesh_tokenizer_huggingface_tokenizers_jni_TokenizersLibrary_createTokenizerFromString__Ljava_lang_String_2): ¿está cargada la biblioteca, por ejemplo, System.loadLibrary?