Files
LocalAI/core/schema/finetune.go
Ettore Di Giacinto 59108fbe32 feat: add distributed mode (#9124)
* feat: add distributed mode (experimental)

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* fix data races, mutexes, transactions

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactorings

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* fixups

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* fix events and tool stream in agent chat

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* use ginkgo

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* fix(cron): compute correctly time boundaries avoiding re-triggering

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* enhancements, refactorings

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* do not flood of healthy checks

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* do not list obvious backends as text backends

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* tests fixups

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* refactoring and consolidation

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* Drop redundant healthcheck

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

* enhancements, refactorings

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>

---------

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
2026-03-30 00:47:27 +02:00

112 lines
5.3 KiB
Go

package schema
// RewardFunctionSpec defines a reward function for GRPO training.
type RewardFunctionSpec struct {
Type string `json:"type"` // "builtin" or "inline"
Name string `json:"name"`
Code string `json:"code,omitempty"` // inline only
Params map[string]string `json:"params,omitempty"`
}
// FineTuneJobRequest is the REST API request to start a fine-tuning job.
type FineTuneJobRequest struct {
Model string `json:"model"`
Backend string `json:"backend"` // "trl"
TrainingType string `json:"training_type,omitempty"` // lora, loha, lokr, full
TrainingMethod string `json:"training_method,omitempty"` // sft, dpo, grpo, rloo, reward, kto, orpo
// Adapter config
AdapterRank int32 `json:"adapter_rank,omitempty"`
AdapterAlpha int32 `json:"adapter_alpha,omitempty"`
AdapterDropout float32 `json:"adapter_dropout,omitempty"`
TargetModules []string `json:"target_modules,omitempty"`
// Training hyperparameters
LearningRate float32 `json:"learning_rate,omitempty"`
NumEpochs int32 `json:"num_epochs,omitempty"`
BatchSize int32 `json:"batch_size,omitempty"`
GradientAccumulationSteps int32 `json:"gradient_accumulation_steps,omitempty"`
WarmupSteps int32 `json:"warmup_steps,omitempty"`
MaxSteps int32 `json:"max_steps,omitempty"`
SaveSteps int32 `json:"save_steps,omitempty"`
WeightDecay float32 `json:"weight_decay,omitempty"`
GradientCheckpointing bool `json:"gradient_checkpointing,omitempty"`
Optimizer string `json:"optimizer,omitempty"`
Seed int32 `json:"seed,omitempty"`
MixedPrecision string `json:"mixed_precision,omitempty"`
// Dataset
DatasetSource string `json:"dataset_source"`
DatasetSplit string `json:"dataset_split,omitempty"`
// Resume from a checkpoint
ResumeFromCheckpoint string `json:"resume_from_checkpoint,omitempty"`
// GRPO reward functions
RewardFunctions []RewardFunctionSpec `json:"reward_functions,omitempty"`
// Backend-specific and method-specific options
ExtraOptions map[string]string `json:"extra_options,omitempty"`
}
// FineTuneJob represents a fine-tuning job with its current state.
type FineTuneJob struct {
ID string `json:"id"`
UserID string `json:"user_id,omitempty"`
Model string `json:"model"`
Backend string `json:"backend"`
ModelID string `json:"model_id,omitempty"` // backend model loader ID
TrainingType string `json:"training_type"`
TrainingMethod string `json:"training_method"`
Status string `json:"status"` // queued, loading_model, loading_dataset, training, saving, completed, failed, stopped
Message string `json:"message,omitempty"`
OutputDir string `json:"output_dir"`
ExtraOptions map[string]string `json:"extra_options,omitempty"`
CreatedAt string `json:"created_at"`
// Export state (tracked separately from training status)
ExportStatus string `json:"export_status,omitempty"` // "", "exporting", "completed", "failed"
ExportMessage string `json:"export_message,omitempty"`
ExportModelName string `json:"export_model_name,omitempty"` // registered model name after export
// Full config for resume/reuse
Config *FineTuneJobRequest `json:"config,omitempty"`
}
// FineTuneJobResponse is the REST API response when creating a job.
type FineTuneJobResponse struct {
ID string `json:"id"`
Status string `json:"status"`
Message string `json:"message"`
}
// FineTuneProgressEvent is an SSE event for training progress.
type FineTuneProgressEvent struct {
JobID string `json:"job_id"`
CurrentStep int32 `json:"current_step"`
TotalSteps int32 `json:"total_steps"`
CurrentEpoch float32 `json:"current_epoch"`
TotalEpochs float32 `json:"total_epochs"`
Loss float32 `json:"loss"`
LearningRate float32 `json:"learning_rate"`
GradNorm float32 `json:"grad_norm"`
EvalLoss float32 `json:"eval_loss"`
EtaSeconds float32 `json:"eta_seconds"`
ProgressPercent float32 `json:"progress_percent"`
Status string `json:"status"`
Message string `json:"message,omitempty"`
CheckpointPath string `json:"checkpoint_path,omitempty"`
SamplePath string `json:"sample_path,omitempty"`
ExtraMetrics map[string]float32 `json:"extra_metrics,omitempty"`
}
// ExportRequest is the REST API request to export a model.
type ExportRequest struct {
Name string `json:"name,omitempty"` // model name for LocalAI (auto-generated if empty)
CheckpointPath string `json:"checkpoint_path"`
ExportFormat string `json:"export_format"` // lora, merged_16bit, merged_4bit, gguf
QuantizationMethod string `json:"quantization_method"` // for GGUF: q4_k_m, q5_k_m, q8_0, f16
Model string `json:"model,omitempty"` // base model name for merge
ExtraOptions map[string]string `json:"extra_options,omitempty"`
}