OpenELM:苹果开源的高效语言模型及训练推理框架

苹果公司最近开源了一个名为OpenELM的大型语言模型(LLM)家族,旨在通过公开模型架构、训练方法和数据集,提高LLM研究的可重复性和透明度。这不仅有助于学界验证结果、研究数据和模型偏差,也为探索潜在风险提供了机会。   

OpenELM采用了一种逐层缩放(layer-wise scaling)策略,在transformer模型的每一层中高效分配参数,从而在给定参数预算下实现更高的精度。例如,在约10亿参数规模下,OpenELM的精度比最近开源的OLMo高出2.36%,而训练token数量只有后者的一半。

有别于此前只提供模型权重和推理代码,或在私有数据集上预训练的做法,苹果的开源内容包括了在公开数据集上进行训练和评估的完整框架,涵盖训练日志、多个检查点和预训练配置。他们还发布了将模型转换为MLX库的代码,方便在苹果设备上进行推理和微调。这种全面的开源有望赋能和加强开放研究社区,为未来的开放研究铺平道路。

OpenELM模型架构

OpenELM采用了decoder-only的transformer架构。参考SOTA的LLM,它在设计中融入了以下特点:  

1. 所有全连接层(线性层)不使用可学习的偏置参数
2. 使用RMSNorm进行预规范化,使用RoPE编码位置信息  
3. 用分组查询注意力(GQA)取代多头注意力(MHA)
4. 用SwiGLU FFN取代前馈网络(FFN)  
5. 使用flash attention计算点积注意力
6. 沿用LLama的分词器

与现有LLM在每层采用相同配置、均匀分配参数不同,OpenELM根据逐层缩放策略,让每层transformer的配置(如注意力头数、前馈维度)各不相同,从而在整个模型中实现参数的非均匀分配。这种做法让OpenELM能在相同参数量下,实现更高的精度。

训练数据和方法

OpenELM在约1.8万亿token的公开数据集上进行了预训练,包括RefinedWeb、去重的PILE、RedPajama和Dolma的子集。与之前使用预分词数据的方法不同,OpenELM采用了即时过滤和分词。这大大简化了使用不同分词器进行实验的流程。 

训练采用AdamW优化器,使用余弦退火学习率调度,训练35万步。他们训练了270M、450M、1.1B和3B四个不同规模的变体,对于某些模型还启用了FSDP和activation checkpointing技术。

评估结果

研究者在三个评估框架下测试了OpenELM:标准zero-shot任务、OpenLLM排行榜任务和LLM360排行榜任务。结果显示,不论在推理、知识理解还是识别错误信息和偏见方面,OpenELM都优于现有的开源LLM。尤其是在规模相当的情况下,OpenELM在精度上显著领先OLMo,且只用了一半的训练数据。  

进一步的指令微调实验表明,在6万个指令样本上微调,可使OpenELM在各种任务上的平均精度提高1-2个百分点。此外,LoRA和DoRA等参数高效微调方法也被证明可用于OpenELM,在维持模型大小不变的情况下显著提升下游任务性能。

模型开源

OpenELM的源码、预训练权重和训练配方已在GitHub上开源。模型本身也已上传到HuggingFace,方便研究者使用。值得一提的是,苹果还开源了将模型转换为MLX的代码,MLX是一个在苹果硅芯片上进行高效机器学习的库。这为在苹果设备上部署OpenELM扫清了障碍。  

结论

OpenELM的发布代表了苹果在开放研究道路上又迈出的一大步。逐层缩放策略和全面的开源内容是其两大亮点。尽管目前的推理速度还有待优化,但OpenELM在精度和数据效率上已经展现了巨大的潜力。未来,随着更多的研究者参与改进和分析,OpenELM有望在各类自然语言任务上树立新的标杆,为LLM的发展注入新的活力。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
WPD-Elm是一个使用Elm语言编写的WebUSB API库,用于在Web浏览器中与USB设备进行通信。以下是一个简单的WPD-Elm示例代码。 首先,我们需要在HTML文件中引入Elm和WPD-Elm的JavaScript文件。 ```html <!DOCTYPE html> <html> <head> <title>WPD-Elm Example</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/elm/0.19.1/elm.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@webusb/elm-webusb@1.0.0/dist/elm-webusb.min.js"></script> </head> <body> <div id="app"></div> <script src="main.js"></script> </body> </html> ``` 接下来,我们可以在Elm文件中定义我们的应用程序。在本例中,我们将使用WPD-Elm打开并关闭USB设备。 ```elm module Main exposing (..) import WebUSB import Html exposing (..) import Html.Events exposing (..) type alias Model = { device : Maybe WebUSB.Device , status : String } type Msg = NoOp | DeviceOpened (Result String WebUSB.Device) | DeviceClosed init : () -> ( Model, Cmd Msg ) init _ = ( { device = Nothing, status = "Disconnected" } , Cmd.none ) update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of NoOp -> ( model, Cmd.none ) DeviceOpened (Ok device) -> ( { model | device = Just device, status = "Connected" } , Cmd.none ) DeviceOpened (Err error) -> ( model, Cmd.none ) DeviceClosed -> ( { model | device = Nothing, status = "Disconnected" } , Cmd.none ) subscriptions : Model -> Sub Msg subscriptions model = case model.device of Just device -> WebUSB.subscriptions device |> Sub.map (DeviceClosed >> DeviceOpened) Nothing -> Sub.none view : Model -> Html Msg view model = div [] [ button [ onClick openDevice ] [ text "Open Device" ] , button [ onClick closeDevice ] [ text "Close Device" ] , p [] [ text model.status ] ] openDevice : Msg openDevice = WebUSB.openDevice { filters = [ WebUSB.filterInterfaceClass 0xff ] , successMsg = DeviceOpened , errorMsg = DeviceOpened << Err } closeDevice : Msg closeDevice = WebUSB.closeDevice >> DeviceClosed main : Program () Model Msg main = Html.program { init = init , view = view , update = update , subscriptions = subscriptions } ``` 在上面的代码中,我们首先定义了一个模型(Model),其中包含一个设备(device)和一个状态(status)。然后,我们定义了三个消息(Msg),分别用于打开设备、关闭设备和处理设备打开/关闭的结果。接下来,我们定义了初始化函数(init)、更新函数(update)、订阅函数(subscriptions)和视图函数(view)。在视图函数中,我们创建了两个按钮,用于打开和关闭设备,并显示当前设备的状态。 最后,我们使用Html.program函数创建了一个Elm程序,将我们定义的初始化函数、更新函数、订阅函数和视图函数传递给它。 这就是一个简单的WPD-Elm示例,它演示了如何在Web浏览器中使用Elm语言与USB设备进行通信。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值