|
7 | 7 | import numpy as np |
8 | 8 | import pytest |
9 | 9 | import torch |
| 10 | +import transformers |
10 | 11 | import yaml |
| 12 | +from sie_server.adapters._types import ComputePrecision |
11 | 13 | from sie_server.adapters.bge_m3_flash import BGEM3FlashAdapter |
12 | 14 | from sie_server.config.model import ModelConfig |
13 | 15 | from sie_server.core.inference_output import EncodeOutput, SparseVector |
| 16 | +from sie_server.core.loader import _build_adapter_kwargs |
14 | 17 | from sie_server.types.inputs import Item |
15 | 18 | from transformers import XLMRobertaConfig |
16 | 19 | from transformers.models.xlm_roberta.modeling_xlm_roberta import XLMRobertaEmbeddings |
@@ -93,6 +96,68 @@ def test_score_task_enabled(self, config: ModelConfig) -> None: |
93 | 96 | def test_score_in_outputs(self, config: ModelConfig) -> None: |
94 | 97 | assert "score" in config.outputs |
95 | 98 |
|
| 99 | + def test_resolved_profile_precisions(self, config: ModelConfig) -> None: |
| 100 | + assert {name: config.resolve_profile(name).compute_precision for name in config.profiles} == { |
| 101 | + "default": "float16", |
| 102 | + "dense": "float16", |
| 103 | + "sparse": "float16", |
| 104 | + "multivector": "float16", |
| 105 | + "candle": "bfloat16", |
| 106 | + "banking": "bfloat16", |
| 107 | + "medical-vn": "bfloat16", |
| 108 | + "bge_m3_flag": None, |
| 109 | + } |
| 110 | + |
| 111 | + def test_default_precision_reaches_adapter_loading( |
| 112 | + self, |
| 113 | + config: ModelConfig, |
| 114 | + monkeypatch: pytest.MonkeyPatch, |
| 115 | + ) -> None: |
| 116 | + kwargs = _build_adapter_kwargs(config, "bfloat16") |
| 117 | + assert kwargs["compute_precision"] == "float16" |
| 118 | + assert kwargs["revision"] == "5617a9f61b028005a4858fdac845db406aefb181" |
| 119 | + model_loader = MagicMock() |
| 120 | + tokenizer_loader = MagicMock() |
| 121 | + monkeypatch.setattr(transformers.AutoModel, "from_pretrained", model_loader) |
| 122 | + monkeypatch.setattr(transformers.AutoTokenizer, "from_pretrained", tokenizer_loader) |
| 123 | + adapter = BGEM3FlashAdapter(**kwargs) |
| 124 | + head_loader = MagicMock() |
| 125 | + monkeypatch.setattr(adapter, "_load_linear_layers", head_loader) |
| 126 | + |
| 127 | + adapter.load("cuda:0") |
| 128 | + |
| 129 | + model_loader.assert_called_once_with( |
| 130 | + "BAAI/bge-m3", |
| 131 | + torch_dtype=torch.float16, |
| 132 | + attn_implementation="eager", |
| 133 | + revision=config.hf_revision, |
| 134 | + ) |
| 135 | + tokenizer_loader.assert_called_once_with("BAAI/bge-m3", revision=config.hf_revision) |
| 136 | + head_loader.assert_called_once_with("BAAI/bge-m3", torch.float16, "cuda:0") |
| 137 | + |
| 138 | + @pytest.mark.parametrize("name", ["default", "dense", "sparse", "multivector"]) |
| 139 | + def test_flash_profiles_preserve_recipe(self, config: ModelConfig, name: str) -> None: |
| 140 | + profile = config.resolve_profile(name) |
| 141 | + assert profile.adapter_path == "sie_server.adapters.bge_m3_flash:BGEM3FlashAdapter" |
| 142 | + assert profile.max_batch_tokens == 16384 |
| 143 | + assert profile.loadtime == {} |
| 144 | + expected_runtime: dict[str, Any] = {"pooling": "cls", "normalize": True} |
| 145 | + if name != "default": |
| 146 | + expected_runtime["output_types"] = [name] |
| 147 | + assert profile.runtime == expected_runtime |
| 148 | + assert config.max_sequence_length == 8192 |
| 149 | + assert config.dims == {"dense": 1024, "sparse": 250002, "multivector": 1024} |
| 150 | + |
| 151 | + @pytest.mark.parametrize( |
| 152 | + ("precision", "expected_dtype"), |
| 153 | + [("float16", torch.float16), ("bfloat16", torch.bfloat16)], |
| 154 | + ) |
| 155 | + def test_explicit_flash_precision_remains_supported( |
| 156 | + self, precision: ComputePrecision, expected_dtype: torch.dtype |
| 157 | + ) -> None: |
| 158 | + adapter = BGEM3FlashAdapter(compute_precision=precision) |
| 159 | + assert adapter._resolve_dtype() == expected_dtype |
| 160 | + |
96 | 161 |
|
97 | 162 | class TestBGEM3EmbeddingParity: |
98 | 163 | @pytest.mark.parametrize("dtype", [torch.float16, torch.bfloat16, torch.float32]) |
|
0 commit comments