mostlyai-engine 2.3.3__tar.gz → 2.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/PKG-INFO +6 -6
  2. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/README.md +1 -1
  3. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/__init__.py +1 -1
  4. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/engine/vllm_engine.py +10 -8
  5. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/argn.py +5 -2
  6. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/generation.py +1 -0
  7. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/probability.py +13 -9
  8. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/pyproject.toml +8 -8
  9. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/.gitignore +0 -0
  10. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/LICENSE +0 -0
  11. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_common.py +0 -0
  12. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_dtypes.py +0 -0
  13. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/__init__.py +0 -0
  14. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/language/__init__.py +0 -0
  15. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/language/categorical.py +0 -0
  16. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/language/datetime.py +0 -0
  17. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/language/numeric.py +0 -0
  18. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/language/text.py +0 -0
  19. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/tabular/__init__.py +0 -0
  20. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/tabular/categorical.py +0 -0
  21. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/tabular/character.py +0 -0
  22. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/tabular/datetime.py +0 -0
  23. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/tabular/itt.py +0 -0
  24. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/tabular/lat_long.py +0 -0
  25. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_encoding_types/tabular/numeric.py +0 -0
  26. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/__init__.py +0 -0
  27. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/common.py +0 -0
  28. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/encoding.py +0 -0
  29. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/engine/__init__.py +0 -0
  30. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/engine/base.py +0 -0
  31. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/engine/hf_engine.py +0 -0
  32. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/generation.py +0 -0
  33. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/interface.py +0 -0
  34. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/lstm.py +0 -0
  35. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/tokenizer_utils.py +0 -0
  36. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/training.py +0 -0
  37. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_language/xgrammar_utils.py +0 -0
  38. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_memory.py +0 -0
  39. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/__init__.py +0 -0
  40. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/common.py +0 -0
  41. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/encoding.py +0 -0
  42. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/fairness.py +0 -0
  43. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/interface.py +0 -0
  44. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_tabular/training.py +0 -0
  45. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_training_utils.py +0 -0
  46. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/_workspace.py +0 -0
  47. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/analysis.py +0 -0
  48. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/domain.py +0 -0
  49. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/encoding.py +0 -0
  50. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/generation.py +0 -0
  51. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/logging.py +0 -0
  52. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/random_state.py +0 -0
  53. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/splitting.py +0 -0
  54. {mostlyai_engine-2.3.3 → mostlyai_engine-2.4.0}/mostlyai/engine/training.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyai-engine
3
- Version: 2.3.3
3
+ Version: 2.4.0
4
4
  Summary: Synthetic Data Engine
5
5
  Project-URL: homepage, https://github.com/mostly-ai/mostlyai-engine
6
6
  Project-URL: repository, https://github.com/mostly-ai/mostlyai-engine
@@ -38,15 +38,15 @@ Requires-Dist: pyarrow>=16.0.0
38
38
  Requires-Dist: scikit-learn>=1.4.0
39
39
  Requires-Dist: setuptools>=77.0.3
40
40
  Requires-Dist: tokenizers>=0.21.0
41
- Requires-Dist: torch<2.9.0,>=2.8.0
42
- Requires-Dist: torchaudio<2.9.0,>=2.8.0
43
- Requires-Dist: torchvision<0.24.0,>=0.23.0
41
+ Requires-Dist: torch<2.10.0,>=2.9.0
42
+ Requires-Dist: torchaudio<2.10.0,>=2.9.0
43
+ Requires-Dist: torchvision<0.25.0,>=0.24.0
44
44
  Requires-Dist: transformers>=4.55.0
45
45
  Requires-Dist: xgrammar>=0.1.21
46
46
  Provides-Extra: gpu
47
47
  Requires-Dist: bitsandbytes==0.42.0; (sys_platform == 'darwin') and extra == 'gpu'
48
48
  Requires-Dist: bitsandbytes>=0.45.5; (sys_platform == 'linux') and extra == 'gpu'
49
- Requires-Dist: vllm==0.10.2; (sys_platform == 'linux' or sys_platform == 'darwin') and extra == 'gpu'
49
+ Requires-Dist: vllm==0.12.0; (sys_platform == 'linux' or sys_platform == 'darwin') and extra == 'gpu'
50
50
  Description-Content-Type: text/markdown
51
51
 
52
52
  # Synthetic Data Engine 💎
@@ -116,7 +116,7 @@ uv pip install -U 'mostlyai-engine[gpu]'
116
116
  On Linux, one can explicitly install the CPU-only variant of torch together with `mostlyai-engine`:
117
117
 
118
118
  ```bash
119
- uv pip install -U torch==2.8.0+cpu torchvision==0.23.0+cpu mostlyai-engine --extra-index-url https://download.pytorch.org/whl/cpu
119
+ uv pip install -U torch==2.9.1+cpu torchvision==0.24.1+cpu mostlyai-engine --extra-index-url https://download.pytorch.org/whl/cpu
120
120
  ```
121
121
 
122
122
  ## TabularARGN for Flat Data
@@ -65,7 +65,7 @@ uv pip install -U 'mostlyai-engine[gpu]'
65
65
  On Linux, one can explicitly install the CPU-only variant of torch together with `mostlyai-engine`:
66
66
 
67
67
  ```bash
68
- uv pip install -U torch==2.8.0+cpu torchvision==0.23.0+cpu mostlyai-engine --extra-index-url https://download.pytorch.org/whl/cpu
68
+ uv pip install -U torch==2.9.1+cpu torchvision==0.24.1+cpu mostlyai-engine --extra-index-url https://download.pytorch.org/whl/cpu
69
69
  ```
70
70
 
71
71
  ## TabularARGN for Flat Data
@@ -34,7 +34,7 @@ __all__ = [
34
34
  "TabularARGN",
35
35
  "LanguageModel",
36
36
  ]
37
- __version__ = "2.3.3"
37
+ __version__ = "2.4.0"
38
38
 
39
39
  # suppress specific warning related to os.fork() in multi-threaded processes
40
40
  warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*multi-threaded.*fork.*")
@@ -27,11 +27,10 @@ from peft import PeftConfig
27
27
  from pydantic import BaseModel
28
28
  from transformers import AutoConfig, AutoTokenizer
29
29
  from vllm import LLM, SamplingParams
30
- from vllm.config import _get_and_verify_max_len
31
30
  from vllm.distributed import cleanup_dist_env_and_memory
32
31
  from vllm.inputs.data import TokensPrompt
33
32
  from vllm.lora.request import LoRARequest
34
- from vllm.sampling_params import GuidedDecodingParams
33
+ from vllm.sampling_params import StructuredOutputsParams
35
34
 
36
35
  from mostlyai.engine._language.common import is_bf16_supported
37
36
  from mostlyai.engine._language.engine.base import EngineMetrics, LanguageEngine
@@ -80,8 +79,11 @@ class VLLMEngine(LanguageEngine):
80
79
 
81
80
  model_path = str(model_path)
82
81
  self._lora_request = LoRARequest("adapter", 1, model_path)
83
- config_max_model_len = _get_and_verify_max_len(
84
- base_config, tokenizer_config=None, max_model_len=None, disable_sliding_window=False, sliding_window=None
82
+ # Get max model length from config (different models use different attribute names)
83
+ config_max_model_len = getattr(
84
+ base_config,
85
+ "max_position_embeddings",
86
+ getattr(base_config, "n_positions", getattr(base_config, "max_sequence_length", 2048)),
85
87
  )
86
88
 
87
89
  self.llm = LLM(
@@ -136,18 +138,18 @@ class VLLMEngine(LanguageEngine):
136
138
 
137
139
  sampling_params = []
138
140
  for i in range(actual_batch_size):
139
- guided_decoding = None
141
+ structured_outputs = None
140
142
  if effective_schemas and i < len(effective_schemas):
141
- # Convert Pydantic model to JSON schema for guided decoding
143
+ # Convert Pydantic model to JSON schema for structured output
142
144
  schema_dict = effective_schemas[i].model_json_schema()
143
- guided_decoding = GuidedDecodingParams(json=schema_dict)
145
+ structured_outputs = StructuredOutputsParams(json=schema_dict)
144
146
 
145
147
  sampling_params.append(
146
148
  SamplingParams(
147
149
  max_tokens=self.max_new_tokens,
148
150
  temperature=sampling_temperature,
149
151
  top_p=sampling_top_p,
150
- guided_decoding=guided_decoding,
152
+ structured_outputs=structured_outputs,
151
153
  )
152
154
  )
153
155
  t_generate = time.time()
@@ -164,10 +164,11 @@ def _regressor_heuristic(id: str, model_size: ModelSizeOrUnits, dim_input: int,
164
164
  def _flat_context_heuristic(id: str, model_size: ModelSizeOrUnits, dim_input: int) -> list[int]:
165
165
  if isinstance(model_size, dict):
166
166
  return model_size[id]
167
- model_size_layers = dict(S=[8], M=[64], L=[128])
167
+ model_size_layers = dict(S=[2], M=[8], L=[32])
168
168
  layers = model_size_layers[model_size]
169
169
  coefficient = round(np.log(max(dim_input, np.e)))
170
170
  dims = [unit * coefficient for unit in layers]
171
+ _LOG.info(f"[ARGN] flat context heuristic: {dim_input=} -> {dims}")
171
172
  return dims
172
173
 
173
174
 
@@ -176,10 +177,11 @@ def _sequential_context_heuristic(
176
177
  ) -> list[int]:
177
178
  if isinstance(model_size, dict):
178
179
  return model_size[id]
179
- model_size_layers = dict(S=[8], M=[32], L=[64, 64])
180
+ model_size_layers = dict(S=[4], M=[16], L=[64, 64])
180
181
  layers = model_size_layers[model_size]
181
182
  coefficient = round(np.log(max(dim_input * seq_len_median, np.e)))
182
183
  dims = [unit * coefficient for unit in layers]
184
+ _LOG.info(f"[ARGN] sequential context heuristic: {dim_input=} x {seq_len_median=} -> {dims}")
183
185
  return dims
184
186
 
185
187
 
@@ -190,6 +192,7 @@ def _history_heuristic(id: str, model_size: ModelSizeOrUnits, dim_input: int, se
190
192
  layers = model_size_layers[model_size]
191
193
  coefficient = round(np.log(max(dim_input * seq_len_median, np.e)))
192
194
  dims = [unit * coefficient for unit in layers]
195
+ _LOG.info(f"[ARGN] history heuristic: {dim_input=} x {seq_len_median=} -> {dims}")
193
196
  return dims
194
197
 
195
198
 
@@ -820,6 +820,7 @@ def generate(
820
820
 
821
821
  if not enable_flexible_generation:
822
822
  check_column_order(gen_column_order, trn_column_order)
823
+
823
824
  _LOG.info(f"{rare_category_replacement_method=}")
824
825
  rare_token_fixed_probs = fix_rare_token_probs(tgt_stats, rare_category_replacement_method)
825
826
  imputation_fixed_probs = _fix_imputation_probs(tgt_stats, imputation)
@@ -245,6 +245,7 @@ def _generate_marginal_probs(
245
245
  tgt_stats: dict,
246
246
  seed_columns: list[str],
247
247
  device: torch.device,
248
+ n_samples: int,
248
249
  ctx_data: pd.DataFrame | None = None,
249
250
  ctx_stats: dict | None = None,
250
251
  fixed_probs: dict | None = None,
@@ -259,6 +260,7 @@ def _generate_marginal_probs(
259
260
  tgt_stats: Target statistics
260
261
  seed_columns: Seed column names in original format, in correct order
261
262
  device: Device for computation
263
+ n_samples: Number of samples to generate probabilities for
262
264
  ctx_data: Optional context data
263
265
  ctx_stats: Optional context statistics (required if ctx_data provided)
264
266
  fixed_probs: Optional fixed probabilities for rare token handling
@@ -266,7 +268,6 @@ def _generate_marginal_probs(
266
268
  Returns:
267
269
  DataFrame of shape (n_samples, cardinality) with probabilities and column names
268
270
  """
269
- n_samples = len(seed_encoded)
270
271
  target_stats = tgt_stats["columns"][target_column]
271
272
 
272
273
  # Build fixed_values dict from seed_encoded
@@ -362,15 +363,14 @@ def predict_proba(
362
363
  )
363
364
  )
364
365
 
365
- # Get seed column names (needed for column order check and _generate_marginal_probs)
366
366
  seed_columns = list(seed_data.columns)
367
367
 
368
- # Check column order when flexible generation is disabled
369
368
  if not enable_flexible_generation:
370
369
  seed_columns_argn = get_argn_column_names(tgt_stats["columns"], seed_columns)
371
370
  target_columns_argn = get_argn_column_names(tgt_stats["columns"], target_columns)
372
- gen_column_order = seed_columns_argn + target_columns_argn
373
- check_column_order(gen_column_order, all_columns)
371
+ columns_to_check = seed_columns_argn + target_columns_argn
372
+ expected_order = [col for col in all_columns if col in columns_to_check]
373
+ check_column_order(columns_to_check, expected_order)
374
374
 
375
375
  # Encode seed data (features to condition on) - common for both single and multi-target
376
376
  # seed_data should NOT include any target columns
@@ -407,6 +407,7 @@ def predict_proba(
407
407
  tgt_stats=tgt_stats,
408
408
  seed_columns=seed_columns,
409
409
  device=device,
410
+ n_samples=n_samples,
410
411
  ctx_data=ctx_data,
411
412
  ctx_stats=ctx_stats,
412
413
  fixed_probs=fixed_probs,
@@ -451,10 +452,10 @@ def predict_proba(
451
452
  # Build DataFrames for each combo with actual values, then concatenate
452
453
  combo_dfs = []
453
454
  for combo_idx, prev_combo in enumerate(prev_combos):
454
- # Copy extended_seed for this combo
455
- df = extended_seed.copy()
455
+ # Build data dict starting with columns from extended_seed
456
+ data = {col: extended_seed[col].values for col in extended_seed.columns}
456
457
 
457
- # Add previous target columns with actual values (no dummy values)
458
+ # Add previous target columns with actual values
458
459
  for i in range(target_idx):
459
460
  prev_target_col = target_columns[i]
460
461
  encoded_val = prev_combo[i]
@@ -466,8 +467,10 @@ def predict_proba(
466
467
  argn_column=prev_target_stats[ARGN_COLUMN],
467
468
  argn_sub_column=sub_col_key,
468
469
  )
469
- df[full_sub_col_name] = encoded_val
470
+ data[full_sub_col_name] = encoded_val
470
471
 
472
+ # Create DataFrame with explicit row count
473
+ df = pd.DataFrame(data, index=range(n_samples))
471
474
  combo_dfs.append(df)
472
475
 
473
476
  # Concatenate all combo DataFrames into single batch
@@ -490,6 +493,7 @@ def predict_proba(
490
493
  tgt_stats=tgt_stats,
491
494
  seed_columns=extended_seed_columns,
492
495
  device=device,
496
+ n_samples=n_samples * num_prev_combos,
493
497
  ctx_data=batched_ctx_data,
494
498
  ctx_stats=ctx_stats,
495
499
  fixed_probs=fixed_probs,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyai-engine"
3
- version = "2.3.3"
3
+ version = "2.4.0"
4
4
  description = "Synthetic Data Engine"
5
5
  authors = [{ name = "MOSTLY AI", email = "dev@mostly.ai" }]
6
6
  requires-python = ">=3.10"
@@ -25,7 +25,7 @@ classifiers = [
25
25
  ]
26
26
 
27
27
  dependencies = [
28
- "setuptools>=77.0.3", # similar to vllm 0.10.1.1
28
+ "setuptools>=77.0.3",
29
29
  "numpy>=2.0.0",
30
30
  "pandas>=2.2.0",
31
31
  "pyarrow>=16.0.0",
@@ -33,24 +33,24 @@ dependencies = [
33
33
  "scikit-learn>=1.4.0",
34
34
  "psutil>=5.9.5,<6", # upgrade when colab psutil is updated
35
35
  "tokenizers>=0.21.0",
36
- "transformers>=4.55.0", # updated (removed ,<4.54.0), similar to vllm 0.10.1.1
36
+ "transformers>=4.55.0",
37
37
  "datasets>=3.0.0",
38
38
  "accelerate>=1.5.0",
39
39
  "peft>=0.12.0",
40
40
  "huggingface-hub[hf-xet]>=0.30.2",
41
41
  "opacus>=1.5.4",
42
- "xgrammar>=0.1.21", # for vllm 0.10.1.1 compatibility (=0.1.21)
42
+ "xgrammar>=0.1.21",
43
43
  "json-repair>=0.47.0",
44
- "torch>=2.8.0,<2.9.0", # for vllm 0.10.2 compatibility
45
- "torchaudio>=2.8.0,<2.9.0", # for vllm 0.10.2 compatibility
46
- "torchvision>=0.23.0,<0.24.0" # for vllm 0.10.2 compatibility
44
+ "torch>=2.9.0,<2.10.0",
45
+ "torchaudio>=2.9.0,<2.10.0",
46
+ "torchvision>=0.24.0,<0.25.0"
47
47
  ]
48
48
 
49
49
  [project.optional-dependencies]
50
50
  gpu = [
51
51
  "bitsandbytes==0.42.0; sys_platform == 'darwin'",
52
52
  "bitsandbytes>=0.45.5; sys_platform == 'linux'",
53
- "vllm==0.10.2; sys_platform == 'linux' or sys_platform == 'darwin'",
53
+ "vllm==0.12.0; sys_platform == 'linux' or sys_platform == 'darwin'",
54
54
  ]
55
55
 
56
56
  [dependency-groups]
File without changes