File size: 4,656 Bytes
c3d6fc9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding: utf-8 -*-
"""
把 hub_package/ 上传到 Hugging Face Hub(对应 PPT 第 28 页第 4 条学习目标)。
================================================================
等价于 PPT 里的 package_to_hub(...),只是拆成"先打包、再上传"两步,更透明。

准备:
  1) 注册 https://huggingface.co ,在 Settings -> Access Tokens 建一个 write token
  2) 登录(二选一):
       hf auth login              # 交互式粘贴 token
       或者直接设环境变量:$env:HF_TOKEN = "hf_xxx"
  3) 打包:python build_hub_package.py --repo-id 你的用户名/value-based-qlearning

上传:
  python upload_to_hub.py --repo-id 你的用户名/value-based-qlearning
  python upload_to_hub.py --repo-id 你的用户名/value-based-qlearning --private

如果本机连不上 huggingface.co(本机实测会超时),有三条路:
  A) 开代理后重试本脚本;
  B) 换镜像(只能下载不能上传,不适用于上传);
  C) 浏览器手动上传:https://huggingface.co/new 建仓库,把 hub_package/ 里的文件拖进去。
"""

import argparse
import os
import sys

BASE_DIR = os.path.dirname(os.path.abspath(__file__))


def list_files(folder):
    rows = []
    for root, _, files in os.walk(folder):
        for name in sorted(files):
            path = os.path.join(root, name)
            rows.append((os.path.relpath(path, folder), os.path.getsize(path)))
    return rows


def main():
    parser = argparse.ArgumentParser(description="上传 hub_package 到 Hugging Face Hub")
    parser.add_argument("--repo-id", required=True, help="用户名/仓库名,例如 zhangsan/value-based-qlearning")
    parser.add_argument("--folder", default=os.path.join(BASE_DIR, "hub_package"))
    parser.add_argument("--token", default=os.environ.get("HF_TOKEN"), help="默认读环境变量 HF_TOKEN")
    parser.add_argument("--private", action="store_true", help="创建私有仓库")
    parser.add_argument("--endpoint", default=os.environ.get("HF_ENDPOINT"),
                        help="默认 huggingface.co,可用环境变量 HF_ENDPOINT 覆盖")
    parser.add_argument("--dry-run", action="store_true", help="只列出要上传的文件,不真的上传")
    args = parser.parse_args()

    if not os.path.isdir(args.folder):
        raise SystemExit(f"找不到 {args.folder},请先运行 python build_hub_package.py")

    files = list_files(args.folder)
    total_mb = sum(size for _, size in files) / (1024 * 1024)
    print(f"准备上传 {len(files)} 个文件(共 {total_mb:.1f} MB)到仓库 {args.repo_id}")
    for rel, size in files:
        print(f"  {rel}  ({size / 1024:.0f} KB)")

    if args.dry_run:
        print("\n[--dry-run] 不上传。")
        return

    if not args.token:
        print("\n[错误] 没有 token。请先执行 hf auth login,或设置 $env:HF_TOKEN。")
        print("       也可以去掉 --token 参数让 huggingface_hub 读本机缓存的登录信息。")
        return

    try:
        from huggingface_hub import HfApi
    except ImportError:
        print("\n[错误] 缺 huggingface_hub,请先:pip install huggingface_hub")
        return

    api = HfApi(endpoint=args.endpoint, token=args.token) if args.endpoint else HfApi(token=args.token)

    try:
        print(f"\n[1/2] 创建/确认仓库 {args.repo_id} ...")
        api.create_repo(repo_id=args.repo_id, repo_type="model",
                        private=args.private, exist_ok=True)
        print("[2/2] 上传文件 ...")
        api.upload_folder(
            repo_id=args.repo_id,
            repo_type="model",
            folder_path=args.folder,
            commit_message="value-based 实践:Q-Learning 智能体(FrozenLake + Taxi)"
                           " + 回放视频 + 评估分数",
        )
    except Exception as exc:                       # noqa: BLE001
        print(f"\n[上传失败] {type(exc).__name__}: {exc}")
        print("\n常见原因与对策:")
        print("  1) 网络连不上 huggingface.co(本机常见)-> 开代理后重试,或浏览器手动上传;")
        print("  2) token 没有 write 权限 -> 重新建一个 write token;")
        print("  3) 仓库名格式不对 -> 必须是 用户名/仓库名。")
        print(f"\n手动上传入口:https://huggingface.co/new  (仓库名建议 value-based-qlearning)")
        return

    url = f"https://huggingface.co/{args.repo_id}"
    print(f"\n[完成] 仓库地址:{url}")
    print(f"       视频和评估分数已经写进 README.md,打开仓库就能看到。")


if __name__ == "__main__":
    sys.exit(main())