模型简介
模型特点
模型能力
使用案例
🚀 Phi-4
Phi-4 是一系列多模态模型,涵盖了推理、多模态指令等多种能力。它基于之前模型的经验进行了优化,支持文本、视觉和音频的输入输出,在多语言和多模态任务上表现出色,能够加速语言和多模态模型的研究,为生成式 AI 功能提供有力支持。
🚀 快速开始
Phi-4 系列已集成在 transformers
的 4.48.2
版本中。可以使用以下命令验证当前 transformers
版本:
pip list | grep transformers
建议使用 Python 3.10 运行。所需的包示例如下:
flash_attn==2.7.4.post1
torch==2.6.0
transformers==4.48.2
accelerate==1.3.0
soundfile==0.13.1
pillow==11.1.0
scipy==1.15.2
torchvision==0.21.0
backoff==2.2.1
peft==0.13.2
Phi-4-multimodal-instruct 也可在 Azure AI Studio 中使用。
加载本地模型
获取 Phi-4-multimodal-instruct 模型检查点后,可使用以下示例代码进行推理:
点击查看详情
import requests
import torch
import os
import io
from PIL import Image
import soundfile as sf
from transformers import AutoModelForCausalLM, AutoProcessor, GenerationConfig
from urllib.request import urlopen
# Define model path
model_path = "microsoft/Phi-4-multimodal-instruct"
# Load model and processor
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
# if you do not use Ampere or later GPUs, change attention to "eager"
_attn_implementation='flash_attention_2',
).cuda()
# Load generation config
generation_config = GenerationConfig.from_pretrained(model_path)
# Define prompt structure
user_prompt = '<|user|>'
assistant_prompt = '<|assistant|>'
prompt_suffix = '<|end|>'
# Part 1: Image Processing
print("\n--- IMAGE PROCESSING ---")
image_url = 'https://www.ilankelman.org/stopsigns/australia.jpg'
prompt = f'{user_prompt}<|image_1|>What is shown in this image?{prompt_suffix}{assistant_prompt}'
print(f'>>> Prompt\n{prompt}')
# Download and open image
image = Image.open(requests.get(image_url, stream=True).raw)
inputs = processor(text=prompt, images=image, return_tensors='pt').to('cuda:0')
# Generate response
generate_ids = model.generate(
**inputs,
max_new_tokens=1000,
generation_config=generation_config,
)
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(f'>>> Response\n{response}')
# Part 2: Audio Processing
print("\n--- AUDIO PROCESSING ---")
audio_url = "https://upload.wikimedia.org/wikipedia/commons/b/b0/Barbara_Sahakian_BBC_Radio4_The_Life_Scientific_29_May_2012_b01j5j24.flac"
speech_prompt = "Transcribe the audio to text, and then translate the audio to French. Use <sep> as a separator between the original transcript and the translation."
prompt = f'{user_prompt}<|audio_1|>{speech_prompt}{prompt_suffix}{assistant_prompt}'
print(f'>>> Prompt\n{prompt}')
# Downlowd and open audio file
audio, samplerate = sf.read(io.BytesIO(urlopen(audio_url).read()))
# Process with the model
inputs = processor(text=prompt, audios=[(audio, samplerate)], return_tensors='pt').to('cuda:0')
generate_ids = model.generate(
**inputs,
max_new_tokens=1000,
generation_config=generation_config,
)
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(f'>>> Response\n{response}')
更多推理示例可查看 此处。
vLLM 推理
可以使用以下命令启动服务器:
python -m vllm.entrypoints.openai.api_server --model 'microsoft/Phi-4-multimodal-instruct' --dtype auto --trust-remote-code --max-model-len 131072 --enable-lora --max-lora-rank 320 --lora-extra-vocab-size 0 --limit-mm-per-prompt audio=3,image=3 --max-loras 2 --lora-modules speech=<path to speech lora folder> vision=<path to vision lora folder>
语音 LoRA 和视觉 LoRA 文件夹位于 vLLM 下载的 Phi-4-multimodal-instruct 文件夹内,也可以使用以下脚本查找:
from huggingface_hub import snapshot_download
model_path = snapshot_download(repo_id="microsoft/Phi-4-multimodal-instruct")
speech_lora_path = model_path+"/speech-lora"
vision_lora_path = model_path+"/vision-lora"
✨ 主要特性
- 多模态支持:能够处理文本、图像和音频输入,并生成文本输出。
- 多语言能力:支持多种语言,包括阿拉伯语、中文、捷克语等。
- 长上下文长度:具有 128K 令牌的上下文长度。
- 高性能表现:在语音识别、翻译、视觉理解等任务上表现出色。
- 指令遵循和函数调用:采用了更好的训练技术,能够更好地遵循指令和进行函数调用。
📦 安装指南
Phi-4 系列已集成在 transformers
的 4.48.2
版本中。可以使用以下命令验证当前 transformers
版本:
pip list | grep transformers
建议使用 Python 3.10 运行。所需的包示例如下:
flash_attn==2.7.4.post1
torch==2.6.0
transformers==4.48.2
accelerate==1.3.0
soundfile==0.13.1
pillow==11.1.0
scipy==1.15.2
torchvision==0.21.0
backoff==2.2.1
peft==0.13.2
💻 使用示例
基础用法
import requests
import torch
import os
import io
from PIL import Image
import soundfile as sf
from transformers import AutoModelForCausalLM, AutoProcessor, GenerationConfig
from urllib.request import urlopen
# Define model path
model_path = "microsoft/Phi-4-multimodal-instruct"
# Load model and processor
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
# if you do not use Ampere or later GPUs, change attention to "eager"
_attn_implementation='flash_attention_2',
).cuda()
# Load generation config
generation_config = GenerationConfig.from_pretrained(model_path)
# Define prompt structure
user_prompt = '<|user|>'
assistant_prompt = '<|assistant|>'
prompt_suffix = '<|end|>'
# Part 1: Image Processing
print("\n--- IMAGE PROCESSING ---")
image_url = 'https://www.ilankelman.org/stopsigns/australia.jpg'
prompt = f'{user_prompt}<|image_1|>What is shown in this image?{prompt_suffix}{assistant_prompt}'
print(f'>>> Prompt\n{prompt}')
# Download and open image
image = Image.open(requests.get(image_url, stream=True).raw)
inputs = processor(text=prompt, images=image, return_tensors='pt').to('cuda:0')
# Generate response
generate_ids = model.generate(
**inputs,
max_new_tokens=1000,
generation_config=generation_config,
)
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(f'>>> Response\n{response}')
# Part 2: Audio Processing
print("\n--- AUDIO PROCESSING ---")
audio_url = "https://upload.wikimedia.org/wikipedia/commons/b/b0/Barbara_Sahakian_BBC_Radio4_The_Life_Scientific_29_May_2012_b01j5j24.flac"
speech_prompt = "Transcribe the audio to text, and then translate the audio to French. Use <sep> as a separator between the original transcript and the translation."
prompt = f'{user_prompt}<|audio_1|>{speech_prompt}{prompt_suffix}{assistant_prompt}'
print(f'>>> Prompt\n{prompt}')
# Downlowd and open audio file
audio, samplerate = sf.read(io.BytesIO(urlopen(audio_url).read()))
# Process with the model
inputs = processor(text=prompt, audios=[(audio, samplerate)], return_tensors='pt').to('cuda:0')
generate_ids = model.generate(
**inputs,
max_new_tokens=1000,
generation_config=generation_config,
)
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(f'>>> Response\n{response}')
高级用法
# 高级场景说明:使用 vLLM 进行推理
python -m vllm.entrypoints.openai.api_server --model 'microsoft/Phi-4-multimodal-instruct' --dtype auto --trust-remote-code --max-model-len 131072 --enable-lora --max-lora-rank 320 --lora-extra-vocab-size 0 --limit-mm-per-prompt audio=3,image=3 --max-loras 2 --lora-modules speech=<path to speech lora folder> vision=<path to vision lora folder>
📚 详细文档
输入格式
文本聊天格式
用于一般对话和指令:
<|system|>You are a helpful assistant.<|end|><|user|>How to explain Internet for a medieval knight?<|end|><|assistant|>
启用工具的函数调用格式
当用户希望模型根据给定工具提供函数调用时使用。用户应在系统提示中提供可用工具,用 <|tool|> 和 <|/tool|> 令牌包裹。工具应使用 JSON 格式指定:
<|system|>You are a helpful assistant with some tools.<|tool|>[{"name": "get_weather_updates", "description": "Fetches weather updates for a given city using the RapidAPI Weather API.", "parameters": {"city": {"description": "The name of the city for which to retrieve weather information.", "type": "str", "default": "London"}}}]<|/tool|><|end|><|user|>What is the weather like in Paris today?<|end|><|assistant|>
视觉 - 语言格式
用于与图像的对话:
<|user|><|image_1|>Describe the image in detail.<|end|><|assistant|>
对于多张图像,用户需要在提示中插入多个图像占位符:
<|user|><|image_1|><|image_2|><|image_3|>Summarize the content of the images.<|end|><|assistant|>
语音 - 语言格式
用于各种语音和音频任务:
<|user|><|audio_1|>{task prompt}<|end|><|assistant|>
任务提示因任务而异:
- 自动语音识别:
<|user|><|audio_1|>Transcribe the audio clip into text.<|end|><|assistant|>
- 自动语音翻译:
<|user|><|audio_1|>Translate the audio to {lang}.<|end|><|assistant|>
- 带有思维链的自动语音翻译:
<|user|><|audio_1|>Transcribe the audio to text, and then translate the audio to {lang}. Use <sep> as a separator between the original transcript and the translation.<|end|><|assistant|>
- 语音查询问答:
<|user|><|audio_1|><|end|><|assistant|>
视觉 - 语音格式
用于与图像和音频的对话,音频可能包含与图像相关的查询:
<|user|><|image_1|><|audio_1|><|end|><|assistant|>
对于多张图像,用户需要在提示中插入多个图像占位符:
<|user|><|image_1|><|image_2|><|image_3|><|audio_1|><|end|><|assistant|>
视觉:
- 支持任何常见的 RGB/灰度图像格式(如 ".jpg", ".jpeg", ".png", ".ppm", ".bmp", ".pgm", ".tif", ".tiff", ".webp")。
- 分辨率取决于 GPU 内存大小。更高的分辨率和更多的图像会产生更多的令牌,从而使用更多的 GPU 内存。训练时支持 64 个裁剪。如果是方形图像,分辨率约为 (8448 by 8448)。对于多图像,最多支持 64 帧,但随着输入帧数的增加,每个帧的分辨率需要降低以适应内存。
音频:
- 支持任何可以由 soundfile 包加载的音频格式。
- 为保持良好性能,建议最大音频长度为 40 秒。对于总结任务,建议最大音频长度为 30 分钟。
模型加载
获取 Phi-4-multimodal-instruct 模型检查点后,可使用示例代码进行推理(见上文加载本地模型部分)。
训练
微调
分别提供了 语音 和 视觉 的监督微调(SFT)基本示例。 还提供了 如何将语音识别扩展到新语言 的示例。
模型信息
属性 | 详情 |
---|---|
架构 | Phi-4-multimodal-instruct 有 56 亿个参数,是一个多模态变压器模型。该模型以预训练的 Phi-4-Mini-Instruct 作为骨干语言模型,并配备了先进的视觉和语音编码器及适配器。 |
输入 | 文本、图像和音频。最适合使用聊天格式的提示。 |
上下文长度 | 128K 令牌 |
GPU | 512 个 A100 - 80G |
训练时间 | 28 天 |
训练数据 | 5 万亿个文本令牌、230 万小时的语音数据和 1.1 万亿个图像 - 文本令牌 |
输出 | 对输入生成的文本响应 |
训练日期 | 2024 年 12 月至 2025 年 1 月 |
状态 | 这是一个基于离线数据集训练的静态模型,公开可用数据的截止日期为 2024 年 6 月。 |
支持语言 | 文本:阿拉伯语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、德语、希伯来语、匈牙利语、意大利语、日语、韩语、挪威语、波兰语、葡萄牙语、俄语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语;视觉:英语;音频:英语、中文、德语、法语、意大利语、日语、西班牙语、葡萄牙语 |
发布日期 | 2025 年 2 月 |
训练数据集
Phi-4-multimodal-instruct 的训练数据包括多种来源,总计 5 万亿个文本令牌,包括:
- 经过质量过滤的公开可用文档、精选的高质量教育数据和代码。
- 为教授数学、编码、常识推理、世界常识(如科学、日常活动、心智理论等)而新创建的合成“教科书式”数据。
- 高质量的人类标注的聊天格式数据。
- 精选的高质量图像 - 文本交错数据。
- 合成和公开可用的图像、多图像和视频数据。
- 带有强/弱转录的匿名内部语音 - 文本对数据。
- 精选的高质量公开可用和匿名内部语音数据,并带有特定任务的监督。
- 精选的合成语音数据。
- 合成的视觉 - 语音数据。
重点关注可能提高模型推理能力的数据质量,并对公开可用文档进行过滤,以包含首选的知识水平。例如,英超联赛某一天的比赛结果可能是大型基础模型的良好训练数据,但为了给模型的小尺寸留出更多推理能力,这些信息被从 Phi-4-multimodal-instruct 中移除。数据收集过程涉及从公开可用文档中获取信息,重点是过滤掉不良文档和图像。为保护隐私,对图像和文本数据源进行过滤,以从训练数据中移除或清理潜在的个人数据。去污过程包括对数据集进行归一化和分词,然后在目标数据集和基准数据集之间生成并比较 n-gram。匹配 n-gram 超过阈值的样本被标记为受污染并从数据集中移除。生成详细的污染报告,总结匹配文本、匹配比例和过滤结果,以便进一步分析。
软件
硬件
默认情况下,Phi-4-multimodal-instruct 模型使用闪存注意力,需要特定类型的 GPU 硬件才能运行。已在以下 GPU 类型上进行测试:
- NVIDIA A100
- NVIDIA A6000
- NVIDIA H100
如果要在 NVIDIA V100 或更早一代的 GPU 上运行模型,调用 AutoModelForCausalLM.from_pretrained() 时应使用 _attn_implementation="eager"。
🔧 技术细节
模型架构
Phi-4-multimodal-instruct 是一个多模态变压器模型,以预训练的 Phi-4-Mini-Instruct 作为骨干语言模型,并配备了先进的视觉和语音编码器及适配器。
训练技术
采用了监督微调(SFT)、直接偏好优化(DPO)和基于人类反馈的强化学习(RLHF)等技术,以提高模型的指令遵循能力和安全性。
数据处理
对训练数据进行了严格的质量过滤和处理,包括去除不良文档和图像、保护隐私、去污等操作。
基准测试
使用多种基准测试评估模型性能,包括视觉、语音和安全等方面的基准。在视觉任务中,与多个模型在多种零样本基准上进行比较;在语音任务中,评估了自动语音识别、翻译、问答等能力。
安全评估
采用多种评估技术,包括红队测试、对抗性对话模拟和多语言安全评估基准数据集,评估模型在多种语言和风险类别下产生不良输出的倾向。还对视觉和音频安全进行了评估。
📄 许可证
该模型根据 MIT 许可证 授权。
附录 A:基准测试方法
点击查看详细说明
我们在此简要介绍一下方法 - 特别是我们如何考虑优化提示。在理想情况下,我们不会更改基准测试中的任何提示,以确保在比较不同模型时始终进行公平比较。实际上,这是我们的默认方法,并且在迄今为止运行的绝大多数模型中都是如此。
然而,也有一些例外情况。在某些情况下,我们发现模型由于未能遵循输出格式而在给定评估中表现不如预期。例如:
- 模型可能无故拒绝回答问题,或者在编码任务中,模型可能在响应前加上 “Sure, I can help with that. …”,这可能会破坏解析器。在这种情况下,我们选择尝试不同的系统消息(例如 “You must always respond to a question” 或 “Get to the point!”)。
- 我们观察到,在某些情况下,少样本实际上会损害模型性能。在这种情况下,我们允许在所有情况下以零样本运行基准测试。
- 我们有工具可以在聊天和完成 API 之间进行转换。在将聊天提示转换为完成提示时,一些模型有不同的关键字,例如 Human 与 User。在这些情况下,我们允许针对模型进行聊天到完成提示的映射。
但是,我们不会:
- 选择不同的少样本示例。在比较不同模型时,少样本始终相同。
- 更改提示格式:例如,如果是 A/B/C/D 多项选择,我们不会将其调整为 1/2/3/4 多项选择。
视觉基准测试设置
基准测试设置的目标是衡量普通用户在使用这些模型进行涉及视觉输入的任务时的性能。为此,我们选择了 9 个流行且公开可用的单帧数据集和 3 个多帧基准测试,涵盖了广泛的具有挑战性的主题和任务(例如数学、OCR 任务、图表理解等),以及一组高质量的模型。 我们的基准测试设置使用零样本提示,并且每个模型的提示内容相同。我们仅对提示内容进行格式化,以满足模型的提示 API。这确保了我们的评估在测试的模型集上是公平的。许多基准测试要求模型从提供的选项列表中选择响应。因此,我们在提示结尾添加了一个指令,引导所有模型选择他们认为正确答案对应的选项字母。 在视觉输入方面,我们使用基准测试中的原始数据集图像。对于需要这种格式的模型(例如 GPTV、Claude Sonnet 3.5、Gemini 1.5 Pro/Flash),我们使用 JPEG 编码将这些图像转换为 base - 64。对于其他模型(例如 Llava Interleave、InternVL2 4B 和 8B),我们使用它们的 Huggingface 接口并传入 PIL 图像或本地存储的 JPEG 图像。我们没有对图像进行任何缩放或预处理。 最后,我们使用相同的代码提取答案并对每个考虑的模型进行评估。这确保了我们在评估答案质量时是公平的。
语音基准测试设置
此基准测试设置的目标是评估普通用户在语音和音频理解任务中使用模型的性能。为实现这一目标,我们选择了几个最先进的开源和闭源模型,并在各种公开和内部基准测试中进行了评估。这些基准测试涵盖了多样化且具有挑战性的主题,包括自动语音识别(ASR)、自动语音翻译(AST)、语音查询问答(SQQA)、音频理解(AU)和语音总结。 结果来自对相同测试数据的评估,没有进行进一步的澄清。所有结果都是在推理过程中不进行采样的情况下获得的。为了进行准确比较,我们在不同任务中对模型使用了一致的提示,除了某些模型 API(例如 GPT - 4o)可能会拒绝响应某些任务的特定提示。 最后,我们使用统一的代码提取答案并对所有考虑的模型进行评估。这种方法通过评估它们的响应质量确保了公平性。
基准测试数据集
该模型在广泛的公开和内部基准测试中进行了评估,以了解其在多个任务和条件下的能力。虽然大多数评估使用英语,但也纳入了多语言基准测试以涵盖特定语言的性能。具体来说:
- 视觉:
- 流行聚合基准:
- MMMU 和 MMMU - Pro:大学水平学科知识和刻意推理的大规模多学科任务。
- MMBench:评估感知和推理能力的大规模基准。
- 视觉推理:
- ScienceQA:科学领域的多模态视觉问答。
- MathVista:视觉数学推理。
- InterGPS:视觉 2D 几何推理。
- 图表推理:
- ChartQA:图表的视觉和逻辑推理。
- AI2D:图表理解。
- 文档智能:
- TextVQA:阅读和推理图像中的文本以回答相关问题。
- InfoVQA:阅读和推理高分辨率信息图图像,具有任意纵横比。
- DocVQA:阅读和推理包含密集文本和手写文本的文档图像。
- OCRBench:测试各种文本相关图像的 OCR 和问答能力。
- 视觉语音多模态理解:
- s_AI2D:以语音作为问题格式的图表理解。
- s_ChartQA:以语音作为问题格式的图表视觉和逻辑推理。
- s_InfoVQA:以语音作为问题格式的高分辨率信息图图像阅读和推理。
- s_DocVQA:以语音作为问题格式的包含密集文本和手写文本的文档图像阅读和推理。
- RAI 和安全基准:
- VLGuardExt:VLGuard 是一个用于模型安全的视觉 - 语言指令遵循公共数据集,用于解决欺骗、歧视、隐私和危险行为(建议、性、暴力、政治)等安全问题。扩展到了一些内部类别,如儿童安全和选举关键信息。
- RTVLM:用于对视觉 - 语言模型进行红队测试的公共基准,涉及模型真实性、隐私、安全和公平性。
- GPTV - RAI:Azure AI 发布的内部基准,用于衡量有害性(例如性、暴力、仇恨和自我伤害)、隐私、越狱、错误信息。
- 流行聚合基准:
- 语音:
- CommonVoice v15 是 Mozilla 开发的开源多语言语音数据集。它包含 133 种语言的超过 33,000 小时的语音数据,由全球志愿者贡献和验证。评估在八种支持的语言中进行。
- Hugging Face 上的 OpenASR 排行榜旨在对英语 ASR 模型的鲁棒性进行基准测试和评估。排行榜中的数据集涵盖了各种语音领域,包括朗读语音、对话、会议等。
- CoVoST2 是一个从 Mozilla 的 Common Voice 项目派生的多语言语音到文本翻译数据集。它是可用于语音翻译的最大开源数据集之一,支持 X 到英语(X→En)和英语到 X(En→X)的翻译任务。在测试集上评估了支持语言的翻译方向。
- FLEURS 是一个多语言语音数据集,旨在评估语音识别和语音到文本翻译模型在多种语言中的性能。在八种支持的语言中评估了语音识别和翻译任务的测试集。
- MT Bench(多轮基准)专门用于评估 AI 模型在多轮问答(QA)场景中的对话和指令遵循能力。为支持语音问题,文本被合成为语音。
- MMMLU(多语言大规模多任务语言理解)是一个广泛的基准,旨在评估 AI 模型在广泛主题中的常识和推理能力。为支持语音问题,文本被合成为语音。在八种支持的语言中对该测试集评估了模型。
- AIR - Bench Chat(音频指令和响应基准)是一个全面的评估框架,旨在测试大型音频语言模型(LALMs)的能力。它包括基础和聊天基准。选择聊天基准是因为其用于音频能力的开放式问答。
- MMAU(大规模多任务音频理解)是一个全面的数据集,旨在评估多模态模型在基于音频的理解和推理任务中的能力。测试集采用多项选择问答形式,涵盖音乐、声音和语音类别。
- Golden3 是一个真实世界的会议数据集,包含 108 个会议记录及相应的转录,平均每个记录 6 分钟。它在 30 个会议室录制,有 4 - 8 名与会者。数据集主要为英语,涵盖广泛的主题。使用 GPT4 生成总结指令,要求总结部分或整个对话,或控制输出风格/长度/结构。
- AMI(增强多方交互)是一个全面的会议记录集合,包含约 100 小时的数据。测试分割包含 20 个会议记录,平均时长 32 分钟。在近讲版本的音频上测试了模型。使用 GPT4 生成总结指令,要求总结部分或整个对话,或控制输出风格/长度/结构。
- 安全和 RAI:
- 单轮可信度评估:
- DecodingTrust:DecodingTrust 是从八个不同角度收集的可信度基准。
- XSTest:XSTest 是一种夸张的安全评估。
- Toxigen:Toxigen 是对抗性和仇恨言论检测。
- 红队测试:
- 对微软 AI 红队提供的提示的响应。
- 单轮可信度评估:
附录 B:微调韩语语音
点击查看详细说明
概述和数据集
Phi-4-multimodal 最初并非为韩语语音到文本任务设计,但可以使用自己的数据或公开的韩语语音数据集对其进行微调。
我们使用以下数据集对 Phi-4-multimodal 模型进行了韩语语音到文本任务的微调:
- kresnik/zeroth_korean
- mozilla-foundation/common_voice_17_0(仅使用韩语语音)
- PolyAI/minds14(仅使用韩语语音)
- 自定义数据集。语音是快速和慢速语音的混合(作者发布的技术博客内容和演示文稿),使用 audiomentations 和 此脚本 进行了一些调制。
总共 35K 个样本。每个样本是韩语语音及其转录的一对。数据集采样率为 16kHz。
您可以从 此处 下载微调后的模型。请参考 演示文件夹 中的 Jupyter 笔记本和视频剪辑。它们并非生产质量,因为只是为了概念验证目的进行了微调,但您可以看到,即使母语者说得相当快,它们也能以高精度进行转录和翻译。
要求
基于 Python 3.10,需要以下包,建议使用 A100/H100 GPU:
torch==2.6.0
transformers==4.48.2
accelerate==1.4.0
soundfile==0.13.1
pillow==11.1.0
scipy==1.15.2
torchvision==0.21.0
backoff==2.2.1
peft==0.14.0
datasets==3.3.2
pandas==2.2.3
flash_attn==2.7.4.post1
evaluate==0.4.3
sacrebleu==2.5.1
训练
使用 microsoft/Phi-4-multimodal-instruct 中的 sample_finetune_speech.py
脚本,在单个 A100 80GB GPU 上以 16 的批量大小训练了 4 个 epoch。
微调脚本和命令行基本与 此处 相同,但您需要准备自己的数据集。此外,要进行音频编码器解冻,请参考以下代码片段。该代码片段取自 微调 Colab 笔记本。
with accelerator.local_main_process_first():
processor = AutoProcessor.from_pretrained(
"microsoft/Phi-4-multimodal-instruct",
trust_remote_code=True,
)
model = create_model(
args.model_name_or_path,
use_flash_attention=args.use_flash_attention,
)
def unfreeze_speech_components(model):
"""Directly target verified components from your debug logs"""
# 1. Audio Embed Module (confirmed exists)
audio_embed = model.model.embed_tokens_extend.audio_embed
# 2. Entire Audio Encoder (simplified)
audio_encoder = audio_embed.encoder # Direct access
# 3. Audio Projection (from debug logs)
audio_projection = audio_embed.audio_projection
# Unfreeze ONLY these 3 components
for component in [audio_embed, audio_encoder, audio_projection]:
for param in component.parameters():
param.requires_grad = True
return model
model = unfreeze_speech_components(model)
# Verify unfrozen parameters
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"Trainable parameters: {trainable_params:,}")
# After unfreezing
encoder_params = list(model.model.embed_tokens_extend.audio_embed.encoder.parameters())
proj_params = list(model.model.embed_tokens_extend.audio_embed.audio_projection.parameters())
assert any(p.requires_grad for p in encoder_params), "Encoder params frozen!"
assert any(p.requires_grad for p in proj_params), "Projection params frozen!"
print("Components properly unfrozen ✅")
运行微调脚本的示例命令如下:
python main.py
当前上传的最新版本模型通过 解冻音频编码器 进行了微调,与基于基线 LoRA 适配器的微调相比,ASR 性能显著提高。比较全量微调和 LoRA 微调,在 zeroth - test 集上的字符错误率(CER)分别为 1.61% 和 2.72%,词错误率(WER)分别为 3.54% 和 7.19%。更多详细信息请参考 实验设置和结果。
实验设置和结果
此基准测试设置的目的是评估韩语音频在语音和音频理解任务中的基本性能。我们对自动语音识别和自动语音翻译进行了评估,测试数据使用了以下数据集和样本:
在以下数据集上进行了评估:
- ASR(自动语音识别):在 zeroth - test 集(457 个样本) 上使用字符错误率(CER)和词错误率(WER)进行评估。
- AST(自动语音翻译):在 fleurs ko <-> en 语音翻译测试集(270 个样本) 上使用 BLEU 分数进行评估。
评估脚本取自 此处。
我们使用 Phi-4-mm-inst-zeroth-kor 作为基线来提高性能,因为它在 1 个 epoch 时显示出显著的性能提升。请注意,基线使用 22K Zeroth Korean 韩语语音数据 训练了 1 个 epoch。基于这个有 35K 训练样本的基线,我们进行了以下场景的额外实验:
- [案例 1] LoRA 微调(1 个 epoch):基于 LoRA 适配器的微调,训练 1 个 epoch。
- [案例 2] LoRA 微调(4 个 epoch):基于 LoRA 适配器的微调,训练 4 个 epoch。
- [案例 3] 解冻音频编码器微调(4 个 epoch):全量微调,训练 4 个 epoch。
实验结果如下:
- zeroth - test 集的 CER 和 WER(越低越好):
- 案例 1 的 CER 和 WER 分别为 3.80% 和 11.52%,优于基线(7.02% 和 17.31%)。
- 案例 2 的 CER 和 WER 分别为 2.72% 和 7.19%,优于案例 1。
- 案例 3 的 CER 和 WER 分别为 1.61% 和 3.54%,在所有案例中表现最佳。
- fleurs ko <-> en 语音翻译测试集的 BLEU 分数(越高越好):
- 案例 1 的结果与基线相比没有改善。特别是,fleurs - ko2en - cot 的 BLEU 分数比基线有所下降。
- 案例 2 的结果比案例 1 略有改善,在所有案例中表现最佳。
- 案例 3 的结果与基线和案例 2 相比没有改善。
模型 | zeroth (CER) | zeroth (WER) | fleurs - ko2en | fleurs - ko2en - cot | fleurs - en2ko | fleurs - en2ko - cot |
---|---|---|---|---|---|---|
original | 99.16 | 99.63 | 5.63 | 2.42 | 6.86 | 4.17 |
Ours - speech full finetune (4 epochs) | 1.61 | 3.54 | 7.67 | 8.38 | 12.31 | 9.69 |
LoRA finetune (4 epochs) | 2.72 | 7.19 | 7.11 | 9.95 | 13.22 | 10.45 |
LoRA finetune (1 epoch) | 3.80 | 11.52 | 7.03 | 7.04 | 12.50 | 9.54 |
Phi - 4 - mm - inst - zeroth - kor | 7.02 | 17.31 | 7.07 | 9.19 | 13.08 | 9.35 |
注意事项
请注意,此模型仅用于概念验证/实验目的,不打算用于生产环境。需要更多高质量的数据、调优、消融研究和实验。
Phi-4-multimodal 模型在多模态任务中表现出色,特别是在语音到文本方面,在韩语任务中具有很高的潜力。因此,如果您对韩语语音到文本任务感兴趣,这个模型可以是一个很好的起点。
参考资料
- https://huggingface.co/microsoft/Phi-4-multimodal-instruct
- https://huggingface.co/seastar105/Phi-4-mm-inst-zeroth-kor
商标
本项目可能包含项目、产品或服务的商标或标志。对 Microsoft 商标或标志的授权使用需遵循并必须遵守 Microsoft 的商标和品牌指南。在本项目的修改版本中使用 Microsoft 商标或标志不得造成混淆或暗示 Microsoft 的赞助。任何第三方商标或标志的使用需遵循这些第三方的政策。











