尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Model-Optimizer 投机解码数据合成:基于 SLURM 的分布式合成数据生成实战指南

发布时间:2026/9/27 7:00:44

资讯中心
01
ARTICLE

Model-Optimizer 投机解码数据合成:基于 SLURM 的分布式合成数据生成实战指南

Model-Optimizer 投机解码数据合成:基于 SLURM 的分布式合成数据生成实战指南
人工智能大模型模型优化模型量化模型压缩【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址https://gitcode.com/GitHub_Trending/te/Model-Optimizer点击查看免费下载导读本文聚焦 NVIDIA Model-Optimizer 仓库中examples/speculative_decoding示例自带的 SLURM 数据准备方案讲解如何将大规模合成对话数据的生成任务切分成多个 shard分片通过salloc分配多节点、由 vLLM / SGLang 推理服务并行调用基础模型逐片生成、最终合并回完整训练集的全流程。读完本文你将掌握sharding_utils.py的分片/合并用法、launch.sh的 10 个命令行参数语义、worker 在节点上的真实执行链路服务启动、温度扫描、断点续跑并能直接把它复用到你自己的投机解码EAGLE / DFlash训练数据生产中。为什么需要 SLURM 数据准备投机解码Speculative Decoding通过在 GPU 内存中部署一个轻量草稿模型draft model与主模型协作用一次前向验证多个候选 token从而加速自回归生成。要让草稿模型的输出分布尽可能贴近主模型训练数据最好由主模型自身生成——这就是合成数据生成Data Synthesis环节的价值详见 examples/speculative_decoding/README.md 的 Data Synthesis 小节。但在亿级样本规模下单机串行生成是不可行的每个样本都要经过一次完整的推理调用耗时以小时计。为此仓库在examples/speculative_decoding/distributed_generate/目录下提供了完整的 SLURM 并行化支持其基本思路是把输入 jsonl 按固定行数切成多个 shard用salloc/ SLURM 作业分配 N 个计算节点每个节点上启动 vLLM或 SGLang推理服务串行处理分配给自己的若干个 shard全部处理完成后把 shard 合并回单个 jsonl作为后续训练数据。整个过程假设$SLURM_JOB_ID已存在即你已在交互式分配或作业脚本环境中并假定已选定节点 n1、n2、n3、n4。第一步用 salloc 分配计算节点文档给出的分配命令是salloc -N4 -A account -p partition -J account-synthetic:data-gen -t 120各参数含义参数说明-N4申请 4 个节点-A accountSLURM 账户名计费账户-p partition目标分区partition-J account-synthetic:data-gen作业名用于在 squeue 中识别本次数据生成任务-t 120分配时长 120 分钟注意这里是分钟单位执行成功后salloc会为当前 shell 绑定一个$SLURM_JOB_ID后续srun --jobid$JOB_ID ...才能把任务调度到这批节点上。仓库中还有一份可直接提交的作业脚本示例 examples/speculative_decoding/collect_hidden_states/slurm_dump.sh它展示了#SBATCH -A account_name、#SBATCH --nodes1 --ntasks-per-node4 --gpus-per-node4、-t 04:00:00等典型 SBATCH 写法可作参考。第二步用 sharding_utils.py 创建数据分片合成数据生成是每个样本一次推理天然适合并行切分。仓库用 sharding_utils.py 完成分片与合并两个方向的操作。分片shardpython3 distributed_generate/sharding_utils.py --input_path /data/train.jsonl --output_dir /data/train/ --max_lines_per_shard 10000从源码看该脚本的参数与行为如下参数默认值作用--input_pathNone输入 jsonl 文件路径分片模式下必填--output_dirNone输出目录分片模式下必填不存在会自动os.makedirs创建--max_lines_per_shard10000每个 shard 最多包含的行数达到上限即滚动到下一个 shard 文件--combineFalse切换为合并模式见下文分片文件的命名规则是train-{shard_idx:05d}-{shard_idx:05d}.jsonl例如train-00000-00000.jsonl、train-00001-00001.jsonl。也就是说一个 40 万行的输入文件按max_lines_per_shard10000切分后会得到train-00000到train-00039共 40 个 shard——这正是后文前 40 个 shard的由来。合并combinepython3 distributed_generate/sharding_utils.py --input_dir /data/output/ --output_path /data/output.jsonl --combine合并模式--combine的逻辑见combine_jsonl_files函数值得注意只收集目录下以.jsonl结尾的文件并按文件名排序后依次读取跳过空白行跳过带有finished: true标记的记录——这是server_generate.py在全部对话生成完毕后写入的完成哨兵见下文删除每条记录的conversation_id字段后以 JSON 每行jsonl格式写入--output_path。因此合并输出是干净的训练 jsonl可直接喂给 main.py 或launch_train.sh进入 EAGLE 训练流程。第三步用 launch.sh 在 SLURM 上并行生成命令形态bash distributed_generate/launch.sh $SLURM_JOB_ID vllm TinyLlama/TinyLlama-1.1B-Chat-v1.0 /data/train/ /data/output /scripts/ 0 10 n1,n2,n3,n4 \You are a helpful assistant.\对照 launch.sh 第 20 行打印的 Usage10 个位置参数语义为位置参数本例取值含义1$1$SLURM_JOB_ID当前 SLURM 作业 ID供srun --jobid使用2$2vllm推理后端必须是vllm或sglang否则脚本直接报错退出3$3TinyLlama/TinyLlama-1.1B-Chat-v1.0基础模型路径/名称将被挂载到容器内/model/4$4/data/train/输入 shard 目录挂载到容器内/input_data/5$5/data/output输出目录脚本会先mkdir -p挂载到/output_data/6$6/scripts/modelopt/examples/speculative_decoding的绝对路径内含server_generate.py与distributed_generate/挂载到/scripts/7$70start_shard从第几个 shard 开始处理断点续跑的关键见下文8$810jobs_per_node每个节点处理多少个 shard9$9n1,n2,n3,n4逗号分隔的节点名列表10${10}You are a helpful assistant.可选 system prompt透传给生成脚本注意$6scripts 路径必须指向仓库中 examples/speculative_decoding 的绝对路径因为 worker 容器内会调用/scripts/distributed_generate/worker.sh与/scripts/scripts/server_generate.py。执行语义launch.sh 的核心循环第 54-66 行对每个节点执行一次srun --outputsrun_worker_${node}.log --jobid$JOB_ID -N 1 --ntasks1 --ntasks-per-node1 -w $node \ --mpi pmix --overlap --container-image$CONTAINER_IMAGE \ --container-mounts$MODEL_PATH:/model/,$DATA_PATH:/input_data/,$OUTPUT_PATH:/output_data/,$SCRIPTS_PATH:/scripts/ \ bash /scripts/distributed_generate/worker.sh $counter $BACKEND $JOBS_PER_NODE $SYSTEM_PROMPT 关键点每个节点通过-w $node精确钉到一个计算节点-N 1 --ntasks1保证每个节点只有一个 srun 任务使用Pyxis 容器--container-image与--container-mounts。默认镜像按后端区分——vllm 用vllm/vllm-openai:v0.24.0sglang 用lmsysorg/sglang:v0.5.3-cu129可通过环境变量CONTAINER_IMAGE覆盖例如本地.sqsh镜像四个目录以只读/可写方式统一挂载模型、输入分片、输出、脚本worker 以后台并行启动每个节点的counter累加JOBS_PER_NODE脚本最后会wait所有 worker任一失败则整体以非零码退出并在日志srun_launch.log中记录每条 srun 命令。以本例4 节点、每节点 10 个 shard为例节点 n1 处理 shard 0-9n2 处理 10-19n3 处理 20-29n4 处理 30-39即前 40 个 shard。每个 shard 含 10000 行每节点实际完成的样本数为jobs_per_node × max_lines_per_shard。第四步增量续跑——处理后续 shard一次salloc分配 120 分钟可能不够处理全部数据但不需要重新申请worker 会记录已生成的conversation_id并跳过见下文断点机制而 launch.sh 的start_shard参数支持精确续跑。处理下一个 40 个 shard即 shard 40-79bash distributed_generate/launch.sh $SLURM_JOB_ID vllm TinyLlama/TinyLlama-1.1B-Chat-v1.0 /data/train/ /data/output /scripts/ 40 10 n1,n2,n3,n4这里start_shard40于是节点 n1 处理 40-49、n2 处理 50-59、n3 处理 60-69、n4 处理 70-79。只要节点仍在分配时段内就可以反复这样续跑直到所有 shard 处理完毕。launch.sh 第 68 行会打印Will process shards $START_SHARD through $((counter - 1))供你核对本次范围。深入 worker.sh节点上的实际执行链路worker.sh 是每个节点上的真正执行者理解它能帮你排查超时、OOM、端口冲突等问题。环境变量与启动参数worker.sh 接收 4 个位置参数_CURRENT_COUNTER本节点起始 shard、BACKEND、JOBS_PER_NODE、SYSTEM_PROMPT其余行为由环境变量控制环境变量默认值含义BASE_PORT8000推理服务起始端口多服务按 GPU 递增SGLANG_TP_SIZE1SGLang 张量并行度vLLM 后端下始终 TP1NUM_TEMPERATURES8温度扫描数量即每张卡一个温度实例的实例数MAX_TOKENS4096单轮生成的最大 token 数透传给server_generate.pyMODEL_NAMEmodel服务的--served-model-nameSTARTUP_TIMEOUT_SECONDS600服务健康检查超时GPU_COUNTnvidia-smi -L行数容器内可见 GPU 数用于校验 NUM_TEMPERATURES 是否越界TEXT_NUM_THREADSTP1 时 64否则 320客户端并发线程数脚本做了严格的输入校验backend 必须为 vllm/sglang、GPU_COUNT必须 0、TP 规模不得超过 GPU 数、NUM_TEMPERATURES不得超过 GPU 数TP1 场景等。服务启动与健康检查当SGLANG_TP_SIZE1时worker 会为每张 GPU 启动一个独立服务vLLM 或 SGLang端口为BASE_PORT gpuCUDA_VISIBLE_DEVICES$gpu vllm serve /model/ \ --tensor-parallel-size 1 --served-model-name $MODEL_NAME \ --port $port --host 0.0.0.0 --trust-remote-code # sglang 时等价于python3 -m sglang.launch_server --model-path /model --tp 1 --port $port ...随后进入健康检查循环反复 curlhttp://localhost:${port}/health全部返回 200 才继续默认 600 秒超时。全部服务就绪后只有 MPI rank 0PMIX_RANK/OMPI_COMM_WORLD_RANK执行生成逻辑避免重复。温度扫描与 shard 处理worker 把每个 GPU 上的服务与每档温度一一对应温度0.0, 0.1, ..., 0.(NUM_TEMPERATURES-1)分别打到不同端口同一 shard 可生成多个温度变体对应多条对话随后依次处理start_shard到end_shard范围内的每个 shard输入 shard 路径按printf /input_data/train-%05d-%05d.jsonl拼出与 sharding_utils 命名严格对应缺失或空 shard 自动跳过[ ! -s $shard ] continue因此中途失败不会阻塞输出文件名为output-%05d-%05d-temp-0.X.jsonl每个 shard 调用一次python3 /scripts/scripts/server_generate.py \ --data_path $shard --output_path $output \ --num_threads $TEXT_NUM_THREADS --max_tokens $MAX_TOKENS \ --temperature $temperature --url http://localhost:$port/v1 \ --log_empty_conversations [--system_prompt $SYSTEM_PROMPT]TP1 时SGLANG_TP_SIZE1所有 GPU 组成一个张量并行服务、只有一个端口温度扫描退化为对该端口的串行调用。生成脚本 server_generate.py 的断点机制worker 最终调用的 server_generate.py 是 Medusa 数据生成脚本的适配版基于openai客户端走 OpenAI 兼容 API。它保证断点续跑安全启动时扫描已有输出文件收集已完成的conversation_id并跳过输出文件已含finished: true哨兵时直接退出All conversations already generated每条完成记录写入conversation_id、conversations可选truncated: true全部处理完后追加一行{finished: true}——这正是 sharding_utils 合并时用于过滤已完成记录的依据。因此即使某个节点在中途挂掉重新以相同start_shard启动同一批 shard 也不会重复生成只会补齐缺失的conversation_id。参数方面--num_threads默认 256即并发请求数/批大小、--temperature默认 0.0、--max_tokens默认 2048、--url默认http://localhost:8000/v1、--api_key默认token-abc123与 README 中vllm serve ... --api-key token-abc123 --port 8000的示例一致。多模态扩展launch_multimodal.sh 与 worker_multimodal.sh除纯文本外仓库还提供面向视频 VLM 数据的并行生成入口 launch_multimodal.sh。与文本版的主要差异仅支持sglang后端使用 SGLang 原生视频客户端参数位支持两种顺序可把media_path放在节点列表前... jobs_per_node media_path [num_frames] nodes [system_prompt]也可把节点列表放在前面... jobs_per_node nodes media_path [num_frames] [system_prompt]脚本通过判断第 9 参是否含/或.前缀来自动识别额外的挂载点MEDIA_PATH:/media_data/并为 OpenAI API 模式起一个本地http.server默认端口 18080把媒体目录暴露为可访问 URL默认SGLANG_TP_SIZE8、MAX_TOKENS6144、NUM_FRAMES默认 32支持API_MODEopenai、VISION_TOKEN_FORMAT默认 qwen_vl等环境变量worker 调用 server_generate_vlm_sglang.py589 行负责把视频/图片路径解析、抽帧后构造带视觉 token 的请求。多模态 shard 的输入输出命名与文本版一致同样可以复用sharding_utils.py分片、合并。关联场景SLURM 上的隐藏状态 dump数据准备的另一条并行路径是离线训练所需的 base model 隐藏状态导出见 collect_hidden_states/slurm_dump.sh。这份 SBATCH 脚本示范了 SLURM 数组作业Array Job用法SLURM_ARRAY_TASK_ID作为 DP rank、SLURM_ARRAY_TASK_COUNT作为 DP world size通过trtllm-llmapi-launch python3 .../compute_hidden_states_trtllm.py --tp 4 --dp-rank $SLURM_ARRAY_TASK_ID --dp-world-size $SLURM_ARRAY_TASK_COUNT实现节点内 TP、跨数组 DP 的并行。它与本文的合成数据生成是互补的两种 SLURM 场景共同服务于投机解码训练的数据准备。最佳实践与注意事项小结先分片再并行max_lines_per_shard建议根据单 shard 处理时长与作业窗口-t估算避免一个 shard 拖垮整批节点或频繁续跑。善用start_shard续跑续跑时从上次结束的 shard 编号开始worker 与 server_generate.py 的双重断点机制可保证不重复、不遗漏。容器镜像可控离线集群可用CONTAINER_IMAGE指向本地.sqsh镜像避免从 registry 拉取Pyxis 要求挂载源路径在srun前已存在因此 launch.sh 会先mkdir -p $OUTPUT_PATH。温度多样性与并发NUM_TEMPERATURES与 GPU 数绑定TP1 时多温度可提升合成数据多样性客户端线程数TEXT_NUM_THREADS决定单 shard 内的并发请求量。完成后务必合并训练前用--combine把output-*.jsonl合并为单个 jsonl脚本会自动剔除空对话与finished哨兵。整套方案全部位于 examples/speculative_decoding/distributed_generate 目录配合 examples/speculative_decoding/README.md 中的 Data Synthesis 小节单机版server_generate.py用法即可从单机平滑扩展到多节点集群为 EAGLE 系列草稿模型训练生产高质量合成数据。赞分享人工智能大模型模型优化模型量化模型压缩【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址https://gitcode.com/GitHub_Trending/te/Model-Optimizer点击查看免费下载相关推荐Cell Mixer 单细胞转录组数据混合合成指南基于 10X 数据的细胞混合物生成与格式转换Cell Mixer 单细胞转录组数据混合合成指南基于 10X 数据的细胞混合物生成与格式转换 导读 Cell Mixer 是 google research人工智能深度学习NLP计算机视觉强化学习3步完成黑苹果配置OpCore Simplify终极EFI生成指南3步完成黑苹果配置OpCore Simplify终极EFI生成指南 想要在普通PC上安装macOS黑苹果却苦于复杂的OpenCore配置OpCore S开发工具CLIOumi 数据合成实战指南使用 oumi synth 一键生成高质量合成训练数据Oumi 数据合成实战指南使用 oumi synth 一键生成高质量合成训练数据 导读 本文基于 Oumi 仓库中的 configs/examples/syn人工智能大模型预训练微调强化学习模型推理服务模型评测MCP 服务分布式训练模型量化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。