LLM-FineTuning-Notebook-Generator / utils /components_creator.py
menouar
Correct the label of max_steps
6f22c73
from typing import Set
import gradio as gr
from gradio.components import Component
from utils import *
def add_quantization_components() -> Set[Component]:
q_components: Set[Component] = set()
load_in_4bit = gr.Radio(["load_in_4bit", "load_in_8bit"], value="load_in_4bit",
label="Quantization",
info="This flag is used to enable 4/8-bit "
"quantization.",
interactive=True,
elem_id=LOAD_IN_4_BIT_ID)
bnb_4bit_quant_type = gr.Radio(["fp4", "nf4"], label="bnb_4bit_quant_type",
value="nf4",
elem_id=BNB_4BIT_QUANT_TYPE,
interactive=True,
info="This sets the quantization data type in "
"the bnb.nn.Linear4Bit "
"layers.")
q_components.add(load_in_4bit)
q_components.add(bnb_4bit_quant_type)
return q_components
def add_quantization_components1() -> Set[Component]:
q_components: Set[Component] = set()
bnb_4bit_compute_dtype = gr.Radio(
["torch.float32", "torch.bfloat16", "torch.float16"],
label="bnb_4bit_compute_dtype",
info="This sets the computational type which might be different "
"than the input type.",
elem_id=BNB_4BIT_COMPUTE_DTYPE,
interactive=True, value="torch.bfloat16")
bnb_4bit_use_double_quant = gr.Checkbox(label="bnb_4bit_use_double_quant",
value=True,
interactive=True,
elem_id=BNB_4BIT_USE_DOUBLE_QUANT,
info="This flag is used for nested "
"quantization where the "
"quantization constants from "
"the first "
"quantization are quantized "
"again.")
q_components.add(bnb_4bit_compute_dtype)
q_components.add(bnb_4bit_use_double_quant)
return q_components
def add_dataset_components() -> Set[Component]:
dataset_selection = gr.Dropdown([dt.path for dt in ft_datasets],
elem_id=DATASET_SELECTION_ID,
label="Select a Dataset",
info="Choose a dataset to finetune the model in the ChatML format."
)
seed = gr.Slider(0, 256, step=1, value=42, elem_id=DATASET_SHUFFLING_SEED, label="Random Seed",
info="Set a random seed for shuffling the dataset.", interactive=True)
d_components: Set[Component] = set()
d_components.add(dataset_selection)
d_components.add(seed)
return d_components
def add_pad_tokens() -> Set[Component]:
pad_token_side = gr.Radio(["right", "left"], label="Tokenizer: padding_side",
info="The side on which the model should have padding applied.",
interactive=True, value="right", elem_id=PAD_SIDE_ID)
pad_token_value = gr.Radio([None, "eos_token"], label="Tokenizer: pad_token",
info="A special token used to make arrays of tokens the same size for batching "
"purpose. Will then be "
"ignored by attention mechanisms or loss computation.",
interactive=True, value=None, elem_id=PAD_VALUE_ID)
pad_components: Set[Component] = set()
pad_components.add(pad_token_side)
pad_components.add(pad_token_value)
return pad_components
def add_lora_components() -> Set[Component]:
r = gr.Slider(1, 2048, step=1, value=6, label="r", info="Lora attention dimension (the 'rank').",
interactive=True, elem_id=LORA_R_ID)
alpha = gr.Slider(1, 512, step=1, value=8, label="lora_alpha", info="The alpha parameter for Lora scaling.",
interactive=True, elem_id=LORA_ALPHA_ID)
out_components: Set[Component] = set()
out_components.add(r)
out_components.add(alpha)
return out_components
def add_lora_components1() -> Set[Component]:
dropout = gr.Slider(0, 1, step=0.01, value=0.05, label="lora_dropout",
info="The dropout probability for Lora layers.",
interactive=True, elem_id=LORA_DROPOUT_ID)
bias = gr.Radio(['none', 'all', 'lora_only'], label="bias",
info="Bias type for LoRA. If 'all' or 'lora_only', the corresponding biases will be updated during "
"training.",
interactive=True, value="none", elem_id=LORA_BIAS_ID)
out_components: Set[Component] = set()
out_components.add(dropout)
out_components.add(bias)
return out_components
def add_training_args_1() -> Set[Component]:
epochs = gr.Slider(1, 100, step=1, value=3, label="num_train_epochs",
info="Total number of training epochs to perform.",
interactive=True, elem_id=NUM_TRAIN_EPOCHS_ID)
max_steps = gr.Slider(-1, 100, step=1, value=-1, label="max_steps",
info="Total number of training steps to perform. If set to a positive number it overrides "
"'num_train_epochs'.",
interactive=True, elem_id=MAX_STEPS_ID)
out_components: Set[Component] = set()
out_components.add(epochs)
out_components.add(max_steps)
return out_components
def add_training_args_1_bis() -> Set[Component]:
logging_steps = gr.Slider(1, 100, step=1, value=10, label="logging_steps",
info="Number of update steps between two logs if logging_strategy='steps'",
interactive=True, elem_id=LOGGING_STEPS_ID)
per_device_train_batch_size = gr.Slider(1, 64, step=1, value=3, label="per_device_train_batch_size",
info="Batch size per device during training.",
interactive=True, elem_id=PER_DEVICE_TRAIN_BATCH_SIZE)
save_strategy = gr.Radio(['no', 'epoch', 'steps'], label="save_strategy",
info="The checkpoint save strategy to adopt during training.",
interactive=True, value="epoch", elem_id=SAVE_STRATEGY_ID)
out_components: Set[Component] = set()
out_components.add(save_strategy)
out_components.add(logging_steps)
out_components.add(per_device_train_batch_size)
return out_components
def add_training_args_3() -> Set[Component]:
max_grad_norm = gr.Slider(0.01, 1, value=0.3, label="max_grad_norm",
info="Maximum gradient norm (for gradient clipping).",
interactive=True, elem_id=MAX_GRAD_NORM_ID)
warmup_ratio = gr.Slider(0, 1, value=0.1, label="warmup_ratio",
info="Ratio of total training steps used for a linear warmup from 0 to learning_rate.",
interactive=True, elem_id=WARMUP_RATIO_ID)
gradient_accumulation_steps = gr.Slider(1, 64, step=1, value=2, label="gradient_accumulation_steps",
info="Number of updates steps to accumulate the gradients for, before "
"performing a backward/update "
"pass.",
interactive=True, elem_id=GRADIENT_ACCUMULATION_STEPS_ID)
gradient_checkpointing = gr.Checkbox(label="gradient_checkpointing", value=True, interactive=True,
info="Use gradient checkpointing to save memory at the expense of slower "
"backward pass.", elem_id=GRADIENT_CHECKPOINTING_ID)
lr_scheduler_type = gr.Radio(['linear', 'constant', 'cosine'], label="lr_scheduler_type",
info="The learning rate scheduler type to use.",
interactive=True, value="cosine", elem_id=LR_SCHEDULER_TYPE_ID)
out_components: Set[Component] = set()
out_components.add(max_grad_norm)
out_components.add(warmup_ratio)
out_components.add(gradient_accumulation_steps)
out_components.add(gradient_checkpointing)
out_components.add(lr_scheduler_type)
return out_components
def add_outputs() -> (Component, Component):
output_dir = gr.Textbox(interactive=True,
label="output_dir",
info='The output directory where the model and checkpoints will be saved.',
elem_id=OUTPUT_DIR_ID)
push_to_hub = gr.Checkbox(
label="Push to Hub",
value=False,
interactive=True,
info="Select this option if you want to upload the trained model to Hugging Face Hub after training. "
"Please note, if this option is selected, you must provide a valid 'HF_TOKEN' in the generated notebook.",
elem_id=PUSH_TO_HUB_ID
)
return output_dir, push_to_hub
def add_hf_repo_cmp() -> Component:
repo_name = gr.Textbox(label="HF Repo name",
placeholder="username/your_repository",
info="Hugging Face repository to be created.",
interactive=True,
visible=False,
elem_id=REPOSITORY_NAME_ID)
return repo_name
def add_outputs1() -> Set[Component]:
report_to = gr.Dropdown(
["azure_ml", "comet_ml", "mlflow", "tensorboard", "wandb", "all", 'none'],
value="tensorboard",
elem_id=REPORT_TO_ID,
label="report_to",
info="The list of integrations to report the results and logs to. Supported platforms are 'azure_ml', "
"'comet_ml', 'mlflow', 'tensorboard' and 'wandb'. Use 'all' to report to all integrations installed, "
"'none' for no integrations."
)
create_readme = gr.Checkbox(label="Automatically Generate a README.md", value=True, interactive=True,
info="Choose whether to automatically generate a model card (README.md) or not.",
elem_id=README_ID)
out_components: Set[Component] = set()
out_components.add(report_to)
out_components.add(create_readme)
return out_components
def add_optimizer() -> Set[Component]:
adam_beta1 = gr.Slider(0.00001, 1, value=0.9, label="adam_beta1",
info="The beta1 hyperparameter for the [`AdamW`] optimizer.",
interactive=True, elem_id=BETA1_ID)
adam_beta2 = gr.Slider(0.00001, 1, value=0.999, label="adam_beta2",
info="The beta2 hyperparameter for the [`AdamW`] optimizer.",
interactive=True, elem_id=BETA2_ID)
adam_epsilon = gr.Slider(1e-9, 1, value=1e-8, label="adam_epsilon",
info="The epsilon hyperparameter for the [`AdamW`] optimizer.",
interactive=True, elem_id=EPSILON_ID)
out_components: Set[Component] = set()
out_components.add(adam_beta1)
out_components.add(adam_beta2)
out_components.add(adam_epsilon)
return out_components
def add_optimizer1() -> Set[Component]:
optimizer = gr.Dropdown(
["adamw_hf", "adamw_torch", "adamw_torch_fused", "adamw_apex_fused", "adamw_anyprecision", "adafactor"],
value="adamw_torch_fused",
elem_id=OPTIMIZER_ID,
label="optimizer",
info="The optimizer to use: 'adamw_hf', 'adamw_torch', 'adamw_torch_fused', 'adamw_apex_fused', "
"'adamw_anyprecision' or "
"'adafactor'. "
)
learning_rate = gr.Slider(1e-6, 1, step=0.001, value=2.0e-05, label="learning_rate",
info="The initial learning rate for AdamW.",
interactive=True, elem_id=LEARNING_RATE_ID)
weight_decay = gr.Slider(0, 1, value=0, label="weight_decay",
info="The weight decay to apply (if not zero) to all layers except all bias and "
"LayerNorm weights in [`AdamW`] optimizer.",
interactive=True, elem_id=WEIGHT_DECAY_ID)
out_components: Set[Component] = set()
out_components.add(optimizer)
out_components.add(learning_rate)
out_components.add(weight_decay)
return out_components
def add_sft_trainer_args() -> Set[Component]:
max_seq_length = gr.Slider(512, 3072, value=2048, label="max_seq_length",
info="The maximum sequence length to use for the `ConstantLengthDataset` and for "
"automatically "
"creating the Dataset.",
interactive=True, elem_id=MAX_SEQ_LENGTH_ID)
packing = gr.Checkbox(label="packing", value=True, interactive=True, elem_id=PACKING_ID,
info="This argument is used by the `ConstantLengthDataset` to pack the sequences of the "
"dataset.")
out_components: Set[Component] = set()
out_components.add(max_seq_length)
out_components.add(packing)
return out_components