togethercomputer / togethercomputer/together-py

Fine-tuning file size guard rejects 60 GB despite documented 100 GB limit

Open
#588 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
10
Forks
3
Avg merge
3d 4h
Merged PRs (30d)
31

Description

The fine-tuning data preparation docs advertise 100 GB for JSONL/Parquet and show check_file() followed by files.upload(..., purpose="fine-tune", check=True). Current Python SDK 2.35.0 at b0c7f91e283a4b674c82be7558e69ddcadc46487 rejects files above 50.1 * 2**30 bytes (about 53.79 decimal GB).

Originally reported by Vinish Reddy Pannala in Fine-Tuning Open Models From Lakehouse Tables, published July 28, 2026, modified August 12. The original SDK version was not stated.

CPU reproduction against the unmodified installed SDK, using a real 3,700-byte, 100-row JSONL and changing only its reported os.stat().st_size:

import os
import tempfile
from pathlib import Path
from unittest.mock import patch
from together.lib.utils import check_file

real_stat = os.stat
with tempfile.TemporaryDirectory() as directory:
    file = Path(directory) / "tiny.jsonl"
    file.write_text('{"text": "local validation fixture"}\n' * 100)
    for size in (3700, 53_794_465_382, 53_794_465_383, 60_000_000_000):
        def controlled_stat(path, *args, **kwargs):
            result = real_stat(path, *args, **kwargs)
            if isinstance(path, str) and path == file.as_posix():
                fields = list(result)
                fields[6] = size
                return os.stat_result(fields)
            return result
        with patch("os.stat", side_effect=controlled_stat):
            report = check_file(file, purpose="fine-tune")
        print(size, report["is_check_passed"])

Output: True, True, False, False. Rejection happens before format parsing. The same threshold is enforced by UploadManager, MultipartUploadManager and both async variants; check=False does not bypass it. I also checked those paths and the public sync/async upload methods with an HTTP transport that aborts at the first request. No real large file, hosted upload, backend acceptance, inference or training was tested.

Could you confirm the intended fine-tuning maximum in bytes and whether this shared guard should also change for eval/batch-api? The SDK uses binary units labeled GB, while the docs do not define that conversion. This concerns the threshold, separately from the Parquet fallthrough fixed in #558 and CLI coverage in #572. I have left the limit unchanged pending clarification.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with together.lib.utils.check_file and trace the shared size guard through UploadManager, MultipartUploadManager, and their async variants. Run the supplied boundary reproduction, then compare how fine-tune, eval, and batch-api purposes use the guard. Done means the intended byte limit and affected purposes are confirmed and the boundary behavior is covered consistently.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.