一条命令组建临时Dask集群,跑完问答对生成与数据清洗即解散
简单说,合成数据流水线的计算形状很固定。先是读取、采样、规范化原始文档,再构造提示和批次。大模型负责生成样本,之后解析验证结构化输出,最后去重并写入Parquet。前前后后几乎全是CPU密集工作,只有大模型生成那一步需要GPU。这个模式不只在问答生成里出现。合成指令生成、分类理由、文档增强、模型蒸馏、偏好对构建、离线评估,都是同一套形状。
hfdask是一个开源Python库,处理的就是这类流水线的部署。做法是:把一个YAML集群定义变成Hugging Face Jobs上的临时Dask集群。先启动一个协调器Job,由它托管Dask调度器并运行脚本。再启动Worker Jobs,为集群提供CPU和GPU工作节点。源码分发、锁定依赖安装、Job提交、集群形成、清理和恢复元数据,都由它负责。
机器之间通过经过身份验证的加密Iroh网格连接。Dask服务绑定到回环地址,不暴露公共调度器。每个机器为每个完整的CPU核心启动一个单线程工作节点。可见的NVIDIA GPU独占分配给前几个工作进程,每进程一个GPU。这些节点会通告Dask标准的GPU资源。
集群配置里有一行network.public_relays: true。它表示显式同意公共发现和中继回退。数据在传输中加密,但发现和中继服务仍能观察到连接元数据。
项目自带一个问答对生成示例。集群配置是一个cpu-basic规格的CPU协调器,加一个l4x1 GPU工作节点。环境镜像是vllm/vllm-openai:v0.29.0,镜像digest固定。数据用fancyzhx/ag_news的测试集,每行是一条新闻文章加四个主题标签之一。数据集以固定修订版本挂载到每个Job的/dataset路径。生成模型是Qwen/Qwen3-0.6B,同样固定修订版本,挂载到/model。
准备阶段不碰GPU。pandas读取挂载的Parquet文件,按标签做确定性平衡采样,每类取32个样本,每16行切成一个分区。
模型加载有个细节。Dask WorkerPlugin会在每个GPU工作节点启动时初始化一个vLLM引擎。模型只加载一次,不用为每个任务重复加载。生成时提示通过apply_chat_template构建。参数是temperature=0.2、top_p=0.9、max_tokens=256。
提交机器不需要安装vLLM这类Linux专用依赖。它们作为带平台标记的普通项目依赖,在Linux Job内部从同一份锁文件安装。
提示要求模型从每篇源文章生成一个可回答的问题。输出必须是一个严格的JSON对象,包含问题、简洁答案和精确的支持性引用。输出还要过一道严格的Pydantic模型解析。它禁止额外字段,空字段直接拒绝。
验证器检查输出是否为有效JSON,字段是否非空,长度是否在限制内。支持性引用必须精确出现在源文章中。重复的规范化问题在写入前被去除。被拒绝的记录不会丢掉。原始生成内容和拒绝原因都保留下来,方便改进提示和验证策略。
最终CPU阶段做去重,然后写三个文件。它们是accepted.parquet、rejected.parquet和summary.json。summary记录尝试数、接受数、拒绝数、重复数和验证产出率。验证产出率就是接受数除以尝试数。
整个计算用dask.annotate编排。准备和验证阶段限制在CPU工作节点。生成阶段通过resources={"GPU": 1}请求GPU。还设置了optimize_graph=False,防止优化器把阶段边界合并掉。CPU工作可以并发运行,生成任务只调度到GPU工作节点。整个流水线保持在同一个计算图里,阶段之间的依赖是显式的。
运行命令只有一条:uv run --group deploy hfdask run --cluster cluster.yaml generate_dataset.py。hfdask在后台先验证集群配置,再快照当前Git工作树中符合条件文件。然后把源码压缩包传到唯一前缀,提交协调器和Worker Jobs。
每个Job会验证并解压源码,然后用锁文件安装依赖。机器之间发现彼此后建立加密隧道。协调器启动调度器,等齐预期的工作节点,再执行generate_dataset.py。脚本跑完,hfdask取消所有已知Job,并逐个确认它们进入终止状态。
把规模放大时,项目给出几条建议。分区大小要让vLLM能批量处理;分区数要多于GPU工作节点数,让GPU保持忙碌。增加工作节点数量而不是做模型并行。提高workers.count就能增加独立的GPU工作节点。CPU阶段始终留在CPU工作节点上。用每个美元接受的示例数衡量成本。还要写可恢复的分片。
hfdask刻意只处理部署机制,不碰合成数据的语义。它负责Job提交、节点生命周期、依赖安装、源码分发、挂载和发现。加密传输、清理验证和恢复清单也在其中。提示设计、生成质量、输出模式、验证策略、去重语义、检查点策略,由工作负载负责。数据集许可和来源、成本和质量阈值也一样。
这个库是开源的,在PyPI上可以获取,版本0.1.1。