File size: 3,403 Bytes
9116984
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""Validate a staged release, then upload only files named by its manifest."""
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
    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 the requested account')
    return None


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('platform', choices=['huggingface', 'modelscope'])
    parser.add_argument('--folder')
    parser.add_argument('--repo-id')
    parser.add_argument('--dry-run', action='store_true')
    args = parser.parse_args()
    folder = Path(args.folder or f'release/{args.platform}')
    repo_id = args.repo_id or ('ixim/Image21-INT4' if args.platform == 'huggingface' else 'iximbox/Image21-INT4')
    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 {owner} namespace')
    rows = validate_release(folder)
    names = [row['path'] for row 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 Hugging Face 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 the 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=str(folder),
                                   allow_patterns=names, commit_message='Release verified Image21-INT4 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)
        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-INT4 conversion')
        print(result)


if __name__ == '__main__':
    main()