尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CosyVoice2 LLM GRPO 强化学习微调实战:基于 veRL 的中文 TTS 全流程训练指南

CosyVoice2 LLM GRPO 强化学习微调实战:基于 veRL 的中文 TTS 全流程训练指南 语音音频人工智能大模型微调预训练模型推理服务【免费下载链接】CosyVoiceMulti-lingual large voice generation model, providing inference, training and deployment full-stack ability.项目地址https://gitcode.com/gh_mirrors/cos/CosyVoice点击查看免费下载导读本文基于 examples/grpo/cosyvoice2/README.md 展开完整讲解如何在 CosyVoice2 开源仓库中借助 veRL 框架对CosyVoice2-0.5B 语音大语言模型LLM进行GRPOGroup Relative Policy Optimization强化学习微调以降低合成语音的字错误率CER。读者将掌握从环境搭建、数据预处理、基于 ASR 的奖励函数设计、分布式训练、分布式推理评估到模型格式回导的端到端实操能力并理解每个阶段对应的源码实现细节。一、背景为什么要用强化学习微调 TTS LLMCosyVoice2 采用 LLM 编解码器 的架构LLM 负责将文本转换为离散语音 token形如|s_12345|再由预训练 U-Net 声码器token2wav还原为 16 kHz 波形。在常规的 SFT监督微调阶段模型学习的是给定文本生成语音 token的下一 token 预测任务而GRPO 强化学习则直接以合成语音与真实文本的匹配程度作为优化目标通过奖励信号引导模型输出更容易被准确识读的语音。仓库中给出的实验证据表明详见本文八、实验结果小节GRPO 微调可将 CosyVoice3zero_shot_zh零样本中文测试集上的 CER 从官方模型的 4.08% 降低到 3.36%。这正是本 recipe 的核心价值用与评估指标ASR 错误率一致的奖励函数直接优化 TTS 合成质量。二、整体工作流六阶段流水线总览整个 recipe 由一个多阶段的 shell 脚本 run.sh 驱动通过bash run.sh start_stage stop_stage控制执行区间阶段作用关键产物stage -2本地安装依赖无 Docker 时verl、pytriton、PytritonSenseVoice 等stage -1下载官方 CosyVoice2-0.5B 并转为 HuggingFace 兼容格式transformers_cosyvoice2_llmstage 0数据准备JSONL → veRL Parquetdata/parquet_aishell3/{train,test}.parquetstage 1启动 token2wav ASR 奖励服务器Triton 服务8000/8001/8002 端口stage 2GRPO 训练FSDP 分片权重checkpoints 目录stage 3合并 FSDP 分片为 HF 格式merged_hf_modelstage 4分布式推理 WER 评估outputs_*目录下的 wav 与识别结果stage 5HF 格式回导为 CosyVoice 仓库格式llm-new.pt从源码结构看run.sh 将训练、评估、导出三个环节组织为一条可重复执行的流水线并对global_step_100/200/300/400/500五个中间检查点逐一执行评估见steps(100 200 300 400 500)便于观察训练过程中的 CER 变化趋势。三、环境搭建官方推荐直接使用预构建的 Docker 镜像该镜像已内置 veRL 0.4、vLLM 0.8.5、Megatron-Core 0.12.2、TensorRT-LLM 2.2 等训练与推理所需组件docker pull soar97/verl:app-verl0.4-vllm0.8.5-mcore0.12.2-te2.2仓库内的 Dockerfile 以此镜像为基础额外安装 requirements.txt 中的依赖conformer、diffusers、modelscope、onnxruntime-gpu、WeTextProcessing、s3tokenizer、tensorrt、sherpa_onnx、jiwer、pypinyin 等并安装两个关键定制包yuekaizhang/verlthread分支GRPO 训练框架本体yuekaizhang/PytritonSenseVoice为 Triton 服务器封装 SenseVoice ASR 模型。如果 Docker 不可用可直接执行bash run.sh -2 -2对应脚本中stage -2它会在 conda 环境中创建cosyvoice2Python 3.10、克隆并安装 verlUSE_MEGATRON0、安装 requirements 与nvidia-pytriton。注意run.sh 开头设置了export PYTHONPATH/workspace/CosyVoice同时sys.path.append(/workspace/CosyVoice/third_party/Matcha-TTS)在多个脚本中出现说明训练/推理代码依赖仓库内的 Matcha-TTS 第三方实现与 CosyVoice2 模块见 third_party/Matcha-TTS请按此约定组织工作目录。四、数据准备JSONL → veRL Parquet4.1 输入数据格式prepare_data.py 期望输入 JSON/JSONL 文件每条样本至少包含如下字段{ text: An example sentence to be synthesized. }README 建议从 SparkAudio/voxbox 数据集的 metadata 目录下载 JSONL 文件如 aishell-3.jsonl。run.sh 的stage 0给出了实际的下载与切分方式wget -O data/aishell-3.jsonl https://huggingface.co/datasets/SparkAudio/voxbox/resolve/main/metadata/aishell-3.jsonl head -n 80000 data/aishell-3.jsonl data/train.jsonl # 总计 88035 条取前 80000 条作训练 tail -n 100 data/aishell-3.jsonl data/test.jsonl # 取最后 100 条作测试4.2 转换为 veRL 格式执行bash run.sh 0 0脚本内部调用prepare_data.py核心逻辑对应 prepare_data.py 中的make_map_fn为每条样本构造一条 CosyVoice2 风格的对话data { data_source: f{args.train_file}_{args.test_file}, prompt: [ {role: user, content: question}, # 待合成的文本 {role: assistant, content: answer}, # 空字符串留给 LLM 生成语音 token ], ability: text-to-speech, reward_model: {style: rule, ground_truth: text}, extra_info: {split: split, index: idx, text: text}, }每个样本被自动包装成 CosyVoice2 风格的 prompt使 LLM 学习输出 CosyVoice2 语音 token。处理完成后生成两个 Parquet 文件data/parquet_tiny/train.parquet data/parquet_tiny/test.parquetrun.sh 实际输出到data/parquet_aishell3/与 README 中示例目录parquet_tiny略有差异以实际脚本为准。若指定--hdfs_dir还会通过 verl 的 hdfs_io 工具将本地 Parquet 复制到 HDFS。五、奖励函数与 ASR 服务器5.1 奖励计算链路为了计算奖励需要一个轻量级服务器完成三步工作token → 波形用 CosyVoice2 预训练 U-Net 模型将生成的语音 token 还原为 16 kHz 波形ASR 转写用 SenseVoice 将波形转写为文本拼音级错误率将转写文本与真实文本ground truth在拼音层面计算错误率并映射为 01 的奖励分数。启动服务器stage 1建议在独立终端或独立 GPU 上运行bash run.sh 1 1 # Triton server listens on ports 8000/8001/80025.2 服务器源码解析服务器实现在 token2wav_asr_server.py 中基于PytritonPython 版 Triton Inference Server。关键点如下通过TritonConfig(http_port8000, grpc_port8001, metrics_port8002)暴露三个端口与 README 注释一致每个 GPU 上加载一个OmniSenseVoiceSmall(iic/SenseVoiceSmall)实例和一个CosyVoice2(/workspace/CosyVoice2-0.5B, load_jitTrue, load_trtTrue, fp16True)编解码器见_Token2Wav_ASR.__init__注意通过torch.cuda.device(self.device_id)保证两者落在同一张卡上模型输入为TOKENSINT32 语音 token 序列、TOKEN_LENS、GT_TEXT真实文本输出为REWARDS与TRANSCRIPTS合成时从yuekai/aishell数据集的 test 划分中随机抽取 prompt 语音与 prompt 文本get_random_prompt_from_dataset模拟零样本zero-shot说话人克隆场景。奖励分数的具体计算对应 token2wav_asr_server.pygt_pinyin lazy_pinyin(gt_norm, styleStyle.TONE3, tone_sandhiTrue, neutral_tone_with_fiveTrue) hyp_pinyin lazy_pinyin(hyp_norm, styleStyle.TONE3, tone_sandhiTrue, neutral_tone_with_fiveTrue) c float(wer( .join(gt_pinyin), .join(hyp_pinyin))) reward_val 1.0 - np.tanh(3.0 * c) reward_val max(0.0, min(1.0, reward_val))即先对中英文文本做归一化ZhNormalizer去标点、小写再转成带声调TONE3的拼音序列用 jiwer 计算拼音级 WER最后用1 - tanh(3*WER)平滑映射到 [0,1]WER 越低奖励越接近 1。5.3 训练侧的自定义奖励函数训练端在 reward_tts.py 中实现通过 HTTP 请求调用上述 Triton 服务compute_score(data_source, solution_str, ground_truth, ...)是 veRL 约定的自定义奖励入口返回 [0,1] 分数_parse_ids用正则r\|s_(\d)\|从模型生成的 token 字符串中提取语音 token ID_remote_reward将 token 数组与 ground truth 打包为 JSONPOST 到http://localhost:8000/v2/models/token2wav_asr/infer解析返回的outputs[0].data[0]作为奖励任何异常KeyError/IndexError/TypeError 或网络异常都会安全回落为0.0保证训练不因单点失败中断。该文件还附带 CLI 快速测试入口--input/--max-samples/--debug/--no-interactive可从 JSONL 中读取text与code字段逐条验证奖励打分是否正常。六、GRPO 训练6.1 启动训练bash run.sh 2 2run.sh 的stage 2调用了verl.trainer.main_ppo以下是实际传给训练器的完整关键参数对应 run.shexport CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 n_gpus_per_node8 micro_batch_size4 train_batch_size32 python3 -m verl.trainer.main_ppo \ algorithm.adv_estimatorgrpo \ data.train_filesdata/parquet_aishell3/train.parquet \ data.val_filesdata/parquet_aishell3/test.parquet \ data.train_batch_size$train_batch_size \ data.max_prompt_length1024 \ data.max_response_length512 \ data.truncationerror \ actor_rollout_ref.model.use_remove_paddingFalse \ actor_rollout_ref.model.path$sft_model_path \ actor_rollout_ref.actor.optim.lr1e-6 \ actor_rollout_ref.actor.ppo_mini_batch_size32 \ actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu$micro_batch_size \ actor_rollout_ref.actor.use_kl_lossFalse \ actor_rollout_ref.model.enable_gradient_checkpointingTrue \ actor_rollout_ref.actor.fsdp_config.param_offloadFalse \ actor_rollout_ref.actor.fsdp_config.optimizer_offloadFalse \ actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu$micro_batch_size \ actor_rollout_ref.rollout.tensor_model_parallel_size1 \ actor_rollout_ref.rollout.namevllm \ actor_rollout_ref.rollout.gpu_memory_utilization0.6 \ actor_rollout_ref.rollout.do_sampletrue \ actor_rollout_ref.rollout.temperature0.8 \ actor_rollout_ref.rollout.top_p0.95 \ actor_rollout_ref.rollout.top_k25 \ actor_rollout_ref.rollout.n4 \ actor_rollout_ref.rollout.val_kwargs.do_sampletrue \ actor_rollout_ref.rollout.val_kwargs.temperature0.8 \ actor_rollout_ref.rollout.val_kwargs.top_p0.95 \ actor_rollout_ref.rollout.val_kwargs.top_k25 \ reward_model.reward_managerprime \ custom_reward_function.pathreward_tts.py \ custom_reward_function.namecompute_score \ trainer.project_namecosyvoice2_grpo \ trainer.experiment_name$exp_name \ trainer.logger[console,wandb] \ trainer.n_gpus_per_node$n_gpus_per_node \ trainer.nnodes1 \ trainer.save_freq100 \ trainer.test_freq100 \ trainer.resume_modeauto \ trainer.total_epochs1 \ trainer.val_before_trainFalse参数含义解读算法与数据algorithm.adv_estimatorgrpo使用 GRPO 替代 PPO训练/验证数据即stage 0生成的 Parquetdata.max_prompt_length1024、data.max_response_length512限制 prompt 与语音 token 序列长度。Actor 训练侧lr1e-6保持较低学习率避免破坏已学到的语音生成能力use_kl_lossFalse表示不叠加 KL 散度约束开启梯度检查点以节省显存。Rollout 采样侧namevllm使用 vLLM 做采样temperature0.8 / top_p0.95 / top_k25 / n4表示每个 prompt 采样 4 条轨迹GRPO 正是利用组内相对优势估计奖励验证阶段val_kwargs.*使用相同的采样配置。奖励侧reward_model.reward_managerprime采用 PRIME 奖励管理custom_reward_function.pathreward_tts.py、namecompute_score指定自定义奖励函数。训练器trainer.n_gpus_per_node8、nnodes1即 8 卡单机训练save_freq100每 100 步保存一次检查点total_epochs1完整跑 1 个 epochresume_modeauto自动断点续训。训练前需先完成stage -1将官方 CosyVoice2-0.5B 模型转换为 HuggingFace 兼容检查点pretrained_to_huggingface.py。该脚本的核心工作是将 CosyVoice2 的llm_decoder语音 token 输出层权重与 bias 拷入新建的lm_head将speech_embedding、llm_embedding拷入input_embeddings对应区间扩展词表新增 6561 个|s_0||s_6560|语音 token以及|eos1|、|eos2|、|eos3|、|sos|、|task_id|等特殊 token设置generation_configtemperature1.0、top_p0.8、top_k25与多个 eos_token_id并以tie_word_embeddingsFalse、use_biasTrue保存使模型与 Transformers 的 Qwen2.5-0.5B 结构兼容。[!TIP]lm_head bias 说明README 特别提示训练期间会禁用 lm_head 的 bias这是为了与 VLLM 和 Transformers 的 Qwen 模型保持兼容。run.sh 的stage -1注释也明确指出we remove the lm_heads bias to make it compatible with the Qwen2.5-0.5B model in Transformers。七、评估与模型导出7.1 合并权重stage 3训练结束后检查点以 FSDP 分片形式存储。执行以下命令合并权重并导出 HuggingFace 风格检查点bash run.sh 3 3 # merges weights into $llm_path/merged_hf_modelrun.sh 内部对global_step_100/200/300/400/500逐一步骤执行python -m verl.model_merger merge \ --backend fsdp \ --local_dir $llm_path/actor \ --target_dir $llm_path/merged_hf_model7.2 分布式推理与 WER 评估stage 4bash run.sh 4 4该命令通过 infer_dataset.py 启动分布式推理并用 scripts/compute_wer.sh 计算 WER。run.sh 中实际命令为CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 \ torchrun --nproc_per_node8 \ infer_dataset.py \ --output-dir $output_dir \ --llm-model-name-or-path $model_path \ --token2wav-path $token2wav_path \ --split-name ${dataset}其中datasetzero_shot_zhCosyVoice3 测试集为默认也可通过datasettest_zh切换到 Seed-TTS 测试集。infer_dataset.py 的实现要点使用AutoModelForCausalLMAutoTokenizer直接加载合并后的 HF 模型model.generate采用max_new_tokens2048与top_p/temperature/top_k采样生成语音 token内置专门的 chat 模板TEMPLATE以|im_start|包裹并在 user 消息前加 Convert the text to speech: 前缀通过extract_speech_ids解析|s_xxxxx|形式的 token交给 CosyVoice2 的 flow hift 解码为 24 kHz 波形写入{output_dir}/{utt}.wav依据 split 名自动选择数据集含zero的 split 使用yuekai/CV3-Eval并加载s3tokenizerspeech_tokenizer_v2_25hz编码 prompt 语音否则使用yuekai/seed_tts_cosy2。评估脚本 scripts/compute_wer.sh 使用 sherpa-onnx 的 Paraformer 中文模型sherpa-onnx-paraformer-zh-2023-09-14首次运行自动下载对生成 wav 做贪婪解码转写再与 ground truth 计算 WER最终调用 scripts/offline-decode-files.py 输出每句识别结果。7.3 导出为 CosyVoice 仓库格式stage 5若要在官方 CosyVoice 仓库cosyvoice/cli/cosyvoice.py 中的CosyVoice2接口中直接使用 RL 训练后的模型需要将 HF 检查点转回 CosyVoice 的llm.pt格式bash run.sh 5 5run.sh 内部调用python3 huggingface_to_pretrained.py \ --hf-cosyvoice2-llm-path $llm_path/merged_hf_model \ --output-path /workspace/CosyVoice2-0.5B/llm-new.pthuggingface_to_pretrained.py 的逻辑是逆向pretrained_to_huggingface.py从model.safetensors中把lm_head的语音 token 区间切片还原为llm_decoder.weight把embed_tokens的语音区间还原为speech_embedding.weight并跳过lm_head.bias因为训练时已禁用 bias最终以tie_word_embeddingsTrue的方式重建llm.pt。[!TIP] README 明确提示转换后 RL 模型的精度相对 HuggingFace 格式略有下降因此若要追求最佳效果建议直接使用 HuggingFace 格式的推理代码如infer_dataset.py而不是转换后的 CosyVoice 原生格式。八、实验结果README 给出了 GRPO 微调前后在两个中文测试集上的 CER字错误率对比ModelSeed-TTStest_zhCERCosyVoice3zero_shot_zhCERCommentCosyVoice2 LLM (official)1.45%4.08%官方模型基线CosyVoice2 LLM GRPO1.37%3.36%HuggingFace 格式模型可见在 Seed-TTStest_zh上 CER 从 1.45% 微降至 1.37%在更具挑战的 CosyVoice3 零样本中文测试集zero_shot_zh上CER 从 4.08% 显著降至3.36%相对下降约 17.6%。其中官方基线对应 CosyVoice2 论文报告的数据GRPO 结果对应 RL 微调后的 HuggingFace 格式模型即 stage 3 产出的merged_hf_model。README 同时致谢了 ch-tts-llasa-rl-grpo 项目对本实现的启发。九、复现要点与注意事项工作目录约定run.sh 中export PYTHONPATH/workspace/CosyVoice多个脚本依赖/workspace/CosyVoice2-0.5B路径存放官方模型与 token2wav请按脚本约定组织目录模型可用modelscope download --model iic/CosyVoice2-0.5B获取或直接使用 HF 兼容检查点yuekai/cosyvoice2_llm。硬件与显存训练默认 8 卡、gpu_memory_utilization0.6微批大小 4、训练批大小 32请根据自身CUDA_VISIBLE_DEVICES与 GPU 显存调整micro_batch_size等超参。奖励服务器先行训练stage 2依赖奖励服务器stage 1正常运行二者通常部署在不同 GPU 或不同终端训练端通过http://localhost:8000访问。bias 兼容性训练阶段禁用了lm_head.bias转换回 CosyVoice 格式时权重会重新补零 bias这是精度轻微下降的可能来源之一追求最佳 CER 请使用 HF 格式推理。测试集切换评估时datasetzero_shot_zh与datasettest_zh对应不同的数据源yuekai/CV3-Eval与yuekai/seed_tts_cosy2与不同的 prompt 编码方式是否加载 s3tokenizer切换时无需改动脚本。十、结语本文以 examples/grpo/cosyvoice2/README.md 为主线结合仓库内的 run.sh、reward_tts.py、token2wav_asr_server.py、prepare_data.py、infer_dataset.py 等实现完整梳理了数据准备 → 奖励服务 → GRPO 训练 → 权重合并 → 分布式评估 → 格式回导的全链路。通过这套 recipe开发者可以在 CosyVoice2 上以 ASR 错误率为导向的奖励信号做强化学习微调在零样本中文 TTS 场景下获得可复现的 CER 收益4.08% → 3.36%并可直接接入 veRL 生态进行更大规模的 RL 训练探索。赞分享语音音频人工智能大模型微调预训练模型推理服务【免费下载链接】CosyVoiceMulti-lingual large voice generation model, providing inference, training and deployment full-stack ability.项目地址https://gitcode.com/gh_mirrors/cos/CosyVoice点击查看免费下载相关推荐verl 强化学习训练实战指南基于 HybridFlow 的 PPO/GRPO 大模型后训练verl 强化学习训练实战指南基于 HybridFlow 的 PPO/GRPO 大模型后训练 verlVolcano Engine ReinforcemenAI 技能人工智能大模型深度学习使用 verl 对 Qwen3 进行强化学习RL训练GRPO/PPO 全流程实战指南使用 verl 对 Qwen3 进行强化学习RL训练GRPO/PPO 全流程实战指南 verl 是火山引擎开源的 LLM 强化学习RL训练库也是论文人工智能大模型Qwen模型评测示例工程本地部署教程TinyZero 实战指南基于 veRLHybridFlow复现 DeepSeek R1-Zero 的强化学习训练全流程TinyZero 实战指南基于 veRLHybridFlow复现 DeepSeek R1 Zero 的强化学习训练全流程 TinyZero 是一个基于 v人工智能大模型强化学习推理模型上一篇3分钟掌握sqlx让Go数据库操作效率提升10倍的实用指南下一篇终极指南Android Sunflower的ViewModel架构与Repository模式最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表