modelforge-finetuning 3.0.4__tar.gz → 3.0.5__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 (109) hide show
  1. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/evaluation/metrics.py +10 -18
  2. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/services/training_service.py +10 -1
  3. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/strategies/qlora_strategy.py +2 -0
  4. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/strategies/sft_strategy.py +32 -0
  5. {modelforge_finetuning-3.0.4/modelforge_finetuning.egg-info → modelforge_finetuning-3.0.5}/PKG-INFO +1 -1
  6. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5/modelforge_finetuning.egg-info}/PKG-INFO +1 -1
  7. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/pyproject.toml +1 -1
  8. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/LICENSE +0 -0
  9. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/MANIFEST.in +0 -0
  10. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/asset-manifest.json +0 -0
  11. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/favicon.ico +0 -0
  12. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/favicon.jpg +0 -0
  13. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/index.html +0 -0
  14. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/logo192.png +0 -0
  15. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/logo512.png +0 -0
  16. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/manifest.json +0 -0
  17. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/robots.txt +0 -0
  18. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/css/main.5a3d6ea1.css +0 -0
  19. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/css/main.5a3d6ea1.css.map +0 -0
  20. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/css/main.9680427d.css +0 -0
  21. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/css/main.9680427d.css.map +0 -0
  22. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/453.6e4f956a.chunk.js +0 -0
  23. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/453.6e4f956a.chunk.js.map +0 -0
  24. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/453.ad6eb26e.chunk.js +0 -0
  25. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/453.ad6eb26e.chunk.js.map +0 -0
  26. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.2b0344e0.js +0 -0
  27. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.2b0344e0.js.LICENSE.txt +0 -0
  28. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.2b0344e0.js.map +0 -0
  29. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.9cc9257a.js +0 -0
  30. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.9cc9257a.js.LICENSE.txt +0 -0
  31. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.9cc9257a.js.map +0 -0
  32. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.9df15fbf.js +0 -0
  33. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.9df15fbf.js.LICENSE.txt +0 -0
  34. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/Frontend/build/static/js/main.9df15fbf.js.map +0 -0
  35. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/__init__.py +0 -0
  36. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/app.py +0 -0
  37. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/cli.py +0 -0
  38. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/database/__init__.py +0 -0
  39. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/database/database_manager.py +0 -0
  40. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/database/models.py +0 -0
  41. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/dependencies.py +0 -0
  42. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/evaluation/__init__.py +0 -0
  43. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/evaluation/dataset_validator.py +0 -0
  44. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/exceptions.py +0 -0
  45. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/formatters/__init__.py +0 -0
  46. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/formatters/formatting_functions.py +0 -0
  47. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/globals/__init__.py +0 -0
  48. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/globals/globals.py +0 -0
  49. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/globals/globals_instance.py +0 -0
  50. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/logging_config.py +0 -0
  51. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/model_configs/high_end.json +0 -0
  52. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/model_configs/low_end.json +0 -0
  53. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/model_configs/mid_range.json +0 -0
  54. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/notebook_cli/__init__.py +0 -0
  55. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/notebook_cli/progress.py +0 -0
  56. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/notebook_cli/prompts.py +0 -0
  57. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/notebook_cli/wizard.py +0 -0
  58. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/providers/__init__.py +0 -0
  59. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/providers/huggingface_provider.py +0 -0
  60. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/providers/provider_factory.py +0 -0
  61. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/providers/unsloth_provider.py +0 -0
  62. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/routers/__init__.py +0 -0
  63. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/routers/finetuning_router.py +0 -0
  64. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/routers/hub_management_router.py +0 -0
  65. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/routers/models_router.py +0 -0
  66. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/routers/playground_router.py +0 -0
  67. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/schemas/__init__.py +0 -0
  68. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/schemas/training_schemas.py +0 -0
  69. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/services/__init__.py +0 -0
  70. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/services/hardware_service.py +0 -0
  71. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/services/model_service.py +0 -0
  72. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/strategies/__init__.py +0 -0
  73. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/strategies/dpo_strategy.py +0 -0
  74. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/strategies/rlhf_strategy.py +0 -0
  75. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/strategies/strategy_factory.py +0 -0
  76. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/low_qa_train_set.jsonl +0 -0
  77. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/low_summarization_train_set.jsonl +0 -0
  78. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/low_text_generation.jsonl +0 -0
  79. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/med_construction.jsonl +0 -0
  80. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/med_text_generation.jsonl +0 -0
  81. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/question_answer-train-data-sample.jsonl +0 -0
  82. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/test_dataset.json +0 -0
  83. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/test_financial_advisory_generation.jsonl +0 -0
  84. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/test_datasets/test_financial_advisory_generation_bak.jsonl +0 -0
  85. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/__init__.py +0 -0
  86. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/chat_playground.py +0 -0
  87. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/configs/hardware_thresholds.json +0 -0
  88. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/configs/tasks.json +0 -0
  89. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/device_utils.py +0 -0
  90. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/finetuning/__init__.py +0 -0
  91. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/finetuning/quantization.py +0 -0
  92. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/finetuning/settings_builder.py +0 -0
  93. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/hardware_detection/__init__.py +0 -0
  94. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/hardware_detection/config_manager.py +0 -0
  95. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/hardware_detection/hardware_detector.py +0 -0
  96. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/hardware_detection/hardware_detector_factory.py +0 -0
  97. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/hardware_detection/model_recommendation.py +0 -0
  98. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/hardware_detection/model_validator.py +0 -0
  99. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/settings_managers/DBManager.py +0 -0
  100. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/settings_managers/FileManager.py +0 -0
  101. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/ModelForge/utilities/settings_managers/__init__.py +0 -0
  102. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/README.md +0 -0
  103. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/modelforge_finetuning.egg-info/SOURCES.txt +0 -0
  104. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/modelforge_finetuning.egg-info/dependency_links.txt +0 -0
  105. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/modelforge_finetuning.egg-info/entry_points.txt +0 -0
  106. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/modelforge_finetuning.egg-info/requires.txt +0 -0
  107. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/modelforge_finetuning.egg-info/top_level.txt +0 -0
  108. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/setup.cfg +0 -0
  109. {modelforge_finetuning-3.0.4 → modelforge_finetuning-3.0.5}/tests/test_device_utils.py +0 -0
@@ -21,6 +21,10 @@ class MetricsCalculator:
21
21
  - Perplexity: exp(loss)
22
22
  - Loss: Cross-entropy loss
23
23
 
24
+ Note: When preprocess_logits_for_metrics is used, predictions contain
25
+ pre-computed scalar losses (one per eval batch) instead of full logit tensors.
26
+ This prevents RAM exhaustion during evaluation.
27
+
24
28
  Args:
25
29
  eval_pred: Evaluation prediction with predictions and labels
26
30
 
@@ -29,28 +33,16 @@ class MetricsCalculator:
29
33
  """
30
34
  logger.info("Computing causal LM metrics")
31
35
 
32
- import torch
33
- import torch.nn.functional as F
34
-
35
- predictions, labels = eval_pred.predictions, eval_pred.label_ids
36
-
37
- logits = torch.from_numpy(np.array(predictions)).float()
38
- lbl = torch.from_numpy(np.array(labels))
39
-
40
- shift_logits = logits[..., :-1, :].contiguous()
41
- shift_labels = lbl[..., 1:].contiguous()
36
+ predictions = eval_pred.predictions
42
37
 
43
- loss = F.cross_entropy(
44
- shift_logits.view(-1, shift_logits.size(-1)),
45
- shift_labels.view(-1).long(),
46
- ignore_index=-100,
47
- reduction="mean",
48
- )
49
- perplexity = float(torch.exp(loss))
38
+ # predictions is shape (num_eval_batches, 1) of pre-computed scalar losses
39
+ # (from _preprocess_logits_for_metrics in sft_strategy.py)
40
+ mean_loss = float(np.mean(predictions))
41
+ perplexity = float(np.exp(mean_loss))
50
42
 
51
43
  metrics = {
52
44
  "perplexity": perplexity,
53
- "eval_loss": float(loss),
45
+ "eval_loss": mean_loss,
54
46
  }
55
47
 
56
48
  logger.info(f"Causal LM metrics: {metrics}")
@@ -432,7 +432,16 @@ class TrainingService:
432
432
 
433
433
  # Train
434
434
  self.training_status["message"] = "Training in progress..."
435
- trainer.train()
435
+ provider_name = config.get("provider", "")
436
+ if provider_name == "unsloth":
437
+ try:
438
+ from unsloth import unsloth_train
439
+ unsloth_train(trainer)
440
+ except ImportError:
441
+ logger.warning("unsloth_train not available, falling back to trainer.train()")
442
+ trainer.train()
443
+ else:
444
+ trainer.train()
436
445
 
437
446
  # Save model
438
447
  self.training_status["message"] = "Saving model..."
@@ -22,6 +22,7 @@ except ImportError:
22
22
  from trl import SFTTrainer, SFTConfig
23
23
 
24
24
  from ..logging_config import logger
25
+ from .sft_strategy import _preprocess_logits_for_metrics
25
26
 
26
27
 
27
28
  class QLoRAStrategy:
@@ -269,6 +270,7 @@ class QLoRAStrategy:
269
270
  peft_config=peft_config,
270
271
  callbacks=callbacks or [],
271
272
  compute_metrics=compute_metrics,
273
+ preprocess_logits_for_metrics=_preprocess_logits_for_metrics,
272
274
  )
273
275
 
274
276
  logger.info("QLoRA SFTTrainer created successfully")
@@ -23,6 +23,37 @@ from trl import SFTTrainer, SFTConfig
23
23
  from ..logging_config import logger
24
24
 
25
25
 
26
+ def _preprocess_logits_for_metrics(logits, labels):
27
+ """
28
+ Reduce logit tensors to scalar loss per batch before CPU accumulation.
29
+
30
+ This prevents RAM exhaustion when the Trainer accumulates eval predictions.
31
+ Instead of storing full logit tensors (batch × seq_len × vocab_size),
32
+ we compute the loss on GPU and return only a scalar, reducing memory by
33
+ orders of magnitude (e.g., 19.7 GB/batch → bytes/batch).
34
+
35
+ Args:
36
+ logits: Model logits (batch, seq_len, vocab_size)
37
+ labels: Token labels (batch, seq_len)
38
+
39
+ Returns:
40
+ Scalar loss tensor for this batch, shape (1,)
41
+ """
42
+ import torch.nn.functional as F
43
+
44
+ shift_logits = logits[..., :-1, :].contiguous()
45
+ shift_labels = labels[..., 1:].contiguous()
46
+
47
+ loss = F.cross_entropy(
48
+ shift_logits.view(-1, shift_logits.size(-1)),
49
+ shift_labels.view(-1).long(),
50
+ ignore_index=-100,
51
+ reduction="mean",
52
+ )
53
+
54
+ return loss.unsqueeze(0)
55
+
56
+
26
57
  class SFTStrategy:
27
58
  """Supervised Fine-Tuning strategy using TRL's SFTTrainer."""
28
59
 
@@ -248,6 +279,7 @@ class SFTStrategy:
248
279
  peft_config=peft_config,
249
280
  callbacks=callbacks or [],
250
281
  compute_metrics=compute_metrics,
282
+ preprocess_logits_for_metrics=_preprocess_logits_for_metrics,
251
283
  )
252
284
 
253
285
  logger.info("SFTTrainer created successfully")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modelforge-finetuning
3
- Version: 3.0.4
3
+ Version: 3.0.5
4
4
  Summary: ModelForge: A no-code toolkit for fine-tuning HuggingFace models
5
5
  Author-email: R3tr0 M1ll3r <r3tr0.m1ll3r@gmail.com>
6
6
  Project-URL: Documentation, https://modelforge-finetuning.readthedocs.io
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modelforge-finetuning
3
- Version: 3.0.4
3
+ Version: 3.0.5
4
4
  Summary: ModelForge: A no-code toolkit for fine-tuning HuggingFace models
5
5
  Author-email: R3tr0 M1ll3r <r3tr0.m1ll3r@gmail.com>
6
6
  Project-URL: Documentation, https://modelforge-finetuning.readthedocs.io
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "modelforge-finetuning"
3
- version = "3.0.4"
3
+ version = "3.0.5"
4
4
  description = "ModelForge: A no-code toolkit for fine-tuning HuggingFace models"
5
5
  authors = [
6
6
  {name = "R3tr0 M1ll3r", email = "r3tr0.m1ll3r@gmail.com"},