尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Warp 稀疏体数据梯度采样:修复 wp.volume_sample_grad 对 vec4f/vec4d 卷的编译失败,深入解析 4×3 雅可比矩阵约定

发布时间:2026/9/17 5:57:26

资讯中心
01
ARTICLE

Warp 稀疏体数据梯度采样:修复 wp.volume_sample_grad 对 vec4f/vec4d 卷的编译失败,深入解析 4×3 雅可比矩阵约定

Warp 稀疏体数据梯度采样:修复 wp.volume_sample_grad 对 vec4f/vec4d 卷的编译失败,深入解析 4×3 雅可比矩阵约定
Warp 稀疏体数据梯度采样修复 wp.volume_sample_grad 对 vec4f/vec4d 卷的编译失败深入解析 4×3 雅可比矩阵约定【免费下载链接】warpA Python framework for GPU-accelerated simulation, robotics, and machine learning.项目地址: https://gitcode.com/GitHub_Trending/warp/warp本文聚焦 Warp 项目 changelog 1691 号修复项wp.volume_sample_grad()与wp.volume_sample_grad_index()对vec4f/vec4d类型体素数据无法编译的问题及其根因——梯度参数的形状约定。你将理解为什么 N 分量向量的梯度必须是一个「N 行 × 3 列」的雅可比矩阵每个值分量占一行、类型检查在编译期如何拦截错误形状以及底层 CUDA 实现如何通过外积累加生成该矩阵并学会在wp.Tape自动微分中对梯度本身求导。问题背景稀疏卷上的值与梯度联合采样Warp 支持以 NanoVDB 标准表示的稀疏体sparse volume常用于大域网格数据如复杂物体的符号距离场SDF或大规模流场速度。用户指南在 runtime.rst 的 Volumes 小节 中说明了wp.Volume的创建与采样方式可以从.nvdb文件、内存缓冲或 NumPy 数组加载也可以用allocate()、allocate_by_tiles()、allocate_by_voxels()直接分配。在 Warp 内核中对卷采样时通过卷的id引用它并选择采样模式wp.Volume.CLOSEST把每个坐标四舍五入到最近体素适合整数数据梯度恒为零wp.Volume.LINEAR对浮点标量/向量数据做三线性插值插值结果在整数体素平面之间关于索引空间坐标可导。wp.volume_sample_grad()就是「值 空间梯度」联合采样的内置函数与只取值的wp.volume_sample()行为一致额外把采样值对索引空间坐标uvw的梯度写入输出参数grad。其文档字符串见 builtins.py明确定义了grad的形状约定对标量dtypegrad是与标量同类型的长度为 3 的向量对受支持的 N 分量向量类型grad是一个N×3 的雅可比矩阵每个值分量占一行one row per value component。受支持的dtype包括int32、int64、uint32、float32、float64、vec3f、vec3d、vec4f、vec4d。1691 修复了什么vec4 卷的梯度类型编译期不匹配changelog 条目 changelog/1691.fixed.md 原文只有两句Fixwp.volume_sample_grad()andwp.volume_sample_grad_index()failing to compile forvec4fandvec4dvolume data. Their gradient argument is a 4-by-3 matrix with one row per value component.这句话信息量很大可以拆解为两个事实症状当卷存储的值类型是vec4f/vec4d时调用这两个内置函数会直接编译失败Warp 的内置函数在 codegen 阶段做类型检查类型不匹配即抛RuntimeError表现为 kernel 无法编译。约定重申对 4 分量值类型梯度参数必须是一个4×3 矩阵——第 r 行存放「第 r 个分量对(u, v, w)三个索引空间坐标的偏导数」。结合源码可以推断出此前的失败路径volume_sample_grad的value_func在解析内核时调用check_volume_value_grad_compatibility()见 builtins.py该函数对向量类型期望的梯度类型是matrix(shape(type_size(dtype), 3), dtypescalar)。修复前若 vec4 分支的期望形状计算有误例如按列组织得到 3×4调用者传入正确的 4×3 雅可比反而会被判为不兼容导致编译报错。修复后的检查逻辑是def check_volume_value_grad_compatibility(dtype, grad_dtype): if type_is_vector(dtype): expected matrix(shape(type_size(dtype), 3), dtypetype_scalar_type(dtype)) else: expected vector(length3, dtypedtype) if not types_equal(grad_dtype, expected): raise RuntimeError(fIncompatible gradient type, expected {type_repr(expected)}, got {type_repr(grad_dtype)})它由volume_sample_grad的 value_funcbuiltins.py与volume_sample_grad_index的 value_funcbuiltins.py共同调用因此在两个函数上行为一致。检查失败时会给出可定位的错误信息例如传错形状时会得到Incompatible gradient type, expected mat43f, got mat34f。形状约定的正确读法行 值分量列 索引空间坐标「每个值分量一行」这个约定直接决定了 Jacobian 的数学含义。设采样点索引空间坐标为uvw采样值为 4 分量向量f(uvw)则正确类型mat43f/mat43d4 行 × 3 列grad[r][c] ∂f_r / ∂uvw_c与标准的「行向量微分Jacobian 布局」一致即df grad · duvw错误类型mat34f/mat34d转置布局每个分量占一列现在会被编译期拒绝。这一约定在 C 侧的类型特征中有对应体现。volume.h 定义了按值类型推导梯度类型的模板template typename T struct val_traits { using grad_t vec_t3, T; // 标量 → vec3 ... }; template unsigned Length, typename T struct val_traitsvec_tLength, T { using grad_t mat_tLength, 3, T; // N 分量向量 → Length×3 矩阵 ... };也就是说C 层面对vec4的grad_t本来就是mat_t4, 3, T与 Python 侧修复后的期望类型严格一致。底层实现三线性插值的雅可比如何生成LINEAR模式下的梯度来自三线性插值函数的解析导数。CUDA 实现位于 volume.h用floorf取采样点所在单元格的角点ijk_base分解出分数部分ijk_frac计算三个轴上的线性权重wx[2] {1-fx, fx}等注意权重以 float 单精度计算即使卷本身是vec4d遍历 8 个角点累加val w * v的同时用外积累加梯度grad outer(v, grad_w)其中grad_w是权重w对uvw的导数一个 vec3符号项offs*2-1保证只有移动角点方向的权重对导数有贡献。8 个角点的outer(v, grad_w)累加完成后grad自然就是一个 N×3 矩阵每个分量一行。这也解释了文档中「远离整数体素平面可导、平面上不可导」的说明——三线性插值函数是分段线性的其雅可比在平面处发生跳变当前实现取正侧单元格的导数但文档明确提示调用方不应依赖这一行为。另有两个实用细节来自内置函数的文档梯度是关于索引空间坐标而非世界空间的。若uvw由wp.volume_world_to_index()从世界坐标换算而来要得到世界空间梯度还需乘1/voxel_sizeCLOSEST模式下grad为零整数数据应使用CLOSEST且当前实现不向存储的体素值传播梯度。volume_sample_grad_index()则是同一套逻辑的「外部数组」版本卷只提供拓扑与体素线性索引实际值从独立的voxel_data数组读取background值用于无体素位置且二者 dtype 必须一致见 builtins.py。它额外支持对voxel_data与background的反向模式求导这对可微优化场景如逆渲染、参数拟合尤为关键。调用示例可复制的 vec4 采样内核下面是一段与测试用例同构的完整用法对应 test_volume.py 中的内核import warp as wp import numpy as np wp.kernel def sample_vec4( volume: wp.uint64, points: wp.array[wp.vec3], values: wp.array[wp.vec4f], grads: wp.array[Any], # wp.types.matrix(shape(4, 3), dtypewp.float32) ): tid wp.tid() grad grads.dtype() # 用数组 dtype 直接构造正确的 4x3 矩阵类型 # 从世界坐标换算到索引空间uvw 为体素坐标可为分数 p wp.volume_world_to_index(volume, points[tid]) values[tid] wp.volume_sample_grad(volume, p, wp.Volume.LINEAR, grad, dtypewp.vec4f) grads[tid] grad要点梯度数组的 dtype 应写成wp.types.matrix(shape(4, 3), dtypewp.float32)即mat43f对vec4d卷则用shape(4, 3), dtypewp.float64。测试文件中的辅助函数 _vec4_grad_type 正是这样构造期望类型的内核内用grads.dtype()从数组推导局部变量类型可以避免手写矩阵类型若误传转置形状mat34fwp.launch会在编译期抛出RuntimeError: Incompatible gradient type, expected mat43f, got mat34f而非静默出错。标量卷的用法更简单摘自内置函数的 docstring 示例builtins.pywp.kernel def sample_grad(vid: wp.uint64, out: wp.array[wp.float32]): grad wp.vec3() out[0] wp.volume_sample_grad(vid, wp.vec3(0.5, 0.0, 0.0), wp.Volume.LINEAR, grad, dtypefloat) out[1] grad[0] values np.zeros((2, 2, 2), dtypenp.float32) values[1, :, :] 1.0 # f(i, j, k) i volume wp.Volume.load_from_numpy(values, voxel_size1.0, bg_value0.0) out wp.zeros(2, dtypewp.float32) wp.launch(sample_grad, dim1, inputs[volume.id], outputs[out]) print(round(float(out.numpy()[0]), 1), round(float(out.numpy()[1]), 1)) # 0.5 1.0测试证据vec4 路径被三类测试锁定修复是否可靠看回归测试即可确认。test_volume.py 中与本修复直接相关的用例前向值 雅可比正确性——test_volume_sample_grad_v4为wp.vec4f和wp.vec4d分别构造承载线性场v(x) A x的卷A即_VEC4_FIELD_JACOBIAN在随机分数点上采样用np.testing.assert_allclose同时校验采样值与 4×3 雅可比。注意其容差计算 _vec4_field_tolerance由于三线性权重始终以单精度求值误差尺度由插值值幅度决定32 * eps_f32 * |values|_max而与卷标量类型自身的精度无关——这正是vec4d与vec4f共用一套容差的原因。外部数组 反向模式——test_volume_sample_grad_index_v4用wp.Tape包裹volume_sample_grad_index的 launch两次tape.backward()第一次给values.grad填 1验证sum(values) Σ(adj_voxel_data · voxel_data) adj_background · background第二次给grads.grad填 1验证对雅可比本身求和后的反向导数。对采样点的二阶梯度——test_volume_sample_grad_index_v4_adjoint把采样点points设为requires_gradTrue用中心差分步长 0.1且所有扰动点保持在同一三线性单元格内以保证插值函数光滑与 tape 给出的points.grad交叉验证。拒绝转置形状——test_volume_sample_grad_rejects_transposed_grad显式构造mat34f梯度参数并断言wp.launch抛出匹配Incompatible gradient type, expected mat43f, got mat34f的RuntimeError。这个用例把 1691 修复的「形状约定」从文档层面固化成了编译期行为契约。小结与使用要点对vec4f/vec4d卷调用wp.volume_sample_grad()/wp.volume_sample_grad_index()时梯度参数必须声明为4×3 矩阵mat43f/mat43d每行对应一个值分量对(u, v, w)的三个偏导传 3×4 会在编译期被check_volume_value_grad_compatibility()拒绝。梯度是索引空间梯度世界空间需自行除以voxel_sizeLINEAR在整数体素平面处不可导跨平面时不要依赖「正侧单元格」这一当前行为。类型推导可在 C 层val_traitsT::grad_tvolume.h与 Python 层检查函数之间交叉印证测试文件 test_volume.py 提供了从值正确性、反传到编译期报错的全套验证范式可作为自定义调用时的模板。【免费下载链接】warpA Python framework for GPU-accelerated simulation, robotics, and machine learning.项目地址: https://gitcode.com/GitHub_Trending/warp/warp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。