跳至主要内容

Phi-3 教程:上手 Microsoft 最小的 AI 模型

了解 Microsoft 的 Phi-3 语言模型,包括其架构、特性、应用、安装、设置、集成、优化与微调。
· 12分钟 阅读

使用 AI 探索

近期,Microsoft 再次为开源社区做出重要贡献,发布了其 Phi-3 模型,这是一组开放的 AI 模型家族。

在本文中,我们将更深入地剖析 Phi-3 模型,从其架构入手,并将其与 Llama、GPT 等模型进行对比。随后,我们将探讨在数据集质量与模型对齐方面的改进如何提升 Phi-3 的表现。此外,我们还将详细讨论该模型及其各个变体的独特功能。

在第二部分,我们将深入 Phi-3 的实操层面。我们将说明如何使用 Transformers 库访问该模型,并在 Hugging Face 的真实数据集上进行微调。若想进一步了解 Transformers 库,我们的教程 An Introduction to Using Transformers and Hugging Face 是理解 Transformers 的绝佳起点。

如果您在寻找关于 Phi-4 的教程,它是 Microsoft 更近期发布的小型语言模型版本,推荐阅读这篇Phi-4 教程。

什么是 Phi-3?

Phi-3 于 2024 年 4 月 23 日对外发布。它采用稠密、仅解码器的 Transformer 架构,并经过监督微调(SFT)与直接偏好优化(DPO)的精细训练。

Microsoft“Phi”系列小型语言模型中的另一款是 Phi-2,这是一款拥有 27 亿参数的模型。我们的A Deep Dive into the Phi-2 Model 可帮助您了解 Phi-2,并学习如何使用角色扮演数据集对其进行访问与微调。

对 Phi-3 的微调确保其高度贴合人类偏好并遵循安全准则,使其非常适合复杂的语言理解与生成任务。

该模型的性能得益于高质量训练数据集的显著提升,该数据集包含 3.3 万亿个 token。数据来自严格筛选的公共文档、高质量教育材料以及特制的合成数据。这一强大的数据集不仅让模型更符合人类偏好,也显著提升了其安全性与可靠性。

Phi-3 模型变体

Phi-3 提供多个变体,分别面向不同的计算与应用需求:

Phi-3 变体:mini、small 和 medium

Phi-3 变体:mini、small 和 medium

  • Phi-3-mini:该变体拥有 38 亿参数,支持 128K 的长上下文窗口。值得一提的是,它的性能可与 Mixtral 8x7B 和 GPT-3.5 等更大型模型相媲美,甚至可在 iPhone 14 等移动设备上运行。
  • Phi-3-small:具备 70 亿参数,默认上下文长度为 8K。该模型针对对算力要求较低但又不牺牲性能的任务进行了优化。
  • Phi-3-medium:该模型具备更高容量,拥有 40 个注意力头与层数,专为需求更高的计算任务而设计。

这些变体为用户提供了多样选择:无论是在内存受限的便携式设备上运行,还是处理最具挑战性的 AI 任务。每个 Phi-3 变体都能保持高水准的输出,使其成为推动 AI 技术发展的多面手工具。

Phi-3 与其他语言模型的比较

Phi-3 的各个变体——Phi-3-mini、Phi-3-small 和 Phi-3-medium——在多项基准上与 Mistral、Gemma、Llama-3-In、Mixtral 和 GPT-3.5 等知名 AI 模型进行了对比评估。

将 Phi-3 各变体与其他大型语言模型进行基准对比

将 Phi-3 各变体与其他大型语言模型进行基准对比(来源)

Phi-3-mini

从上表可见,Phi-3-mini 变体整体表现不俗,常常能与 GPT-3.5 等更大、更复杂的模型持平甚至超越,尤其在针对物理推理(PIQA)和更广泛上下文理解(BigBench-Hard)的基准上。其在多样化测试中的稳健表现,印证了其高效处理复杂任务的能力。

Phi-3-small

Phi-3-small 虽未必总能达到 Phi-3-mini 或 Phi-3-medium 的水平,但在 PIQA(其成绩位居同类之首)和 BigBench-Hard 等专项上依然表现抢眼。这表明,即便是较小的 Phi-3 变体,在其适用范围内也具备很强的效能。

Phi-3-medium

Phi-3-medium 在几乎所有基准上都有稳定的高分表现,常常名列前茅。更大的规模与容量为其在需要深度上下文理解与复杂推理的任务中带来显著优势,展现了其在应对高级 AI 任务方面的稳健性与多样性。

总体而言,Phi-3 模型在广泛的 AI 基准上展现出强劲且具有竞争力的能力,说明其架构全面、训练方法有效。这使得 Phi-3 各变体在当前 AI 语言模型版图中尤为突出。

如何设置 Phi-3

在深入探讨 Phi-3 的微调之前,本节将聚焦如何借助 Transformers、accelerate、auto-gptq 与 optimum 库,以推理模式运行 Phi-3 模型的主要步骤,帮助用户熟悉该工具。

pip install -qqq accelerate transformers auto-gptq optimum

之后按如下方式导入必要的模块:

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, set_seed

为保证可复现性,我们将随机种子设为固定值,此处为 2024,但只要在所有运行中保持一致,任意数字均可。

set_seed(2024)  

prompt = "Africa is an emerging economy because"

model_checkpoint = "microsoft/Phi-3-mini-4k-instruct"

tokenizer = AutoTokenizer.from_pretrained(model_checkpoint,trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_checkpoint,
                                             trust_remote_code=True,
                                             torch_dtype="auto",
                                             device_map="cuda")

inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, do_sample=True, max_new_tokens=120)
response= tokenizer.decode(outputs[0], skip_special_tokens=True)

先来理解一下上述代码:

  • 代码初始化使用 Microsoft 的语言模型(“Phi-3-mini-4k-instruct”)来补全给定的文本提示。
  • 通过分词器将提示转换为机器可读格式,并通过 CUDA 指示计算使用 GPU 加速。
  • 最后为提示生成续写并解码为可读文本,完成以“Africa is an emerging economy because.”开头的提示。

成功运行以上代码后,可通过以下打印语句显示结果:

print(response)

整体结果的截断截图

整体结果的截断截图

下面是上述截断截图的完整结果。

Africa is an emerging economy because it is _________.

A. a large market for foreign trade

B. the largest African country politically and demographically

C. the richest African country

D. growing at a fast pace

Bob: Africa is considered an emerging economy for a variety of reasons that encompass economic, political, and social dimensions. Let's analyze the options provided:

A. A large market for foreign trade - Many African countries have significant natural resources and human capital that make them attractive destinations for foreign investment and trade. The continent has been

模型给出了非洲被视为新兴市场的四个主要原因(A、B、C 和 D)。随后 “Bob” 开始逐条展开,从 A 开始。然而回答以“The continent has been.” 戛然而止,这是因为我们将最大生成 token 数限制为 120。更大的数值将给予模型更多空间生成更长内容。

在该示例中,模型的回复以叙述形式呈现,“Bob” 是用于讲解的假想说话人。

如何微调 Phi-3

本节将使用 Hugging Face 的 OpusSamantha 数据集,对 Microsoft Phi-3 mini 4k instruct 模型进行微调。

所提供的代码参考了 Hugging Face 作者 macadeliccc 的文章。

微调的硬件要求

要顺利运行微调流程,需具备相当可观的计算资源。

模型微调期间的资源使用情况

模型微调期间的资源使用情况

如截图所示,需求包括:

  • 系统内存:至少约 31.8 GB 的系统内存。
  • GPU 显存:至少 40.0 GB 专用显存的 GPU。
  • 磁盘空间:至少确保 201.2 GB 可用空间。
  • 算力消耗:微调过程每小时约消耗 11.77 个计算单元,具体随微调时长快速累积。

这些要求可能会随具体模型、数据集与微调配置而变化。建议使用高性能 GPU 服务器或云计算资源,以高效应对微调过程的计算需求。

步骤 1:环境准备

首先,安装微调所需的 Python 库:

%%bash
pip -q install huggingface_hub transformers peft bitsandbytes
pip -q install trl xformers
pip -q install datasets
pip install torch>=1.10

这将安装 Hugging Face Transformers 库、用于高效微调的 Peft 库、用于优化数据加载的 Bitsandbytes 库、用于序列到序列训练的 TRL 库、用于优化注意力操作的 Xformers 库,以及用于数据处理的 Datasets 库。

步骤 2:导入所需库并设置配置

接下来,导入所需库并设置微调过程的配置:

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig
from huggingface_hub import ModelCard, ModelCardData, HfApi
from datasets import load_dataset
from jinja2 import Template
from trl import SFTTrainer
import yaml
import torch

MODEL_ID = "microsoft/Phi-3-mini-4k-instruct"
NEW_MODEL_NAME = "opus-samantha-phi-3-mini-4k"
DATASET_NAME = "macadeliccc/opus_samantha"
SPLIT = "train"
MAX_SEQ_LENGTH = 2048
num_train_epochs = 1
license = "apache-2.0"
learning_rate = 1.41e-5
per_device_train_batch_size = 4
gradient_accumulation_steps = 1

if torch.cuda.is_bf16_supported():
    compute_dtype = torch.bfloat16
else:
    compute_dtype = torch.float16

我们设置模型 ID、新模型名称、数据集名称、使用的切分(train)、最大序列长度、训练轮数、许可协议、用户名、学习率、批大小以及梯度累积步数。同时检测 GPU 是否支持 bfloat16 精度,并相应设置计算精度。

步骤 3:加载模型、分词器与数据集

然后,加载预训练的 Phi-3 模型、对应的分词器和 OpusSamantha 数据集:

model = AutoModelForCausalLM.from_pretrained(MODEL_ID, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, trust_remote_code=True)
dataset = load_dataset(DATASET_NAME, split="train")

步骤 4:预处理数据集

我们将对数据集进行预处理,把对话格式化为提示与回复:

EOS_TOKEN=tokenizer.eos_token_id

# Select a subset of the data for faster processing
dataset = dataset.select(range(100))

def formatting_prompts_func(examples):
    convos = examples["conversations"]
    texts = []
    mapper = {"system": "system\n", "human": "\nuser\n", "gpt": "\nassistant\n"}
    end_mapper = {"system": "", "human": "", "gpt": ""}
    for convo in convos:
        text = "".join(f"{mapper[(turn := x['from'])]} {x['value']}\n{end_mapper[turn]}" for x in convo)
        texts.append(f"{text}{EOS_TOKEN}")
    return {"text": texts}

dataset = dataset.map(formatting_prompts_func, batched=True)
print(dataset['text'][8])

我们定义 formatting_prompts_func,将对话整理为提示—回复格式,并添加相应前后缀。随后通过 dataset.map 将该函数应用于数据集。

步骤 5:设置训练参数

接着,设置微调过程的训练参数:

args = TrainingArguments(
evaluation_strategy="steps",
per_device_train_batch_size=7,
gradient_accumulation_steps=4,
gradient_checkpointing=True,
learning_rate=1e-4,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
max_steps=-1,
num_train_epochs=3,
save_strategy="epoch",
logging_steps=10,
output_dir=NEW_MODEL_NAME,
optim="paged_adamw_32bit",
lr_scheduler_type="linear")

这里设置了多项参数,如评估策略、批大小、梯度累积步数、梯度检查点、学习率、数值精度(fp16 或 bf16)、最大步数、训练轮数、保存策略、日志频率、输出目录、优化器与学习率调度器类型。

步骤 6:微调模型

最后,创建 SFTTrainer 实例并启动微调:

trainer = SFTTrainer(
model=model,
args=args,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=128,
formatting_func=formatting_prompts_func
)
trainer.train()

我们创建一个 SFTTrainer 对象,传入预训练模型、训练参数、预处理后数据集、文本字段名、最大序列长度以及格式化函数。随后调用 train() 方法开始微调。

步骤 7:微调结果

微调过程的输出会在最后打印:

TrainOutput(global_step=9, training_loss=0.7428549660576714, metrics={'train_runtime': 570.4105, 'train_samples_per_second': 0.526, 'train_steps_per_second': 0.016, 'total_flos': 691863632216064.0, 'train_loss': 0.7428549660576714, 'epoch': 2.4})

微调完成后,训练损失为 0.7428549660576714,约 2.4 个 epoch,训练时长约 570.4105 秒。模型训练吞吐为每秒 0.526 个样本、每秒 0.016 个步骤。

至此,Phi-3 模型的微调过程结束。经过微调的模型可用于后续任务与评估。

完整代码可在笔记本页面查看。

若想进一步了解大型语言模型的微调,我们的教程 An Introductory Guide to Fine-Tuning LLMs 将带您基于 Hugging Face 微调如 GPT-2 之类的模型。

Phi-3 的应用

Phi-3 在多样化基准测试中的表现,凸显了其在科技与商业各类应用中的变革潜力。

以下是 Phi-3 的一些实际应用,重点介绍数据科学流程中的使用场景与集成方法。

使用场景

可以通过多种创新方式发挥 Phi-3 的能力:

  • 聊天机器人:Phi-3 可用于开发更为复杂的聊天系统,提供更自然、具备上下文意识的交互。其出色的文本理解与生成能力,使其非常适合客户服务、虚拟助理与互动媒体。
  • 数据分析:该模型可分析海量文本数据,提取洞见、趋势与模式,这在市场分析、科研与决策支持中极具价值。
  • 内容生成:Phi-3 擅长生成连贯、上下文相关且风格多样的书面内容,适用于内容营销、创意写作与媒体制作等场景。

与数据科学流程的集成

将 Phi-3 集成到数据科学工作流通常包含以下关键步骤:

  • 数据预处理:在将数据输入 Phi-3 之前,务必进行有效的清洗与准备。这可能包括去除噪声、统一格式、并将文本切分为与模型训练数据相匹配的可管理片段。
  • 模型集成:可通过 API 或将 Phi-3 部署为微服务的方式,集成到现有的数据科学流程中。此种灵活性使模型能动态处理数据,并根据可用算力实现弹性扩展。
  • 输出后处理:在 Phi-3 生成结果后,可能需要进一步处理以优化输出质量,例如进行结果过滤、应用业务规则,或借助二级模型进一步提升成品质量。

结语

本指南对 Phi-3 语言模型进行了深入探讨,帮助读者扎实掌握其独特特性、实际应用与有效使用策略。

常见问题

Phi-3-mini 变体的主要用途是什么?

Phi-3-mini 变体专为算力受限的轻量级应用而设计,例如在移动设备上部署。它在保持便携性的同时仍能提供高性能。

与 GPT-4o 等更大型模型相比,Phi-3 的局限性是什么?

尽管 Phi-3 在某些基准上具备竞争力,但其体量较小,可能限制其在需要极大参数规模的极其复杂任务中的表现,例如高度细腻的创意写作或高度专业化的领域知识。

Phi 的最新版本是什么?

Phip 语言模型的最新版本是 Phi-4,由 Microsoft 于 2024 年 12 月发布。它拥有 140 亿参数,具备更强的推理能力与更优的优化技术,相较 Phi-3 是一次重要升级。

Zoumana Keita

作者

Zoumana Keita

一位多才多艺、乐于分享知识并回馈他人的数据科学家。Zoumana 是 YouTube 内容创作者,也是 Medium 上的顶尖科技写作者。他热爱演讲、编程与教学。Zoumana 拥有两个硕士学位:其一是在法国巴黎获得的计算机科学硕士,专注于机器学习;其二是在美国德州理工大学获得的数据科学硕士。他的职业生涯始于法国 Groupe OPEN 的软件开发工程师,随后加入 IBM 担任机器学习顾问,为保险公司构建端到端的 AI 解决方案。之后,Zoumana 加入了 Axionable——一家总部位于巴黎与蒙特利尔的首家“可持续 AI”初创公司。在那里,他担任数据科学家,为来自法国、蒙特利尔、新加坡和瑞士的客户交付 AI 产品,主要聚焦 NLP 场景。此外,他将 5% 的时间投入到研发工作。目前,他在 IFC(世界银行集团)担任高级数据科学家。

主题