使用 Azure 机器学习微调小型语言模型 (SLM) Phi-3

目录

概述

动手实验室


概述

 

小型语言模型 (SLM) 的动机

  • 效率:SLM 的计算效率更高,需要的内存和存储空间更少,而且由于需要处理的参数更少,因此运行速度更快。
  • 成本:培训和部署 SLM 的成本较低,使其可供更广泛的企业使用,并适合边缘计算中的应用。
  • 可定制性:SLM 更适合专业应用,与大型模型相比,SLM 可以更轻松地针对特定任务进行微调· 未被充分开发的潜力:虽然大型模型已显示出明显的优势,但使用大型数据集训练的小型模型的潜力尚未得到充分开发。SLM 旨在展示小型模型在使用足够的数据进行训练时可以实现高性能。
  • 推理效率:较小的模型在推理过程中通常效率更高,这是在资源受限的实际应用中部署模型时的一个关键方面。这种效率包括更快的响应时间并降低计算和能源成本。
  • 研究可访问性:由于是开源的,而且体积较小,SLM 更容易被更多没有资源使用较大模型的研究人员使用。它为语言模型研究的实验和创新提供了一个平台,无需大量计算资源。
  • 架构和优化方面的进步:SLM 采用了各种架构和速度优化来提高计算效率。这些增强功能使 SLM 能够以更快的速度和更少的内存进行训练,从而可以在常见的 GPU 上进行训练。
  • 开源贡献:SLM 的作者已公开模型检查点和代码,为开源社区做出贡献并支持其他人的进一步进步和应用。
  • 终端用户应用程序:凭借其出色的性能和紧凑的尺寸,SLM 适用于终端用户应用程序,甚至可以在移动设备上使用,为广泛的应用程序提供轻量级平台。
  • 训练数据和流程:SLM 训练过程旨在有效且可重复,使用自然语言数据和代码数据的混合,旨在使预训练变得可访问且透明。

博客文章缩略图 1,标题为“使用 Azure 机器学习微调小型语言模型 (SLM) Phi-3”

Phi-3(微软研究院)

Phi-3 是微软研究院创建的 SLM,是 phi-2 的后继者。phi-3 在多个公开基准测试中表现良好(例如 phi-3 在 MMLU 中达到 69%),并支持长达 128k 的上下文。3.8B phi-3 mini 模型于 2024 年 4 月底首次发布,phi-3-small、phi-3-medium 和 phi-3-vision 于 5 月在 Microsoft Build 大会上亮相。

  • Phi-3-mini 是一个 3.8B 参数语言模型(128K 和 4K)。
  • Phi-3-small 是一个 7B 参数语言模型(128K 和 8K)。
  • Phi-3-medium 是一个14B 参数语言模型(128K 和 4K)。
  • Phi-3 vision 是一个具有语言和视觉功能的 4.2B 参数多模式模型。

在此示例中,我们将学习如何使用 QLoRA 对 phi-3-mini-4k-instruct 进行微调:使用 Flash Attention 对量化 LLM 进行高效微调。QLoRA 是一种高效的微调技术,可将预训练语言模型量化为 4 位,并附加经过微调的小型“低秩适配器”。这使得在单个 GPU 上微调多达 650 亿个参数的模型成为可能;尽管效率不高,但 QLoRA 的性能可与全精度微调相媲美,并在语言任务上取得了最先进的结果。

 

动手实验室

 

[第一步:准备]

让我们准备数据集。在本例中,我们将下载 ultrachat 数据集。

 

 

<span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code class="language-python"><span style="color:#00e0e0">from</span> datasets <span style="color:#00e0e0">import</span> load_dataset
<span style="color:#00e0e0">from</span> random <span style="color:#00e0e0">import</span> randrange

<span style="color:#d4d0ab"># Load dataset from the hub</span>
dataset <span style="color:#00e0e0">=</span> load_dataset<span style="color:#fefefe">(</span><span style="color:#abe338">"HuggingFaceH4/ultrachat_200k"</span><span style="color:#fefefe">,</span> split<span style="color:#00e0e0">=</span><span style="color:#abe338">'train_sft[:2%]'</span><span style="color:#fefefe">)</span>

<span style="color:#00e0e0">print</span><span style="color:#fefefe">(</span><span style="color:#abe338">f"dataset size: </span><span style="color:#fefefe">{</span><span style="color:#abe338">len</span><span style="color:#fefefe">(</span>dataset<span style="color:#fefefe">)</span><span style="color:#fefefe">}</span><span style="color:#abe338">"</span><span style="color:#fefefe">)</span>
<span style="color:#00e0e0">print</span><span style="color:#fefefe">(</span>dataset<span style="color:#fefefe">[</span>randrange<span style="color:#fefefe">(</span><span style="color:#abe338">len</span><span style="color:#fefefe">(</span>dataset<span style="color:#fefefe">)</span><span style="color:#fefefe">)</span><span style="color:#fefefe">]</span><span style="color:#fefefe">)</span></code></span></span>

 

 

让我们使用较短版本的数据集来创建训练和测试示例。为了指导调整我们的模型,我们需要将结构化示例转换为通过指令描述的任务集合。我们定义一个,formatting_function它接受一个样本并返回一个带有格式指令的字符串。

 

<span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code class="language-python">dataset <span style="color:#00e0e0">=</span> dataset<span style="color:#fefefe">.</span>train_test_split<span style="color:#fefefe">(</span>test_size<span style="color:#00e0e0">=</span><span style="color:#00e0e0">0.2</span><span style="color:#fefefe">)</span>
train_dataset <span style="color:#00e0e0">=</span> dataset<span style="color:#fefefe">[</span><span style="color:#abe338">'train'</span><span style="color:#fefefe">]</span>
train_dataset<span style="color:#fefefe">.</span>to_json<span style="color:#fefefe">(</span><span style="color:#abe338">f"data/train.jsonl"</span><span style="color:#fefefe">)</span>
test_dataset <span style="color:#00e0e0">=</span> dataset<span style="color:#fefefe">[</span><span style="color:#abe338">'test'</span><span style="color:#fefefe">]</span>
test_dataset<span style="color:#fefefe">.</span>to_json<span style="color:#fefefe">(</span><span style="color:#abe338">f"data/eval.jsonl"</span><span style="color:#fefefe">)</span></code></span></span>

 

 

让我们以 json 格式保存这个训练和测试数据集。现在让我们加载 Azure ML SDK。这将帮助我们创建必要的组件。

 

<span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code class="language-python"><span style="color:#d4d0ab"># import required libraries</span>
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>identity <span style="color:#00e0e0">import</span> DefaultAzureCredential<span style="color:#fefefe">,</span> InteractiveBrowserCredential
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml <span style="color:#00e0e0">import</span> MLClient<span style="color:#fefefe">,</span> Input
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml<span style="color:#fefefe">.</span>dsl <span style="color:#00e0e0">import</span> pipeline
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml <span style="color:#00e0e0">import</span> load_component
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml <span style="color:#00e0e0">import</span> command
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml<span style="color:#fefefe">.</span>entities <span style="color:#00e0e0">import</span> Data
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml <span style="color:#00e0e0">import</span> Input
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml <span style="color:#00e0e0">import</span> Output
<span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml<span style="color:#fefefe">.</span>constants <span style="color:#00e0e0">import</span> AssetTypes</code></span></span>

 

 

现在让我们创建工作区客户端。

 

<span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code class="language-python">credential <span style="color:#00e0e0">=</span> DefaultAzureCredential<span style="color:#fefefe">(</span><span style="color:#fefefe">)</span>
workspace_ml_client <span style="color:#00e0e0">=</span> <span style="color:#00e0e0">None</span>
<span style="color:#00e0e0">try</span><span style="color:#fefefe">:</span>
    workspace_ml_client <span style="color:#00e0e0">=</span> MLClient<span style="color:#fefefe">.</span>from_config<span style="color:#fefefe">(</span>credential<span style="color:#fefefe">)</span>
<span style="color:#00e0e0">except</span> Exception <span style="color:#00e0e0">as</span> ex<span style="color:#fefefe">:</span>
    <span style="color:#00e0e0">print</span><span style="color:#fefefe">(</span>ex<span style="color:#fefefe">)</span>
    subscription_id<span style="color:#00e0e0">=</span> <span style="color:#abe338">"Enter your subscription_id"</span>
    resource_group <span style="color:#00e0e0">=</span> <span style="color:#abe338">"Enter your resource_group"</span>
    workspace<span style="color:#00e0e0">=</span> <span style="color:#abe338">"Enter your workspace name"</span>
    workspace_ml_client <span style="color:#00e0e0">=</span> MLClient<span style="color:#fefefe">(</span>credential<span style="color:#fefefe">,</span> subscription_id<span style="color:#fefefe">,</span> resource_group<span style="color:#fefefe">,</span> workspace<span style="color:#fefefe">)</span></code></span></span>

 

 

这里我们创建一个自定义的训练环境。

 

<span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code class="language-python"><span style="color:#00e0e0">from</span> azure<span style="color:#fefefe">.</span>ai<span style="color:#fefefe">.</span>ml<span style="color:#fefefe">.</span>entities <span style="color:#00e0e0">import</span> Environment<span style="color:#fefefe">,</span> BuildContext
env_docker_image <span style="color:#00e0e0">=</span> Environment<span style="color:#fefefe">(</span>
    image<span style="color:#00e0e0">=</span><span style="color:#abe338">"mcr.microsoft.com/azureml/curated/acft-hf-nlp-gpu:latest"</span><span style="color:#fefefe">,</span>
    conda_file<span style="color:#00e0e0">=</span><span style="color:#abe338">"environment/conda.yml"</span><span style="color:#fefefe">,</span>
    name<span style="color:#00e0e0">=</span><span style="color:#abe338">"llm-training"</span><span style="color:#fefefe">,</span>
    description<span style="color:#00e0e0">=</span><span style="color:#abe338">"Environment created for llm training."</span><span style="color:#fefefe">,</span>
<span style="color:#fefefe">)</span>
workspace_ml_client<span style="color:#fefefe">.</span>environments<span style="color:#fefefe">.</span>create_or_update<span style="color:#fefefe">(</span>env_docker_image<span style="color:#fefefe">)</span></code></span></span>

 

 

让我们看看conda.yaml

 

<span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code class="language-yaml"><span style="color:#ffd700">name</span><span style="color:#fefefe">:</span> model<span style="color:#fefefe">-</span>env
<span style="color:#ffd700">channels</span><span style="color:#fefefe">:</span>
  <span style="color:#fefefe">-</span> conda<span style="color:#fefefe">-</span>forge
<span style="color:#ffd700">dependencies</span><span style="color:#fefefe">:</span>
  <span style="color:#fefefe">-</span> python=3.8
  <span style="color:#fefefe">-</span> pip=24.0
  <span style="color:#fefefe">-</span> <span style="color:#ffd700">pip</span><span style="color:#fefefe">:</span>
    <span style="color:#fefefe">-</span> bitsandbytes==0.43.1
    <span style="color:#fefefe">-</span> transformers~=4.41
    <span style="color:#fefefe">-</span> peft~=0.11
    <span style="color:#fefefe">-</span> accelerate~=0.30
    <span style="color:#fefefe">-</span> trl==0.8.6
    <span style="color:#fefefe">-</span> einops==0.8.0
    <span style="color:#fefefe">-</span> datasets==2.19.1
    <span style="color:#fefefe">-</span> wandb==0.17.0
    <span style="color:#fefefe">-</span> mlflow==2.13.0
    <span style="color:#fefefe">-</span> azureml<span style="color:#fefefe">-</span>mlflow==1.56.0 
    <span style="color:#fefefe">-</span> torchvision==0.18.0    </code></span></span>

 

 

[第二步:训练]

让我们看一下训练脚本。我们将使用 Tim Dettmers 等人在论文“ QLoRA:用于语言生成的量化感知低秩适配器调整”中最近介绍的方法。QLoRA 是一种新技术,可以在不牺牲性能的情况下减少大型语言模型在微调过程中的内存占用。QLoRA 工作原理的 TL;DR; 如下:

  • 将预训练模型量化为 4 位并冻结。
  • 附加小型、可训练的适配器层。(LoRA)
  • 仅对适配器层进行微调,同时将冻结的量化模型用于上下文。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值