fix(onnx-asr): корректный маппинг compute_type в onnx-asr quantization
При adversarial review (gpt-5.5) обнаружено: пользователь с config
compute_type = "float32" и --device onnx падал на старте.
HARDCODED_DEFAULTS["compute_type"] = "float32", apply_device_defaults не
заменяет значение если оно есть в config — старая проверка
(compute_type in ("int8", "fp16", "float32")) пропускала "float32"
дальше как onnx_asr quantization, что заставляло искать несуществующий
файл с суффиксом _float32.
- _normalize_quantization() — explicit маппинг в onnx-asr quantization.
- float32/fp32 → None (unquantized loading в onnx-asr — это None, не строка).
- float16 → fp16 (CUDA-naming → onnx-asr-naming).
- int8/fp16 → pass-through.
- Неизвестные compute_type (например, int8_float32 от CTranslate2) → ValueError
вместо silent fallback на int8 — пользователь раньше получал не ту
модель без предупреждения.
4 новых теста: float32→None, fp32→None, float16→fp16, unknown→raises.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -104,6 +104,79 @@ class TestCreateModel:
|
||||
|
||||
assert calls == ["fp16"]
|
||||
|
||||
def test_float32_maps_to_none(self, monkeypatch):
|
||||
"""compute_type='float32' маппится в quantization=None (unquantized).
|
||||
|
||||
onnx-asr использует quantization как суффикс файла; для float32 нужен None,
|
||||
строка "float32" приведёт к попытке загрузить несуществующий файл.
|
||||
"""
|
||||
calls = []
|
||||
|
||||
def fake_load_model(model=None, quantization="MISSING", **kwargs):
|
||||
calls.append(quantization)
|
||||
return FakeAsrAdapter()
|
||||
|
||||
class FakeAsrAdapter:
|
||||
def with_vad(self, vad):
|
||||
return self
|
||||
|
||||
monkeypatch.setattr("onnx_asr.load_model", fake_load_model)
|
||||
monkeypatch.setattr("onnx_asr.load_vad", lambda model, **kw: None)
|
||||
|
||||
backend = OnnxAsrBackend()
|
||||
backend.create_model("gigaam-v3-ctc", "onnx", "float32")
|
||||
|
||||
assert calls == [None]
|
||||
|
||||
def test_fp32_maps_to_none(self, monkeypatch):
|
||||
"""compute_type='fp32' тоже маппится в quantization=None."""
|
||||
calls = []
|
||||
|
||||
def fake_load_model(model=None, quantization="MISSING", **kwargs):
|
||||
calls.append(quantization)
|
||||
return FakeAsrAdapter()
|
||||
|
||||
class FakeAsrAdapter:
|
||||
def with_vad(self, vad):
|
||||
return self
|
||||
|
||||
monkeypatch.setattr("onnx_asr.load_model", fake_load_model)
|
||||
monkeypatch.setattr("onnx_asr.load_vad", lambda model, **kw: None)
|
||||
|
||||
backend = OnnxAsrBackend()
|
||||
backend.create_model("gigaam-v3-ctc", "onnx", "fp32")
|
||||
|
||||
assert calls == [None]
|
||||
|
||||
def test_float16_alias_maps_to_fp16(self, monkeypatch):
|
||||
"""compute_type='float16' (CUDA-naming) маппится в onnx-asr 'fp16'."""
|
||||
calls = []
|
||||
|
||||
def fake_load_model(model=None, quantization=None, **kwargs):
|
||||
calls.append(quantization)
|
||||
return FakeAsrAdapter()
|
||||
|
||||
class FakeAsrAdapter:
|
||||
def with_vad(self, vad):
|
||||
return self
|
||||
|
||||
monkeypatch.setattr("onnx_asr.load_model", fake_load_model)
|
||||
monkeypatch.setattr("onnx_asr.load_vad", lambda model, **kw: None)
|
||||
|
||||
backend = OnnxAsrBackend()
|
||||
backend.create_model("gigaam-v3-ctc", "onnx", "float16")
|
||||
|
||||
assert calls == ["fp16"]
|
||||
|
||||
def test_unknown_compute_type_raises(self, monkeypatch):
|
||||
"""Неподдерживаемый compute_type → ValueError, не silent fallback."""
|
||||
monkeypatch.setattr("onnx_asr.load_model", lambda **kw: None)
|
||||
monkeypatch.setattr("onnx_asr.load_vad", lambda model, **kw: None)
|
||||
|
||||
backend = OnnxAsrBackend()
|
||||
with pytest.raises(ValueError, match="Неподдерживаемый compute_type"):
|
||||
backend.create_model("gigaam-v3-ctc", "onnx", "int8_float32")
|
||||
|
||||
|
||||
class TestTranscribe:
|
||||
def test_transcribe_collects_segments(self, monkeypatch, tmp_path):
|
||||
|
||||
Reference in New Issue
Block a user