许可证: MIT
流水线标签: 文本生成
标签: [ONNX, DML, ONNXRuntime, phi3, 自然语言处理, 对话式, 自定义代码]
推理: 否
Phi-3 Mini-4K-Instruct ONNX 模型
本仓库托管了 Phi-3-mini-4k-instruct 的优化版本,以加速 ONNX Runtime 的推理性能。
Phi-3 Mini 是一款轻量级、前沿的开源模型,基于 Phi-2 使用的数据集构建(包括合成数据和筛选后的网站数据),并专注于高质量、高推理密度的数据。该模型属于 Phi-3 模型家族,迷你版本提供两种变体:4K 和 128K,分别表示其支持的上下文长度(以 token 计)。模型经过严格的增强流程,结合了监督微调和直接偏好优化,以确保精确的指令遵循和强大的安全措施。
优化后的 Phi-3 Mini 模型以 ONNX 格式发布,可通过 ONNX Runtime 在各类设备的 CPU 和 GPU 上运行,包括服务器平台、Windows、Linux 和 Mac 桌面设备,以及移动端 CPU,并为每个目标设备提供最适合的精度。
DirectML 支持让开发者能够为 Windows 设备带来跨 AMD、Intel 和 NVIDIA GPU 的硬件加速。结合 DirectML,ONNX Runtime 为 Phi-3 Mini 提供了跨平台的 CPU、GPU 和移动端支持。
要快速上手 Phi-3,您可以使用我们新推出的 ONNX Runtime Generate() API。具体操作指南请参见此处。
ONNX 模型
以下是已添加的部分优化配置:
- int4 DML 的 ONNX 模型:适用于 Windows 上 AMD、Intel 和 NVIDIA GPU 的 ONNX 模型,使用 AWQ 量化为 int4。
- fp16 CUDA 的 ONNX 模型:适用于 NVIDIA GPU 的 ONNX 模型。
- int4 CUDA 的 ONNX 模型:适用于 NVIDIA GPU 的 ONNX 模型,通过 RTN 实现 int4 量化。
- int4 CPU 和移动端的 ONNX 模型:适用于 CPU 和移动端的 ONNX 模型,通过 RTN 实现 int4 量化。上传了两个版本以平衡延迟与精度:
- Acc=1 针对更高的精度优化,而 Acc=4 针对更高的性能优化。对于移动设备,推荐使用 acc-level-4 的模型。
更多关于 AMD 的更新以及 CPU 和移动端的额外优化将在 5 月初的官方 ORT 1.18 版本中发布。敬请期待!
支持的硬件
模型已在以下硬件上测试:
- GPU 型号: RTX 4090 (DirectML)
- GPU 型号: 1 块 A100 80GB GPU,型号: Standard_ND96amsr_A100_v4 (CUDA)
- CPU 型号: Standard F64s v2 (64 个虚拟 CPU,128 GiB 内存)
- 移动端型号: 三星 Galaxy S21
最低配置要求:
- Windows: 支持 DirectX 12 的 GPU 和至少 4GB 的共享内存
- CUDA: NVIDIA GPU,计算能力 ≥ 7.0
模型描述
- 开发者: Microsoft
- 模型类型: ONNX
- 支持的自然语言: Python、C、C++
- 许可证: MIT
- 模型说明: 这是为 ONNX Runtime 推理转换的 Phi-3 Mini-4K-Instruct 模型。
更多详情
如何开始使用模型
为了让 Phi-3 模型能够在多种设备和平台上运行,并支持不同的执行后端,我们引入了一个新的 API 来封装生成式 AI 推理的多个方面。该 API 让您能够轻松将 LLM 直接集成到应用中。要使用 ONNX Runtime 运行这些模型的早期版本,请按照此处的步骤操作。
例如:
python model-qa.py -m /*{您的模型路径}*/onnx/cpu_and_mobile/phi-3-mini-4k-instruct-int4-cpu -k 40 -p 0.95 -t 0.8 -r 1.0
*输入:* <|user|>讲个笑话<|end|><|assistant|>
*输出:* 为什么科学家不相信原子?
因为它们构成了一切!
这个笑话利用了“构成”的双关含义。在科学中,原子是物质的基本构成单位,字面上“构成”了一切。但在口语中,“构成”也可以指编造或撒谎,因此产生了幽默效果。
性能指标
Windows 上的 DirectML
我们测量了 DirectML 和 ONNX Runtime 新 Generate() API 的性能,测试使用了通过激活感知量化([AWQ](https://arxiv.org/abs/2306.00978)量化的 Phi-3 Mini,块大小为 128,运行于 Windows。测试机器配备了 NVIDIA GeForce RTX 4090 GPU 和 Intel Core i9-13900K CPU。DirectML 不仅让开发者能够实现高性能,还能通过支持 AMD、Intel 和 NVIDIA GPU 在整个 Windows 生态系统中部署模型。最重要的是,AWQ 意味着开发者在实现规模化的同时还能保持高模型精度。
敬请期待未来几周内硬件合作伙伴优化的驱动程序以及 ONNX Runtime Generate() API 的额外更新带来的性能提升。
批次大小, 提示长度 |
生成长度 |
实际吞吐量 (tps) |
1, 16 |
256 |
266.65 |
1, 16 |
512 |
251.63 |
1, 16 |
1024 |
238.87 |
1, 16 |
2048 |
217.5 |
1, 32 |
256 |
278.53 |
1, 32 |
512 |
259.73 |
1, 32 |
1024 |
241.72 |
1, 32 |
2048 |
219.3 |
1, 64 |
256 |
308.26 |
1, 64 |
512 |
272.47 |
1, 64 |
1024 |
245.67 |
CUDA
在所有批次大小和提示长度组合中,Phi-3 Mini-4K-Instruct 在 ONNX Runtime 中的表现均优于 PyTorch。对于 FP16 CUDA,ORT 比 PyTorch 快达 5 倍,而对于 INT4 CUDA,ORT 比 PyTorch 快达 10 倍。在大批次量下,ORT 也比 Llama.cpp 快达 3 倍。
下表展示了在 1 块 A100 80GB GPU,型号: Standard_ND96amsr_A100_v4 上测量的 FP16 和 INT4 精度下前 256 个生成 token 的平均吞吐量 (tps)。
批次大小, 提示长度 |
ORT FP16 CUDA |
PyTorch Compile FP16 CUDA |
Llama.cpp |
ORT/PyTorch 加速比 |
ORT/Llama.cpp 加速比 |
1, 16 |
124.74 |
23.95 |
109.47 |
5.21 |
1.14 |
1, 64 |
123.38 |
26.66 |
110.26 |
4.63 |
1.12 |
1, 256 |
116.17 |
29.66 |
109.42 |
3.92 |
1.06 |
1, 1024 |
103.27 |
29.67 |
105.60 |
3.48 |
0.98 |
1, 2048 |
92.11 |
27.74 |
102.00 |
3.32 |
0.90 |
1, 4096 |
83.24 |
27.71 |
95.17 |
3.00 |
0.87 |
4, 16 |
507.16 |
113.82 |
349.56 |
4.46 |
1.45 |
4, 64 |
492.15 |
111.63 |
342.45 |
4.41 |
1.44 |
4, 256 |
446.25 |
112.85 |
317.02 |
3.95 |
1.41 |
4, 1024 |
338.82 |
114.57 |
246.32 |
2.96 |
1.38 |
4, 2048 |
262.85 |
105.71 |
189.34 |
2.49 |
1.39 |
4, 4096 |
200.46 |
81.36 |
131.16 |
2.46 |
1.53 |
16, 16 |
1648.33 |
481.10 |
893.34 |
3.43 |
1.85 |
16, 64 |
1533.04 |
470.57 |
802.73 |
3.26 |
1.91 |
16, 256 |
1206.64 |
482.87 |
575.24 |
2.50 |
2.10 |
16, 1024 |
672.45 |
342.86 |
262.41 |
1.96 |
2.56 |
16, 2048 |
437.28 |
156.48 |
148.79 |
2.79 |
2.94 |
16, 4096 |
291.14 |
OOM |
79.72 |
|
3.65 |
批次大小, 提示长度 |
ORT INT4 CUDA |
PyTorch Eager INT4 CUDA |
Llama.cpp INT4 CUDA |
ORT/PyTorch 加速比 |
ORT/Llama.cpp 加速比 |
1, 16 |
218.43 |
20.85 |
146.84 |
10.48 |
1.49 |
1, 64 |
213.41 |
20.86 |
149.35 |
10.23 |
1.43 |
1, 256 |
192.29 |
20.90 |
147.82 |
9.20 |
1.30 |
1, 1024 |
158.60 |
20.86 |
141.03 |
7.60 |
1.12 |
1, 2048 |
132.74 |
19.99 |
135.32 |
6.64 |
0.98 |
1, 4096 |
115.44 |
18.34 |
123.29 |
6.30 |
0.94 |
4, 16 |
291.75 |
68.45 |
378.89 |
4.26 |
0.77 |
4, 64 |
286.83 |
68.63 |
370.86 |
4.18 |
0.77 |
4, 256 |
269.77 |
68.27 |
341.23 |
3.95 |
0.79 |
4, 1024 |
224.34 |
68.47 |
260.11 |
3.28 |
0.86 |
4, 2048 |
187.09 |
65.53 |
196.91 |
2.86 |
0.95 |
4, 4096 |
153.44 |
54.88 |
134.73 |
2.80 |
1.14 |
16, 16 |
1030.87 |
272.84 |
648.29 |
3.78 |
1.59 |
16, 64 |
982.78 |
272.66 |
598.96 |
3.60 |
1.64 |
16, 256 |
835.82 |
273.95 |
461.85 |
3.05 |
1.81 |
16, 1024 |
540.11 |
226.96 |
235.99 |
2.38 |
2.29 |
16, 2048 |
377.84 |
127.05 |
139.97 |
2.97 |
2.70 |
16, 4096 |
263.52 |
OOM |
77.11 |
|
3.42 |
CPU
下表展示了在 Standard F64s v2 (64 个虚拟 CPU,128 GiB 内存) 上测量的 INT4 精度下前 256 个生成 token 的平均吞吐量 (tps)。
批次大小, 提示长度 |
ORT INT4 CPU |
Llama.cpp |
ORT/Llama.cpp 加速比 |
1, 16 |
14.97 |
13.57 |
1.10 |
1, 64 |
14.47 |
10.39 |
1.39 |
1, 256 |
13.32 |
10.31 |
1.29 |
1, 1024 |
10.14 |
9.83 |
1.03 |
1, 2048 |
7.58 |
9.11 |
0.83 |
软件包版本
Pip 包名 |
版本 |
torch |
2.2.0 |
triton |
2.2.0 |
onnxruntime-gpu |
1.18.0 |
onnxruntime-genai |
0.2.0 |
onnxruntime-genai-cuda |
0.2.0 |
onnxruntime-genai-directml |
0.2.0 |
transformers |
4.39.0 |
bitsandbytes |
0.42.0 |
附录
激活感知量化
AWQ 通过识别对保持精度最重要的前 1% 显著权重,并对剩余的 99% 权重进行量化。与其他量化技术相比,这种方法减少了量化带来的精度损失。更多关于 AWQ 的信息,请参见此处。
模型卡片联系人
parinitarahi, kvaishnavi, natke
贡献者
Kunal Vaishnavi, Sunghoon Choi, Yufeng Li, Akshay Sonawane, Sheetal Arun Kadam, Rui Ren, Edward Chen, Scott McKay, Ryan Hill, Emma Ning, Natalie Kershaw, Parinita Rahi, Patrice Vignola, Chai Chaoweeraprasit, Logan Iyer, Vicente Rivera, Jacques Van Rhyn