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.
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/PKG-INFO +1 -1
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/__init__.py +1 -1
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/encoding.py +1 -1
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/generation.py +17 -1
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/analysis.py +1 -1
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/training.py +13 -13
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/pyproject.toml +13 -13
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/.gitignore +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/LICENSE +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/README.md +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_common.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_dtypes.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/__init__.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/__init__.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/categorical.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/datetime.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/numeric.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/text.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/__init__.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/categorical.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/character.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/datetime.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/itt.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/lat_long.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/numeric.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/__init__.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/common.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/encoding.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/__init__.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/base.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/hf_engine.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/vllm_engine.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/generation.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/lstm.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/tokenizer_utils.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/training.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/xgrammar_utils.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_memory.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/__init__.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/argn.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/common.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/fairness.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_tabular/training.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_training_utils.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_workspace.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/domain.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/encoding.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/generation.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/logging.py +0 -0
- {mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/splitting.py +0 -0
|
@@ -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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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>=
|
|
58
|
-
"ruff
|
|
59
|
-
"pre-commit>=4.0
|
|
60
|
-
"twine>=6.1
|
|
61
|
-
"ipykernel>=6.25
|
|
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.
|
|
65
|
-
"mkdocstrings[crystal, python]>=0.
|
|
66
|
-
"mkdocs-material>=9.0
|
|
67
|
-
"griffe>=1.0
|
|
68
|
-
"pymdown-extensions>=10.0
|
|
69
|
-
"griffe-fieldz>=0.2
|
|
70
|
-
"black>=
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/datetime.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/numeric.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/language/text.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/character.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/datetime.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/itt.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/lat_long.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_encoding_types/tabular/numeric.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/hf_engine.py
RENAMED
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/engine/vllm_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mostlyai_engine-1.3.1 → mostlyai_engine-1.3.3}/mostlyai/engine/_language/tokenizer_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|