llama.cpp backend: настоящий по-токенный стриминг, лок на контекст, отмена при обрыве клиента#1
Merged
Ferraronp merged 2 commits intoJun 17, 2026
Conversation
… отмена и join в finally - _llama_cpp_job пишет токены в tokens_list ПО ОДНОМУ через on_token-колбэк: раньше был один extend() ПОСЛЕ всей генерации — flow не мог начаться, пока LLM не закончит полностью (TTFB = вся генерация, стриминг фиктивный) - threading.Condition вместо поллинга: консьюмер просыпается сразу по токену - self._llama_lock: общий llama.cpp контекст не thread-safe, параллельный reset() ломал KV-кеш живой генерации - cancel_event + try/finally join(30): при обрыве клиента (GeneratorExit) join после цикла не выполнялся — осиротевший поток продолжал генерацию
… pop в finally - tts_stream_external_llm: принимает tokens_cond — консьюмер просыпается сразу по появлению токена (поллинг добавлял до 100мс на чанк); done и available читаются под одним локом — убрана гонка со «протухшим» available, из-за которой хвост мог уйти в финальный чанк раньше времени - tts_with_external_tokens: pop hift_cache в finally — исключение в token2wav больше не оставляет вечную запись в hift_cache_dict (утечка памяти)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Проблемы и фиксы
1. Стриминг был фиктивным (главное)
_llama_cpp_jobзаполнялtokens_listоднимextend()после полного завершения генерации LLM — flow matching не мог начаться, пока LLM не догенерирует всё (TTFB = время всей генерации). Теперь токены пишутся ПО ОДНОМУ черезon_token-колбэк в_run_llama_cpp_inference— LLM и flow реально перекрываются, первый аудио-чанк выходит после ~token_hop_len + pre_lookaheadтокенов.2. Поллинг
sleep(0.1)→threading.Conditiontts_stream_external_llmпросыпался раз в 100мс; теперь консьюмер будитсяnotify_all()сразу по каждому токену. Заодно убрана гонка:doneиavailableтеперь читаются под одним локом (раньше «протухший» available из прошлой итерации мог досрочно уронить хвост в финальный чанк).3. Общий llama.cpp контекст без лока
llm_ggufодин на все запросы: параллельныйreset()ломал KV-кеш живой генерации (битый звук/мусорные токены). Добавленself._llama_lock, вся последовательность reset/eval/sample сериализована.4. Осиротевший LLM-поток при обрыве клиента
Если клиент бросал стрим (GeneratorExit),
llm_thread.join()после цикла не выполнялся — поток продолжал генерировать, а следующий запрос делал reset() параллельно с его eval(). Теперь:cancel_event(проверяется в цикле генерации) +try/finallyсjoin(30)во всех 3 stream-ветках (zero_shot / cross_lingual / instruct2).5. Утечка hift_cache
tts_with_external_tokens: исключение вtoken2wavоставляло запись вhift_cache_dictнавсегда — pop перенесён вfinally.Совместимость
tokens_condиcancel_event— опциональные параметры, старые вызовы работают без изменений (fallback на короткий поллинг).После проверки имеет смысл обновить PR FunAudioLLM#1872 в upstream. 🦊