ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VGGT 推理 YAML 配置全解析:从单卡基线到多卡序列并行与 W8A8 量化

VGGT 推理 YAML 配置全解析:从单卡基线到多卡序列并行与 W8A8 量化 VGGT 推理 YAML 配置全解析从单卡基线到多卡序列并行与 W8A8 量化【免费下载链接】cann-recipes-embodied-ai本项目针对具身智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-embodied-ai本篇技术指南以cann-recipes-embodied-ai仓库中 VGGT 模型在昇腾 NPU 上的推理适配为例系统讲解其 YAML 配置文件体系。你将掌握config/*.yaml中每个参数的含义、默认值与约束关系理解计算冗余消除、多卡序列并行、INT8 量化与内存数据格式四大优化类别的底层实现原理并能够独立完成从单卡基线推理到 2/4/8 卡并行推理、再到 INT8 量化模型构建与推理的完整配置与启动流程。一、配置体系总览VGGT 的推理参数全部通过config/*.yaml文件管理启动入口demo_infer.py使用--config参数指定配置文件默认值为config/single.yaml。这一机制由 demo_infer.py 中的parse_args()实现读取 YAML 后分别提取model_args、world_size再经load_optimization_config解析optimization段最终通过build_vggt_config组装为完整的推理配置对象对应 utils.py 中的VGGTConfig数据结构。仓库预置了 5 套默认配置覆盖单卡、多卡与量化三类典型场景配置文件场景world_size序列并行量化single.yaml单卡基线1关闭bf16sp2.yaml2 卡序列并行2开启Ulysses2, Ring1bf16sp4.yaml4 卡序列并行4开启Ulysses2, Ring2bf16sp8.yaml8 卡序列并行8开启Ulysses4, Ring2bf16single_w8a8.yaml单卡 INT8 量化推理1关闭bf16 W8A8一个完整的配置文件由顶层元信息model_name、world_size、master_port、entry_script与两大配置段model_args、optimization组成。下面以 single.yaml 为基准逐段拆解。二、model_args模型与推理运行参数model_args段控制模型权重、输入数据与推理过程的基本行为model_args: ckpt: ckpt/model.pt # 模型权重路径必填 images-path: examples/kitchen/images # 输入图片目录必填 enable-profiling: false # 是否开启性能剖析 profile-dir: prof_sp # 剖析结果输出目录 num-runs: 6 # 推理运行次数各参数要点ckpt模型权重文件路径必填。标准模型对应 README.md 中通过 Hugging Face 下载的model.ptINT8 量化场景下则应指向生成的VGGT_model_W8A8.pt见 single_w8a8.yaml。images-path输入图片目录支持相对路径或绝对路径。demo_infer.py中的_load_images_for_inference会递归收集目录下所有图片经load_and_preprocess_images预处理后组成[1, N, 3, H, W]形状的批量张量。enable-profiling / profile-dir性能剖析开关与输出目录。开启后由 demo_infer.py 中的define_profiler创建 NPUCPU 双活动剖析器采用warmup2, active1的调度策略多卡场景下结果按rank_{i}子目录分别落盘关闭时使用空上下文管理器零额外开销。num-runs正式推理的次数。单卡路径下_run_single_inference会先执行一次 warmup 再循环num_runs次序列并行路径下_run_sp_inference_loop丢弃前 2 次结果对应代码中step 2才记录日志最终取剩余次数的平均值作为端到端推理耗时。三、optimization四大优化类别配置optimization段是整个配置体系的核心包含计算冗余消除、并行计算、量化、内存与数据格式四大类别optimization: # 计算冗余消除通过缓存机制避免重复计算 computation-redundancy-elimination: rope-cache: true # 旋转编码缓存 dpt-pos-embed-cache: true # DPT 头位置编码缓存 cos-sin-dtype-optimization: true # Cos/Sin 数据类型优化 # 并行计算优化利用多 NPU 并行仅多卡场景生效 parallel-computation: enable: false # 并行计算总开关 ulysses-degree: 2 # Ulysses 序列并行度 ring-degree: 2 # Ring Attention 并行度 # 量化优化降低数据精度以减少显存占用与计算开销 quantization: dtype: bf16 # 模型数据类型fp32 或 bf16 int8-w8a8: enable: false # INT8 量化开关 build: false # INT8 量化模型构建开关 # 内存与数据格式优化提前转换数据格式避免运行时转换开销 memory-and-data-format: conv-weight-layout-preconvert: true # 卷积核布局预转换3.1 计算冗余消除Computation Redundancy Elimination参数类型说明rope-cachebool旋转编码三层缓存关闭时每次重新计算dpt-pos-embed-cacheboolDPT 头位置编码缓存关闭时不缓存cos-sin-dtype-optimizationboolCos/Sin 使用 bfloat16关闭时使用 float64rope-cache对应旋转编码的缓存机制实现在 rope.py 的_compute_frequency_components中代码注释明确其为三层缓存基础频率缓存以(dim, seq_len, device, dtype)为 key 缓存 cos/sin 频率分量表frequency_cachemax 位置缓存以(height, width)为 key 缓存input_positions.max() 1的序列长度源码中即max_position_cache思路2D 嵌入结果缓存以(height, width, batch_size, seq_len)为 key 缓存垂直/水平方向 embedding 后的 cos/sin 张量cos_sin_cache。旋转编码的输入依赖 positions 变量而 positions 与输入图片的宽高相关因此对同样大小的图片可完全复用结果避免每次前向都重新生成 cos/sin 与求最大值。dpt-pos-embed-cache对应 DPT 头的位置编码缓存实现在 dpt_head.py。位置编码结果取决于输入图片大小与 token 长度因此以(W, H, x.shape)为 key 缓存_compute_pos_embed的结果关闭时回退到_apply_pos_embed_original每次重新计算。cos-sin-dtype-optimization对应 Cos/Sin 算子输入数据类型优化。原生实现中 omega 变量使用torch.doublefloat64导致算子下发到 AI CPU 执行、性能低下优化后改为 bfloat16使算子可调度到 NPU 矢量/AICore 上执行。该开关通过 demo_infer.py 中的set_cos_sin_dtype_optimization_enabled全局生效其详细替换逻辑记录在 vggt_optimization.md。3.2 并行计算Parallel Computation仅多卡生效参数类型说明enablebool启用序列并行单卡场景必须为 falseulysses-degreeintUlysses 并行度必须满足ulysses-degree × ring-degree world_sizering-degreeintRing 并行度必须满足ulysses-degree × ring-degree world_size并行计算采用Ulysses Ring Attention 混合序列并行方案Ulysses 并行将num_heads注意力头维度切分到多卡通过 all-to-all 通信实现 head 维度与序列维度的互换使每个 rank 持有完整序列但只处理部分注意力头。约束num_attention_heads必须能被ulysses-degree整除。Ring 并行将序列维度切分到多卡利用 NPU FIA 算子返回的 LSElog-sum-exp信息支持分块注意力结果的数值稳定合并并采用通信与计算 overlap 策略隐藏通信开销。两个并行度的关系约束在源码层被强校验demo_infer.py的setup_sequence_parallel_groupsdemo_infer.py会显式检查world_size ! ulysses_degree * ring_degree并抛出ValueError同时按ring_degree组创建 Ulysses 进程组、按ulysses_degree组创建 Ring 进程组最终构造SPConfig(ulysses_degree, ring_degree, use_ring_overlapTrue)传入模型。序列并行的具体算子适配见 unified_sp_attention.py以npu_fused_infer_attention_score为底层实现与 attention.pyFrame Attention处理帧内短序列保持使用 PyTorch SDPAGlobal Attention处理跨帧长序列切换到 NPU FIA 融合算子二者通过is_global_attention标志分流。多卡推理要求输入图片数量足够多序列足够长才能体现并行收益配置并行场景时应结合输入规模评估。3.3 量化Quantization参数类型说明dtypestr模型数据类型fp32原始或bf16半精度int8-w8a8.enablebool启用 INT8 量化推理W8A8int8-w8a8.buildbool构建 INT8 量化模型仅首次运行时使用dtype模型整体数据精度。fp32为原始精度bf16显存减半。demo_infer.py的_load_model_with_sp与load_standard_model在加载权重后据此调用model.float()或model.bfloat16()。仓库实测见 vggt_optimization.mdbf16 相比 fp32 获得 6.62% 性能收益相机位姿任务精度从 0.919 降至 0.911损失在 0.5% 以内。int8-w8a8.enableINT8 量化推理开关。开启时模型加载走 W8A8 路径激活使用动态 per-token 量化、权重使用静态 per-channel 量化。量化 Linear 层的实现见 vggt_linear.py权重在__init__时通过torch_npu.npu_dynamic_quant离线量化为 int8 并保存 per-channel scale前向时对激活做 per-token 量化再经npu_quant_matmul以 bf16 精度输出。int8-w8a8.build量化模型构建开关。首次使用 INT8 时置为truedemo_infer.py会先加载标准模型调用build_and_save_w8a8_model生成量化模型并保存到当前路径文件名VGGT_model_W8A8.pt后直接返回。值得注意的量化范围当前实现仅对 VGGT 模型中in_features 4096的 Linear 层进行 8bit 量化其余 Linear 层通过set_ignore_quantize标记跳过见 vggt_utils.py。仓库实测fp32 模型约 4.9GBbf16 约 2.46GBint8 约 2.16GBINT8 相比 bf16 相机位姿精度从 0.911 降至 0.907损失在 0.5% 以内vggt_optimization.md。3.4 内存与数据格式Memory and Data Format参数类型说明conv-weight-layout-preconvertbool卷积核预转换为 Fractal_Z 格式关闭时使用默认格式NPU 上进行二维卷积前需要先通过 Transdata 算子将卷积核转为Fractal_ZNZ私有格式推理过程中存在格式转换开销。该优化在模型加载完成后调用cast_model_weight实现见 cast_weight.py调用逻辑见 demo_infer.py递归遍历所有nn.Conv2d模块提前执行torch_npu.npu_format_cast(weight.data, 4)格式 4 即 Fractal_Z完成转换从而将转换开销从推理热路径中剔除。代码中有一处平台相关的前提条件is_ascend_950()返回 True 时跳过该转换注释说明 950 仅支持 ND 格式无需 NZ 转换因此该优化实际作用于 Atlas A2/A3 等目标环境。四、顶层元信息与参数约束4.1 顶层字段model_name: vggt # 模型名称 world_size: 1 # 启动进程数 master_port: 29600 # torchrun 主节点端口 entry_script: demo_infer.py # 入口脚本model_name / entry_scriptyaml_parse.sh校验与解析时的必填字段world_size进程数即 NPU 卡数多卡时必须等于ulysses-degree × ring-degreemaster_porttorchrun启动时的分布式主节点端口默认 29600。配置文件校验逻辑见 yaml_parse.shvggt_validate_yaml会强制检查model_name、world_size、entry_script三个顶层键是否存在并校验world_size为正整数校验失败即中止启动。4.2 量化参数关系dtype与int8-w8a8.enable可以同时为 true模型整体 BF16 Linear 层 INT8这也是 single_w8a8.yaml 采用的组合int8-w8a8.build与int8-w8a8.enable不应同时为 truebuild 用于生成模型enable 用于使用模型。4.3 并行计算参数约束必须满足ulysses-degree × ring-degree world_size单卡场景world_size1下parallel-computation.enable必须为falsenum_attention_heads必须能被ulysses-degree整除。4.4 合法配置示例速查表场景world_sizeparallel.enableulysses-degreering-degreedtypeint8-w8a8.enable单卡推理1false11bf16false单卡量化推理1false11bf16true2 卡并行2true21bf16false4 卡并行4true22bf16false8 卡并行8true42bf16false以上组合均与仓库预置配置文件一一对应可直接套用。五、多卡序列并行推理配置与启动多卡推理通过 YAML 配置文件控制关键参数如下参数说明world_sizeNPU 卡数必须等于ulysses-degree × ring-degreeoptimization.parallel-computation.enable是否启用序列并行多卡推理设为trueoptimization.parallel-computation.ulysses-degreeUlysses 并行度num_attention_heads必须能被其整除optimization.parallel-computation.ring-degreeRing 并行度约束ulysses-degree × ring-degree world_size以 8 卡为例对应 sp8.yamloptimization: parallel-computation: enable: true ulysses-degree: 4 ring-degree: 2 model_name: vggt world_size: 8 master_port: 29600 entry_script: demo_infer.py5.1 启动方式方式一Python 直接启动仅单卡# 默认使用 single.yaml 配置单卡推理 python demo_infer.py # 指定配置文件单卡推理 python demo_infer.py --config config/single.yamldemo_infer.py的main()demo_infer.py依据enable_sp或环境变量中是否存在RANK/WORLD_SIZE自动分流到序列并行路径或单卡路径。方式二Shell 脚本启动支持单卡与多卡# 单卡推理默认使用 single.yaml bash infer_test.sh # 多卡推理2 卡并行内部调用 torchrun bash infer_test.sh sp2.yaml # 多卡推理4 卡并行 bash infer_test.sh sp4.yaml # 多卡推理8 卡并行 bash infer_test.sh sp8.yamlinfer_test.sh的执行流程为source CANN 环境变量 → 加载 yaml_parse.sh 与 vggt_launch.sh →vggt_parse_config解析配置并导出WORLD_SIZE、MASTER_PORT、ENTRY_SCRIPT环境变量 →vggt_launch启动任务。vggt_launch.sh的启动前会设置 NPU 优化环境变量与 HCCL 分布式通信配置# NPU 优化环境变量 export PYTORCH_NPU_ALLOC_CONF${PYTORCH_NPU_ALLOC_CONF:-expandable_segments:True} export TASK_QUEUE_ENABLE${TASK_QUEUE_ENABLE:-2} export CPU_AFFINITY_CONF${CPU_AFFINITY_CONF:-1} export TOKENIZERS_PARALLELISM${TOKENIZERS_PARALLELISM:-false} # HCCL 分布式通信配置 export HCCL_IF_IP${LOCAL_HOST} export HCCL_IF_BASE_PORT23456 export HCCL_CONNECT_TIMEOUT1200 export HCCL_EXEC_TIMEOUT1200随后按world_size通过torchrun --master_port${MASTER_PORT} --nproc_per_node${WORLD_SIZE}torchrun 不可用时回退到python -m torch.distributed.run拉起分布式推理。run_inference_with_sp中通过dist.init_process_group(backendhccl)初始化 HCCL 通信后端每个进程绑定npu:{local_rank}设备。5.2 多卡推理执行流程序列并行推理的完整链路对应 demo_infer.py固定随机种子 → 初始化分布式 → 依据 YAML 创建 Ulysses/Ring 进程组 → 按dtype加载模型可选conv-weight-layout-preconvert→ 加载并预处理图片 → warmup → 开启剖析可选→ 循环num_runs次推理并统计耗时 → 输出平均推理时间。六、INT8 量化推理完整流程INT8 量化推理分为构建与使用两个阶段步骤 1生成 int8 量化模型修改配置将 build 置为 trueenable 保持 falseoptimization: quantization: int8-w8a8: enable: false build: true然后运行yaml 文件名需替换为实际配置文件python demo_infer.py --config config/xxx.yamlint8 模型会生成在当前路径文件名VGGT_model_W8A8.pt。此阶段quick_start会走标准模型加载路径调用build_and_save_w8a8_model完成量化模型构建与落盘后直接返回。步骤 2使用 int8 量化模型推理使用 single_w8a8.yaml 配置文件ckpt指向生成的量化权重、int8-w8a8.enable: truepython demo_infer.py --config config/single_w8a8.yaml七、性能剖析与结果输出当enable-profiling: true时推理过程通过 NPU Profiler 采集算子级性能数据AIC 流水线利用率等指标结果保存到profile-dir指定目录多卡场景下每个 rank 的结果独立存放于profile-dir/rank_{i}子目录。剖析器采用 Level1 级别的PipeUtilization指标采集兼顾信息量采集与开销控制。推理耗时统计方面单卡路径逐次打印每次推理耗时并输出平均值序列并行路径仅 rank 0 打印且丢弃前 2 次warmup 后数据取均值。仓库在 8 卡 Atlas 800I A2 上的参考数据见 vggt_optimization.md25 张输入图片时逐步叠加 Cos/Sin 优化、旋转编码优化、DPT 头优化、AddLayerNorm 融合、BF16 权重、私有格式提前转换后单卡推理耗时由 1324.83ms 降至 1121.09ms序列并行下 Ulysses2/4/8 分别获得 1.75x/3.43x/6.47x 提升Ring2/4/8 分别获得 1.82x/3.48x/6.42x 提升。上述性能数据与测试环境强相关实际部署时请以自身硬件与输入规模实测为准。八、使用注意事项汇总多卡配置必须满足world_size ulysses-degree × ring-degree单卡场景world_size1下parallel-computation.enable必须为false首次使用 INT8 量化时需先设置int8-w8a8.build: true构建量化模型之后改为enable: true使用build与enable不应同时为 true性能剖析结果保存在profile-dir目录images-path支持相对路径或绝对路径环境准备方面本样例依赖 CANN 套件当前为 CANN.8.5.0、torch 2.7.1 与 torch_npu 2.7.1.post2并需要从 VGGT 官方仓库以非覆盖模式复制网络结构代码vggt/dependency、vggt/heads、vggt/layers、vggt/utils等目录完整步骤见 README.md使用一站式平台的用户可直接运行bash infer_platform_env_prepare.sh一键准备代码与权重再以python demo_infer.py --config config/single.yaml完成单卡三维重建推理。九、关联文档与进一步阅读vggt_optimization.md本篇配置中四大优化类别的详细原理、代码替换示例与性能数据出处vggt_accuracy_evaluation.mdVGGT 在相机位姿估计、点云重建、深度估计三个任务上的精度评测方法demo_infer.pyYAML 配置的消费方完整展示了单卡/序列并行/量化三条推理路径config/五套预置 YAML 配置可直接作为自定义配置的模板vggt/layers/rope.py 与 vggt/heads/dpt_head.py缓存类优化的底层实现。【免费下载链接】cann-recipes-embodied-ai本项目针对具身智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-embodied-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表