修复直播测试与 TTS 预热
This commit is contained in:
@@ -9,6 +9,7 @@ from app.faster_qwen_worker import (
|
||||
MAX_NEW_TOKENS,
|
||||
FasterQwenWorkerClient,
|
||||
FasterQwenWorkerTimeout,
|
||||
faster_qwen_worker_main,
|
||||
_generation_kwargs,
|
||||
_configure_worker_environment,
|
||||
)
|
||||
@@ -91,6 +92,14 @@ def _ready(pid):
|
||||
}
|
||||
|
||||
|
||||
def _progress(stage):
|
||||
return {
|
||||
"type": "progress",
|
||||
"stage": stage,
|
||||
"pid": 4000,
|
||||
}
|
||||
|
||||
|
||||
def _probe_worker_main(connection, _settings):
|
||||
connection.send({
|
||||
"type": "ready",
|
||||
@@ -153,6 +162,8 @@ class FasterQwenWorkerTests(unittest.TestCase):
|
||||
|
||||
def test_client_returns_worker_audio(self):
|
||||
connection = _FakeConnection([
|
||||
_progress("model_loading"),
|
||||
_progress("warmup_started"),
|
||||
_ready(4100),
|
||||
{
|
||||
"type": "result",
|
||||
@@ -181,6 +192,81 @@ class FasterQwenWorkerTests(unittest.TestCase):
|
||||
self.assertEqual(len(context.processes), 1)
|
||||
client.close()
|
||||
|
||||
def test_client_default_startup_timeout_allows_slow_model_load(self):
|
||||
client = FasterQwenWorkerClient({})
|
||||
|
||||
self.assertEqual(client.startup_timeout_seconds, 900.0)
|
||||
client.close()
|
||||
|
||||
def test_worker_applies_process_limits_after_model_warmup(self):
|
||||
order = []
|
||||
|
||||
class FakeModel:
|
||||
def warmup(self):
|
||||
order.append("warmup")
|
||||
|
||||
class WorkerConnection:
|
||||
def __init__(self):
|
||||
self.sent = []
|
||||
self.closed = False
|
||||
|
||||
def send(self, message):
|
||||
self.sent.append(message)
|
||||
|
||||
def recv(self):
|
||||
return {"command": "stop"}
|
||||
|
||||
def close(self):
|
||||
self.closed = True
|
||||
|
||||
connection = WorkerConnection()
|
||||
with (
|
||||
patch("app.faster_qwen_worker._configure_worker_environment", return_value=3),
|
||||
patch(
|
||||
"app.faster_qwen_worker._load_runtime",
|
||||
side_effect=lambda _settings, progress=None: (
|
||||
progress("from_pretrained_started") if progress else None,
|
||||
order.append("load"),
|
||||
{"model": FakeModel()},
|
||||
)[-1],
|
||||
),
|
||||
patch(
|
||||
"app.faster_qwen_worker._apply_worker_process_limits",
|
||||
side_effect=lambda _settings: order.append("limits") or {
|
||||
"cpu_affinity_count": 6,
|
||||
"process_priority": "below_normal",
|
||||
},
|
||||
),
|
||||
patch(
|
||||
"app.faster_qwen_worker._synthesize_wav",
|
||||
side_effect=lambda _runtime, _text: order.append("voice_clone") or b"wav",
|
||||
),
|
||||
):
|
||||
faster_qwen_worker_main(connection, {})
|
||||
|
||||
self.assertEqual(order, ["load", "warmup", "voice_clone", "limits"])
|
||||
progress_stages = [
|
||||
item.get("stage")
|
||||
for item in connection.sent
|
||||
if item.get("type") == "progress"
|
||||
]
|
||||
self.assertEqual(
|
||||
progress_stages,
|
||||
[
|
||||
"process_started",
|
||||
"environment_ready",
|
||||
"model_loading",
|
||||
"from_pretrained_started",
|
||||
"model_loaded",
|
||||
"warmup_started",
|
||||
"graph_warmup_complete",
|
||||
"voice_clone_warmup_started",
|
||||
"voice_clone_warmup_complete",
|
||||
"warmup_complete",
|
||||
],
|
||||
)
|
||||
self.assertEqual(connection.sent[-1]["type"], "ready")
|
||||
|
||||
def test_timeout_terminates_worker_and_starts_a_prewarmed_replacement(self):
|
||||
first_connection = _FakeConnection([_ready(4200)])
|
||||
replacement_connection = _FakeConnection([_ready(4300)])
|
||||
|
||||
Reference in New Issue
Block a user