flux-3-image-klein-infendpoint / clone_checkpoint.py
stsachit's picture
Publish self-contained A10 deployment and offline validation
52a6059 verified
Raw History Blame Contribute Delete
5.45 kB
"""Full, pinned Socialtrait checkpoint with one on-disk copy of each LFS object.
Install huggingface_hub and git-lfs, authenticate with `hf auth login`, then:
python clone_checkpoint.py /path/with/at-least-31-GiB-free/flux3-klein
Do not edit weight files in place: the checkout and LFS store use hardlinks.
"""
import argparse
import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess
from huggingface_hub import HfApi, get_token, hf_hub_download
from model_config import UPSTREAM as REPO, REVISION
OVERLAY = ('model_config.py', 'flux3_engine.py', 'handler.py', 'web.py', 'modal_app.py',
'requirements.txt', 'prompts.json', 'README.md', 'DEPLOYMENT.txt',
'verify_checkpoint.py', 'validate_deployment.py')
def digest(path):
sha = hashlib.sha256()
with path.open('rb') as source:
for chunk in iter(lambda: source.read(8 * 1024 * 1024), b''):
sha.update(chunk)
return sha.hexdigest()
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('destination', type=Path)
parser.add_argument('--reserve-gib', type=float, default=5,
help='Free disk space to retain after download (default: 5 GiB).')
args = parser.parse_args()
destination = args.destination.expanduser().resolve()
token = get_token()
if not token:
raise SystemExit('Authenticate first with hf auth login; do not put a token in this command.')
info = HfApi(token=token).model_info(REPO, revision=REVISION, files_metadata=True)
files = list(info.siblings)
# A prior partial clone is resumable only if our identity marker matches.
identity = {'repo': REPO, 'revision': REVISION}
marker = destination / '.git' / 'full-checkpoint-identity.json'
if destination.exists() and any(destination.iterdir()):
if not marker.exists() or json.loads(marker.read_text()) != identity:
raise SystemExit('Destination is not a matching checkpoint clone. Choose an empty directory.')
needed = 0
for item in files:
if item.lfs:
sha = item.lfs.sha256
obj = destination / '.git/lfs/objects' / sha[:2] / sha[2:4] / sha
if not obj.exists() or obj.stat().st_size != item.size:
needed += item.size
parent = destination
while not parent.exists():
parent = parent.parent
free = shutil.disk_usage(parent).free
reserve = max(args.reserve_gib, 0) * 2**30
if free < needed + reserve:
raise SystemExit(f'Need {needed/2**30:.2f} GiB plus {reserve/2**30:.1f} GiB reserve; '
f'only {free/2**30:.2f} GiB free. Select a larger disk.')
env = os.environ.copy()
env.update(GIT_LFS_SKIP_SMUDGE='1', GIT_TERMINAL_PROMPT='0',
GIT_CONFIG_COUNT='1', GIT_CONFIG_KEY_0='http.https://huggingface.co/.extraheader',
GIT_CONFIG_VALUE_0=f'Authorization: Bearer {token}')
if not marker.exists():
destination.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(['git', 'clone', '--no-checkout', f'https://huggingface.co/{REPO}',
str(destination)], env=env, check=True)
subprocess.run(['git', '-C', str(destination), 'checkout', REVISION], env=env, check=True)
marker.write_text(json.dumps(identity))
staging = destination / '.git' / 'hf-download'
inventory = []
for index, item in enumerate(files, 1):
target = destination / item.rfilename
if item.lfs:
sha = item.lfs.sha256
obj = destination / '.git/lfs/objects' / sha[:2] / sha[2:4] / sha
obj.parent.mkdir(parents=True, exist_ok=True)
if not obj.exists():
download = Path(hf_hub_download(REPO, item.rfilename, revision=REVISION,
token=token, local_dir=staging))
if digest(download) != sha:
raise RuntimeError(f'Checksum mismatch: {item.rfilename}')
os.replace(download, obj)
elif obj.stat().st_size != item.size or digest(obj) != sha:
raise RuntimeError(f'Existing LFS object failed verification: {item.rfilename}')
target.parent.mkdir(parents=True, exist_ok=True)
if target.exists():
target.unlink()
os.link(obj, target)
if not target.is_file() or target.stat().st_size != item.size:
raise RuntimeError(f'Missing or incomplete file: {item.rfilename}')
inventory.append({'path': item.rfilename, 'bytes': item.size,
'sha256': item.lfs.sha256 if item.lfs else None})
print(f'[{index}/{len(files)}] Verified {item.rfilename}', flush=True)
(destination / 'checkpoint_inventory.json').write_text(json.dumps(
{**identity, 'files': inventory}, indent=2) + '\n')
source = Path(__file__).resolve().parent
for name in OVERLAY:
shutil.copy2(source / name, destination / name)
with (destination / '.git/info/exclude').open('a') as exclude:
exclude.write('\n.env*\n__pycache__/\nbenchmark_outputs/\n')
print(f'Complete checkpoint and deployment files: {destination}')
print('Socialtrait BF16/Q8 weights, tokenizers, configurations, licenses and notices retained.')
print('No repository has been uploaded or made public.')
if __name__ == '__main__':
main()