mostlyai-engine 1.1.2__tar.gz → 1.1.4__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.1.2 → mostlyai_engine-1.1.4}/PKG-INFO +8 -6
  2. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/README.md +1 -0
  3. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/__init__.py +1 -1
  4. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/training.py +10 -4
  5. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_tabular/training.py +9 -3
  6. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/logging.py +5 -7
  7. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/pyproject.toml +7 -6
  8. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/.gitignore +0 -0
  9. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/LICENSE +0 -0
  10. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_common.py +0 -0
  11. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_dtypes.py +0 -0
  12. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/__init__.py +0 -0
  13. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/language/__init__.py +0 -0
  14. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/language/categorical.py +0 -0
  15. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/language/datetime.py +0 -0
  16. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/language/numeric.py +0 -0
  17. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/language/text.py +0 -0
  18. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/tabular/__init__.py +0 -0
  19. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/tabular/categorical.py +0 -0
  20. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/tabular/character.py +0 -0
  21. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/tabular/datetime.py +0 -0
  22. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/tabular/itt.py +0 -0
  23. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/tabular/lat_long.py +0 -0
  24. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_encoding_types/tabular/numeric.py +0 -0
  25. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/__init__.py +0 -0
  26. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/common.py +0 -0
  27. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/encoding.py +0 -0
  28. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/engine/__init__.py +0 -0
  29. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/engine/base.py +0 -0
  30. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/engine/hf_engine.py +0 -0
  31. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/engine/vllm_engine.py +0 -0
  32. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/formatron_utils.py +0 -0
  33. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/generation.py +0 -0
  34. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/lstm.py +0 -0
  35. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_language/tokenizer_utils.py +0 -0
  36. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_memory.py +0 -0
  37. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_tabular/__init__.py +0 -0
  38. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_tabular/argn.py +0 -0
  39. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_tabular/common.py +0 -0
  40. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_tabular/encoding.py +0 -0
  41. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_tabular/fairness.py +0 -0
  42. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_tabular/generation.py +0 -0
  43. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_training_utils.py +0 -0
  44. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/_workspace.py +0 -0
  45. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/analysis.py +0 -0
  46. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/domain.py +0 -0
  47. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/encoding.py +0 -0
  48. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/generation.py +0 -0
  49. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/splitting.py +0 -0
  50. {mostlyai_engine-1.1.2 → mostlyai_engine-1.1.4}/mostlyai/engine/training.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyai-engine
3
- Version: 1.1.2
3
+ Version: 1.1.4
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
@@ -24,15 +24,16 @@ Classifier: Programming Language :: Python :: 3.13
24
24
  Classifier: Topic :: Software Development :: Libraries
25
25
  Classifier: Typing :: Typed
26
26
  Requires-Python: >=3.10
27
- Requires-Dist: accelerate<0.32,>=0.31.0
28
- Requires-Dist: datasets<3,>=2.20.0
27
+ Requires-Dist: accelerate>=0.31.0
28
+ Requires-Dist: datasets<4,>=3.0.0
29
29
  Requires-Dist: formatron<0.5,>=0.4.11
30
+ Requires-Dist: huggingface-hub<0.29,>=0.28.0
30
31
  Requires-Dist: joblib<2,>=1.3.0
31
- Requires-Dist: json-repair<0.31,>=0.30.0
32
+ Requires-Dist: json-repair>=0.30.0
32
33
  Requires-Dist: numpy<2,>=1.26.3
33
- Requires-Dist: opacus==1.5.2
34
+ Requires-Dist: opacus<2,>=1.5.2
34
35
  Requires-Dist: pandas~=2.2.0
35
- Requires-Dist: peft<0.12,>=0.11.1
36
+ Requires-Dist: peft>=0.12.0
36
37
  Requires-Dist: psutil<6,>=5.9.5
37
38
  Requires-Dist: pyarrow>=16.0.0
38
39
  Requires-Dist: rich<14,>=13.9.4
@@ -192,4 +193,5 @@ engine.generate( # use model to generate synthetic samples
192
193
  workspace_dir=ws,
193
194
  sample_size=10,
194
195
  )
196
+ pd.read_parquet(ws / "SyntheticData") # load synthetic data
195
197
  ```
@@ -141,4 +141,5 @@ engine.generate( # use model to generate synthetic samples
141
141
  workspace_dir=ws,
142
142
  sample_size=10,
143
143
  )
144
+ pd.read_parquet(ws / "SyntheticData") # load synthetic data
144
145
  ```
@@ -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.1.2"
25
+ __version__ = "1.1.4"
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.*")
@@ -679,7 +679,8 @@ def train(
679
679
  do_stop = True
680
680
 
681
681
  # check for max_training_time
682
- if (total_time_init + time.time() - start_trn_time) > max_training_time:
682
+ total_training_time = total_time_init + time.time() - start_trn_time
683
+ if total_training_time > max_training_time:
683
684
  do_stop = True
684
685
 
685
686
  # no checkpoint is saved yet because the training stopped before the first epoch ended
@@ -691,8 +692,13 @@ def train(
691
692
  lr_scheduler=lr_scheduler,
692
693
  dp_accountant=privacy_engine.accountant if with_dp else None,
693
694
  )
694
- with forward_ctx_mgr:
695
- val_loss = _calculate_val_loss(model=model, val_dataloader=val_dataloader)
695
+ if total_training_time > max_training_time:
696
+ _LOG.info("skip validation loss calculation due to time-capped early stopping")
697
+ val_loss = None
698
+ else:
699
+ _LOG.info("calculate validation loss")
700
+ with forward_ctx_mgr:
701
+ val_loss = _calculate_val_loss(model=model, val_dataloader=val_dataloader)
696
702
  dp_epsilon = privacy_engine.get_epsilon(dp_delta) if with_dp else None
697
703
  # send a final message to inform how far we've progressed
698
704
  progress_message = ProgressMessage(
@@ -702,7 +708,7 @@ def train(
702
708
  samples=samples,
703
709
  trn_loss=None,
704
710
  val_loss=val_loss,
705
- total_time=total_time_init + time.time() - start_trn_time,
711
+ total_time=total_training_time,
706
712
  learn_rate=current_lr,
707
713
  dp_eps=dp_epsilon,
708
714
  dp_delta=dp_delta,
@@ -822,7 +822,8 @@ def train(
822
822
  do_stop = True
823
823
 
824
824
  # check for max_training_time
825
- if (total_time_init + time.time() - start_trn_time) > max_training_time:
825
+ total_training_time = total_time_init + time.time() - start_trn_time
826
+ if total_training_time > max_training_time:
826
827
  do_stop = True
827
828
 
828
829
  # no checkpoint is saved yet because the training stopped before the first epoch ended
@@ -834,7 +835,12 @@ def train(
834
835
  lr_scheduler=lr_scheduler,
835
836
  dp_accountant=privacy_engine.accountant if with_dp else None,
836
837
  )
837
- val_loss = _calculate_val_loss(model=argn, val_dataloader=val_dataloader)
838
+ if total_training_time > max_training_time:
839
+ _LOG.info("skip validation loss calculation due to time-capped early stopping")
840
+ val_loss = None
841
+ else:
842
+ _LOG.info("calculate validation loss")
843
+ val_loss = _calculate_val_loss(model=argn, val_dataloader=val_dataloader)
838
844
  dp_epsilon = privacy_engine.get_epsilon(dp_delta) if with_dp else None
839
845
  # send a final message to inform how far we've progressed
840
846
  trn_loss = _calculate_average_trn_loss(trn_sample_losses)
@@ -845,7 +851,7 @@ def train(
845
851
  samples=samples,
846
852
  trn_loss=trn_loss,
847
853
  val_loss=val_loss,
848
- total_time=total_time_init + time.time() - start_trn_time,
854
+ total_time=total_training_time,
849
855
  learn_rate=current_lr,
850
856
  dp_eps=dp_epsilon,
851
857
  dp_delta=dp_delta,
@@ -20,15 +20,13 @@ _LOG = logging.getLogger(__name__.rsplit(".", 1)[0]) # get the logger with the
20
20
 
21
21
  def init_logging() -> None:
22
22
  """
23
- Initialize the logging configuration. Either log to stdout or to a file.
23
+ Initialize the logging configuration to stdout.
24
24
  """
25
25
 
26
- # log to stdout
27
- handler = logging.StreamHandler(stream=sys.stdout)
28
- handler.setFormatter(logging.Formatter("[%(asctime)s] %(levelname)-7s: %(message)s"))
29
- handler.setLevel(logging.INFO)
30
-
26
+ _LOG.propagate = False
31
27
  if not _LOG.hasHandlers():
28
+ handler = logging.StreamHandler(stream=sys.stdout)
29
+ handler.setFormatter(logging.Formatter("[%(asctime)s] %(levelname)-7s: %(message)s"))
30
+ handler.setLevel(logging.INFO)
32
31
  _LOG.addHandler(handler)
33
32
  _LOG.setLevel(logging.INFO)
34
- _LOG.propagate = False
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyai-engine"
3
- version = "1.1.2"
3
+ version = "1.1.4"
4
4
  description = "Synthetic Data Engine"
5
5
  authors = [{ name = "MOSTLY AI", email = "dev@mostly.ai" }]
6
6
  requires-python = ">=3.10"
@@ -33,12 +33,13 @@ dependencies = [
33
33
  "psutil>=5.9.5,<6", # upgrade when colab psutil is updated
34
34
  "tokenizers>=0.21.0,<0.22",
35
35
  "transformers>=4.45.2,<5",
36
- "datasets>=2.20.0,<3",
37
- "accelerate>=0.31.0,<0.32",
38
- "peft>=0.11.1,<0.12",
39
- "opacus==1.5.2", # pin as 1.5.3 breaks tests
36
+ "datasets>=3.0.0,<4",
37
+ "accelerate>=0.31.0",
38
+ "peft>=0.12.0",
39
+ "huggingface-hub>=0.28.0,<0.29",
40
+ "opacus>=1.5.2,<2",
40
41
  "formatron>=0.4.11,<0.5",
41
- "json-repair>=0.30.0,<0.31",
42
+ "json-repair>=0.30.0",
42
43
  "rich>=13.9.4,<14",
43
44
  "torch>=2.5.1; sys_platform == 'darwin'",
44
45
  ]
File without changes