小语言模型(SLM)入门实战:基于 Microsoft Phi-3/3.5 家族从文本、视觉到 MoE 的推理指南
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
本指南以《生成式 AI 初学者教程》第 19 课为主线,系统讲解小语言模型(Small Language Model, SLM)的核心概念、与大型语言模型(LLM)的关键差异,并以 Microsoft Phi-3/3.5 家族为实例,带你走通云端 API 与本地运行两条推理路径。学完本文,你将能够准确描述 SLM 的定位、区分 LLM 与 SLM 的五个维度,并借助仓库配套 Notebook 独立完成 Instruct(文本)、Vision(视觉)与 MoE(混合专家)三类模型的推理调用。
什么是小语言模型(SLM)
小语言模型(SLM)是大型语言模型(LLM)的缩小版变体:它继承了 LLM 的绝大部分架构原理与技术手段,但计算足迹(computational footprint)显著降低。SLM 是专门用于生成类人文本的语言模型子集,与 GPT-4 这样的大模型相比更加紧凑、高效,非常适合计算资源受限的场景;尽管体积小,它依然能胜任多种自然语言处理(NLP)任务:
- 文本生成:生成连贯且符合上下文的句子或段落;
- 文本补全:基于给定提示词预测并补全句子;
- 翻译:把文本从一种语言转换到另一种语言;
- 摘要:把长文本压缩成更短、更易读的摘要。
SLM 通常通过对 LLM 进行压缩或蒸馏(distill)构建,目标是保留原模型相当一部分功能与语言能力。模型尺寸的缩减降低了整体复杂度,使 SLM 在内存占用与算力需求两方面都更高效;当然,与更大的模型相比,它在部分性能或理解深度上会有所取舍。
SLM 如何工作:从训练到微调
SLM 基于海量文本数据训练而成,在训练过程中学习语言的模式与结构,从而生成语法正确、上下文恰当的文本。训练流程包含四个典型阶段:
- 数据收集:从各种来源收集大规模文本数据集;
- 预处理:清洗并整理数据,使其适合训练;
- 训练:使用机器学习算法让模型学会理解与生成文本;
- 微调:针对特定任务调整模型,提升其在目标任务上的表现。
SLM 的发展与移动设备、边缘计算平台等资源受限环境对可部署模型的需求增长相吻合。在完整版 LLM 因资源消耗过重而难以落地的场景中,以效率为核心的 SLM 在性能与可及性之间取得了平衡,从而被广泛部署于各类领域。
SLM 的典型应用场景
- 聊天机器人:提供客户支持,并以对话方式与用户交互;
- 内容创作:帮助写作者生成创意,甚至起草整篇文章;
- 教育:辅助学生完成写作作业或学习新语言;
- 无障碍:为残障人士开发工具,如文本转语音系统。
LLM 与 SLM 的关键区别:五个维度
LLM 与 SLM 都建立在概率机器学习的基本原理之上,架构设计、训练方法、数据生成过程与模型评估手段也大同小异,但以下五个关键因素将两类模型区分开来。
模型规模(Size)
规模是 LLM 与 SLM 最显著的差异。例如 ChatGPT(GPT-4)参数量估计高达约 1.76 万亿,而开源 SLM 如 Mistral 7B 仅有约 70 亿参数。这种悬殊主要源于模型架构与训练过程的差异:ChatGPT 在编码器-解码器(encoder-decoder)框架内使用自注意力机制,而 Mistral 7B 在纯解码器(decoder-only)模型中使用滑动窗口注意力(sliding window attention),使训练更高效。架构差异深刻影响模型的复杂度与性能。
理解能力(Comprehension)
SLM 通常针对特定领域进行性能优化,高度专业化,但在跨多个知识领域的广泛上下文理解上可能受限;LLM 则试图在更全面的层面模拟人类智能,在海量多样数据集上训练,跨领域表现优异,通用性与适应性更强,因此更适合自然语言处理、编程等更广泛的下游任务。
计算资源(Computing)
LLM 的训练与部署是资源密集型工作,通常需要大规模 GPU 集群等重型基础设施——例如从头训练 ChatGPT 级别的模型可能需要数千张 GPU 并持续很长时间。相比之下,参数量更小的 SLM 对算力的门槛低得多:像 Mistral 7B 这样的模型可在配备中等 GPU 的本地机器上训练与运行(尽管训练仍需多张 GPU、耗时数小时)。
偏见(Bias)
偏见是 LLM 中的常见问题,主要源于训练数据:这些模型大量使用互联网上原始公开数据,可能导致某些群体被低估或误述、标签错误,以及由方言、地域差异和语法规则引发的语言偏见。LLM 架构的复杂性还可能无意中放大偏见,若不仔细微调很难察觉。SLM 使用更受约束的领域专用数据集训练,对这些偏见相对不那么敏感,但并非完全免疫。
推理(Inference)
体积缩小为 SLM 带来显著的推理速度优势:它在本地硬件上即可高效产出结果,无需大规模并行处理。而 LLM 由于体量与复杂度,往往需要大量并行计算资源才能获得可接受的推理时间;当并发用户较多时,LLM 的响应速度尤其会在大规模部署场景下变慢。
小结
| 维度 | LLM(如 GPT-4) | SLM(如 Mistral 7B、Phi-3-mini) |
|---|---|---|
| 模型规模 | 高达万亿级参数 | 数十亿级参数 |
| 理解能力 | 跨领域通用、适应性强 | 领域专精、泛化有限 |
| 计算资源 | 需大规模 GPU 集群 | 中等 GPU 本地可运行 |
| 偏见 | 易受公开数据偏见影响 | 相对不敏感,但非免疫 |
| 推理速度 | 需并行计算,高并发下降速 | 本地高效推理、响应快 |
简而言之,LLM 通用但资源消耗大,SLM 以领域专精效率与更低的计算需求见长。本课程以Microsoft Phi-3 / 3.5为实例来介绍 SLM。
Microsoft Phi-3 / Phi-3.5 家族概览
Phi-3 / 3.5 家族主要覆盖三类应用场景:文本(Instruct)、视觉(Vision)与智能体/MoE(Mixture of Experts)。与 LLM 不同,Phi-3/3.5-mini 或 Phi-3/3.5-Vision 可以部署到边缘设备上。
Phi-3 / 3.5 Instruct:文本场景
Instruct 系列主要用于文本生成、聊天补全、内容信息抽取等任务。
- Phi-3-mini:3.8B 参数的语言模型,可在 Microsoft Azure AI Studio、Hugging Face、Ollama 等平台获取。据课程文档记载,Phi-3 模型在关键基准测试上显著优于同等或更大尺寸的模型,Phi-3-mini 甚至超过两倍于自身规模的模型。
- Phi-3-small & medium:仅 7B 参数的 Phi-3-small 在语言、推理、编码、数学等多项基准上超过 GPT-3.5T;14B 参数的 Phi-3-medium 延续这一趋势,超过 Gemini 1.0 Pro。
- Phi-3.5-mini:可视为 Phi-3-mini 的升级版,参数量不变,但多语言支持能力增强(支持 20 多种语言:阿拉伯语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、德语、希伯来语、匈牙利语、意大利语、日语、韩语、挪威语、波兰语、葡萄牙语、俄语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语等),并强化了长上下文支持。3.8B 的 Phi-3.5-mini 在同类模型中表现突出,可媲美两倍规模的模型。
Phi-3 / 3.5 Vision:视觉场景
如果把 Instruct 模型比作 Phi 的“理解能力”,那么 Vision 就是 Phi 观察世界的“眼睛”。
- Phi-3-Vision:仅 4.2B 参数,在通用视觉推理、OCR、表格与图表理解等任务上,超过 Claude-3 Haiku、Gemini 1.0 Pro V 等更大模型。
- Phi-3.5-Vision:是 Phi-3-Vision 的升级版,新增多图像支持——不仅可以看图,还可以“看视频”。它在 OCR、表格与图表理解任务上超过 Claude-3.5 Sonnet、Gemini 1.5 Flash,在通用视觉知识推理任务上与它们持平,并支持多帧输入(即对多张输入图像进行推理)。
Phi-3.5-MoE:稀疏专家混合场景
Mixture of Experts(MoE)允许模型用远少得多的算力完成预训练,意味着在相同计算预算下可以大幅扩展模型或数据集规模——MoE 模型应在预训练中比同质量稠密(dense)模型快得多。Phi-3.5-MoE 由 16 个 3.8B 专家模块(expert modules)组成,仅有 6.6B 激活参数,却能达到与规模大得多的模型相近的推理、语言理解与数学能力。
仓库中的配套 Notebook phi35_moe_demo.ipynb 加载模型后打印出的结构,正好印证了上述架构描述:PhiMoEForCausalLM由 32 层PhiMoEDecoderLayer组成,其中稀疏专家块PhiMoESparseMoeBlock含一个输出维度为 16 的gate门控网络,以及 16 个PhiMoEBlockSparseTop2MLP专家(Top-2 路由、每 token 激活两个专家),词表大小为 32064——即每个解码层都有一组共享门控与 16 个专家供路由选择。
云端 API 推理:三种接入方式
GitHub Models
GitHub Models 是最直接的接入方式,可快速访问 Phi-3/3.5-Instruct 模型。结合 Azure AI Inference SDK 或 OpenAI SDK,可以通过代码访问 API 完成 Phi-3/3.5-Instruct 调用,也可以在 Playground 中先行测试不同效果。
课程文档附带一个中文场景对比演示:在 Playground 中分别选择 Phi-3-mini 与 Phi-3.5-mini,对同一中文提问查看两者的回答质量差异。
Azure AI Studio
如果需要调用视觉(Vision)与 MoE 模型,可以通过 Azure AI Studio 完成。可参考 Phi-3 Cookbook 中关于在 Azure AI Studio 上调用 Phi-3/3.5 Instruct、Vision、MoE 的快速上手章节(具体操作步骤见 Phi-3 Cookbook 文档)。
NVIDIA NIM
除云端模型目录方案外,还可以通过 NVIDIA NIM(NVIDIA Inference Microservices)完成相关调用。NIM 是一组加速推理微服务,旨在帮助开发者在云、数据中心、工作站等多样环境中高效部署 AI 模型。其关键特性包括:
- 部署简便:一条命令即可部署 AI 模型,轻松集成到现有工作流;
- 性能优化:利用 NVIDIA 预优化的推理引擎(如 TensorRT、TensorRT-LLM)保证低延迟与高吞吐;
- 可扩展性:在 Kubernetes 上支持自动扩缩容,有效应对波动的工作负载;
- 安全与控制:组织可在自管基础设施上自托管 NIM 微服务,保持对数据与应用的控制;
- 标准 API:提供行业标准 API,便于构建聊天机器人、AI 助手等 AI 应用。
NIM 是 NVIDIA AI Enterprise 的组成部分,旨在简化 AI 模型的部署与运维,确保其在 NVIDIA GPU 上高效运行。
仓库配套 Notebook Phi-3-Vision-Nividia-NIM.ipynb 展示了通过 NIM 的 OpenAI 兼容接口调用 Phi-3 视觉模型的完整流程:将图片 base64 编码后嵌入消息、携带 Bearer 令牌发起请求、解析返回内容:
import requests, base64 invoke_url = "https://ai.api.nvidia.com/v1/vlm/microsoft/phi-3-vision-128k-instruct" # 将图片读取并编码为 base64 with open("./img/demo.png", "rb") as f: image_b64 = base64.b64encode(f.read()).decode() assert len(image_b64) < 180_000, \ "To upload larger images, use the assets API (see docs)" stream = False headers = { "Authorization": "Bearer Your Nvidia NIM API Key", "Accept": "text/event-stream" if stream else "application/json" } payload = { "messages": [ { "role": "user", "content": f'Please create Python code for image, and use plt to save the new picture under imgs/ and name it phi-3-vision.jpg. <img src="data:image/png;base64,{image_b64}" />' } ], "max_tokens": 1024, "temperature": 0.6, "top_p": 1.0, "stream": stream } response = requests.post(invoke_url, headers=headers, json=payload) if stream: for line in response.iter_lines(): if line: print(line.decode("utf-8")) else: print(response.json())注意:图片以<img src="data:image/png;base64,..." />的形式嵌入 user 消息内容,max_tokens、temperature、top_p等生成参数与标准 Chat Completions 接口一致。
本地运行 Phi-3/3.5
所谓推理(inference),指的是语言模型根据收到的输入生成响应或预测的过程:向 Phi-3 提供提示词或问题后,它利用训练好的神经网络分析数据中的模式与关系,推断出最恰当、最相关的回答。以下介绍三种本地运行方案。
Hugging Face Transformers
Hugging Face Transformers 是为 NLP 及其他机器学习任务设计的强大库,其核心特点包括:
- 预训练模型:提供数千个可用于文本分类、命名实体识别、问答、摘要、翻译、文本生成等任务的预训练模型;
- 框架互操作:支持 PyTorch、TensorFlow、JAX 等多个深度学习框架,可在一种框架中训练、在另一种框架中使用;
- 多模态能力:除 NLP 外还支持计算机视觉(图像分类、目标检测)与音频处理(语音识别、音频分类)任务;
- 易用性:提供简便的模型下载与微调 API 和工具,对初学者与专家都很友好;
- 社区与资源:拥有活跃社区及丰富的文档、教程和指南。
这是最常用的方式,但需要 GPU 加速——Vision、MoE 等场景计算量很大,若不量化,在 CPU 上会非常慢。
仓库提供了三个配套 Demo Notebook:
① Instruct 文本生成:phi35-instruct-demo.ipynb 展示了加载本地模型、按 Phi-3 聊天模板组织消息并生成中文回答的完整链路:
import torch from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline torch.random.manual_seed(0) model = AutoModelForCausalLM.from_pretrained( "../phi-3-instruct", # 指向本地已下载的 Phi-3/3.5 模型目录 device_map="cuda", # 显式使用 GPU torch_dtype="auto", trust_remote_code=True, ) tokenizer = AutoTokenizer.from_pretrained("../phi-3-instruct") # Phi-3 聊天模板:<|system|> ... <|end|> <|user|> ... <|end|> <|assistant|> messages = ("<|system|>\n 你是我的人工智能助手,协助我用中文解答问题.\n<|end|>" "<|user|>\n 你知道长沙吗?\n<|end|><|assistant|>") pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) generation_args = { "max_new_tokens": 1024, "return_full_text": False, "temperature": 0.3, "do_sample": False, } output = pipe(messages, **generation_args) print(output[0]['generated_text'])② Vision 多帧推理:phi35-vision-demo.ipynb 演示了 Phi-3.5-Vision 的多帧输入能力:先用 OpenCV 基于直方图相似度(阈值 0.9)从视频中抽取关键帧,再以<|image_i|>占位符组织多帧输入,最后调用模型对“视频”进行摘要:
from PIL import Image from transformers import AutoModelForCausalLM, AutoProcessor # 1. 视频抽帧(OpenCV 直方图相似度 < 0.9 时保留关键帧) # save_keyframes('../video/copilot.mp4', '../output') # 2. 读取多帧图片并构造占位符 images = [] placeholder = "" for i in range(1, 22): images.append(Image.open(f"../output/keyframe_{i}.jpg")) placeholder += f"<|image_{i}|>\n" # 3. 加载视觉模型与处理器 model_id = "../Phi3Vision" model = AutoModelForCausalLM.from_pretrained( model_id, device_map="cuda", trust_remote_code=True, torch_dtype="auto", _attn_implementation='flash_attention_2') processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True, num_crops=4) # 4. 应用聊天模板并生成 messages = [{"role": "user", "content": placeholder + "Summarize the video."}] prompt = processor.tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True) inputs = processor(prompt, images, return_tensors="pt").to("cuda:0") generation_args = {"max_new_tokens": 1000, "temperature": 0.0, "do_sample": False} generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args) generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:] response = processor.batch_decode( generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] print(response)关键点:num_crops=4控制图像切块数量(影响视觉细节的编码粒度),_attn_implementation='flash_attention_2'启用 FlashAttention 加速,多帧推理正好对应文档所述“支持多帧输入”能力。
③ MoE 智能体场景:phi35_moe_demo.ipynb 展示了用 MoE 模型驱动“工具调用型智能体”:系统消息要求模型始终以 JSON 格式输出tool_name、input、output字段,从而实现写作、翻译等多步 Agent 流程:
from torch import bfloat16 import transformers model_id = "../Phi3MOE" model = transformers.AutoModelForCausalLM.from_pretrained( model_id, trust_remote_code=True, torch_dtype=bfloat16, # MoE 模型显式使用 bfloat16 加载 device_map='auto', ) tokenizer = transformers.AutoTokenizer.from_pretrained(model_id) def instruction_format(sys_message: str, query: str): return f'<|system|> {sys_message} <|end|>\n<|user|> {query} <|end|>\n<|assistant|>' # sys_msg:定义 Blog / Translate 两个工具,要求模型以 JSON 格式规划多步调用 query = 'Write something about Generative AI with MOE, translate it to Chinese' input_prompt = instruction_format(sys_msg, query) pipe = transformers.pipeline("text-generation", model=model, tokenizer=tokenizer) generation_args = { "max_new_tokens": 512, "return_full_text": False, "temperature": 0.3, "do_sample": False, } output = pipe(input_prompt, **generation_args) print(output[0]['generated_text'])该 Notebook 运行时会加载 17 个 checkpoint 分片,并给出部分参数被卸载到 CPU 的提示(device_map='auto'会自动做显存调度),说明 MoE 模型虽然激活参数只有 6.6B,但完整权重仍需可观显存。
Ollama
Ollama 是一个让用户在本机轻松运行 LLM 的平台,支持 Llama 3.1、Phi 3、Mistral、Gemma 2 等多种模型。它将模型权重、配置与数据打包成一个整体,便于用户自定义和创建自己的模型;支持 macOS、Linux、Windows,适合想脱离云服务进行实验或部署的用户。使用方式最为直接,只需一条命令:
ollama run phi3.5ONNX Runtime for GenAI
ONNX Runtime 是一个跨平台推理与训练的机器学习加速器,支持 Open Neural Network Exchange(ONNX)格式的模型——这是表示机器学习模型的标准。ONNX Runtime 推理可带来更快的用户体验与更低的成本,支持 PyTorch、TensorFlow/Keras 等深度学习框架,以及 scikit-learn、LightGBM、XGBoost 等经典机器学习库的模型;兼容不同硬件、驱动与操作系统,并通过硬件加速器利用、图优化与变换提供最优性能。
生成式 AI指基于训练数据生成文本、图像、音乐等新内容的 AI 系统,例如 GPT-3 这类语言模型与 Stable Diffusion 这类图像生成模型。ONNX Runtime for GenAI(GENAI)扩展了 ONNX Runtime 的能力,为 ONNX 模型提供完整的生成式 AI 循环,包括 ONNX Runtime 推理、logits 处理、搜索与采样、KV 缓存管理等。其关键特性:
- 广泛的平台支持:可运行于 Windows、Linux、macOS、Android、iOS 等平台;
- 模型支持:支持 LLaMA、GPT-Neo、BLOOM 等流行生成式 AI 模型;
- 性能优化:包含对 NVIDIA GPU、AMD GPU 等不同硬件加速器的优化;
- 易用性:提供易于集成到应用的 API,用最少代码生成文本、图像等内容;
- 用户可以调用高层
generate()方法,也可以逐 token 循环迭代模型,并在循环中动态更新生成参数; - 支持贪婪/波束搜索、TopP/TopK 采样,内置重复惩罚等 logits 处理,还可轻松添加自定义打分。
快速开始:
# 安装 ONNX Runtime 本体 pip install onnxruntime # 安装生成式 AI 扩展 pip install onnxruntime-genai简单生成示例:
import onnxruntime_genai as og model = og.Model('path_to_your_model.onnx') tokenizer = og.Tokenizer(model) input_text = "Hello, how are you?" input_tokens = tokenizer.encode(input_text) output_tokens = model.generate(input_tokens) output_text = tokenizer.decode(output_tokens) print(output_text)调用 Phi-3.5-Vision 的多模态示例:使用create_multimodal_processor()创建多模态处理器,并在 prompt 中以<|image_1|>占位图片:
import onnxruntime_genai as og model_path = './Your Phi-3.5-vision-instruct ONNX Path' img_path = './Your Image Path' model = og.Model(model_path) processor = model.create_multimodal_processor() tokenizer_stream = processor.create_stream() text = "Your Prompt" prompt = "<|user|>\n" prompt += "<|image_1|>\n" prompt += f"{text}<|end|>\n" prompt += "<|assistant|>\n" image = og.Images.open(img_path) inputs = processor(prompt, images=image) params = og.GeneratorParams(model) params.set_inputs(inputs) params.set_search_options(max_length=3072) generator = og.Generator(model, params) while not generator.is_done(): generator.compute_logits() generator.generate_next_token() new_token = generator.get_next_tokens()[0] output = tokenizer_stream.decode(new_token) print(tokenizer_stream.decode(new_token), end='', flush=True)与高层generate()不同,这里采用逐 token 循环方式,通过GeneratorParams.set_search_options(max_length=3072)设置最大生成长度,适合对生成过程做细粒度控制。
其他厂商的量化推理方案
除 ONNX Runtime、Ollama 之外,还可以基于各厂商提供的模型参考方式实现量化模型推理,例如:
- Apple MLX:配合 Apple Metal 使用,充分利用 Apple 芯片的 GPU/统一内存;
- Qualcomm QNN:利用 NPU 加速;
- Intel OpenVINO:利用 CPU/GPU 加速。
更多内容可查阅 Phi-3 Cookbook。
进一步学习:仓库配套资源索引
本文已覆盖 SLM 基础与 Phi-3/3.5 家族推理的核心内容;若想深入,可在本仓库中直接复用以下配套资源:
- 课程原文(英文版):19-slm/README.md
- Instruct 文本推理:19-slm/python/phi35-instruct-demo.ipynb
- Vision 多帧推理:19-slm/python/phi35-vision-demo.ipynb
- MoE 智能体推理:19-slm/python/phi35_moe_demo.ipynb
- NVIDIA NIM 视觉调用:19-slm/python/Phi-3-Vision-Nividia-NIM.ipynb
这些 Notebook 均采用真实可运行的调用方式(模型路径为占位符,需按你的本地目录替换)。结合模型家族图(Instruct / Vision / MoE 的参数与规模对照)与云端 Playground 实测截图,你可以把从“SLM 是什么”到“Phi-3/3.5 怎么用”的知识闭环完整走通。若想进一步学习 SLM 的更多细节,Phi-3 Cookbook 是推荐的后续资料。
【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考