mostlyai-engine 1.3.1__tar.gz → 1.3.3__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 (50) hide show
  1. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/PKG-INFO +1 -1
  2. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/__init__.py +1 -1
  3. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/encoding.py +1 -1
  4. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/generation.py +17 -1
  5. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/analysis.py +1 -1
  6. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/training.py +13 -13
  7. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/pyproject.toml +13 -13
  8. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/.gitignore +0 -0
  9. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/LICENSE +0 -0
  10. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/README.md +0 -0
  11. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_common.py +0 -0
  12. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_dtypes.py +0 -0
  13. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/__init__.py +0 -0
  14. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/__init__.py +0 -0
  15. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/categorical.py +0 -0
  16. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/datetime.py +0 -0
  17. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/numeric.py +0 -0
  18. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/text.py +0 -0
  19. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/__init__.py +0 -0
  20. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/categorical.py +0 -0
  21. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/character.py +0 -0
  22. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/datetime.py +0 -0
  23. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/itt.py +0 -0
  24. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/lat_long.py +0 -0
  25. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/numeric.py +0 -0
  26. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/__init__.py +0 -0
  27. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/common.py +0 -0
  28. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/encoding.py +0 -0
  29. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/__init__.py +0 -0
  30. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/base.py +0 -0
  31. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/hf_engine.py +0 -0
  32. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/vllm_engine.py +0 -0
  33. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/generation.py +0 -0
  34. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/lstm.py +0 -0
  35. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/tokenizer_utils.py +0 -0
  36. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/training.py +0 -0
  37. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/xgrammar_utils.py +0 -0
  38. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_memory.py +0 -0
  39. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/__init__.py +0 -0
  40. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/argn.py +0 -0
  41. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/common.py +0 -0
  42. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/fairness.py +0 -0
  43. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/training.py +0 -0
  44. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_training_utils.py +0 -0
  45. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_workspace.py +0 -0
  46. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/domain.py +0 -0
  47. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/encoding.py +0 -0
  48. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/generation.py +0 -0
  49. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/logging.py +0 -0
  50. {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/splitting.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyai-engine
3
- Version: 1.3.1
3
+ Version: 1.3.3
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
@@ -22,7 +22,7 @@ from mostlyai.engine.generation import generate
22
22
 
23
23
 
24
24
  __all__ = ["split", "analyze", "encode", "train", "generate", "init_logging"]
25
- __version__ = "1.3.1"
25
+ __version__ = "1.3.3"
26
26
 
27
27
  # suppress specific warning related to os.fork() in multi-threaded processes
28
28
  warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*multi-threaded.*fork.*")
@@ -81,7 +81,7 @@ def encode(
81
81
  output_path=workspace.encoded_data_path,
82
82
  ctx_partition_file=ctx_pqt_partitions[i] if has_context else None,
83
83
  ctx_stats=ctx_stats if has_context else None,
84
- n_jobs=min(cpu_count() - 1, 16),
84
+ n_jobs=min(16, max(1, cpu_count() - 1)),
85
85
  )
86
86
  progress.update(completed=i, total=len(tgt_pqt_partitions) + 1)
87
87
  _LOG.info(f"ENCODE_TABULAR finished in {time.time() - t0:.2f}s")
@@ -720,7 +720,7 @@ def generate(
720
720
  # read model config
721
721
  model_units = model_configs.get("model_units") or ModelSize.M
722
722
  _LOG.debug(f"{model_units=}")
723
- enable_flexible_generation = model_configs.get("enable_flexible_generation")
723
+ enable_flexible_generation = model_configs.get("enable_flexible_generation", True)
724
724
  _LOG.info(f"{enable_flexible_generation=}")
725
725
 
726
726
  # resolve device
@@ -755,6 +755,22 @@ def generate(
755
755
  fairness=fairness,
756
756
  )
757
757
  _LOG.info(f"{gen_column_order=}")
758
+ if not enable_flexible_generation:
759
+ # check if resolved column order is the same as the one from training
760
+ trn_column_order = [
761
+ get_argn_name(
762
+ argn_processor=tgt_stats["columns"][col][ARGN_PROCESSOR],
763
+ argn_table=tgt_stats["columns"][col][ARGN_TABLE],
764
+ argn_column=tgt_stats["columns"][col][ARGN_COLUMN],
765
+ )
766
+ for col in tgt_stats["columns"].keys()
767
+ ]
768
+ _LOG.info(f"{trn_column_order=}")
769
+ if gen_column_order != trn_column_order:
770
+ raise ValueError(
771
+ "The column order for generation does not match the column order from training, due to seed, rebalancing, fairness or imputation configs. "
772
+ "A change in column order is only permitted for models that were trained with `enable_flexible_generation=True`."
773
+ )
758
774
 
759
775
  _LOG.info(f"{rare_category_replacement_method=}")
760
776
  rare_token_fixed_probs = _fix_rare_token_probs(tgt_stats, rare_category_replacement_method)
@@ -162,7 +162,7 @@ def analyze(
162
162
  ctx_encoding_types=ctx_encoding_types,
163
163
  ctx_primary_key=ctx_primary_key if has_context else None,
164
164
  ctx_root_key=ctx_root_key,
165
- n_jobs=min(cpu_count() - 1, 16),
165
+ n_jobs=min(16, max(1, cpu_count() - 1)),
166
166
  )
167
167
  progress.update(completed=i, total=len(tgt_pqt_partitions) + 1)
168
168
 
@@ -26,8 +26,8 @@ from mostlyai.engine._workspace import resolve_model_type
26
26
  def train(
27
27
  *,
28
28
  model: str | None = None,
29
- max_training_time: float = 14400.0, # 10 days
30
- max_epochs: float = 100.0, # 100 epochs
29
+ max_training_time: float | None = 14400.0, # 10 days
30
+ max_epochs: float | None = 100.0, # 100 epochs
31
31
  batch_size: int | None = None,
32
32
  gradient_accumulation_steps: int | None = None,
33
33
  enable_flexible_generation: bool = True,
@@ -48,8 +48,8 @@ def train(
48
48
 
49
49
  Args:
50
50
  model: The identifier of the model to train. If tabular, defaults to MOSTLY_AI/Medium. If language, defaults to MOSTLY_AI/LSTMFromScratch-3m.
51
- max_training_time: Maximum training time in minutes.
52
- max_epochs: Maximum number of training epochs.
51
+ max_training_time: Maximum training time in minutes. If None, defaults to 10 days.
52
+ max_epochs: Maximum number of training epochs. If None, defaults to 100 epochs.
53
53
  batch_size: Per-device batch size for training and validation. If None, determined automatically.
54
54
  gradient_accumulation_steps: Number of steps to accumulate gradients. If None, determined automatically.
55
55
  enable_flexible_generation: Whether to enable flexible order generation. Defaults to True.
@@ -65,11 +65,12 @@ def train(
65
65
  if model_type == ModelType.tabular:
66
66
  from mostlyai.engine._tabular.training import train as train_tabular
67
67
 
68
+ args = inspect.signature(train_tabular).parameters
68
69
  train_tabular(
69
- model=model if model else inspect.signature(train_tabular).parameters["model"].default,
70
+ model=model if model else args["model"].default,
70
71
  workspace_dir=workspace_dir,
71
- max_training_time=max_training_time,
72
- max_epochs=max_epochs,
72
+ max_training_time=max_training_time if max_training_time else args["max_training_time"].default,
73
+ max_epochs=max_epochs if max_epochs else args["max_epochs"].default,
73
74
  batch_size=batch_size,
74
75
  gradient_accumulation_steps=gradient_accumulation_steps,
75
76
  enable_flexible_generation=enable_flexible_generation,
@@ -78,9 +79,7 @@ def train(
78
79
  upload_model_data_callback=upload_model_data_callback,
79
80
  model_state_strategy=model_state_strategy,
80
81
  device=device,
81
- max_sequence_window=max_sequence_window
82
- if max_sequence_window
83
- else inspect.signature(train_tabular).parameters["max_sequence_window"].default,
82
+ max_sequence_window=max_sequence_window if max_sequence_window else args["max_sequence_window"].default,
84
83
  )
85
84
  else:
86
85
  from mostlyai.engine._language.training import train as train_language
@@ -88,11 +87,12 @@ def train(
88
87
  if max_sequence_window is not None:
89
88
  raise ValueError("max_sequence_window is not supported for language models")
90
89
 
90
+ args = inspect.signature(train_language).parameters
91
91
  train_language(
92
- model=model if model else inspect.signature(train_language).parameters["model"].default,
92
+ model=model if model else args["model"].default,
93
93
  workspace_dir=workspace_dir,
94
- max_training_time=max_training_time,
95
- max_epochs=max_epochs,
94
+ max_training_time=max_training_time if max_training_time else args["max_training_time"].default,
95
+ max_epochs=max_epochs if max_epochs else args["max_epochs"].default,
96
96
  batch_size=batch_size,
97
97
  gradient_accumulation_steps=gradient_accumulation_steps,
98
98
  enable_flexible_generation=enable_flexible_generation,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyai-engine"
3
- version = "1.3.1"
3
+ version = "1.3.3"
4
4
  description = "Synthetic Data Engine"
5
5
  authors = [{ name = "MOSTLY AI", email = "dev@mostly.ai" }]
6
6
  requires-python = ">=3.10"
@@ -54,20 +54,20 @@ gpu = [
54
54
 
55
55
  [dependency-groups]
56
56
  dev = [
57
- "pytest>=7.1.2,<8",
58
- "ruff==0.9.2",
59
- "pre-commit>=4.0.0,<5",
60
- "twine>=6.1.0,<7",
61
- "ipykernel>=6.25.2",
57
+ "pytest>=8.0",
58
+ "ruff>=0.11", # sync'ed with .pre-commit-config
59
+ "pre-commit>=4.0",
60
+ "twine>=6.1",
61
+ "ipykernel>=6.25",
62
62
  ]
63
63
  docs = [
64
- "mkdocs>=1.5.3",
65
- "mkdocstrings[crystal, python]>=0.27.0,<0.28",
66
- "mkdocs-material>=9.0.0,<10",
67
- "griffe>=1.0.0,<2",
68
- "pymdown-extensions>=10.0.0,<11",
69
- "griffe-fieldz>=0.2.0,<0.3",
70
- "black>=22.1.0",
64
+ "mkdocs>=1.6",
65
+ "mkdocstrings[crystal, python]>=0.29",
66
+ "mkdocs-material>=9.0",
67
+ "griffe>=1.0",
68
+ "pymdown-extensions>=10.0",
69
+ "griffe-fieldz>=0.2",
70
+ "black>=25.0",
71
71
  ]
72
72
 
73
73
  [project.urls]
File without changes