
编译器图像处理编程语言高性能计算【免费下载链接】Halidea language for fast, portable>项目地址https://gitcode.com/gh_mirrors/ha/Halide点击查看免费下载导读本文以 src/autoschedulers/anderson2021/weights/README.md 为核心系统讲解 Halide 中基于机器学习的 Anderson2021 自动调度器autoscheduler所使用的预训练权重文件它们如何以留一法hold-one-out方式训练、为何按不同应用分别存储、.weights二进制文件的内在格式与版本校验机制以及在 V100 之外的其他 GPU 上使用这些权重时需要留意的前提条件。读完本文你将能够正确理解、加载、转换并评估这套预训练模型在你自己 Halide 管道上的适用边界。一、背景Anderson2021 自动调度器与成本模型Halide 是一门面向快速、可移植的数据并行计算的语言。用户用高层算法描述图像处理/计算管道pipeline再由编译器自动推导出调度schedule。在 Halide 的自动调度器家族中anderson2021位于 src/autoschedulers/anderson2021采用基于机器学习的成本模型来指导粗到细的 beam search它先对候选循环嵌套loop nest提取特征再由神经网络成本模型打分从而在大规模搜索空间中挑选最优调度。这套机制的核心文件包括AutoSchedule.cpp自动调度器主体实现optimal_schedule/optimal_schedule_pass的 beam search 主循环CostModel.h 与 DefaultCostModel.cpp成本模型接口与默认实现Featurization.h定义管道特征PipelineFeatures与调度特征ScheduleFeaturesWeights.h / Weights.cpp神经网络权重结构的定义、读写与文件格式weights 目录本文主角存放训练好的模型权重文件。成本模型本质上是一个小型神经网络其参数正是weights目录下那些.weights文件。因此权重文件的质量与适用范围直接决定了自动调度器给出的调度是否高效。二、留一法Hold-One-Out训练策略README 明确说明了权重目录的训练方式The weights in this directory were trained in a hold-one-out fashion. Each app was trained on a set of random pipelines and all the other apps, but not itself.也就是说这里存放的不是一份通用权重而是按应用app分别训练的多份权重。每一份权重都遵循留一法交叉验证原则训练某个应用的权重时训练集由两部分组成随机生成的管道random pipelines与除该应用之外的所有其他应用该应用自身绝不参与训练从而保证后续在该应用上评测时模型面对的是完全未见过的数据。README 给出的例子最直观For example, bilateral_grid.weights was trained on the random pipelines and all apps except bilateral grid.即bilateral_grid.weights的训练集 随机管道 除 bilateral grid 以外的全部应用bilateral grid 自身被排除在训练集之外。这一策略的设计意图可以从源码层面得到印证。在 AutoSchedule.cpp 中实现了random_dropout函数用于在 beam search 中随机丢弃状态——它正是为随机探索搜索树、生成训练数据服务的源码注释Used for randomly exploring the search tree for autotuning and to generate training data.。结合 generate_data.sh 与 retrain_cost_model.cpp 可见训练数据正是由随机管道与既有应用管道共同构成随机管道保证特征的广度其他应用保证特征的多样性留一法保证评测的公正性——这正是一套标准的跨应用泛化 独立验证评估框架。权重目录中都有哪些应用从仓库实际内容看weights 目录 中存放了与 Halide 官方应用测试集一一对应的权重文件权重文件对应应用bgu.weightsBGUbackground subtraction 类管道bilateral_grid.weightsbilateral grid 双边网格camera_pipe.weights相机图像处理管线conv_layer.weights卷积层cuda_mat_mul.weightsCUDA 矩阵乘法depthwise_separable_conv.weights深度可分离卷积gpu.weightsGPU 综合管道harris.weightsHarris 角点检测hist.weights直方图iir_blur.weightsIIR 递归模糊interpolate.weights插值lens_blur.weights镜头散景模糊local_laplacian.weights局部拉普拉斯max_filter.weights最大值滤波nl_means.weights非局部均值去噪stencil_chain.weights模板stencil链unsharp.weights反锐化掩膜此外目录外还共存一份baseline.weights位于 src/autoschedulers/anderson2021/baseline.weights用于对照实验。当你的管道与某个应用高度相似时可直接选用对应的权重当需要更通用的场景时baseline.weights或随机管道训练的通用权重是起点。三、.weights文件的二进制格式要理解这些权重文件如何被自动调度器消费需要阅读 Weights.cpp 中的格式注释。源码在文件开头明确给出了.weights文件的磁盘布局uint32 signature 始终为 0x68776631 (hwf1) uint32 PipelineFeatures::version uint32 ScheduleFeatures::version uint32 buffer-count uint32 dimension-count uint32 x (dimension-count) 各维度长度 extent float32 x (element-count) 按行优先存储的权重数据 所有数值均为小端序 little-endian对应地Weights.h 中的Weights结构体包含六个权重缓冲buffer它们恰好对应成本模型神经网络的六组参数成员含义维度来源head1_filter/head1_bias网络第一个分支头head1的卷积权重与偏置head1_channels、head1_w、head1_hhead2_filter/head2_bias网络第二个分支头head2的卷积权重与偏置head2_channels、head2_wconv1_filter/conv1_bias汇合后的主干第一层卷积权重与偏置conv1_channels、head1_channels head2_channels各维度的具体数值定义在 NetworkSize.h 中加载时 Weights.cpp 会对每一段数据进行严格校验前 4 字节必须是签名0x68776631即 ASCII 字符串hwf1Halide Weights Format 1否则load直接返回false接下来两个 uint32 是PipelineFeatures::version()与ScheduleFeatures::version()的版本号然后是buffer-count必须恰为 6与结构体中的六个缓冲一一对应每个缓冲先写维度个数与各维度 extent读取时必须与结构体声明的维度完全一致dimension_count必须等于buf.dimensions()每个extent必须等于buf.extent(d)最后按行优先顺序读取float32权重数据。load_onelambda 中任何一处不匹配i.fail()或尺寸不符都会导致整个加载失败从而保证损坏的、被截断的或来自不同网络结构的权重文件不会静默产生错误结果。这也是为什么版本号 签名 尺寸三重校验是理解这些.weights文件的关键。两个版本号为何重要Weights结构体的头两个字段就是特征版本号Weights.huint32_t pipeline_features_version PipelineFeatures::version(); uint32_t schedule_features_version ScheduleFeatures::version();这两个版本号的意义在于成本模型输入的特征向量由 Featurization.h 中定义的PipelineFeatures与ScheduleFeatures计算得到而特征集合一旦在代码中增删或调整其version()就会变化。如果权重文件的特征版本号与当前编译的 Halide 不一致模型对特征向量的解释就会错位因此load会记录版本号由上层代码判断是否匹配。从源码结构可以推断这是为了让训练好的权重与代码库中的特征定义保持同步避免老权重喂新特征造成的维度错配。若遇到版本不匹配就需要用 retrain_cost_model.cpp 重新训练。四、训练平台约束V100 与 GPU 迁移注意事项README 末尾明确给出了唯一的硬件前提These weights were trained on a V100 and may not perform the same on other GPUs.这短短一句话包含两层事实训练平台这批权重是在 NVIDIA V100 GPU 上完成训练的注意训练平台与推理平台并非同一概念——训练时的硬件环境会影响模型学习到的调度偏好分布适用边界在其他 GPU 上使用这些权重性能表现可能不一致。为什么会有这种差异从 GPULoopInfo.cpp / GPULoopInfo.h 与 GPUMemInfo.h 的源码结构可以看到自动调度器的特征工程中包含了大量与 GPU 硬件相关的信息如内存层级、共享内存、线程块组织、访存模式等。不同代际、不同厂商的 GPU 在共享内存大小、寄存器数量、缓存行为、带宽延迟比例上差异显著V100 上最优的 tile 尺寸、unroll 因子、向量化宽度到了其他 GPU 上未必最优。因此如果你的目标设备恰好是 V100 或与 V100 架构行为相近的 GPU直接使用本目录权重即可如果是其他 GPU如 A100、H100、消费级 RTX 或非 NVIDIA 平台建议把本目录权重作为起点/基线并用 retrain_cost_model.cpp 结合你目标硬件上的采样数据微调权重或与baseline.weights做对比评测。五、权重的加载、转换与预测实操5.1 加载机制Weights结构体提供两种加载途径Weights.cppload_from_file/save_to_file读写新版单一.weights文件即本目录中的格式含签名与版本号load_from_dir/save_to_dir读写旧版目录格式——六个原始二进制.data文件head1_conv1_weight.data head1_conv1_bias.data head2_conv1_weight.data head2_conv1_bias.data trunk_conv1_weight.data trunk_conv1_bias.data注意旧格式load_from_dir不记录版本号源码中 Weights.cpp 会直接假设它们与当前特征版本一致Old style data doesnt record the versions, so just assume they are current——这意味着旧格式数据遇到特征版本演进时天然存在隐患这也正是新格式引入签名与版本号的原因。5.2 旧格式转换工具仓库中专门提供了一个转换工具 weightsdir_to_weightsfile.cpp用于把旧目录格式统一转换为新.weights文件格式Usage: weights_dir weights_file.weights它内部依次调用Weights::load_from_dir(argv[1])与Weights::save_to_file(argv[2])。源码注释说明了它的定位Utility to convert from the old dir-of-raw-data into a new .weights file. Should live only long enough for downstream users to convert existing data files to the new format.——即它只服务于存量数据的格式迁移。该工具的构建由 CMakeLists.txt 与 Makefile 管理。5.3 用权重做推理预测scripts/predict_all.sh 展示了如何用已有权重在样本集上做推理预测Usage: $0 halide_build_dir samples_dir weights_file predictions_file include_filenames limit parallelism实际调用的是retrain_cost_model可执行程序并设置NUM_EPOCHS1、学习率 0.001——即只跑一个 epoch 的前向预测将预测结果写入predictions_file。相关配套脚本还有 average_times.sh汇总多次运行的平均耗时与 utils.sh路径处理等公共函数。而训练数据集的生成则依赖 generate_data.sh。六、何时需要重新训练结合 README 的留一法说明与源码结构以下场景应当考虑重新训练而非直接套用目标硬件与 V100 差异大README 已明确提示may not perform the same on other GPUs特征版本不匹配Weights::load读取的PipelineFeatures::version()/ScheduleFeatures::version()与当前代码库不一致时版本号定义见 Featurization.h应使用 retrain_cost_model.cpp 重新训练管道类型显著偏离训练分布例如你的应用与目录中 17 个应用均无相似结构留一法训练出的权重在极端陌生的特征空间上外推能力有限追求更强的调度质量baseline.weights与各应用权重的存在本身说明按应用定制权重能带来更好结果有条件的团队可在目标硬件上做留一法训练流程复现。七、结语这些权重如何指导你的使用决策归纳 README 与源码这套权重的核心事实链是按应用分离 留一法训练 V100 平台限定 带签名与版本号的二进制格式。实际使用时的决策顺序可以简化为判断目标设备是否为 V100 或近似架构——是则直接用否则做好性能可能下降的心理预期并准备重新训练在 weights 目录 中选择与你的管道最接近的应用权重或使用baseline.weights若持有旧版六个.data文件用 weightsdir_to_weightsfile.cpp 转换为新格式用 scripts/predict_all.sh 在验证集上评测权重质量必要时用 retrain_cost_model.cpp 在目标硬件上重新训练。通过上述流程你既能快速上手现成的预训练权重也清楚它们在什么条件下会失效、如何针对自己的硬件与应用做定制化迭代。赞分享编译器图像处理编程语言高性能计算【免费下载链接】Halidea language for fast, portable>项目地址https://gitcode.com/gh_mirrors/ha/Halide点击查看免费下载相关推荐AI 编译器算子计算与调度从 Halide 调度树到 TVM 自动调优的深度解析AI 编译器算子计算与调度从 Halide 调度树到 TVM 自动调优的深度解析 导读 在 AI 编译器的后端优化中算子的计算定义与调度实现是两个文档教程人工智能基于 verl 前端与 MindSpeed/vLLM-Ascend 的 DeepSeek-R1 大规模 RL 训练优化实践Atlas A3 128 卡基于 verl 前端与 MindSpeed/vLLM Ascend 的 DeepSeek R1 大规模 RL 训练优化实践Atlas A3 128 卡 导读编译器图像处理编程语言高性能计算diffusers AutoModel 深度解析从 config.json 自动路由模型类与预训练权重加载diffusers AutoModel 深度解析从 config.json 自动路由模型类与预训练权重加载 AutoModel 是 Diffusers人工智能媒体生成深度学习音频上一篇Move 语言常量Constants权威指南声明语法、可见性控制与编译期求值 —— 基于 aptos-core 仓库 Move Book 文档深度解析下一篇MobileViT-v2 模型对比分析与其他轻量级视觉模型的差异创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考