预迁移就绪评估器,用于将 NumPy 代码移植到 cuPyNumeric。在开始大量移植工作之前使用,当用户询问代码能否在 GPU 上扩展、是否应该迁移到 cu
cuPyNumeric 迁移就绪评估
功能概述
cuPyNumeric 迁移就绪评估是一项面向实际任务的技能,主要用于在迁移之前(而非迁移期间)使用本技能;回答一个核心问题: 在用户投入数周的移植工作之前,其现有的 NumPy API 中有哪些能在 cuPyNumeric 上扩展,哪些需要重构?
核心要点
- 为此:阅读源代码,根据在 Legate/NVIDIA GPU 栈上的多 GPU 扩展能力对每个 NumPy 惯用模式进行分类,交叉参考附带的 API 支持清单,并生成。
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
使用与执行
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
结果检查与注意事项
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
cuPyNumeric 迁移就绪评估
目的
在迁移之前(而非迁移期间)使用本技能。 回答一个核心问题:在用户投入数周的移植工作之前,其现有的 NumPy API 中有哪些能在 cuPyNumeric 上扩展,哪些需要重构? 为此:阅读源代码,根据在 Legate/NVIDIA GPU 栈上的多 GPU 扩展能力对每个 NumPy 惯用模式进行分类,交叉参考附带的 API 支持清单,并生成结构化结论,包含每个发现的推理和配方指引。
这是一项静态的只读评估。 使用 Read、Grep 和 Glob 工具检查用户的源代码。不要执行用户的代码、修改或写入文件,也不要打印环境变量或密钥。下面展示的 legate 和 cuPyNumeric Doctor 命令是建议由用户运行的,而非本技能执行的操作。
如果之前从未见过本技能,请先前往 references/getting-started.md。
何时使用本技能
当用户即将将 NumPy 代码迁移到 GPU,并询问是否能在 cuPyNumeric/GPU 上扩展、是否应该迁移、哪些部分会受益、移植前需要更改什么、移植是否值得,或提及预移植评估、扩缩容分析、惯用模式分析、GPU 重构规划、识别 NumPy GPU 反模式时使用。
在以下情况拒绝并重定向(请求不是预迁移评估时):
- 迁移后的性能/性能分析("已经移植了,为什么慢?")→ 指向
legate --profile和上游的性能分析与调试指南。 - 自定义 CUDA / 内核编写("编写/优化 CUDA 内核")
用户要求评估的图谱/稀疏/ML/NLP 工作负载仍然在范围内:进行评估并通过关卡 4 返回 NOT RECOMMENDED。这是一种结论,而非拒绝。
指令
按顺序执行以下所有五个步骤。语义性地阅读用户的代码并推理;不要一次性输出散文式结论。
步骤 1 — 收集上下文
在扫描代码之前先收集信息。以下每项都针对典型工作负载提供了默认值——当用户未主动提供细节时使用默认值;不要卡在提问上。
- 源代码位置。 未指定路径时默认使用当前工作目录。
- 运行时的热路径数组大致大小。 默认 3000 万到 5000 万个元素。将用户提供的数字(或此默认值)映射到关卡 2 层级(每 GPU 下限 65K;10M+ 可实现真正单 GPU 加速;100M+ 可实现多 GPU)。
- 目标硬件。 默认 1-4 GPU,单节点。在假设多节点前确认。仅 CPU 运行时,询问每节点 RAM 而非 FBMEM。
- 主要计算模式。 模板计算 / GEMM / 蒙特卡洛 / 归约 / 混合-SciPy。让用户说明;否则在步骤 3 中从代码推断。
在评估报告顶部说明你使用的默认值,以便用户修正。如果某个值无法确定,如实说明并仅进行定性评估——不要编造超出上述默认值的数字。
步骤 2 — 加载 API 支持清单
读取 assets/api-support.md,即上游 NumPy 与 cuPyNumeric 对比表的已提交快照。对于代码中调用的每个 NumPy API,找到其所在行并读取前导符号:
✓✓ numpy.X—— 已实现且可在多 GPU 上工作(最佳路径)。✓ numpy.X—— 已实现但仅限单 GPU/CPU(多节点有限制)。🟡 numpy.X — <注释>—— 部分支持;阅读注释。✗ numpy.X—— 未在 cuPyNumeric 分布式路径上实现。调用时的行为因版本而异(部分不支持的 API 会通过主机 NumPy 路由,其他会抛出异常)——无论哪种情况,在热路径上使用都是迁移阻塞项。不要向用户承诺会静默回退到主机 NumPy。
如果 Fetched: 行超过约 90 天,请刷新快照——参见可用脚本部分。
步骤 3 — 语义性读取代码
使用 Read 和 Grep 遍历用户文件,根据 references/idioms-that-scale.md 和 references/idioms-that-block.md(完整的推理和 R-code 见上述文件)对每个数组数学区域进行分类。进行语义性阅读,而非正则表达式匹配:标记前,确认 arr 追踪到 cupynumeric 数组(或别名为它的 np.*),并检查访问是否位于热循环内。应用以下规则:
- 标记元素循环(
for i in range(n): arr[i] = ...)为阻塞项;将 epoch/step/file 循环(循环体已向量化)视为正常——区分二者。 - 标记标量同步——在热循环内(每次迭代的主机同步)对 cuPyNumeric 数组调用
.item()/float()/int()/bool()/complex();在边界处允许。 - 标记归约条件——在数组归约上的
if/while(while np.max(err) > tol:)每次迭代都会同步。 - 标记循环中的可提权分配作为可修复的低效项。
- 标记运行时代码中的
mpi4py(与cupynumeric配合进行数组分区/通信的代码)(R108)——但首先确认其在热路径上发出了 MPI 调用;忽略 README、构建脚本或备用启动器中的 grep 匹配。 - 在
reshape/asarray/flatten上标记order=为 R109——始终标记,无论版本是警告还是静默无操作。 - 始终在多 GPU 下为
np.random.*引用 [R304](references/idioms-that-scale.md#r304] 作为 INFO:跨 GPU 的按位一致可重现性默认不可能实现(--gpus N/LEGATE_GPUS是 Legate 启动器参数)。 - 标记数组上的 Python 内置函数(
sum/max/min/any/iter(arr))——主机迭代回退(R110;上游最佳实践)。允许len(arr)(形状查找;优先使用arr.shape[0]/arr.size以确保零维安全)。 - 标记在热循环中混合使用
cupy和cupynumeric(R111);运行时不共享 GPU 内存,因此每次跳转都经过主机 NumPy。 - 在
assets/api-support.md中查找代码调用的每个 NumPy API(符号图例见步骤 2)。
关于深层原理,阅读 references/gpu-stack.md(内存、SM、通信、调度)和 references/execution-model.md(惰性执行、同步点、映射器)。
步骤 4 — 生成结构化评估报告
按以下顺序交付报告。每个发现都引用 file:line,方便用户导航。
- 结论——一句话概括——见下方的"结论框架"。
- 可扩展部分(SCALES 发现)——引用具有代表性的代码行,让用户看到导入替换后哪些会加速。
- 阻塞项(BLOCKS 发现)——每个都与
idioms-that-block.md及refactor-recipes.md中的配方关联。 - 可修复项(REFACTOR 发现)——按配方分组;一个配方通常可修复多处。
- 兼容性/成本说明(INFO 发现)——SciPy 边界、仅单 GPU 的线性代数/FFT、RNG 布局与
--gpus N。 - API 支持缺口——代码调用的、清单中未实现或仅单 GPU 的 API。
- 决策框架摘要——来自
references/decision-framework.md的关卡 1-6,标记为通过/未通过/不确定。 - 推荐后续步骤——优先应用哪些配方、是否先移植一个模块、何时引入 cuPyNumeric Doctor。
所有 8 个部分都必须出现,即使结论是 READY 或 NOT RECOMMENDED。在空部分下写 "None for this code" 或 "n/a — see verdict" 一行即可——不要省略标题;标题是评估报告评分的结构契约。参见 assets/sample_report.md 了解实际报告示例。
步骤 5 — 转交至 cuPyNumeric Doctor 进行运行时验证
引导用户在应用配方且代码可运行后,运行 cuPyNumeric Doctor:
CUPYNUMERIC_DOCTOR=1 CUPYNUMERIC_DOCTOR_FORMAT=json CUPYNUMERIC_DOCTOR_FILENAME=doctor-report.json legate --gpus 1 main.py
cuPyNumeric Doctor 能在运行时捕获源代码审查可能遗漏的问题(标量元素访问、ndarray 迭代、高级索引、nonzero 误用、mpi4py 导入、视图的原地操作)。评估的结束语为:"现在启用 cuPyNumeric Doctor 运行;以下是你需要在其输出中关注的内容。"
结论框架
定性分配结论,基于发现的类型而非分数:
| 结论 | 适用条件 | 行动 |
|---|---|---|
| READY | 无 BLOCKS;很少或没有 REFACTOR | 替换导入;进行基准测试 |
| LIGHT REFACTOR | 少量配方可修复的模式(R201–R206),或一两个简单的 BLOCKS | 从 refactor-recipes.md 应用 1-3 个配方;重新评估至 READY |
| SIGNIFICANT REFACTOR | 热路径中存在多个 BLOCKS,或任何 R108(mpi4py)——需要重写,但非不推荐 |
真实项目;预计每模块 1-3 工程师周 |
| NOT RECOMMENDED | 仅两种失败情况:关卡 2(数组低于 65,536 下限)或关卡 4(计算模式不匹配)。大量 BLOCKS 不归入此类 | 先重构或使用其他运行时 |
按顺序应用,第一个匹配即获胜:
- 关卡 4 失败(稀疏/图谱/ML/顺序/字符串)→ NOT RECOMMENDED。
- 关卡 2 失败(热路径数组 < 65,536 元素/GPU,无可行的批处理路径)→ NOT RECOMMENDED。
- 任何 R108(
mpi4py) → SIGNIFICANT REFACTOR(并行层重写的成本是代价,而非不推荐的原因)。 - 热路径中存在多个 BLOCKS(R101–R111)→ SIGNIFICANT REFACTOR(计数不会超过这个级别——每个 BLOCKS 都有记录的配方)。
- 一两个配方可修复的 BLOCKS(例如 R101–R104 元素循环/同步)→ LIGHT REFACTOR。
- 仅有 REFACTOR 模式(R201–R206)→ LIGHT REFACTOR;配方是机械性的。
- 无 BLOCKS,无 REFACTOR → READY。
- 热路径上清单中缺失的 API → 降级一级(SIGNIFICANT 保持 SIGNIFICANT,从不降为 NOT RECOMMENDED)。仅单 GPU 的 API 仅对多节点有意义。
权衡发现的类型,而非数量。 热循环中的一个 R101 比十个 R001 更重要——它破坏了 R001 本该提供的扩展能力。反之,大量 BLOCKS + R108 仍然是 SIGNIFICANT,而非 NOT RECOMMENDED——层级衡量的是工程成本,而非绝望程度。NOT RECOMMENDED 需要规模或计算模式的失败。完整框架:references/decision-framework.md。
可扩展与阻塞项一览
- SCALES(保持原样)——向量化逐元素操作、归约、matmul/einsum、
np.where、每 GPU 大型模板切片arr[1:-1, 1:-1]、out=、布尔掩码索引。 - BLOCKS(迁移前移除)——元素循环、
np.vectorize、for row in arr、热循环中的.item()/.tolist()/bool(arr)、循环中的归约式if/while、arr[::2]、dtype=object、mpi4py、order=、min/max/sum(arr)。 - REFACTOR(应用配方)——循环中的分配、循环中的
x = x + y重新绑定、循环中的vstack/hstack/concatenate、np.nonzero()+ 索引、视图突变diag/flip/flatten、热循环中的reshape。 - INFO(成本说明,非阻塞)——SciPy 导入、单设备
linalg.qr/svd、单变换fft.*、有大小阈值的linalg.solve/cholesky。
完整分类见 idioms-that-scale.md 和 idioms-that-block.md。清单中未列出的 API 静默忽略(超出上游表格范围——标记会造成噪音)。
阅读顺序
规范化的按序阅读指南位于 references/getting-started.md 中——阅读一次以了解方向。
对于非平凡的评估,必须阅读的是 idioms-that-block.md、refactor-recipes.md 和 decision-framework.md;其余内容(idioms-that-scale.md、gpu-stack.md、execution-model.md、partitioning-and-balance.md、case-studies.md)按需阅读。
限制
- 不运行 cuPyNumeric。 不需要运行时;这是移植前的检查。实际的加速测量发生在迁移之后。
- 不自动生成重构后的代码。 它识别需要更改的内容并指向配方;由用户(或后续代理)应用。
- 不对工作负载进行性能分析。 运行时测量请使用
legate.timing.time()和上游的性能分析与调试指南。 - 不能替代判断。 模式匹配会遗漏日志记录中的隐式同步、隐藏
.tolist()的装饰器、运行时数据相关的分区不匹配。需要(尤其是在边界情况下)同时阅读源代码。
示例
附带 assets/examples/ 夹具的工作评估(示例,非模板):
结论:LIGHT REFACTOR。
scales_well.py可以顺利翻译;needs_refactor.py需要提权一次分配;blocks_scaling.py通过.item()每次迭代同步。可扩展部分:
scales_well.py:23-31(模板计算 R005)、:40-44(归约 R002)、:18-22(逐元素 R001)。 阻塞项:blocks_scaling.py:51-58(R104 —— 热循环中的.item())→ RR-sync。 可修复项:needs_refactor.py:21-28(R201 —— 循环中的分配)→ RR-alloc。 下一步: 应用配方;重新评估至 READY;首次实际运行时启用CUPYNUMERIC_DOCTOR=1。
完整的工作报告见 assets/sample_report.md。
权威上游参考资料
- 对比表(
assets/api-support.md的来源):https://nv-legate.github.io/cupynumeric/api/comparison.html(镜像,最新)/.../latest/api/comparison.htmlon docs.nvidia.com(官方) - 最佳实践、Doctor、性能分析、与 NumPy 的差异、Legate 启动器——位于 https://docs.nvidia.com/cupynumeric/latest/(`user/practices.html`、`user/doctor.html`、`user/profiling_debugging.html`、`user/differences.html`)和 https://docs.nvidia.com/legate/latest/manual/usage/running.html
- 源代码:https://github.com/nv-legate/cupynumeric
可用脚本
| 脚本 | 目的 | 参数 |
|---|---|---|
scripts/fetch_api_support.py |
抓取上游对比表到 assets/api-support.md。仅需 Python 标准库;可独立运行。 |
--default-path(写入已提交的 assets/api-support.md);--docs-nvidia-url(使用官方 docs.nvidia.com 替代默认的 GitHub Pages 镜像) |
用户运行此命令以刷新清单(python scripts/fetch_api_support.py --default-path)。
附带的参考文件和资源
references/ 中的文件已在必需阅读顺序上方列出(R-code 范围:idioms-that-scale.md = R001–R007 / R301–R305;idioms-that-block.md = R101–R111 / R201–R206)。资源:assets/api-support.md(已提交的 API 快照,步骤 2 中加载)、assets/sample_report.md 和 assets/examples/*.py(工作报告和夹具)。
故障排除
| 症状 | 原因 | 修复 |
|---|---|---|
清单中的 Fetched: 行超过约 90 天 |
快照过期 | 运行 fetch_api_support.py --default-path(用户操作) |
| 清单缺失或抓取工具失败 | 上游 HTML 变更 | 对该评估使用 WebFetch 获取对比表 |
| 针对许多可修复的 BLOCKS 给出 NOT RECOMMENDED | 启发式规则顺序错误 | 重新应用顺序:关卡 4 → 关卡 2 → R108 → BLOCKS → REFACTOR;权衡类型而非数量 |
| 内核编写或迁移后性能分析 | 超出范围 | 拒绝并重定向(参见"何时使用")——不输出结论 |
热门AI工具
相关专题
本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。
0
2026.11.12
本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。
0
2026.11.12
本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。
0
2026.11.12
本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。
0
2026.11.06
围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。
0
2026.11.06
详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。
0
2026.11.06
DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。
0
2026.11.05
DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。
0
2026.11.05
本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。
0
2026.11.04
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.8万人学习
共6课时 | 54.7万人学习
最新文章