KV污染根治(还9/14的债):JNI 每次 generate 前 llama_memory_clear——翻译慢的主因(每批重建引擎=每次尝试重载E2B 4~6s)就此免除;Kotlin 侧 translateNumbered 改引擎复用(translateEngine ?: ensure),闲置60s卸载不变;纪要流水线多块共享引擎的潜在污染同步消除;.so 已重编部署(strip 4.32MB,6导出符号)
This commit is contained in:
parent
fe7c696589
commit
cea9892426
|
|
@ -2382,6 +2382,7 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ensureTranslateEngine(): LlmEngine? {
|
private fun ensureTranslateEngine(): LlmEngine? {
|
||||||
|
translateEngine?.let { return it }
|
||||||
val f = File(File(externalModelDir, summarizeModelDirName), summarizeGgufName)
|
val f = File(File(externalModelDir, summarizeModelDirName), summarizeGgufName)
|
||||||
if (!f.isFile) {
|
if (!f.isFile) {
|
||||||
Log.i(TAG, "translate model missing at ${f.absolutePath}; tap-translate off")
|
Log.i(TAG, "translate model missing at ${f.absolutePath}; tap-translate off")
|
||||||
|
|
@ -2400,18 +2401,17 @@ class MainActivity : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 一批 = 一个全新引擎(nativeGenerate 不清 KV 的 workaround)。
|
|
||||||
// items: key(通常是 sid 字符串) × 原文;返回 key × 译文,失败 null。
|
// items: key(通常是 sid 字符串) × 原文;返回 key × 译文,失败 null。
|
||||||
// 直译模式(2026-09-16):不再携带同轮上下文
|
// 直译模式(2026-09-16):不携带同轮上下文;引擎复用(JNI 每次生成前清 KV)
|
||||||
private fun translateNumbered(
|
private fun translateNumbered(
|
||||||
items: List<Pair<String, String>>, temp: Float = 0f,
|
items: List<Pair<String, String>>, temp: Float = 0f,
|
||||||
): Map<String, String>? {
|
): Map<String, String>? {
|
||||||
if (items.isEmpty()) return emptyMap()
|
if (items.isEmpty()) return emptyMap()
|
||||||
val targetName = transTargetName()
|
val targetName = transTargetName()
|
||||||
val langHint = transLangHint()
|
val langHint = transLangHint()
|
||||||
translateEngine?.let { runCatching { it.release() } }
|
// 引擎复用(2026-09-16,JNI 已加 KV 清除):不再按批重建——
|
||||||
translateEngine = null
|
// "每批重建"曾让每次尝试都重载 E2B ~4-6s,是翻译单句 30~40s 的主因
|
||||||
val engine = ensureTranslateEngine() ?: return null
|
val engine = translateEngine ?: ensureTranslateEngine() ?: return null
|
||||||
// 长句拆段:小模型对短输入才稳定;长句译到中途会"掉语言"
|
// 长句拆段:小模型对短输入才稳定;长句译到中途会"掉语言"
|
||||||
// (简体→繁体→别的语言)。拆 ≤140 字段一次 generate,段序拼回。
|
// (简体→繁体→别的语言)。拆 ≤140 字段一次 generate,段序拼回。
|
||||||
val segKeys = ArrayList<Pair<String, String>>()
|
val segKeys = ArrayList<Pair<String, String>>()
|
||||||
|
|
|
||||||
|
|
@ -165,6 +165,12 @@ Java_com_k2fsa_sherpa_onnx_LlmEngine_nativeGenerate(
|
||||||
std::lock_guard<std::mutex> lock(e->mu);
|
std::lock_guard<std::mutex> lock(e->mu);
|
||||||
e->abort.store(false);
|
e->abort.store(false);
|
||||||
|
|
||||||
|
// KV 清除(2026-09-16 根治):原实现不清 KV,同引擎连续 generate 会复读
|
||||||
|
// 上一条输出 -> Kotlin 侧被迫"每次尝试重建引擎"(E2B 每次重载 4~6s,
|
||||||
|
// 是翻译单句 30~40s 的主因)。每次生成前清空内存,引擎即可安全复用;
|
||||||
|
// 顺带修复纪要流水线多块共享引擎的潜在污染。
|
||||||
|
llama_memory_clear(llama_get_memory(e->ctx), true);
|
||||||
|
|
||||||
const std::string prompt = jstringToUtf8(env, jPrompt);
|
const std::string prompt = jstringToUtf8(env, jPrompt);
|
||||||
if (prompt.empty()) {
|
if (prompt.empty()) {
|
||||||
throwJava(env, "nativeGenerate: empty prompt");
|
throwJava(env, "nativeGenerate: empty prompt");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue