|
| 1 | +# 语音理解模型EAGLE3 |
| 2 | + |
| 3 | +[Eagle3](https://arxiv.org/pdf/2503.01840)是目前最常用、加速效果最好的投机采样算法。 |
| 4 | +本项目包括Eagle3的训练以及benchmark测试,并开源了Qwen2Audio的[Eagle3权重](https://huggingface.co/collections/AngelSlim/eagle3)。 |
| 5 | + |
| 6 | +我们训练的Qwen2Audio Eagle3模型的表现可以参见基准测试[benchmarks](../../performance/speculative_decoding/benchmarks.md), |
| 7 | +其中全部数据都是在单张H20上使用vLLM推理获得。 |
| 8 | + |
| 9 | +## 1. 支持模型列表 |
| 10 | +- `Qwen2Audio` |
| 11 | + |
| 12 | +## 2. 准备数据 |
| 13 | + |
| 14 | +### 2.1 数据组织形式 |
| 15 | + |
| 16 | +所有数据需保存在jsonl文件中,训练数据格式可参考: |
| 17 | + |
| 18 | +- 数据示例: AngelSlim/dataset/librispeech_test/librispeech_eval_10_test.jsonl |
| 19 | + |
| 20 | + ```shell |
| 21 | + {"id": 5910, "conversations": [{"role": "user", "content": [{"type": "audio", "audio": "./audios/1580-141083-0008.flac"}, {"type": "text", "text": "Detect the language and recognize the speech: <|en|>"}]}, {"role": "assistant", "content": [{"type": "text", "text": "THE PROOF WAS IN THREE LONG SLIPS I HAD LEFT THEM ALL TOGETHER"}]}]} |
| 22 | + ``` |
| 23 | + |
| 24 | +- 典型字段意义如下: |
| 25 | + - id: 对话唯一标识 |
| 26 | + - conversations: OpenAI 对话格式 |
| 27 | + - audio: 对应音频文件路径 |
| 28 | + |
| 29 | +### 2.2 重采样训练数据(推荐) |
| 30 | + |
| 31 | +为得到高质量的目标模型SFT数据,建议使用目标模型重新采样训练数据,将LLM生成的结果保存在jsonl文件中,对应的Audio文件存储在同一目录下,组织形式同上。 |
| 32 | + |
| 33 | +可基于实际应用场景自行生成训练数据,下面提供vLLM生成数据流程参考: |
| 34 | + |
| 35 | +**步骤1:启动vLLM server** |
| 36 | + |
| 37 | +首先需要启动vLLM server来提供模型推理服务: |
| 38 | + |
| 39 | +```shell |
| 40 | +bash scripts/speculative/run_vllm_server.sh |
| 41 | +``` |
| 42 | + |
| 43 | +**server配置说明:** |
| 44 | +- 该脚本会启动目标基础模型的vLLM推理服务 |
| 45 | +- 确保服务器成功启动后再进行下一步数据生成 |
| 46 | +- 可以通过修改脚本中的参数来调整vLLM server配置(如vLLM启动参数、GPU数量等),来适应不同的目标模型 |
| 47 | + |
| 48 | +**步骤2:生成采样数据** |
| 49 | + |
| 50 | +vLLM server启动后,使用 `scripts/speculative/generate_data_for_target_model.sh` 脚本生成训练数据: |
| 51 | + |
| 52 | +```shell |
| 53 | +bash scripts/speculative/generate_data_for_target_model.sh |
| 54 | +``` |
| 55 | + |
| 56 | +**脚本功能说明:** |
| 57 | +- 通过vLLM server调用目标基础模型对输入数据进行采样 |
| 58 | +- 生成 `.jsonl` 格式的训练数据集 |
| 59 | +- 数据将用于后续Eagle模型的在线训练 |
| 60 | + |
| 61 | +**脚本参数说明:** |
| 62 | + |
| 63 | +在使用前,需要在脚本中配置以下参数: |
| 64 | + |
| 65 | +- `DATA_NAME_OR_PATH`: 输入数据集的HF名称或本地路径 |
| 66 | +- `OUTPUT_DIR`: 生成的数据集输出路径 |
| 67 | +- `DATA_FORMAT`: 输入数据集的格式(sharegpt|ultrachat) |
| 68 | +- `DATA_SHARD_SIZE`: 生成数据集的切分子集大小 |
| 69 | +- `BASE_PORT`: vLLM server的端口号 |
| 70 | + |
| 71 | +**注意事项:** |
| 72 | +- 确保vLLM服务器已成功启动并正常运行 |
| 73 | +- 数据生成过程可能需要较长时间,取决于样本数量和模型规模 |
| 74 | + |
| 75 | + |
| 76 | +## 3. 训练Eagle3模型 |
| 77 | + |
| 78 | +目前支持Qwen2Audio在线训练模式:在线训练适合显存足够、目标模型不大、训练上下文长度不要求极长的场景。 |
| 79 | + |
| 80 | +### 3.1 在线训练 |
| 81 | + |
| 82 | +使用下面的脚本进行Eagle3模型的在线训练: |
| 83 | + |
| 84 | +```shell |
| 85 | +bash scripts/speculative/qwen2_audio/train_eagle3_audio_online.sh |
| 86 | +``` |
| 87 | + |
| 88 | +**脚本参数说明:** |
| 89 | + |
| 90 | +在使用前,需要在脚本中配置以下参数: |
| 91 | + |
| 92 | +- `TARGET_MODEL_NAME_OR_PATH`: 目标模型的HF名称或本地名称 |
| 93 | +- `DRAFT_MODEL_CONFIG_PATH`: 草稿模型的config路径 |
| 94 | +- `TRAIN_DATA_PATH`: 训练数据路径 |
| 95 | +- `EVAL_DATA_PATH`: 验证数据路径 |
| 96 | +- `OUTPUT_DIR`: Eagle3模型输出路径 |
| 97 | +- `MODEL_MAX_LENGTH`: 训练数据的最大长度 |
| 98 | +- `CHAT_TEMPLATE_TYPE`: 目标模型的数据模板类型 |
| 99 | + |
| 100 | +## 4. 基准测试 |
| 101 | + |
| 102 | +AngelSlim提供了Qwen2Audio模型vLLM backend的Eagle3基准测试脚本,用于评估投机采样的性能提升。 |
| 103 | + |
| 104 | +### 4.1 vLLM基准测试 |
| 105 | + |
| 106 | +> vLLM 适配参考: [Support Eagle3 for Qwen2Audio](https://github.com/vllm-project/vllm/pull/32230) |
| 107 | + |
| 108 | +#### 4.1.1 基本用法 |
| 109 | + |
| 110 | +使用 `tools/vllm_offline_eagle3_qwen2_audio_bench.py` 脚本进行投机采样基准测试: |
| 111 | + |
| 112 | +```shell |
| 113 | +python3 tools/vllm_offline_eagle3_qwen2_audio_bench.py \ |
| 114 | + --target_model ${BASE_MODEL_PATH} \ |
| 115 | + --draft_model ${EAGLE_MODEL_PATH} \ |
| 116 | + --output_file ${OUTPUT_FILE} \ |
| 117 | + --use_eagle \ |
| 118 | +``` |
| 119 | + |
| 120 | +#### 4.1.2 参数说明 |
| 121 | + |
| 122 | +**模型配置参数:** |
| 123 | +- `--target_model`: 基础模型路径(必需) |
| 124 | +- `--draft_model`: Eagle辅助模型路径(必需) |
| 125 | + |
| 126 | +**基准测试配置:** |
| 127 | +- `--test_data_path`: 测试jsonl文件路径,默认为: "dataset/librispeech_test/librispeech_eval_10_test.jsonl" |
| 128 | +- `--use_eagle`: 运行Eagle3推理,默认为False |
| 129 | +- `--output_file`: 输出结果文件路径 |
| 130 | +- `--num_prompts`: 测试用例数量,默认为100 |
| 131 | + |
| 132 | +**生成参数:** |
| 133 | +- `--temp`: 采样温度,默认为 0 |
| 134 | +- `--max_model_len`: 最大上下文长度,默认为 16384 |
| 135 | +- `--output_len`: 最大生成token数,默认为 1024 |
| 136 | +- `--max_num_seqs`: 每次迭代的最大序列数,默认为 1 |
| 137 | +- `--num_spec_tokens`: draft model投机采样token数量,默认为2 |
| 138 | + |
| 139 | +**硬件配置:** |
| 140 | +- `--tp`: 张量并行大小,默认为1 |
| 141 | + |
| 142 | +**其他设置:** |
| 143 | +- `--seed`: 随机种子 |
| 144 | + |
| 145 | +#### 4.1.3 使用示例 |
| 146 | + |
| 147 | +测试数据组织形式:所有数据需保存在jsonl文件中,对应的Audio文件存储在同一目录下,目录结构可参考: |
| 148 | +``` |
| 149 | +└── librispeech_test |
| 150 | + ├── librispeech_eval_10_test.json |
| 151 | + ├── audios |
| 152 | + │ ├── xxx.flac |
| 153 | + │ ├── xxx.flac |
| 154 | +``` |
| 155 | +
|
| 156 | +**运行投机采样:** |
| 157 | +```shell |
| 158 | +python3 tools/vllm_offline_eagle3_qwen2_audio_bench.py \ |
| 159 | + --target_model Qwen/Qwen2-Audio-7B-Instruct \ |
| 160 | + --draft_model "$EAGLE_DIR" \ |
| 161 | + --use_eagle \ |
| 162 | + --num_spec_tokens 4 \ |
| 163 | + --num_prompts 10 \ |
| 164 | + --temp 0 \ |
| 165 | + --max_num_seqs 1 \ |
| 166 | + --output_len 1024 \ |
| 167 | + --output_file "$OUTPUT_FILE" |
| 168 | +``` |
| 169 | + |
| 170 | +**Baseline基准测试:** |
| 171 | +```shell |
| 172 | +python3 tools/vllm_offline_eagle3_qwen2_audio_bench.py \ |
| 173 | + --target_model Qwen/Qwen2-Audio-7B-Instruct \ |
| 174 | + --num_prompts 10 \ |
| 175 | + --temp 0 \ |
| 176 | + --max_num_seqs 1 \ |
| 177 | + --output_len 1024 \ |
| 178 | + --output_file "$OUTPUT_FILE" |
| 179 | +``` |
| 180 | + |
| 181 | +#### 4.1.4 性能报告 |
| 182 | + |
| 183 | +运行完成后,工具会自动生成性能报告,包括: |
| 184 | +- 投机采样与基线模型的性能对比 |
| 185 | +- 加速比统计 |
| 186 | +- 生成质量指标(如果启用) |
| 187 | + |
| 188 | +结果将保存在指定的输出目录中,便于后续分析和比较。 |
| 189 | + |
| 190 | +完整的vLLM benchmark结果可见[Benchmark](../../../performance/speculative_decoding/benchmarks.md)。 |
0 commit comments