为了账号安全,请及时绑定邮箱和手机立即绑定

Meta Llama 3 优化的 CPU 推理技术,使用 Hugging Face 和 PyTorch 实现

Nightcafe创作 — 图片版权归作者所有

学习如何在CPU上部署Meta Llama 3时降低模型响应时间

Meta的第三代Llama系列终于发布了(详情),我想要确保你知道如何最优化地部署这款最先进的(SoTA)大语言模型。在本教程中,我们将专注于进行仅权重量化的(WOQ)以压缩80亿参数模型并提升推理速度,但在开始之前,我们先来聊聊Meta的Llama 3。

羊驼 3

到目前为止,Llama 3 家族包括从 8B 到 70B 参数的模型,未来还将不断推出新版本。这些模型包含一个宽松的 Meta Llama 3 许可协议,建议在使用前先审阅许可协议。这标志着 Llama 模型家族和开源 AI 的一个令人兴奋的新篇章。

建筑

Llama 3 是一个自回归的大规模语言模型,基于单解码器变压器。与Llama 2相比,Meta团队成员在以下几个方面进行了显著改进:

  • 采用了分组查询注意力机制(GQA)以提升推理效率。
  • 优化了词元化器,采用了包含128K词汇的词表,旨在更高效地编码语言信息。
  • 在一个包含15万亿词元的训练数据集上进行了训练,这个数据集比Llama 2的训练数据集大7倍,包含的代码量则多出4倍。

下面的图(图1)显示了 print(model) 的结果,其中 modelmeta-llama/Meta-Llama-3–8B-Instruct。从图中我们可以看到,该模型由包含自注意力机制的32个Llama解码层组成。此外,它还包括LlamaMLP、LlamaRMSNorm以及一个Linear头。我们期待在Llama 3的研究论文发布后了解更多。

图1. print(model) 显示了 llama-3–8B-instruct 架构中层的分布情况。

语言模型的表现

该模型在各种行业标准的语言建模基准上进行了评估,例如MMLU基准、GPQA测试、HumanEval基准、GSM-8K测试、MATH基准等。为了本教程的目的,我们将特别关注“指令微调模型”(图2)的表现。最引人注目的是,Llama 3 8B参数模型在报告的这些基准测试中比Llama 2 70B模型的表现高出62%到143%,而其模型大小却只有Llama 2 70B的12%!

图2. Llama 3指令模型在MMLU、GPQA、HumanEval、GSM-8K和MATH LLM基准测试中的性能指标 — 图片由作者提供,来源: source

更加出色的语言建模能力、更加宽松的许可协议以及这一代Llama所包含的架构效率标志着一个激动人心的新阶段的开始。让我们来看看如何在CPU上优化推理过程,以便实现Llama 3的可扩展和低延迟部署。

使用PyTorch优化Llama 3推断

之前的文章里,我介绍了模型压缩和整体推理的优化在开发基于LLM的应用程序过程中的重要性。在本教程中,我们将重点介绍如何将仅权重的量化(WOQ)应用于meta-llama/Meta-Llama-3–8B-Instruct。WOQ提供了一个在性能、延迟和准确性之间的平衡,可以选择将权重量化为int4或int8。WOQ的关键环节是去量化步骤,它将int4或int8权重转换回bf16进行计算。

图3. 仅对权重进行量化(weight-only quantization)的简单说明,预量化的权重以橙色表示,量化的权重以绿色表示。请注意,这描绘了初始量化为int4/int8,然后去量化为fp16/bf16或bf16以进行计算步骤。 — 图片由作者制作 — (来源)

环境搭建

您将需要大约60GB的RAM来运行WOQ于Llama-3-8B-Instruct。这其中包括约30GB用于加载完整模型,以及在量化过程中达到的约30GB峰值内存占用。经过WOQ处理的Llama 3仅会消耗约10GB的RAM,这相当于释放整个模型的内存后,可以节省约50GB的RAM。

您可以在 Intel ® Tiber ® 开发者云 免费的 JupyterLab* 环境中运行这个教程。该环境配备第 4 代 Intel ® Xeon ® CPU,拥有 224 个线程和 504 GB 内存,完全够用运行这段代码。

如果你是在自己的IDE中运行此程序,你可能需要安装Jupyter,以及配置conda或Python环境。在开始之前,请确保安装了必要的依赖。

    intel-extension-for-pytorch==2.2  # 英特尔PyTorch扩展
    transformers==4.35.2            # 变换器
    torch==2.2.0                   # PyTorch
    huggingface_hub                 # Hugging Face Hub
访问和设置Llama 3:

您需要一个Hugging Face*账户来使用Llama 3的模型和分词器。

为了做到这一点,在设置菜单中选择“Access Tokens”,然后创建一个令牌。(请参见图4)

图4. Hugging Face token配置界面的截图 — 图片由作者提供

在运行以下代码后,复制你的访问令牌(access token)并粘贴到在你的 Jupyter 单元格内生成的“Token”字段中。

    从huggingface_hub导入notebook_login, Repository,  

    # 登录到Hugging Face账号  
    notebook_login()

访问 meta-llama/Meta-Llama-3–8B-Instruct 页面,并仔细阅读条款和许可,随后提供您的信息并提交 Llama 3 访问请求。接受模型条款并提供个人信息完全由您自行决定。

Llama 3-8B Instruct 的量化(使用 WOQ 方法)

我们将利用Intel® Extension for PyTorch*将WOQ应用于Llama 3。此扩展包含了针对Intel硬件的最新PyTorch优化技术。请按照以下步骤对Llama 3模型进行量化,并执行优化推理:

  1. Llama 3 模型和分词器: 首先,导入所需的包,并使用 AutoModelForCausalLM.from_pretrained()AutoTokenizer.from_pretrained() 方法来加载模型和分词器,加载 llama-3-8b-instruct 特定的权重和分词器设置。
    import torch  
    import intel_extension_for_pytorch as ipex  
    from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer  

    模型 = 'meta-llama/Meta-Llama-3-8B-Instruct'  

    model = AutoModelForCausalLM.from_pretrained(模型)  # 导入预训练模型
    tokenizer = AutoTokenizer.from_pretrained(模型)  # 导入分词器

2. 量化配方设置: 配置WOQ量化配方。我们可以将weight_dtype变量设置为所需的内存数据类型,从torch.quint4x2torch.qint8中选择,分别对应4位整数和8位整数。此外,我们还可以使用lowp_model来定义反量精度。当前,我们将保留为ipex.quantization.WoqLowpMode.None以维持默认的bf16(半精度浮点数)计算精度。

    qconfig = ipex.quantization.get_weight_only_quant_qconfig_mapping(  
      weight_dtype=torch.quint4x2, # 或 torch.qint8  
      lowp_mode=ipex.quantization.WoqLowpMode.NONE, # 或 FP16, BF16, INT8  
    )  
    checkpoint = None # 可选地加载 int4 或 int8 检查点  

    # 第三部分:模型优化和量化  
    model_ipex = ipex.llm.optimize(model, quantization_config=qconfig, low_precision_checkpoint=checkpoint)  

    del model # 删除原始模型  

我们使用 ipex.llm.optimize() 来应用 WOQ,然后使用 del model 删除整个模型,从而释放大约 30GB 内存。

3. 提示Llama 3: Llama 3和Llama 2一样,有一个预定义的特定提示模板,用于其指令优化的模型。使用这个模板,开发人员可以定义具体的模型行为指令,并提供用户提示以及对话历史。

    系统= """\n\n 你是乐于助人、尊重他人和诚实的助手。始终尽可能友好地回答问题,同时确保安全无忧。如果你不知道答案,请不要编造信息。"""
    user= "\n\n你是一位天文学专家。你能给我讲讲关于宇宙的5个有趣的事实吗?"
    model_answer_1 = 'None'

    llama_prompt_tempate = f"""  
    \n系统{系统}  
    \nuser{user}  
    \nassistant{model_answer_1}  
    """  

    inputs = tokenizer(llama_prompt_tempate, return_tensors="pt").input_ids

我们填写所需字段,然后利用分词器将整个模板转换成模型可以理解的令牌。

4.Llama 3 推理: 对于文本生成,我们使用 TextStreamer 生成实时生成流,而不是一次性打印整个输出。这为读者提供了一个更自然的文本生成体验。我们将配置好的流处理器传递给 model_ipex.generate() 函数以及其他文本生成参数。

streamer = TextStreamer(tokenizer, skip_prompt=True)  

# 启用推理模式,用于推理过程
with torch.inference_mode():  
    # 生成模型的输出
    tokens = model_ipex.generate(  
        inputs,  
        streamer=streamer,  
        pad_token_id=128001,  # 填充token的ID
        eos_token_id=128001,  # 结束token的ID
        max_new_tokens=300,  # 控制生成的新token数量
        repetition_penalty=1.5,  # 重复惩罚因子,防止生成内容重复
    )

运行这段代码时,模型将开始生成输出。需要注意的是,这些输出未经任何过滤或保护。在实际应用中,您可能还需要进行额外的后期处理。

图5. 在Intel Tiber云的JupyterLab环境中,使用WOQ模式下的压缩以int4运行的Llama-3–8B-Instruct的实时推理——作者的Gif图

就这样搞定啦。仅用不到20行代码,你现在就已经有了一个低延迟、CPU优化的最新SoTA LLM版本。

部署时,需要考虑的因素

根据你的推理引擎服务部署策略,你可能需要考虑以下几个方面:

  • 如果在容器中部署 Llama 3 的实例,WOQ 将带来更小的内存占用,并允许你在单个硬件节点上提供多个该模型的推理服务。
  • 部署多个推理服务时,你应该为每个服务实例优化线程和内存的分配。为处理后台进程,应预留大约 4 GB 的额外内存和大约 4 个线程。
  • 考虑将 WOQ 版本的模型保存并存储在模型注册表中,以避免每次部署实例时重新量化模型。
结论和讨论部分

Meta的Llama 3 LLM家族相比之前的版本实现了显著的进步,提供了多种配置选项(更多即将推出)。在这次教程中,我们探讨了如何通过weight-only quantization (WOQ)技术来提升CPU推理性能,这种技术在减少延迟的同时几乎不影响准确性。

通过将新一代高性能的Llama 3 LLM与如WOQ等优化技术相结合,开发人员可以为GenAI应用程序开启新的可能性。这种组合降低了硬件要求,以实现集成到新系统和现有系统中的LLM后获得的高度保真、低延迟结果。

下面有几个好玩的可以试试:

  1. 量化级别实验: 应该测试int4和int8量化,以找到性能和准确性之间最适合您特定应用的最佳平衡方案。
  2. 性能监测: 持续评估Llama 3模型在不同实际场景中的性能和准确性至关重要,以确保量化能够保持所需的效力。
  3. 测试更多Llama: 探索整个Llama 3系列,并评估WOQ及其他PyTorch 量化配方的影响。

感谢您的阅读!不要忘了关注我以获取更多类似的文章,您可以在这里找到我的个人资料我的个人资料

其他名称和品牌可能归他人所有或为他人商标.

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消