已合并
test(hub): add test cases for torch.hub.help and torch.hub._get_torch_home APIs #34080
xiemingda1002创建于 4月21日
test(hub): add test cases for torch.hub.help and torch.hub._get_torch_home APIs #34080
已合并
xiemingda1002创建于 4月21日
已删除 :add-test-hub-help-api-v2.10.0合入到Ascend/pytorchv2.10.0
xiemingda1002
xiemingda1002
4月21日

【合入来源】

https://gitcode.com/Ascend/pytorch/issues/1703\

【修改方案】

一、API 功能说明

torch.hub.help 和 torch.hub._get_torch_home 是 PyTorch hub 模块中用于文档查询和路径管理的辅助 API,功能说明如下:

  1. torch.hub.help(github, model, force_reload=False, skip_validation=False, trust_repo=None)

    • 文档获取核心能力:接收 GitHub 仓库地址和入口点名称,返回该入口点的文档字符串(docstring),无需实际加载模型或执行代码。
    • 远程仓库解析核心能力:支持 "owner/repo[:branch]" 格式的仓库地址,自动解析并获取 hubconf.py 中定义的入口点函数的文档。
    • 安全机制支持:通过 skip_validation 参数可跳过 GitHub API 验证(避免 rate limit),trust_repo 参数控制仓库信任策略(False/True/check/None)。
    • 无状态调用:多次调用 help 不会产生副作用,不修改缓存状态,不影响后续 load 等操作,不下载仓库代码。
    • 返回值灵活性:返回字符串类型文档或 None(若入口点函数未定义 docstring),支持用户预览模型使用说明。
    • 典型用途:在加载模型前查看入口点的参数说明、使用示例、依赖信息等。
  2. torch.hub._get_torch_home()

    • 路径解析核心能力:根据环境变量 TORCH_HOME 或默认路径 ~/.cache/torch 确定 torch home 目录。
    • 环境变量优先级机制:优先读取 TORCH_HOME 环境变量,若未设置则依次检查 XDG_CACHE_HOME/torch、~/.cache/torch。
    • 内部 API 特性:作为 get_dir() 的底层实现,不直接暴露给用户,但可通过 hub 模块访问(用于测试或调试)。
    • 路径标准化处理:返回的路径经过 os.path.expanduser 处理,支持 ~ 符号展开,确保路径可用性。
    • 返回值:字符串类型路径,非空且为绝对路径。

上述 API 均为纯 Python 层实现,不涉及张量计算,仅负责文档查询和路径解析。

二、测试文件 test/test_hub_api.py 完整验证该 API 的原因

本测试文件针对 PyTorch 社区原生 test/test_hub.py 覆盖不足的 torch.hub.help / _get_torch_home API 进行补充验证,确保昇腾 NPU 环境下功能完整可用:

  1. torch.hub.help API 验证

    • test_help_function_callable:验证 help 函数存在于 hub 模块且可调用(hasattr + callable 检查),确保 API 基础可用性。
    • test_help_returns_none_without_docstring:严格验证 help 函数在入口点无 docstring 时返回 None。使用 mock 本地仓库进行测试,无需外部网络依赖。
    • test_help_returns_docstring_with_content:严格验证 help 函数在入口点有 docstring 时返回有效的字符串内容。使用 mock 本地仓库进行测试,检查返回值类型为 str、非空、且包含预期关键字 "EfficientNet"。
  2. torch.hub._get_torch_home API 验证

    • test_get_torch_home_returns_path:验证 _get_torch_home 返回有效的路径字符串(assertIsInstance(str) + assertGreater(len, 0)),确保路径非空且类型正确。
    • test_get_torch_home_with_env_variable:验证 TORCH_HOME 环境变量能正确影响返回路径,使用 tempfile.TemporaryDirectory 创建临时目录作为测试路径,覆盖自定义路径场景。测试后恢复原始环境变量状态(os.environ.pop 或 restore),避免污染其他测试。
  3. 测试隔离性保障

    • setUp 机制:TestHubHelp 类在 setUp 中创建 mock 本地仓库目录,写入 hubconf.py 文件,包含有/无 docstring 的两个入口点函数。
    • tearDown 机制:每个测试后清理临时目录,确保测试用例间无状态污染。
    • 独立性设计:两个测试类(TestHubHelp、TestHubGetTorchHome)独立,无共享状态。
    • 零外部依赖:使用 unittest.mock.patch 模拟 _get_cache_or_reload,避免对 GitHub 外部仓库的依赖,测试更快、更可靠,适合 CI 环境。

测试完整性
所有用例覆盖 API 的基础功能验证、接口存在性检查、环境变量交互、测试隔离性保障,完整覆盖昇腾 NPU 适配所需的最小功能集合。

三、昇腾 NPU 适配说明(解释为什么无需 NPU 适配)

torch.hub.help 和 torch.hub._get_torch_home 均具备硬件无关性、纯 Python 层实现、无底层算子依赖三大核心特征,决定了其无需针对昇腾 NPU 做适配,具体分析:

  1. 纯 Python 层抽象,无硬件相关逻辑

    • help API 硬件无关性:仅负责解析远程仓库的 hubconf.py 并提取文档字符串,是「文档查询」的纯 Python 抽象接口,不涉及任何硬件相关的计算、存储、通信逻辑。
    • _get_torch_home API 硬件无关性:仅负责读取环境变量和构建路径字符串,依赖 os.path 模块进行路径处理,无任何硬件相关的逻辑或依赖。
    • 设备无关设计:两个 API 的核心逻辑与 CPU/GPU/NPU 等硬件架构完全解耦,在任意硬件环境下行为一致。
  2. 无底层算子 / 内核依赖

    • 标准库依赖:两个 API 内部仅调用 Python 标准库(os 路径模块、tempfile 临时文件模块、urllib 网络模块)和 PyTorch 纯 Python 层的 hub 模块。
    • 无硬件扩展依赖:未依赖 CUDA/NPU 等硬件相关的扩展库、内核函数或底层驱动。
    • help 的远程解析机制:基于 GitHub URL 和 Python import 机制,与硬件架构无关。
    • _get_torch_home 的路径处理机制:基于 os.path.expanduser 和 os.getenv,纯文件系统操作。
  3. 核心逻辑与硬件解耦

    • 文档获取解耦:help API 返回的文档字符串是纯文本信息,与硬件架构无关 —— 无论是 CPU/GPU/NPU 环境,文档查询逻辑完全一致。
    • 路径解析解耦:_get_torch_home 返回的路径是通用文件系统路径,不包含任何硬件相关字段(如设备 ID、内存地址),昇腾 NPU 环境下可直接复用。
    • 无张量操作:两个 API 均不涉及张量的创建、计算或迁移,测试用例中无 tensor 相关代码,无需 NPU 设备支持。

结论
torch.hub.help 和 torch.hub._get_torch_home 均是「硬件无关的纯 Python 层抽象」,核心逻辑不耦合任何特定硬件。测试用例无需导入 torch_npu,API 本身无需适配修改,可直接复用。

【资料变更】

刷新2.7.1版本下有多个版本资料。
1、torch.hub._get_torch_home API该API昇腾支持,但是在文档中并无描述,因此需要增加。
文档修改PR链接:https://gitcode.com/Ascend/pytorch/pull/34365

【接口变更】

不涉及

【功能验证】

测试文件路径:test/test_hub_api.py

本地验证结果:

image.png

所有测试用例执行通过。torch.hub.help 和 torch.hub._get_torch_home API 核心功能验证正常。

两个 API 均为纯 Python 层实现,不涉及张量操作,无需 NPU 设备适配。测试用例无需导入 torch_npu,API 本身可在任意硬件环境稳定运行。验证结果表明,torch.hub.help 和 torch.hub._get_torch_home 在昇腾 NPU 环境下功能正常可用,无需修改源码。

【CheckList】

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 xiemingda1002 的贡献)
xiemingda1002xiemingda1002
4月21日 创建了 pull request,commit c5d06272
xiemingda1002xiemingda1002
4月21日 关联了issue:[Usage]: test目录下 torch.hub.help 和 torch.hub._get_torch_home API测试用例缺失
ascend-robot
ascend-robot成员
4月21日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
test 李伟, yuhaiyan (2/2) 李伟 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

xiemingda1002, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
ascend-robotascend-robot成员
4月21日 添加了label:ascend-cla/yes
此处折叠了100条消息 查看更多
haiyan8
haiyan8
4月25日 评论:

/lgtm

likedislike
liwei386成员
4月25日 评论:

/approve

likedislike
ascend-robotascend-robot成员
4月25日 添加了label:approvedlgtm
ascend-robot
ascend-robot成员
4月25日 评论:

Review Guide

This pull-request passes review.
Committers who wrote a comment of /approve are: 李伟.
Reviewers who wrote a comment of /lgtm are: yuhaiyan, 李伟.

likedislike
ascend-robotascend-robot成员
4月25日 合入了pull request