拆解ml-compiler-opt的4步训练流水线:从默认轨迹采集到PPO强化学习
拆解ml-compiler-opt的4步训练流水线从默认轨迹采集到PPO强化学习【免费下载链接】ml-compiler-optInfrastructure for Machine Learning Guided Optimization (MLGO) in LLVM.项目地址: https://gitcode.com/gh_mirrors/mlc/ml-compiler-optml-compiler-opt 是 Google 开源的机器学习引导编译器优化MLGOMachine Learning Guided Optimization训练基础设施用于把 LLVM 编译器中人工编写的优化启发式替换为机器学习模型。它目前已支持两大优化场景面向代码体积的内联优化inlining-for-size对应-Oz和面向性能的寄存器分配优化regalloc-for-performance。对想尝试用 AI 训练编译器的新手来说本文带你完整拆解它的 4 步训练流水线语料提取 → 默认轨迹采集 → 行为克隆热启动 → PPO 强化学习闭环训练。ml-compiler-opt 如何把编译器变成可训练的环境在传统编译器里这个函数要不要内联这类决策由几十行精心调校的经验公式启发式决定。ml-compiler-opt 的思路是观测Observation编译器每次做决策时把当前调用点周围几十个特征如调用者/被调用者基本块数量、内联成本估计等打包成观测向量动作Action由神经网络模型输出决策内联/不内联奖励Reward编译完成后用最终二进制大小与启发式基线对比——变小是正奖励变大是负奖励。编译过程由此变成一个强化学习环境。项目根目录的 README.md 指出LLVM 主仓提供开发模式clang可通过 TFLite 从命令行热切换策略而本仓库负责训练循环和相关工具。四步流水线总览步骤核心工具输入输出① 语料提取extract_irmlgo-utils真实项目的编译数据库IR 语料库corpus② 轨迹采集generate_default_trace.pygenerate_vocab.py语料库 启发式 clang默认轨迹tfrecord 特征词表③ 行为克隆train_bc.py默认轨迹热启动模型warmstart④ PPO 训练train_locally.py语料库 热启动模型优化后的策略模型第 1 步提取训练语料——从真实代码中挖矿强化学习需要海量训练样本。ml-compiler-opt 的语料来自真实项目官方 Demo 以 Fuchsia 操作系统为例任何能用 clang 构建、可生成compile_commands.json的项目都可行模块越多越好。关键机制是构建时开启clang_embed_bitcodetrue对象文件中会嵌入优化前的 LLVM 字节码和 clang 命令行extract_ir工具即可从中把每个模块还原出来形成语料库。语料加载逻辑见 compiler_opt/rl/corpus.py。 新手提示语料提取只需编译一次目标项目是整个流水线中一次性的准备工作。第 2 步采集默认轨迹并生成特征词表采集默认轨迹用工具 compiler_opt/tools/generate_default_trace.py 驱动启发式版clang 重新编译整个语料库把编译器每次决策时的观测值、动作、奖励记录成 tfrecord 轨迹文件。它支持--num_workers并行编译和--sampling_rate采样率如 0.2 表示只处理 20% 的模块并行调度基于 compiler_opt/distributed/ 下的本地工作池实现。生成特征词表观测特征大多是连续数值如被调用者有多少个基本块无法直接喂给网络。工具 compiler_opt/tools/generate_vocab.py 会对每个特征按其分布做1000 分位分桶quantile bucketization生成.buckets文件存入 compiler_opt/rl/inlining/vocab/——这里你能看到node_count.buckets、threshold.buckets等 30 多个特征的分桶文件。后续训练时特征值会被映射为分桶序号作为网络的稀疏特征输入。⚠️ 词表在特征集合或特征分布发生变化时需要重新生成官方 Demo 将其列为可选步骤。第 3 步行为克隆热启动——先学会模仿启发式PPO 如果从随机策略开始早期大量样本都是浪费。ml-compiler-opt 引入行为克隆Behavioral Cloning热启动训练入口compiler_opt/rl/train_bc.py配置文件compiler_opt/rl/inlining/gin_configs/behavioral_cloning_nn_agent.gin使用BCAgentConfig QNetwork 结构隐藏层 40-40-20它直接读取第 2 步的默认轨迹让网络模仿启发式的每一个内联决策。产出的模型就是热启动模型——它不要求比启发式更好只要求足够接近为 PPO 提供一个良好的初始策略避免强化学习冷启动阶段的震荡。第 4 步PPO 强化学习——闭环训练循环主训练入口是 compiler_opt/rl/train_locally.py配合配置 compiler_opt/rl/inlining/gin_configs/ppo_nn_agent.ginPPOAgentConfig ActorDistributionNetwork。其核心循环在train_eval函数中非常直观保存策略将当前 PPO 策略落盘saved_collect_policy采集数据LocalDataCollector调度一批并行 worker用该策略真实重编译语料中的模块产出观测-动作-奖励轨迹并维护每个模块的奖励统计compiler_opt/rl/local_data_collector.pyPPO 训练Trainercompiler_opt/rl/trainer.py在轨迹上做若干轮num_iterations策略梯度更新重复直到累计策略迭代达到num_policy_iterations上限。配置文件中的关键超参数值得新手关注train_eval.num_policy_iterations 3000 # 策略迭代轮数 train_eval.num_modules 100 # 每轮采集的模块数 train_eval.num_iterations 300 # 每轮 PPO 更新次数 PPOAgent.importance_ratio_clipping 0.2 # PPO 经典的裁剪系数 PPOAgent.entropy_regularization 0.003 # 熵正则鼓励探索 PPOAgent.adaptive_kl_target 0.01 # 自适应 KL 约束如何判断训练好坏启动 TensorBoard 观察reward_distribution奖励均值和分位数的正负代表模型相对启发式的大小改进/回退情况正奖励 改进负奖励 回退该监控逻辑实现在 compiler_opt/rl/data_collector.py。官方提示完整 PPO 训练约需半天时间建议 96 核左右的工作站。训练完成之后把模型装回编译器PPO 训练产出的是 TensorFlow SavedModel。部署时把它覆盖进 LLVM 源码树的llvm/lib/Analysis/models/inliner/再以release 模式重新构建 clang去掉 TFLite 依赖、策略静态嵌入最终用-mllvm -enable-ml-inlinerrelease启用再对比优化前后的体积报告即可验证收益。快速上手环境要求与完整 Demo系统Ubuntu如 20.04、Python 3.8/3.9/3.10依赖pip3 install pipenv pipenv sync --system依赖声明在 Pipfile需构建 TFLite 并以开发模式构建 LLVM辅助脚本见 buildbot/build_tflite.sh 与 buildbot/buildbot_init.sh。项目提供了端到端教程内联策略训练 Demodocs/inlining-demo/demo.md寄存器分配策略训练 Demodocs/regalloc-demo/demo.md如果只想看流水线骨架而不跑完整 Demo直接按本文 4 个步骤的顺序阅读对应源码是最快的理解路径。小结ml-compiler-opt 的 4 步流水线可以概括为一句话用真实代码造数据用启发式轨迹打地基用 PPO 在真实编译反馈上持续精进。除了内联和寄存器分配它的框架设计compiler_opt/rl/下的 env、env 配置、特征词表机制也天然支持接入更多优化点仓库中compiler_opt/es/目录还为计划中的进化策略Evolution Strategies训练预留了空间。想要给 LLVM装上大脑这就是你的起点。【免费下载链接】ml-compiler-optInfrastructure for Machine Learning Guided Optimization (MLGO) in LLVM.项目地址: https://gitcode.com/gh_mirrors/mlc/ml-compiler-opt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
