编码大模型系列:Meta创新的“代码编译优化”的LLM

news2024/11/26 11:57:07

鲁班号导读正式上线。移步“鲁班秘笈”,查阅更多内容。

大型语言模型 (LLM) 已在各种软件工程和编码任务中展现出卓越的能力。然而,它们在代码和编译器优化领域的应用仍未得到充分探索。训练LLM需要大量资源,需要大量的 GPU时间和大量的数据收集。Meta语言模型编译器 (LLM Compiler),这是一套专为代码优化任务设计的强大、公开可用的预训练模型。

LLM Compiler建立在Code Llama的基础上,增强了对编译器中间表示 (IR)、汇编语言和优化技术的理解。该模型已在546B的LVM-IR和汇编代码的庞大语料库上进行了训练,并经过了指令微调。

LLM Compiler是根据定制的商业许可发布的,允许广泛重用。除了7B和 13B的规模,还有该模型的微调版本,展示了其在优化代码大小和从 x86_64和ARM汇编反编译回LLVM-IR的增强功能。

Code Llama

2024年1月29日发布代码Llama 70B是一个可以使用文本提示生成代码的大型语言模型。Code Llama是最先进的代码任务公开可用LLMs,可以使得当前开发人员的工作流程更快、更高效,并降低学习编码的门槛。Code Llama可以被用来作业以及教学。

Code Llama是Llama 2的代码专用版本,它是通过在特定的代码数据集进一步训练Llama 2而得到。它可以从代码和自然语言提示生成代码和关于代码的自然语言,例如,“写一个斐波那契数列的函数”。它还可用于代码的补全和调试,支持当今使用的许多最流行的语言,包括Python、C++、Java、PHP、Typescript (Javascript)、C#和Bash。

Code Llama提供多达100,000 个上下文Token。所有的模型都基于16,000个Token序列进行训练,在多达100,000个Token输入中显示出明显的改进。

Meta还微调Code Llama的另外两个变体:Code Llama-Python和Code Llama-Instruct。Code Llama-Python是Code Llama的专用语言变体,在 Python代码的100B的Token上进一步微调。Meta选择Python的原因是Python和PyTorch在AI社区中发挥着重要作用。

上图为Code Llama的家族谱系

LLM Compiler

刚刚,Meta在编译器优化方面又迈出了一大步,它推出了一套突破性的工具,基于LLM的编译器能够处理编译和反编译任务,在编译器技术领域树立了新的标杆。

编译器的中间表示(Intermediate Representation,IR)是编译过程中的一种抽象表示形式,位于源代码和目标代码之间。它的存在主要是为了帮助编译器在多个阶段进行优化和转换,从而生成高效的目标代码。

上图为LLM Compiler的训练过程,分两个阶段对546B的数据集进行训练,这些数据集以编译器为中心。在第一阶段,模型主要在未标记的编译器IR和汇编代码上进行训练。第二阶段对模型进行指令微调,以预测优化的输出和效果。进而生成7B和13B的LLM Compiler。

不同阶段使用的训练数据集,可以看出在编译优化方面还是加入不少的训练数据。尤其是第三阶段和第四阶段中,和代码相关的自然语言成为主力。

之后在164B个下游标记和反汇编任务数据集上进一步微调形成新的LLM Compiler FTD。在四个训练阶段中,每阶段都会保留先前15%的任务数据。

核心要点:如何学习编译优化

既然要优化编译,那么就需要想解锁下LLVM。LLVM是一套编译器基础设施项目,以C++写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是为了任意一种编程语言而写成的程序,利用虚拟技术完成编译时期、链接时期、执行时期以及“闲置时期”的优化任务。

它最早以C/C++为实现对象,而目前它已支持包括ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java字节码、Objective-C、Swift、Python、Ruby、Crystal、Rust、Scala以及C#等语言。

LLVM pass框架是LLVM系统的一个很重要的部分。LLVM的优化和转换工作就是由多个pass来一起完成的。类似流水线操作一样,每个pass完成特定的优化工作。

上面就是所有的pass(优化算子),各自身怀绝技!

总的来说,所有的pass大致可以分为两类:

  • 分析(analysis)和转换分析类的pass主要以提供信息为主

  • 转换类(transform)的pass主要优化中间代码

常用的代码优化方法(不同的pass):

  • 删除公共子表达式:如果表达式x op y先前已被计算过,并且从先前的计算到现在,x op y中的变量值没有改变,则x op y的这次出现就称为公共子表达式(common subexpression)

  • 删除无用代码无用代码(Dead-code):其计算结果永远不会被使用的语句

  • 常量合并:如果在编译时刻推导出一个表达式的值是常量,就可以使用该常量来替代这个表达式。

  • 代码移动:这个转换的结果是那些不管循环多少次都得到相同结果的表达式(即循环不变计算,loop-invariant computation),在进入循环之前就对它们进行求值。

  • 强度削弱:用较快的操作代替较慢的操作,如用加代替乘 。(例:2*x ⇒ x+x)

  • 删除归纳变量:对于一个变量x ,如果存在一个正的或负的常数c使得每次x被赋值时它的值总增加c ,那么x就称为归纳变量(Induction Variable)。在循环中,若有一组归纳变量的值的变化不变,可以将这组变量保留一个

聪明的读者一定反应过来了,感情这模型是在学习如何针对代码选择最优的pass list(优化算子组合)然后进行优化。对了!

Meta为了让LLM Compiler了解编译器优化的工作原理,它使用编译器模拟办法。这个办法将未优化的代码和随机选择的pass lists(优化算子组合,黄色部分)一起丢给opt,进而生成优化代码(IR 或汇编,绿色部分)。最后黄色部分和绿色部分一起作为训练集喂给LLM。

上图中的opt是LLVM工具链中的一个工具,用于分析和转换LLVM源文件中的中间表示(IR)。这个工具通常用于应用各种优化和转换操作,例如执行优化传递、插入优化插件等。

>opt input .bc -o output .bc -p ’module ( default <Oz >) ,module ( iroutliner )’

>clang output .bc -o output .o

>size output .o

上图展示了训练1和推理2期间的模型输入(提示)和输出(标签)的过程。为了生成训练提示的标签,未优化的代码和多个随机pass组合进行编译,然后针对输出二进制最小的pass组合进行最小化,之后再使用 PassListEval检查其正确性。最终被选择的pass list以及其相应的优化IR在训练期间用作标签。期间最经常被选择的100个pass组合将会在所有的应用中广播。

对于部署,Meta选择优化过的传递列表,以确保优化的代码是正确的。为了保证正确性,PassListEval很是关键,下图展示了这个过程:

那么如何进行反编译的微调呢,其实也很简单,通过训练模型将给定的代码样本反汇编为相应的IR来训练模型,以了解汇编(ASM,机器指令,黄色)和IR(优化过后的绿色部分)之间的关系。用于标记此训练任务的IR是利用优化过的IR。如下图所示:

这样LLM编译器经过微调,可在特定任务中表现出色,例如将编译后的代码反汇编回其中间表示 (LLVM-IR)。这对于理解遗留代码或反向优化特别有益,使LLM编译器成为维护和升级现有软件系统的宝贵工具。

效果如何

若要比较效果的话,肯定和优化命令-Oz作为基准来比较,从图中可以看出,效果还是挺不错的。虽然LLM Compiler在编译器优化任务上表现良好,并且相比先前的工作,对编译器表示和汇编代码的理解有所改进,但仍存在一些局限性。主要限制是输入的有限序列长度(上下文窗口)。

LLM 编译器支持 16k tokens的上下文窗口,但程序代码往往超过这个长度。例如,67%的MiBench基准中显示超过了这个上下文窗口。为了缓解这个问题,研究人员拆分了内容,然而仍有18%还是过长,无法作为输入。这样也是是后续的一个研究热点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CodinGame】CLASH OF CODE - 20240630

前言 本文是CodinGame&#xff08;图片来自此&#xff09;随手做的几个&#xff0c;供记录用 要求&#xff1a; 代码 import math import syss input()for n in range(len(s)):print(s[n:])要求 代码 import sys import math# Auto-generated code below aims at helpi…

【01-02】Mybatis的配置文件与基于XML的使用

1、引入日志 在这里我们引入SLF4J的日志门面&#xff0c;使用logback的具体日志实现&#xff1b;引入相关依赖&#xff1a; <!--日志的依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…

ManicTime(屏幕时间统计工具) 专业版值得购买吗

ManicTime 是 Windows 平台上&#xff0c;一款支持跟踪、标记用户在每个软件上所花时间的工具&#xff0c;它能自动归类生成时间使用报表&#xff0c;帮助用户分析及改善工作效率。 ManicTime 不仅会在后台记录、统计所有窗口的使用时间&#xff0c;还能自动截图存档到本地&a…

数据结构-分析期末选择题考点(图)

我是梦中传彩笔 欲书花叶寄朝云 目录 图的常见考点&#xff08;一&#xff09;图的概念题 图的常见考点&#xff08;二&#xff09;图的邻接矩阵、邻接表 图的常见考点&#xff08;三&#xff09;拓扑排序 图的常见考点&#xff08;四&#xff09;关键路径 图的常见考点&#x…

企业数据备份整体规划方案

企业数据备份整体规划设计参考 备份系统前期规划至关重要&#xff0c;需综合考虑多维度因素以达最优解。本文全面探讨企业数据中心备份规划&#xff0c;助您构建高效、稳健的数据保护体系。 随着信息化深入&#xff0c;企业业务系统日益增多&#xff0c;数据规模与类型均显著扩…

等保测评练习16

等级保护初级测评师试题16 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.虚拟机被非法利用后&#xff0c;可能被当作跳板机。&#xff08;T&#xff09; P312 2.云服务商&#xff0c;为云计算服务…

《Windows API每日一练》7.2 计时器的三种使用方法

如果程序在整个运行过程中需要一个计时器&#xff0c;在WinMain函数中或窗口过程处理WM_CREATE 消息时&#xff0c;调用SetTimer函数创建一个计时器。在离开WinMain函数时或是处理WM_DESTROY消息时&#xff0c;调用KillTimer函数销毁计时器。基于调用SetTimer参数的不同&#x…

C#异常提示.mp3的文件不是一个有效的波形文件

解决方法: 使用格式工厂将mp3格式的文件转为wav格式

从笔灵到AI去痕:全方位提升内容创作与学术诚信

内容为王&#xff0c;在内容创作的世界中尤为重要。然而&#xff0c;面对写作时常常感到无从下手&#xff1a;有时缺乏灵感&#xff0c;有时难以表达清楚自己的想法。AI写作助手的出现&#xff0c;为这些问题提供了创新的解决方案&#xff0c;极大地改变了内容创作的过程。 今…

android轮播图入门1——简单无限自动轮播图

目标 目标是实现一个简单的轮播图&#xff0c;特征如下&#xff1a; 只展示本地图片可以无限轮播&#xff0c;在第一帧时也可以向前轮播可以自动轮播 code 先上代码&#xff0c;需要事先准备几张本地图片当素材 MainActivity: package com.example.loopapplication;import…

快速了解《大模型赋能下的AI2.0数字人平台》白皮书

在生成式AI和大模型的赋能下&#xff0c;数字人迎来AI 2.0时代。它能否成为每个人的“数字分身”&#xff0c;转化为新型的AI劳动力工具&#xff1f;商汤科技与上海市人工智能技术协会、零壹智库、增强现实核心技术产业联盟联合发布《大模型赋能下的AI 2.0数字人平台》。《白皮…

利用微信开放标签<wx-open-launch-weapp>在H5中跳转微信小程序报错完美的解决方案

一、报错&#xff1a; [WXTAG] [JSCORE] The slot <template> or <script type"text/wxtag-template"> of <wx-open-launch-weapp> is missing 二、源码 官方源代码如下&#xff0c;<script type"text/wxtag-template"></sc…

智能社区服务小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;房屋信息管理&#xff0c;住户信息管理&#xff0c;家政服务管理&#xff0c;家政预约管理&#xff0c;报修信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;房屋信…

# Sharding-JDBC从入门到精通(3)- Sharding-JDBC 入门程序

Sharding-JDBC从入门到精通&#xff08;3&#xff09;- Sharding-JDBC 入门程序 一、Sharding-JDBC 入门程序&#xff08;水平分表&#xff09;-环境搭建 1、需求说明 使用 Sharding-JDBC 完成对订单表的水平分表&#xff0c;通过快速入门程序的开发&#xff0c;快速体验 Sh…

Unity制作一个简单抽卡系统(简单好抄)

业务流程&#xff1a;点击抽卡——>播放动画——>显示抽卡面板——>将随机结果添加到面板中——>关闭面板 1.准备素材并导入Unity中&#xff08;包含2个抽卡动画&#xff0c;抽卡结果的图片&#xff0c;一个背景图片&#xff0c;一个你的展示图片&#xff09; 2.给…

mac电脑游戏推荐:NBA 2K24 街机版下载

NBA 2K24 街机版是一款由2K Sports开发并发行的篮球游戏&#xff0c;属于著名的NBA 2K系列。这款游戏为玩家提供了与NBA联赛中真实球员和球队互动的机会&#xff0c;体验篮球比赛的激情与紧张。街机版的NBA 2K24通常会在游戏厅、商场等公共场所设置&#xff0c;供玩家投币游玩。…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-48全连接卷积神经网络(FCN)

48全连接卷积神经网络&#xff08;FCN&#xff09; 1.构造函数 import torch import torchvision from torch import nn from torch.nn import functional as F import matplotlib.pyplot as plt import liliPytorch as lp from d2l import torch as d2l# 构造模型 pretrained…

如何在 Linux 中后台运行进程?

一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前&#xff0c;让我们先了解一下什么是后台进程。在 Linux 中…

数字图像处理期末复习题1

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

甄选范文“论云上自动化运维及其应用”,软考高级论文,系统架构设计师论文

论文真题 云上自动化运维是传统IT运维和DevOps的延伸,通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本,提升系统的灵活度,以及系统的交付速度,增强系统的可靠性,构建更加安全、可信、开放的业务平台。 请围绕“云上自动化运维及其应用”…