Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ build-backend = "poetry.masonry.api"

[tool.poetry]
name = "together"
version = "1.5.33"
version = "1.5.34"
authors = ["Together AI <support@together.ai>"]
description = "Python client for Together's Cloud Platform! Note: SDK 2.0 is now available at https://github.com/togethercomputer/together-py"
readme = "README.md"
Expand Down
16 changes: 7 additions & 9 deletions src/together/cli/api/finetune.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from __future__ import annotations

import json
import re
from datetime import datetime, timezone
from textwrap import wrap
from typing import Any, Literal
Expand All @@ -14,18 +13,11 @@

from together import Together
from together.cli.api.utils import BOOL_WITH_AUTO, INT_WITH_MAX, generate_progress_bar
from together.types.finetune import (
DownloadCheckpointType,
FinetuneEventType,
FinetuneTrainingLimits,
FullTrainingType,
LoRATrainingType,
)
from together.types.finetune import DownloadCheckpointType, FinetuneTrainingLimits
from together.utils import (
finetune_price_to_dollars,
format_timestamp,
log_warn,
log_warn_once,
parse_timestamp,
)

Expand Down Expand Up @@ -258,6 +250,7 @@ def create(
lora_dropout: float,
lora_alpha: float,
lora_trainable_modules: str,
train_vision: bool,
suffix: str,
wandb_api_key: str,
wandb_base_url: str,
Expand Down Expand Up @@ -299,6 +292,7 @@ def create(
lora_dropout=lora_dropout,
lora_alpha=lora_alpha,
lora_trainable_modules=lora_trainable_modules,
train_vision=train_vision,
suffix=suffix,
wandb_api_key=wandb_api_key,
wandb_base_url=wandb_base_url,
Expand Down Expand Up @@ -368,6 +362,10 @@ def create(
"You have specified a number of evaluation loops but no validation file."
)

if model_limits.supports_vision:
# Don't show price estimation for multimodal models yet
confirm = True

finetune_price_estimation_result = client.fine_tuning.estimate_price(
training_file=training_file,
validation_file=validation_file,
Expand Down
6 changes: 6 additions & 0 deletions src/together/constants.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import enum


# Session constants
TIMEOUT_SECS = 600
MAX_SESSION_LIFETIME_SECS = 180
Expand Down Expand Up @@ -40,6 +41,11 @@
# the number of bytes in a gigabyte, used to convert bytes to GB for readable comparison
NUM_BYTES_IN_GB = 2**30

# Multimodal limits
MAX_IMAGES_PER_EXAMPLE = 10
MAX_IMAGE_BYTES = 10 * 1024 * 1024 # 10MB
# Max length = Header length + base64 factor (4/3) * image bytes
MAX_BASE64_IMAGE_LENGTH = len("data:image/jpeg;base64,") + 4 * MAX_IMAGE_BYTES // 3

# expected columns for Parquet files
PARQUET_EXPECTED_COLUMNS = ["input_ids", "attention_mask", "labels"]
Expand Down
24 changes: 21 additions & 3 deletions src/together/resources/finetune.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import re
from pathlib import Path
from typing import List, Dict, Literal
from typing import Dict, List, Literal

from rich import print as rprint

Expand All @@ -18,10 +18,11 @@
FinetuneList,
FinetuneListEvents,
FinetuneLRScheduler,
FinetuneRequest,
FinetuneResponse,
FinetuneMultimodalParams,
FinetunePriceEstimationRequest,
FinetunePriceEstimationResponse,
FinetuneRequest,
FinetuneResponse,
FinetuneTrainingLimits,
FullTrainingType,
LinearLRScheduler,
Expand Down Expand Up @@ -73,6 +74,7 @@ def create_finetune_request(
lora_dropout: float | None = 0,
lora_alpha: float | None = None,
lora_trainable_modules: str | None = "all-linear",
train_vision: bool = False,
suffix: str | None = None,
wandb_api_key: str | None = None,
wandb_base_url: str | None = None,
Expand Down Expand Up @@ -252,6 +254,15 @@ def create_finetune_request(
simpo_gamma=simpo_gamma,
)

if model_limits.supports_vision:
multimodal_params = FinetuneMultimodalParams(train_vision=train_vision)
elif train_vision:
raise ValueError(
f"Vision encoder training is not supported for the non-multimodal model `{model}`"
)
else:
multimodal_params = None

finetune_request = FinetuneRequest(
model=model,
training_file=training_file,
Expand All @@ -272,6 +283,7 @@ def create_finetune_request(
wandb_project_name=wandb_project_name,
wandb_name=wandb_name,
training_method=training_method_cls,
multimodal_params=multimodal_params,
from_checkpoint=from_checkpoint,
from_hf_model=from_hf_model,
hf_model_revision=hf_model_revision,
Expand Down Expand Up @@ -342,6 +354,7 @@ def create(
lora_dropout: float | None = 0,
lora_alpha: float | None = None,
lora_trainable_modules: str | None = "all-linear",
train_vision: bool = False,
suffix: str | None = None,
wandb_api_key: str | None = None,
wandb_base_url: str | None = None,
Expand Down Expand Up @@ -387,6 +400,7 @@ def create(
lora_dropout (float, optional): Dropout rate for LoRA adapters. Defaults to 0.
lora_alpha (float, optional): Alpha for LoRA adapters. Defaults to 8.
lora_trainable_modules (str, optional): Trainable modules for LoRA adapters. Defaults to "all-linear".
train_vision (bool, optional): Whether to train vision encoder in multimodal models. Defaults to False.
suffix (str, optional): Up to 40 character suffix that will be added to your fine-tuned model name.
Defaults to None.
wandb_api_key (str, optional): API key for Weights & Biases integration.
Expand Down Expand Up @@ -464,6 +478,7 @@ def create(
lora_dropout=lora_dropout,
lora_alpha=lora_alpha,
lora_trainable_modules=lora_trainable_modules,
train_vision=train_vision,
suffix=suffix,
wandb_api_key=wandb_api_key,
wandb_base_url=wandb_base_url,
Expand Down Expand Up @@ -906,6 +921,7 @@ async def create(
lora_dropout: float | None = 0,
lora_alpha: float | None = None,
lora_trainable_modules: str | None = "all-linear",
train_vision: bool = False,
suffix: str | None = None,
wandb_api_key: str | None = None,
wandb_base_url: str | None = None,
Expand Down Expand Up @@ -951,6 +967,7 @@ async def create(
lora_dropout (float, optional): Dropout rate for LoRA adapters. Defaults to 0.
lora_alpha (float, optional): Alpha for LoRA adapters. Defaults to 8.
lora_trainable_modules (str, optional): Trainable modules for LoRA adapters. Defaults to "all-linear".
train_vision (bool, optional): Whether to train vision encoder in multimodal models. Defaults to False.
suffix (str, optional): Up to 40 character suffix that will be added to your fine-tuned model name.
Defaults to None.
wandb_api_key (str, optional): API key for Weights & Biases integration.
Expand Down Expand Up @@ -1028,6 +1045,7 @@ async def create(
lora_dropout=lora_dropout,
lora_alpha=lora_alpha,
lora_trainable_modules=lora_trainable_modules,
train_vision=train_vision,
suffix=suffix,
wandb_api_key=wandb_api_key,
wandb_base_url=wandb_base_url,
Expand Down
60 changes: 29 additions & 31 deletions src/together/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,18 @@
AudioSpeechStreamChunk,
AudioSpeechStreamEvent,
AudioSpeechStreamResponse,
AudioTimestampGranularities,
AudioTranscriptionRequest,
AudioTranslationRequest,
AudioTranscriptionResponse,
AudioTranscriptionResponseFormat,
AudioTranscriptionVerboseResponse,
AudioTranslationRequest,
AudioTranslationResponse,
AudioTranslationVerboseResponse,
AudioTranscriptionResponseFormat,
AudioTimestampGranularities,
ModelVoices,
VoiceListResponse,
)
from together.types.batch import BatchEndpoint, BatchJob, BatchJobStatus
from together.types.chat_completions import (
ChatCompletionChunk,
ChatCompletionRequest,
Expand All @@ -31,6 +32,19 @@
)
from together.types.embeddings import EmbeddingRequest, EmbeddingResponse
from together.types.endpoints import Autoscaling, DedicatedEndpoint, ListEndpoint
from together.types.evaluation import (
ClassifyParameters,
CompareParameters,
EvaluationCreateResponse,
EvaluationJob,
EvaluationRequest,
EvaluationStatus,
EvaluationStatusResponse,
EvaluationType,
JudgeModelConfig,
ModelRequest,
ScoreParameters,
)
from together.types.files import (
FileDeleteResponse,
FileList,
Expand All @@ -41,49 +55,32 @@
FileType,
)
from together.types.finetune import (
TrainingMethodDPO,
TrainingMethodSFT,
FinetuneCheckpoint,
CosineLRScheduler,
CosineLRSchedulerArgs,
FinetuneCheckpoint,
FinetuneDeleteResponse,
FinetuneDownloadResult,
LinearLRScheduler,
LinearLRSchedulerArgs,
FinetuneLRScheduler,
FinetuneList,
FinetuneListEvents,
FinetuneRequest,
FinetuneResponse,
FinetuneLRScheduler,
FinetuneMultimodalParams,
FinetunePriceEstimationRequest,
FinetunePriceEstimationResponse,
FinetuneDeleteResponse,
FinetuneRequest,
FinetuneResponse,
FinetuneTrainingLimits,
FullTrainingType,
LinearLRScheduler,
LinearLRSchedulerArgs,
LoRATrainingType,
TrainingMethodDPO,
TrainingMethodSFT,
TrainingType,
)
from together.types.images import ImageRequest, ImageResponse
from together.types.models import ModelObject, ModelUploadRequest, ModelUploadResponse
from together.types.rerank import RerankRequest, RerankResponse
from together.types.batch import BatchJob, BatchJobStatus, BatchEndpoint
from together.types.evaluation import (
EvaluationType,
EvaluationStatus,
JudgeModelConfig,
ModelRequest,
ClassifyParameters,
ScoreParameters,
CompareParameters,
EvaluationRequest,
EvaluationCreateResponse,
EvaluationJob,
EvaluationStatusResponse,
)
from together.types.videos import (
CreateVideoBody,
CreateVideoResponse,
VideoJob,
)
from together.types.videos import CreateVideoBody, CreateVideoResponse, VideoJob


__all__ = [
Expand Down Expand Up @@ -131,6 +128,7 @@
"RerankRequest",
"RerankResponse",
"FinetuneTrainingLimits",
"FinetuneMultimodalParams",
"AudioSpeechRequest",
"AudioResponseFormat",
"AudioLanguage",
Expand Down
17 changes: 13 additions & 4 deletions src/together/types/finetune.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
from __future__ import annotations

from enum import Enum
from typing import List, Literal, Any
from typing import Any, List, Literal

from pydantic import Field, StrictBool, field_validator

from together.types.abstract import BaseModel
from together.types.common import (
ObjectType,
)
from together.types.common import ObjectType


class FinetuneJobStatus(str, Enum):
Expand Down Expand Up @@ -175,6 +173,14 @@ class TrainingMethodDPO(TrainingMethod):
simpo_gamma: float | None = None


class FinetuneMultimodalParams(BaseModel):
"""
Multimodal parameters
"""

train_vision: bool = False


class FinetuneProgress(BaseModel):
"""
Fine-tune job progress
Expand Down Expand Up @@ -231,6 +237,8 @@ class FinetuneRequest(BaseModel):
)
# from step
from_checkpoint: str | None = None
# multimodal parameters
multimodal_params: FinetuneMultimodalParams | None = None
# hf related fields
hf_api_token: str | None = None
hf_output_repo_name: str | None = None
Expand Down Expand Up @@ -409,6 +417,7 @@ class FinetuneTrainingLimits(BaseModel):
min_learning_rate: float
full_training: FinetuneFullTrainingLimits | None = None
lora_training: FinetuneLoraTrainingLimits | None = None
supports_vision: bool = False


class LinearLRSchedulerArgs(BaseModel):
Expand Down
Loading