diff --git a/src/together/cli/api/finetune.py b/src/together/cli/api/finetune.py index 172acdd3..1cb2b921 100644 --- a/src/together/cli/api/finetune.py +++ b/src/together/cli/api/finetune.py @@ -4,7 +4,7 @@ import re from datetime import datetime, timezone from textwrap import wrap -from typing import Any, Literal +from typing import Any, Literal, List import click from click.core import ParameterSource # type: ignore[attr-defined] @@ -62,6 +62,7 @@ def fine_tuning(ctx: click.Context) -> None: "-t", type=str, required=True, + multiple=True, help="Training file ID from Files API", ) @click.option("--model", "-m", type=str, help="Base model name") @@ -202,7 +203,7 @@ def fine_tuning(ctx: click.Context) -> None: ) def create( ctx: click.Context, - training_file: str, + training_file: str | List[str], validation_file: str, model: str, n_epochs: int, @@ -239,7 +240,7 @@ def create( client: Together = ctx.obj training_args: dict[str, Any] = dict( - training_file=training_file, + training_files=training_file, model=model, n_epochs=n_epochs, validation_file=validation_file, diff --git a/src/together/resources/finetune.py b/src/together/resources/finetune.py index 27baf2d2..893af787 100644 --- a/src/together/resources/finetune.py +++ b/src/together/resources/finetune.py @@ -45,8 +45,8 @@ def create_finetune_request( model_limits: FinetuneTrainingLimits, - training_file: str, model: str | None = None, + training_files: str | List[str] = "", n_epochs: int = 1, validation_file: str | None = "", n_evals: int | None = 0, @@ -76,7 +76,22 @@ def create_finetune_request( rpo_alpha: float | None = None, simpo_gamma: float | None = None, from_checkpoint: str | None = None, + # Deprecated + training_file: str | None = None, ) -> FinetuneRequest: + + if training_file is not None: + if training_files: + raise ValueError("Cannot specify both `training_file` and `training_files`") + log_warn_once( + "The `training_file` argument is deprecated. Use `training_files` instead." + ) + training_files = [training_file] + elif not training_files: + raise ValueError("Either `training_file` or `training_files` must be provided") + elif isinstance(training_files, str): + training_files = [training_files] + if model is not None and from_checkpoint is not None: raise ValueError( "You must specify either a model or a checkpoint to start a job from, not both" @@ -243,7 +258,7 @@ def create_finetune_request( finetune_request = FinetuneRequest( model=model, - training_file=training_file, + training_files=training_files, validation_file=validation_file, n_epochs=n_epochs, n_evals=n_evals, @@ -308,7 +323,7 @@ def __init__(self, client: TogetherClient) -> None: def create( self, *, - training_file: str, + training_files: str | List[str] = "", model: str | None = None, n_epochs: int = 1, validation_file: str | None = "", @@ -341,12 +356,14 @@ def create( rpo_alpha: float | None = None, simpo_gamma: float | None = None, from_checkpoint: str | None = None, + # Deprecated + training_file: str | None = None, ) -> FinetuneResponse: """ Method to initiate a fine-tuning job Args: - training_file (str): File-ID of a file uploaded to the Together API + training_files (str | List[str]): File-ID, or list of File-IDs, of a file uploaded to the Together API model (str, optional): Name of the base model to run fine-tune job on n_epochs (int, optional): Number of epochs for fine-tuning. Defaults to 1. validation file (str, optional): File ID of a file uploaded to the Together API for validation. @@ -397,6 +414,7 @@ def create( from_checkpoint (str, optional): The checkpoint identifier to continue training from a previous fine-tuning job. The format: {$JOB_ID/$OUTPUT_MODEL_NAME}:{$STEP}. The step value is optional, without it the final checkpoint will be used. + training_file (str, optional): Deprecated. Use `training_files` instead. Returns: FinetuneResponse: Object containing information about fine-tuning job. @@ -419,7 +437,7 @@ def create( finetune_request = create_finetune_request( model_limits=model_limits, - training_file=training_file, + training_files=training_files, model=model, n_epochs=n_epochs, validation_file=validation_file, @@ -450,6 +468,7 @@ def create( rpo_alpha=rpo_alpha, simpo_gamma=simpo_gamma, from_checkpoint=from_checkpoint, + training_file=training_file, ) if verbose: @@ -729,7 +748,7 @@ def __init__(self, client: TogetherClient) -> None: async def create( self, *, - training_file: str, + training_files: str | List[str] = "", model: str | None = None, n_epochs: int = 1, validation_file: str | None = "", @@ -762,12 +781,14 @@ async def create( rpo_alpha: float | None = None, simpo_gamma: float | None = None, from_checkpoint: str | None = None, + # Deprecated + training_file: str | None = None, ) -> FinetuneResponse: """ Async method to initiate a fine-tuning job Args: - training_file (str): File-ID of a file uploaded to the Together API + training_files (str | List[str]): File-ID, or list of File-IDs, of a file uploaded to the Together API model (str, optional): Name of the base model to run fine-tune job on n_epochs (int, optional): Number of epochs for fine-tuning. Defaults to 1. validation file (str, optional): File ID of a file uploaded to the Together API for validation. @@ -818,6 +839,7 @@ async def create( from_checkpoint (str, optional): The checkpoint identifier to continue training from a previous fine-tuning job. The format: {$JOB_ID/$OUTPUT_MODEL_NAME}:{$STEP}. The step value is optional, without it the final checkpoint will be used. + training_file (str, optional): Deprecated. Use `training_files` instead. Returns: FinetuneResponse: Object containing information about fine-tuning job. @@ -840,7 +862,7 @@ async def create( finetune_request = create_finetune_request( model_limits=model_limits, - training_file=training_file, + training_files=training_files, model=model, n_epochs=n_epochs, validation_file=validation_file, @@ -871,6 +893,7 @@ async def create( rpo_alpha=rpo_alpha, simpo_gamma=simpo_gamma, from_checkpoint=from_checkpoint, + training_file=training_file, ) if verbose: diff --git a/src/together/types/finetune.py b/src/together/types/finetune.py index e8c388f9..75205c0e 100644 --- a/src/together/types/finetune.py +++ b/src/together/types/finetune.py @@ -171,7 +171,7 @@ class FinetuneRequest(BaseModel): """ # training file ID - training_file: str + training_files: List[str] # validation file id validation_file: str | None = None # base model string @@ -222,7 +222,10 @@ class FinetuneResponse(BaseModel): # job ID id: str | None = None # training file id + # NOTE: Will be deprecated in the future training_file: str | None = None + # training file ids + training_files: List[str] | None = None # validation file id validation_file: str | None = None # base model name