Image21-INT8 / scripts /upload.py
ixim's picture
Fix INT8 CPU offload; publish memory audit and paired retests
ba48d54 verified
Raw
History Blame Contribute Delete
3.6 kB
"""Validate a staged release, then upload only its manifest-listed files."""
import argparse
import os
from pathlib import Path
from scripts.release import validate_release
def modelscope_access(config, owner):
token = os.environ.get('MODELSCOPE_API_TOKEN')
if token:
return token
# ModelScopeConfig.get_token() holds a Git access credential, not an SDK/API token.
if not config.get_cookies():
raise RuntimeError('No valid ModelScope API login. Log in locally with a fresh SDK token.')
user = config.get_user_info()
if not user or user[0] != owner:
raise ValueError('Authenticated ModelScope account differs from requested account')
return None # Let HubApi use its authenticated cached cookies.
def main():
ap = argparse.ArgumentParser()
ap.add_argument('platform', choices=['huggingface', 'modelscope'])
ap.add_argument('--folder')
ap.add_argument('--repo-id')
ap.add_argument('--dry-run', action='store_true')
args = ap.parse_args()
folder = Path(args.folder or f'release/{args.platform}')
repo_id = args.repo_id or ('ixim/Image21-INT8' if args.platform == 'huggingface' else 'iximbox/Image21-INT8')
owner = 'ixim' if args.platform == 'huggingface' else 'iximbox'
if repo_id.split('/')[0] != owner or len(repo_id.split('/')) != 2:
raise ValueError(f'Expected the requested {owner} namespace')
rows = validate_release(folder)
names = [r['path'] for r in rows] + ['MANIFEST.json']
print(f'Validated {len(rows)} files for {args.platform}:{repo_id}', flush=True)
if args.dry_run:
print('Dry run: no network mutation performed.')
return
if args.platform == 'huggingface':
from huggingface_hub import HfApi, get_token
token = get_token()
if not token:
raise RuntimeError('No HF credentials. Run hf auth login with this project HF_HOME first.')
api = HfApi(token=token)
if api.whoami()['name'] != owner:
raise ValueError('Authenticated Hugging Face account differs from requested account')
api.create_repo(repo_id=repo_id, repo_type='model', private=False, exist_ok=True)
result = api.upload_folder(repo_id=repo_id, repo_type='model', folder_path=folder,
allow_patterns=names, commit_message='Release verified Image21-INT8 conversion')
print(result)
else:
from modelscope.hub.api import HubApi, ModelScopeConfig
from modelscope.hub.errors import NotExistError
from requests.exceptions import HTTPError
api = HubApi()
token = modelscope_access(ModelScopeConfig, owner)
# Inspect the target first. Do not catch authentication/network errors as a missing repo.
try:
api.get_model(repo_id)
except HTTPError as exc:
if exc.response is None or exc.response.status_code != 404:
raise
api.create_model(repo_id, visibility=5, license='other',
original_model_id='Qwen/Qwen-Image-2.1', token=token)
except NotExistError:
api.create_model(repo_id, visibility=5, license='other',
original_model_id='Qwen/Qwen-Image-2.1', token=token)
result = api.upload_folder(repo_id=repo_id, folder_path=str(folder), token=token,
allow_patterns=names, max_workers=4,
commit_message='Release verified Image21-INT8 conversion')
print(result)
if __name__ == '__main__':
main()