From c5c2738281a8ef7e4a061d1f648ad75be2a8b809 Mon Sep 17 00:00:00 2001 From: Richard Loyer Date: Sun, 24 May 2026 22:05:44 +0200 Subject: [PATCH] Valide device: generate() bout-en-bout OK (test_native), bridge pret integration --- dist/README.md | 3 +++ dist/jni/test_engine.c | 4 ++++ dist/jni/test_engine.cpp | 19 +++++++++++++++++++ dist/jni/test_native.cpp | 20 ++++++++++++++++++++ dist/test_engine | Bin 0 -> 7488 bytes dist/test_native | Bin 0 -> 63128 bytes 6 files changed, 46 insertions(+) create mode 100644 dist/jni/test_engine.c create mode 100644 dist/jni/test_engine.cpp create mode 100644 dist/jni/test_native.cpp create mode 100755 dist/test_engine create mode 100755 dist/test_native diff --git a/dist/README.md b/dist/README.md index 9042b20..d1d7225 100644 --- a/dist/README.md +++ b/dist/README.md @@ -28,3 +28,6 @@ decode CPU. Modèle dense (Qwen3) plein NPU ; hybride (Qwen3.5 DDDA) GDN sur NPU Thinker Guard-4B → 4 bullets ; Speaker 9B = SYS_KAZEIA+bullets. Mono-moteur, `reset()` entre tours. Prompts: voir RAPPORT_KAZEIA §8. `--reasoning-budget 0` impératif (sinon ramble anglais) : EngineLlmEngine met thinking off. Mesuré: 9B>4B qualité, Speaker=9B. → MODELS.md (choix), PERF.md (chiffres), PITFALLS.md (params_fit, no tty, OOM 30B+), INTEGRATION.md (détail API). API: load/generate/reset/free. + +## VALIDÉ DEVICE 24/05 +test_native (=logique generate bridge) sur Pad3: load 4B HTP+decode CPU+detok = OUT propre, exit0. Pipeline prefill-NPU/decode-CPU prouve end-to-end. dist/jni/test_native.cpp = harness reproductible. Bridge so: 4 symboles JNI + deps ok. Reste app: gradle+jniLibs+template chat. diff --git a/dist/jni/test_engine.c b/dist/jni/test_engine.c new file mode 100644 index 0000000..401b693 --- /dev/null +++ b/dist/jni/test_engine.c @@ -0,0 +1,4 @@ +#include +#include +extern jlong Java_com_kazeia_llm_EngineJni_load(JNIEnv*,jobject,jstring,jint); +extern jstring Java_com_kazeia_llm_EngineJni_generate(JNIEnv*,jobject,jlong,jstring,jint); diff --git a/dist/jni/test_engine.cpp b/dist/jni/test_engine.cpp new file mode 100644 index 0000000..10eb318 --- /dev/null +++ b/dist/jni/test_engine.cpp @@ -0,0 +1,19 @@ +// Stub JNIEnv: valide libkazeia_engine.so generate() sur device, sans Java. +#include +#include +#include +struct Str { const char* s; }; +static const char* getUTF(void*, Str* j, void*){ return j->s; } +static void relUTF(void*, Str*, const char*){} +static Str* newUTF(void*, const char* s){ static Str r; r.s=s; return &r; } +// table indices: 169=NewStringUTF,167=GetStringUTFChars,168=Release (suffisant ici) +int main(int c, char** v){ + void* p[300]={0}; p[169]=(void*)newUTF; p[167]=(void*)getUTF; p[168]=(void*)relUTF; + void** env=p; void* h=dlopen("libkazeia_engine.so",RTLD_NOW); + if(!h){printf("dlopen fail: %s\n",dlerror());return 1;} + auto load=(long(*)(void**,void*,Str*,int))dlsym(h,"Java_com_kazeia_llm_EngineJni_load"); + auto gen=(Str*(*)(void**,void*,long,Str*,int))dlsym(h,"Java_com_kazeia_llm_EngineJni_generate"); + Str mp{v[1]}, pr{"Kazeia psy. Patient: je vais mal. Une phrase:"}; + long k=load(env,0,&mp,2048); printf("h=%ld\n",k); if(!k)return 2; + Str* r=gen(env,0,k,&pr,20); printf("OUT:[%s]\n",r->s); return 0; +} diff --git a/dist/jni/test_native.cpp b/dist/jni/test_native.cpp new file mode 100644 index 0000000..aaee1f2 --- /dev/null +++ b/dist/jni/test_native.cpp @@ -0,0 +1,20 @@ +// Valide la logique de generate() (prefill HTP + greedy CPU) sur device, sans JNI. +#include +#include +#include +#include "llama.h" +int main(int c, char** v){ + llama_backend_init(); + auto mp=llama_model_default_params(); mp.n_gpu_layers=99; + auto m=llama_model_load_from_file(v[1],mp); if(!m){printf("nomodel\n");return 1;} + auto cp=llama_context_default_params(); cp.n_ctx=2048; cp.n_threads=8; cp.n_batch=512; + auto ctx=llama_init_from_model(m,cp); auto vo=llama_model_get_vocab(m); + auto s=llama_sampler_init_greedy(); + const char* pr="Kazeia psy. Patient: je vais mal. Une phrase:"; + int n=-llama_tokenize(vo,pr,strlen(pr),0,0,true,true); std::vectort(n); + llama_tokenize(vo,pr,strlen(pr),t.data(),n,true,true); + auto b=llama_batch_get_one(t.data(),n); printf("OUT:"); + for(int i=0;i<20&&llama_decode(ctx,b)==0;i++){auto id=llama_sampler_sample(s,ctx,-1); + if(llama_vocab_is_eog(vo,id))break; char z[128]; int l=llama_token_to_piece(vo,id,z,128,0,true); + if(l>0)fwrite(z,1,l,stdout); b=llama_batch_get_one(&id,1);} printf("\n"); return 0; +} diff --git a/dist/test_engine b/dist/test_engine new file mode 100755 index 0000000000000000000000000000000000000000..72b3530f6610ed686b676a4c0cc7eea749235fd8 GIT binary patch literal 7488 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