<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LLM微调 on 蔡大锅's Blog</title><link>https://bingorun.cn/tags/llm%E5%BE%AE%E8%B0%83/</link><description>Recent content in LLM微调 on 蔡大锅's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>©2025-2026 沪ICP备2025139614号-2 | 沪公网安备31011502407735号</copyright><atom:link href="https://bingorun.cn/tags/llm%E5%BE%AE%E8%B0%83/index.xml" rel="self" type="application/rss+xml"/><item><title>DataFlow 1.1–1.2 搭建操作手册</title><link>https://bingorun.cn/posts/dataflow-task1/</link><pubDate>Wed, 21 Oct 2026 00:00:00 +0800</pubDate><guid>https://bingorun.cn/posts/dataflow-task1/</guid><description>&lt;p>这篇手册跟着的是北京大学 DCML 组的《&lt;a href="https://wcny4qa9krto.feishu.cn/wiki/I9tbw2qnBi0lEakmmAGclTysnFd">DataFlow 系列图文教程&lt;/a>》的实操过程。DataFlow 是 OpenDCAI 团队开源的数据治理系统，专门对付 PDF 文档、纯文本、爬虫数据这类嘈杂的低质量数据：经过修正、扩增、评估、过滤四类算子，产出能直接拿去训练的高质量数据集，再用预训练、SFT 或 RL 去提升模型在通用领域（推理、检索）和垂直领域（医疗、金融、法律）的表现。&lt;/p>
&lt;ul>
&lt;li>图文教程（飞书 Wiki）：&lt;a href="https://wcny4qa9krto.feishu.cn/wiki/I9tbw2qnBi0lEakmmAGclTysnFd">https://wcny4qa9krto.feishu.cn/wiki/I9tbw2qnBi0lEakmmAGclTysnFd&lt;/a>&lt;/li>
&lt;li>GitHub 仓库：&lt;a href="https://github.com/OpenDCAI/DataFlow">https://github.com/OpenDCAI/DataFlow&lt;/a>&lt;/li>
&lt;li>中文文档：&lt;a href="https://opendcai.github.io/DataFlow-Doc/zh/">https://opendcai.github.io/DataFlow-Doc/zh/&lt;/a>&lt;/li>
&lt;li>B 站视频教程：&lt;a href="https://space.bilibili.com/3546929239689711">https://space.bilibili.com/3546929239689711&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>这次实操是租用腾讯云单卡 V100 服务器东京节点上完成：1.1 走完全链路——环境搭建、LoRA 微调、对话验证、量化测评；1.2 上 GPU 版，独立跑 KBCleaning 流水线。机器是腾讯云 Ubuntu 22.04，1 × Tesla V100-SXM2-32GB（驱动 535 / CUDA 12.2），10 核 / 38GB 内存，磁盘空闲 60GB 以上；pip 走腾讯云镜像，HuggingFace 可直连（约 10MB/s）。&lt;/p>
&lt;p>整个过程由服务器上的 pi-coding-agent（1.2.0，glm-5.3）执行，我负责确认和关键决策（KBC/VQA 的选择、显存参数的取舍）。规矩是 agent 每步先列出要跑的命令和影响，我点头之后才执行，文中截图大多能看到这个交互。踩过的坑都写进了对应步骤，照着做能少走弯路。&lt;/p>
&lt;h2 id="前置pi-agent-安装与任务下发">前置：pi-agent 安装与任务下发&lt;/h2>
&lt;p>先准备好 agent 环境：装 pi、配模型、下发任务。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>安装 pi-coding-agent（snap --classic，要求 snapd ≥ 2.76）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 首次启动配置 provider / model / token（Z.AI Coding CN · glm-5.3）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 人工下发任务：阅读《DataFlow 系列图文教程.pdf》，完成 1.1 节搭建
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 工作模式约定：agent 每步先列命令与影响，人工确认后再执行
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► pi 转换 PDF 提取教程步骤 + 完成环境检查 ──► 进入下方 Step 0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>安装 pi-coding-agent&lt;/strong>。snap 安装必须带 &lt;code>--classic&lt;/code>；本机 snapd 是 2.67.1，低于 snap 包要求的 2.76，第一次装直接失败：&lt;/p>
&lt;p>&lt;img alt="snapd 2.67.1 低于要求的 2.76，首次安装失败" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/01-install-pi-agent.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="apt 升级系统组件，解除 snapd 版本限制" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/02-snapd-upgrade.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>升级系统组件把 snapd 带到 2.76.3，重装就过了（pi-coding-agent 1.2.0 from Ubuntu &lt;em>installed&lt;/em>）：&lt;/p>
&lt;p>&lt;img alt="snapd 升到 2.76.3 后重装成功" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/03-reinstall-after-upgrade.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;strong>首次启动与模型配置&lt;/strong>。首次启动提示 No model available，需要选 provider、配 model 和 token。我选的 Z.AI Coding CN · glm-5.3，凭证写入 &lt;code>~/.pi/agent/auth.json&lt;/code>：&lt;/p>
&lt;p>&lt;img alt="pi-agent 首次启动，进入 provider / model 配置界面" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/04-provider-model-config.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;strong>下发任务&lt;/strong>。配置完成后先跟 pi 过了一遍能力边界（读文档 / 执行命令 / 写代码 / 建文件），然后把任务交给它：读服务器上的《DataFlow 系列图文教程.pdf》，完成 1.1 节搭建。同时约定好——每个步骤执行前先跟我确认。&lt;/p>
&lt;p>&lt;img alt="确认 agent 能力清单与教程 wiki 地址" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/05-agent-capabilities.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="下发 1.1 节搭建任务，约定逐步确认的交互模式" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/06-dispatch-task-confirm.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="整体流程">整体流程&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>环境检查 ──► 安装 Miniconda ──► 创建 conda 环境(3.10) + 克隆仓库 + 安装依赖
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 下载 MinerU 解析模型
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 创建工作目录 run_dataflow ──► 上传 PDF
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► pdf2model init(KBC) ──► 配置本地化修正 + 下载大模型
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► dataflow pdf2model train（解析→清洗→QA生成→LoRA微调）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► dataflow chat 验证
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► dataflow eval 量化测评（训练前 vs 训练后打分，对应教程 1.1.2）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>【1.2 篇：环境与流水线库体验（GPU 版）】
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>环境/模型全部复用 1.1（无需重装）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 新建工作区 dataflow_ws + dataflow init（铺开全部流水线脚本库）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 修改 GPU 版 KBCleaning 流水线（复用 1.1 适配配方，lang=en）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ──► 独立运行：PDF+URL 解析 → 清洗 → QA 生成 → 432 组英文 QA
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>1.1 节的具体步骤是 pi 从 PDF 教程里提取并复述的，见前置篇末尾和 Step 0 的配图。&lt;/p>&lt;/blockquote>
&lt;h2 id="step-0-环境检查与安装-miniconda">Step 0 环境检查与安装 Miniconda&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>nvidia-smi &lt;span style="color:#75715e"># 确认 V100 32GB 可见&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>df -h / &lt;span style="color:#75715e"># 确认磁盘余量（建议 ≥60GB）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>which conda git &lt;span style="color:#75715e"># 本机无 conda，需先安装&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>安装 Miniconda（装在用户目录，不需要 root）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bash /tmp/miniconda.sh -b -p ~/miniconda3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>~/miniconda3/bin/conda init bash &lt;span style="color:#75715e"># 写入 ~/.bashrc，重开 shell 或 source 后生效&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>注意：新版 conda（26.x）第一次 &lt;code>conda create&lt;/code> 会被 TOS 条款拦住，先跑一遍接受命令：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/blockquote>
&lt;p>&lt;img alt="pi 转换教程 PDF，提取 1.1 节步骤并完成环境检查（GPU/内存/磁盘/git/conda）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/07-pdf-steps-env-check.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="环境检查结论与 Miniconda 安装计划，等待人工确认" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/08-miniconda-plan.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="pi 列出计划命令与影响说明（装哪里、要不要 sudo），确认后才执行" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/09-confirm-before-run.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-1-创建环境克隆仓库安装依赖">Step 1 创建环境、克隆仓库、安装依赖&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>conda create -n dataflow python&lt;span style="color:#f92672">=&lt;/span>3.10 -y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>conda activate dataflow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git clone https://github.com/OpenDCAI/DataFlow.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd DataFlow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install -e &lt;span style="color:#e6db74">&amp;#34;.[pdf2model]&amp;#34;&lt;/span> &lt;span style="color:#75715e"># 引号必须加，防止 bash 解析 []&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>安装量约 4~6GB，大概 10 分钟。关键组件版本：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>包&lt;/th>
 &lt;th>版本&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>open-dataflow&lt;/td>
 &lt;td>1.0.11&lt;/td>
 &lt;td>可编辑模式安装&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>torch&lt;/td>
 &lt;td>2.7.0+cu126&lt;/td>
 &lt;td>V100 可直接使用（驱动向下兼容）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>vllm&lt;/td>
 &lt;td>0.9.1&lt;/td>
 &lt;td>依赖约束 &lt;code>&amp;lt;0.9.2&lt;/code> 恰好是最后支持 V100 的版本&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>llamafactory&lt;/td>
 &lt;td>0.9.3&lt;/td>
 &lt;td>LoRA 微调框架&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>mineru&lt;/td>
 &lt;td>2.7.6&lt;/td>
 &lt;td>PDF 解析&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>装完验证：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>dataflow -v
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 输出 You are using the latest version: 1.0.11&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python -c &lt;span style="color:#e6db74">&amp;#34;import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 输出 True Tesla V100-SXM2-32GB&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>V100 服务器提前装好图形库：无界面机器缺 opencv 依赖的系统图形库，后面 Flash 解析阶段会报 &lt;code>ImportError: libGL.so.1&lt;/code>，提前装上（需要 sudo）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get install -y libgl1 libglib2.0-0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/blockquote>
&lt;p>Miniconda 26.9.3 装好并写入 &lt;code>~/.bashrc&lt;/code> 后，创建 dataflow 环境并拉取源码：&lt;/p>
&lt;p>&lt;img alt="Miniconda 安装完成，创建 dataflow 虚拟环境（Python 3.10）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/10-create-conda-env.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="dataflow 环境创建成功，克隆 DataFlow 仓库" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/11-clone-repo.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>然后 pip 安装 pdf2model 全套依赖（同样是先列计划、确认后执行）：&lt;/p>
&lt;p>&lt;img alt="pi 估算依赖体积（约 46GB、515 分钟）并列出安装计划" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/12-deps-install-plan.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="依赖安装完成，DataFlow 仓库目录就绪" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/13-deps-installed.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-2-模型准备mineru-解析模型">Step 2 模型准备（MinerU 解析模型）&lt;/h2>
&lt;p>1.1 节的 KBC/VQA 两种模式都用 &lt;code>pipeline&lt;/code> 系列 10 个模型（版面/公式/表格/OCR 等，约 3~4GB）；&lt;code>vlm&lt;/code> 系列是 1.10 节 PDF2VQA 才用的，本节用不到。&lt;/p>
&lt;blockquote>
&lt;p>依赖装完先做了三项验证（见下图），再启动 MinerU 模型下载。这一步走了弯路：先用的 modelscope 源，限速严重，后来切到 huggingface 才正常。下面的命令是最终推荐配置。&lt;/p>&lt;/blockquote>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 本机 HF 直连快（~10MB/s），推荐 huggingface 源；modelscope 源单线程限速且易超时崩溃&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mineru-models-download -s huggingface -m pipeline
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>带全参数运行则没有交互提示，下载完自动生成 &lt;code>~/mineru.json&lt;/code> 配置&lt;/li>
&lt;li>中断了重跑即可：已完成的模型自动跳过，支持续传&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="三项验证全通过（dataflow 1.0.11 / PyTorch+V100 / mineru 命令就位）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/14-mineru-models-prep.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="下载 MinerU pipeline 模型（modelscope 源，34GB，预计 510 分钟）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/15-download-models.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;strong>坑：modelscope 源限速严重&lt;/strong>。单线程只有约 167KB/s，预估 30 分钟起步，我让 pi 换成 HF 源重下并后台续传，速度直接快了一个数量级：&lt;/p>
&lt;p>&lt;img alt="pi 发现 modelscope 慢（右侧 4.5 秒完成第一个模型 vs 51 秒），切换 huggingface 源重下" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/16-switch-to-huggingface.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="HF 源提速明显：MFD 模型 29 秒完成（modelscope 花了 9.5 分钟），818M 大模型 70 秒搞定" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/17-hf-speed-boost.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>等下载的空档，pi 自己规划了并行任务：模型在后台下着，同时把不依赖下载的工作目录先建好，日志里能看到下载持续推进：&lt;/p>
&lt;p>&lt;img alt="pi 规划异步执行：模型后台下载的同时创建 run_dataflow 工作目录" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/18-async-planning.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-3-创建工作目录">Step 3 创建工作目录&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd /home/ubuntu
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir run_dataflow &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> cd run_dataflow
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img alt="创建 run_dataflow 工作目录，与 DataFlow 仓库、miniconda3 并列" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/19-create-workdir.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-4-上传待处理数据pdf">Step 4 上传待处理数据（PDF）&lt;/h2>
&lt;p>在本地电脑执行：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>scp /本地路径/金融大模型应用评测报告-摘要版.pdf ubuntu@&amp;lt;服务器IP&amp;gt;:/home/ubuntu/run_dataflow/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>pi 先问我 PDF 是什么类型，用来决定走 KBC 还是 VQA；我答复：报告类、含图表、已上传。&lt;/p>
&lt;p>&lt;img alt="pi 给出 KBC vs VQA 模式对比表，询问 PDF 类型与上传状态" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/20-kbc-vs-vqa-choice.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="pi 确认 PDF 已就位，建议选 KBC 模式，人工确认执行" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/21-kbc-mode-confirm.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-5-初始化--配置本地化修正--大模型下载">Step 5 初始化 + 配置本地化修正 + 大模型下载&lt;/h2>
&lt;h3 id="51-初始化选择-kbc-模式">5.1 初始化（选择 KBC 模式）&lt;/h3>
&lt;p>数据是报告类 PDF（含图表），按教程指引选 KBC（纯文本知识库 / Alpaca 格式）；VQA 面向教材/试题类，这里不适用。&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd /home/ubuntu/run_dataflow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dataflow pdf2model init --qa&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;kbc&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>init 和模型下载是并行推进的：模型在后台下着，pi 先把目录创建和初始化做完了，互不阻塞（见 Step 2 末尾的异步规划图）。&lt;/p>&lt;/blockquote>
&lt;p>init 完 pi 没有直接开跑，而是先把流水线源码通读了一遍，确认 &lt;code>dataflow pdf2model train&lt;/code> 的完整链路是 MinerU 解析 PDF → 清洗 → 生成 QA → LLaMA-Factory LoRA 微调，顺带排查了 GPU 显存释放问题，然后列出完整的修正清单：&lt;/p>
&lt;p>&lt;img alt="pi 通读源码梳理 train 链路，列出 4 个问题与待操作清单（含显存预算）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/22-pipeline-issues-found.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>init 生成了两个关键文件：&lt;code>pdf_to_model_pipeline.py&lt;/code>（主流水线）和 &lt;code>.cache/train_config.yaml&lt;/code>（训练配置）。&lt;/p>
&lt;h3 id="52-必须做的本地化修正单卡-v100--中文数据">5.2 必须做的本地化修正（单卡 V100 + 中文数据）&lt;/h3>
&lt;blockquote>
&lt;p>默认配置按 4 卡 A100 + 英文数据生成，直接训练必然失败，按下表逐项改：&lt;/p>&lt;/blockquote>
&lt;p>&lt;strong>新建输入清单 &lt;code>run_dataflow/input.jsonl&lt;/code>&lt;/strong>（默认路径指向不存在的示例文件）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/run_dataflow/金融大模型应用评测报告-摘要版.pdf&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>修改 &lt;code>pdf_to_model_pipeline.py&lt;/code>&lt;/strong>（10 处）：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>位置&lt;/th>
 &lt;th>默认值&lt;/th>
 &lt;th>改为&lt;/th>
 &lt;th>原因&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>first_entry_file_name&lt;/code>&lt;/td>
 &lt;td>&lt;code>../../example_data/.../kbc_test.jsonl&lt;/code>&lt;/td>
 &lt;td>&lt;code>/home/ubuntu/run_dataflow/input.jsonl&lt;/code>&lt;/td>
 &lt;td>指向自己的数据&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>intermediate_dir&lt;/code>&lt;/td>
 &lt;td>&lt;code>../example_data/...&lt;/code>&lt;/td>
 &lt;td>&lt;code>./.cache/flash/&lt;/code>&lt;/td>
 &lt;td>中间产物落工作目录&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mineru_model_path&lt;/code>&lt;/td>
 &lt;td>&lt;code>&amp;quot;&amp;lt;your Model Path&amp;gt;/...&amp;quot;&lt;/code> 占位符&lt;/td>
 &lt;td>&lt;code>/home/ubuntu/models/MinerU2.5-2509-1.2B&lt;/code>&lt;/td>
 &lt;td>Flash 解析必需，填本地路径&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>num_gpus_per_replica&lt;/code>&lt;/td>
 &lt;td>&lt;code>0.5&lt;/code>&lt;/td>
 &lt;td>&lt;code>0.25&lt;/code>&lt;/td>
 &lt;td>Flash 引擎(1.2B)只需 ~6GB，压缩预算给后续 Qwen 引擎腾显存&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>engine_gpu_util_rate_to_ray_cap&lt;/code>&lt;/td>
 &lt;td>&lt;code>0.9&lt;/code>&lt;/td>
 &lt;td>&lt;code>0.85&lt;/code>&lt;/td>
 &lt;td>同上&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tokenizer_name&lt;/code>&lt;/td>
 &lt;td>&lt;code>Qwen/Qwen2.5-7B-Instruct&lt;/code>&lt;/td>
 &lt;td>&lt;code>/home/ubuntu/models/Qwen2.5-7B-Instruct&lt;/code>&lt;/td>
 &lt;td>免联网拉取&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>vllm_tensor_parallel_size&lt;/code>&lt;/td>
 &lt;td>&lt;code>4&lt;/code>&lt;/td>
 &lt;td>&lt;code>1&lt;/code>&lt;/td>
 &lt;td>本机单卡&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>vllm_max_model_len&lt;/code>&lt;/td>
 &lt;td>（未设置→32768）&lt;/td>
 &lt;td>&lt;code>8192&lt;/code>&lt;/td>
 &lt;td>分块仅 512 token；默认 32K 会导致 KV cache 不足报错&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>vllm_gpu_memory_utilization&lt;/code>&lt;/td>
 &lt;td>&lt;code>0.6&lt;/code>&lt;/td>
 &lt;td>&lt;code>0.85&lt;/code>&lt;/td>
 &lt;td>Flash 释放后独占整卡，拿足 KV 空间&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lang&lt;/code>（两处）&lt;/td>
 &lt;td>&lt;code>&amp;quot;en&amp;quot;&lt;/code>&lt;/td>
 &lt;td>&lt;code>&amp;quot;zh&amp;quot;&lt;/code>&lt;/td>
 &lt;td>中文报告&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>修改 &lt;code>.cache/train_config.yaml&lt;/code>&lt;/strong>（V100 架构限制，不改训练直接报错）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">model_name_or_path&lt;/span>: &lt;span style="color:#ae81ff">/home/ubuntu/models/Qwen2.5-7B-Instruct &lt;/span> &lt;span style="color:#75715e"># 默认 Qwen/Qwen2.5-7B-Instruct 改本地路径&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">fp16&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span> &lt;span style="color:#75715e"># V100(Volta) 仅支持 fp16&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">bf16&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span> &lt;span style="color:#75715e"># bf16 需 Ampere+，V100 开启即报错&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">tf32&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span> &lt;span style="color:#75715e"># TF32 同样需 Ampere+，LLaMA-Factory 硬校验&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>修正后的流水线关键片段：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>storage &lt;span style="color:#f92672">=&lt;/span> FileStorage(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> first_entry_file_name&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/run_dataflow/input.jsonl&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cache_path&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;./.cache/gpu&amp;#34;&lt;/span>, &lt;span style="color:#f92672">...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>knowledge_cleaning_step1 &lt;span style="color:#f92672">=&lt;/span> FileOrURLToMarkdownConverterFlash(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> intermediate_dir&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;./.cache/flash/&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mineru_model_path&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/models/MinerU2.5-2509-1.2B&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> batch_size&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">4&lt;/span>, replicas&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> num_gpus_per_replica&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0.25&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> engine_gpu_util_rate_to_ray_cap&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0.85&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">...&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>llm_serving &lt;span style="color:#f92672">=&lt;/span> LocalModelLLMServing_vllm(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> hf_model_name_or_path&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/models/Qwen2.5-7B-Instruct&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vllm_max_tokens&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2048&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vllm_tensor_parallel_size&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vllm_max_model_len&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">8192&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vllm_gpu_memory_utilization&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0.85&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>knowledge_cleaning_step3 &lt;span style="color:#f92672">=&lt;/span> KBCTextCleaner(llm_serving&lt;span style="color:#f92672">=...&lt;/span>, lang&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;zh&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>self&lt;span style="color:#f92672">.&lt;/span>knowledge_cleaning_step4 &lt;span style="color:#f92672">=&lt;/span> Text2MultiHopQAGenerator(llm_serving&lt;span style="color:#f92672">=...&lt;/span>, lang&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;zh&amp;#34;&lt;/span>, num_q&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">5&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>单卡显存编排是最大的坑&lt;/strong>：Flash 解析引擎的 Ray actor（约 14.5GB）解析完不会自动释放显存，&lt;code>MineruEngine&lt;/code> 也没有 shutdown 接口；不处理的话，后面 Qwen 7B 引擎（约 19GB）一加载就是 CUDA OOM。要在流水线 &lt;code>forward()&lt;/code> 里、step1 解析完成后加释放逻辑：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">_release_mineru_gpu&lt;/span>(self):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 逐个 ray.kill(actor, no_restart=True)（遍历 pipeline.pdf2img / process_img / img2md 的 actors）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># → ray.shutdown() → gc.collect() → torch.cuda.empty_cache()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># → 轮询等待 GPU 空闲率 &amp;gt;90% 再继续（Ray 释放是异步的）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>另外 step5 取数列名为 &lt;code>input_qa_key=&amp;quot;QA_pairs&amp;quot;&lt;/code>（注意大写，误写 &lt;code>Qa_pairs&lt;/code> 会找不到列报错）。&lt;/p>
&lt;p>前面截图里 pi 列的正是这 4 个问题：示例路径不存在、&lt;code>tensor_parallel_size=4&lt;/code>、&lt;code>lang=&amp;quot;en&amp;quot;&lt;/code>、&lt;code>train_config.yaml&lt;/code> 的 bf16——跟这张表一一对应。&lt;/p>&lt;/blockquote>
&lt;h3 id="53-下载两个大模型约-174gb">5.3 下载两个大模型（约 17.4GB）&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>huggingface-cli download opendatalab/MinerU2.5-2509-1.2B &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --local-dir /home/ubuntu/models/MinerU2.5-2509-1.2B &lt;span style="color:#75715e"># 2.4GB，Flash 解析用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>huggingface-cli download Qwen/Qwen2.5-7B-Instruct &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --local-dir /home/ubuntu/models/Qwen2.5-7B-Instruct &lt;span style="color:#75715e"># 14.3GB，QA生成+微调基座&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>长任务后台运行模板（防会话误杀 + 断点续传 + 失败自动重试）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>setsid nohup bash -c &lt;span style="color:#e6db74">&amp;#39;for i in $(seq 1 10); do \
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> huggingface-cli download Qwen/Qwen2.5-7B-Instruct \
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> --local-dir /home/ubuntu/models/Qwen2.5-7B-Instruct &amp;amp;&amp;amp; break; sleep 5; done&amp;#39;&lt;/span> &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> &amp;gt; /tmp/dl_qwen.log 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff">1&lt;/span> &amp;lt; /dev/null &amp;amp;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>下载完验证完整性：Qwen 目录应有 4 个 safetensors 分片（3.7G+3.6G+3.6G+3.4G）加 tokenizer 文件。&lt;/p>&lt;/blockquote>
&lt;p>&lt;img alt="配置修正全部完成（6+2 处）并语法校验通过，启动双模型串行下载脚本" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/23-config-fixed-download.png?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-6-一键微调模型">Step 6 一键微调模型&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd /home/ubuntu/run_dataflow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PYTHONUNBUFFERED&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> setsid nohup dataflow pdf2model train &amp;gt; train.log 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff">1&lt;/span> &amp;lt; /dev/null &amp;amp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tail -f train.log &lt;span style="color:#75715e"># 实时观察&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img alt="训练进程后台启动（PID 52805），90 秒后回看日志" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/24-train-started.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>流水线内部依次执行（日志中依次出现）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Step 1 PDF Detection → Step 2 Data Processing（MinerU解析→分块→Qwen清洗→QA生成）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>→ Step 2.5 数据集注册 → Step 3 数据转换 → Step 4 Training(LlamaFactory)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>成功的标志和产物：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Step 4: Training (LlamaFactory) completed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>train_loss = 3.2454 eval_loss = 3.6028 epoch = 2.0（本例 13 秒完成）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LoRA 适配器: .cache/saves/pdf2model_cache_*/adapter_model.safetensors（155MB）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>训练数据: .cache/data/qa.json —— 自动生成 40 组中文 QA 对
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>如果数据已处理完、只改了训练配置，不用重跑全流程，直接执行第 4 步的等价命令：
&lt;code>llamafactory-cli train .cache/train_config.yaml&lt;/code>&lt;/p>&lt;/blockquote>
&lt;h2 id="step-7-与微调模型交互验证">Step 7 与微调模型交互验证&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd /home/ubuntu/run_dataflow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dataflow chat &lt;span style="color:#75715e"># 自动发现 saves/ 下最新 LoRA 适配器并与基座合并（7.6B params）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img alt="激活 dataflow 环境、启动 dataflow chat，自动发现训练后的适配器" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/25-chat-launch.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>问一个基于报告内容的问题验证效果：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>User&lt;/strong>：金融大模型评测报告主要涵盖哪些评测维度?&lt;/p>
&lt;p>&lt;strong>Assistant&lt;/strong>：金融大模型评测报告主要涵盖以下评测维度：1. 技术性能（准确性/稳定性/响应速度）… 2. 安全性 … 3. 可解释性 … 4. 遵守法规 … 5. 用户体验 …&lt;/p>&lt;/blockquote>
&lt;p>回答紧扣报告主题、结构清晰，链路是通的。&lt;/p>
&lt;p>&lt;img alt="dataflow chat 启动：自动发现 LoRA 适配器（pdf2model_cache_20261021_175536）并加载" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/26-adapter-found.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="适配器合并完成（7.6B params），进入 CLI 对话界面" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/27-model-merged-loaded.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="模型回答紧扣报告内容：准确性/安全性/合规性/鲁棒性/性能/可解释性/用户友好性七个维度" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/28-chat-answer.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-8-量化效果测评dataflow-eval对应教程-112">Step 8 量化效果测评（dataflow eval，对应教程 1.1.2）&lt;/h2>
&lt;p>教程 1.1.2 的对比部分全是截图（同题问答对比加 base/fine_tuned 分数汇总），评分脚本没有随教程提供。好在 DataFlow 仓库自带同一套框架 &lt;code>dataflow eval&lt;/code>（LLM-as-judge 裁判打分），直接拿它做&amp;quot;训练前 vs 训练后&amp;quot;的分数对比。&lt;/p>
&lt;p>pi 给出的四步方案：eval init → 合并 LoRA → 改三个配置槽位 → 后台运行出对比报告：&lt;/p>
&lt;p>&lt;img alt="pi 列出测评执行方案（4 步）：init / 合并 LoRA / 改配置 / 后台运行" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/29-eval-plan.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h3 id="81-前置准备">8.1 前置准备&lt;/h3>
&lt;blockquote>
&lt;p>&lt;strong>显存互斥&lt;/strong>：测评需要约 27GB 显存，先在 chat 终端输入 &lt;code>exit&lt;/code> 退出，&lt;code>nvidia-smi&lt;/code> 确认 0 MiB 再继续。&lt;/p>
&lt;p>&lt;strong>磁盘准备&lt;/strong>：合并后的完整模型约 15GB，磁盘不够先清理安全缓存：
&lt;code>rm -rf ~/.cache/pip ~/.cache/modelscope /tmp/miniconda.sh&lt;/code>（释放约 7.6GB；modelscope 缓存已确认是重复残留，mineru 现用 HF 路径）&lt;/p>&lt;/blockquote>
&lt;h3 id="82-初始化测评配置">8.2 初始化测评配置&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cd /home/ubuntu/run_dataflow
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dataflow eval init &lt;span style="color:#75715e"># 生成 eval_local.py / eval_api.py 配置模板&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="83-合并-lora-为完整模型关键前置">8.3 合并 LoRA 为完整模型（关键前置）&lt;/h3>
&lt;p>被测模型必须能被 vLLM 直接加载，先用 LLaMA-Factory 把适配器合并进基座：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># export_lora.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">model_name_or_path&lt;/span>: &lt;span style="color:#ae81ff">/home/ubuntu/models/Qwen2.5-7B-Instruct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">adapter_name_or_path&lt;/span>: &lt;span style="color:#ae81ff">/home/ubuntu/run_dataflow/.cache/saves/pdf2model_cache_20261021_175536&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">template&lt;/span>: &lt;span style="color:#ae81ff">qwen&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">export_dir&lt;/span>: &lt;span style="color:#ae81ff">/home/ubuntu/models/Qwen2.5-7B-finetuned&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">export_size&lt;/span>: &lt;span style="color:#ae81ff">4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">export_device&lt;/span>: &lt;span style="color:#ae81ff">cpu &lt;/span> &lt;span style="color:#75715e"># 用 CPU 合并，不占 GPU 显存&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>setsid nohup llamafactory-cli export export_lora.yaml &amp;gt; export_lora.log 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff">1&lt;/span> &amp;lt; /dev/null &amp;amp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 约 2 分钟 → 产出 15GB 完整模型（4 分片 + tokenizer）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img alt="LoRA 合并成功（15GB、4 分片完整），接着修改 eval_local.py 三处配置" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/30-lora-merged.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h3 id="84-修改-eval_localpy三个槽位--一个官方模板-bug">8.4 修改 eval_local.py（三个槽位 + 一个官方模板 bug）&lt;/h3>
&lt;p>&lt;strong>裁判模型 JUDGE_MODEL_CONFIG&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;model_path&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/models/Qwen2.5-7B-Instruct&amp;#34;&lt;/span>, &lt;span style="color:#75715e"># 本地 7B 当裁判&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;vllm_temperature&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">0.1&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;vllm_seed&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">42&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;vllm_max_model_len&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">8192&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;gpu_memory_utilization&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">0.85&lt;/span>, &lt;span style="color:#75715e"># 注意键名不带 vllm_ 前缀（create_judge_serving 按 gpu_memory_utilization/max_tokens 读取）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;max_tokens&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">512&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>被测模型 TARGET_MODELS&lt;/strong>（两个条目，参数一致才公平）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;base_model&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/models/Qwen2.5-7B-Instruct&amp;#34;&lt;/span>, &lt;span style="color:#75715e"># 训练前&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;vllm_tensor_parallel_size&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;vllm_temperature&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">0.1&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;vllm_seed&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">42&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;vllm_gpu_memory_utilization&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">0.85&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;answer_prompt&amp;#34;&lt;/span>: 中文作答提示词},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;fine_tuned_model&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/models/Qwen2.5-7B-finetuned&amp;#34;&lt;/span>, &lt;span style="color:#75715e"># 训练后&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#960050;background-color:#1e0010">（&lt;/span>参数同上&lt;span style="color:#960050;background-color:#1e0010">）&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>题库 BENCH_CONFIG&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;pdf_qa_40&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;input_file&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/run_dataflow/.cache/data/qa.json&amp;#34;&lt;/span>, &lt;span style="color:#75715e"># 训练时生成的 40 组 QA&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;question_key&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;input&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;reference_answer_key&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;output&amp;#34;&lt;/span>, &lt;span style="color:#75715e"># 字段名与模板默认一致&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;output_dir&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/run_dataflow/eval_results/pdf_qa_40&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>官方模板有个 bug&lt;/strong>：模板自带的 &lt;code>FairAnswerJudgePrompt&lt;/code> 是普通类，会被判卷算子的 &lt;code>@prompt_restrict&lt;/code> 校验拒绝，报 &lt;code>Invalid prompt_template type&lt;/code>。修复方法是改成继承 &lt;code>DIYPromptABC&lt;/code>（&lt;code>build_prompt&lt;/code> 签名不用动）：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> dataflow.core.prompt &lt;span style="color:#f92672">import&lt;/span> DIYPromptABC
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">FairAnswerJudgePrompt&lt;/span>(DIYPromptABC):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> __init__(self): super()&lt;span style="color:#f92672">.&lt;/span>__init__()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">build_prompt&lt;/span>(self, question, answer, reference_answer): &lt;span style="color:#f92672">...&lt;/span>(原内容不变)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/blockquote>
&lt;h3 id="85-运行测评">8.5 运行测评&lt;/h3>
&lt;blockquote>
&lt;p>长任务建议写成独立启动脚本再 &lt;code>setsid nohup&lt;/code>，避免 shell &lt;code>&amp;amp;&amp;amp;&lt;/code> 链与 &lt;code>&amp;amp;&lt;/code> 的优先级坑（直接内联曾导致启动失败且无日志）。&lt;/p>&lt;/blockquote>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt; /tmp/run_eval.sh &lt;span style="color:#e6db74">&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">source ~/miniconda3/etc/profile.d/conda.sh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">conda activate dataflow
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">cd /home/ubuntu/run_dataflow
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">exec dataflow eval local
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>setsid nohup /tmp/run_eval.sh &amp;gt; eval_run2.log 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff">1&lt;/span> &amp;lt; /dev/null &amp;amp;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>流程自动串行：基座答 40 题 → 微调模型答 40 题 → 裁判判卷 80 条 → 出报告，全程约 5 分钟。&lt;/p>
&lt;p>&lt;img alt="语法校验通过、确认显存干净后后台启动测评（PID 83625）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/31-eval-running.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h3 id="86-测评结果">8.6 测评结果&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>1. [pdf_qa_40] base_model Accuracy: 0.825 (33/40)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2. [pdf_qa_40] fine_tuned_model Accuracy: 0.775 (31/40)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img alt="测评分数汇总：base 82.5%（33/40，平均 98 字）vs fine_tuned 77.5%（31/40，平均 93 字）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/32-eval-scores.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>产物：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>eval_results/all_results.json # 分数汇总
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>eval_results/pdf_qa_40/pdf_qa_40_answers_*.json # 每题原始回答
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.cache/eval/{model}/pdf_qa_40_step1.json # 每题判分明细
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>结果说实话不理想：微调后反而比基座低 5 个点。逐题翻看 4 道判分翻转题，有的两边回答几乎一样却判了不同分。分析下来三个原因：一是 LLM 裁判本身有噪声（±10% 量级）；二是参考答案由 Qwen 基座生成，裁判也是同一个 Qwen，存在自我风格偏好；三是摘要版报告只产出 40 条 QA，训练量太小。这不是流程问题，是数据量问题——换完整版报告（QA 量翻 10 倍以上）、训练/测试题分离、换更强的裁判模型，差距才会拉开。教程里演示的 8.75 vs 8.64 差距也极小，同属方向性验证的量级。&lt;/p>&lt;/blockquote>
&lt;p>&lt;img alt="pi 的归因分析：判卷噪声/自我偏好/训练量太小，及拉开差距的三个改进方向" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/33-eval-analysis.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h2 id="step-9-12-节-gpu-版实操dataflow-init--独立-kbcleaning-流水线">Step 9 1.2 节 GPU 版实操（dataflow init + 独立 KBCleaning 流水线）&lt;/h2>
&lt;p>1.2 教程的原样是：安装 → &lt;code>dataflow init&lt;/code> → 改 &lt;code>first_entry_file_name&lt;/code> → 跑通一条流水线 → 查看缓存结果，以 CPU 版为例。我直接上 GPU 版：能力更强（PDF+URL 混合源、LLM 清洗/QA 生成），环境全部复用 1.1，什么都不用重装。&lt;/p>
&lt;h3 id="91-复用说明不重装任何东西">9.1 复用说明（不重装任何东西）&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>1.2 教程命令&lt;/th>
 &lt;th>我们的处理&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>pip install open-dataflow&lt;/code>&lt;/td>
 &lt;td>跳过——1.1 已装源码版（&lt;code>-e .[pdf2model]&lt;/code>），重复安装会用 PyPI 包覆盖&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>conda 环境 / 模型 / 系统库&lt;/td>
 &lt;td>全局共享层，直接复用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>新建文件夹&lt;/td>
 &lt;td>仅需 &lt;code>mkdir&lt;/code> + &lt;code>dataflow init&lt;/code>（秒级，纯模板文件复制）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="92-新建工作区并初始化">9.2 新建工作区并初始化&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mkdir /home/ubuntu/dataflow_ws &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> cd /home/ubuntu/dataflow_ws
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dataflow init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>init 后当前目录出现：&lt;code>cpu_pipelines/&lt;/code>、&lt;code>gpu_pipelines/&lt;/code>、&lt;code>api_pipelines/&lt;/code>、&lt;code>example_data/&lt;/code>、&lt;code>playground/&lt;/code>、&lt;code>core_text/&lt;/code>、&lt;code>simple_text_pipelines/&lt;/code>——就是教程&amp;quot;init 前后对比&amp;quot;截图里的内容。&lt;/p>
&lt;p>&lt;img alt="pi 给出 1.2 GPU 版操作方案：新建工作区 + dataflow init" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/34-ws-dataflow-init.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h3 id="93-修改输入清单与-gpu-流水线">9.3 修改输入清单与 GPU 流水线&lt;/h3>
&lt;p>&lt;strong>修输入路径&lt;/strong>：&lt;code>example_data/KBCleaningPipeline/kbc_test.jsonl&lt;/code> 里的 PDF 相对路径失效，改绝对路径；3 个 URL 保持不变：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/ubuntu/dataflow_ws/example_data/KBCleaningPipeline/bitter_lesson.pdf&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://trafilatura.readthedocs.io/en/latest/quickstart.html&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://arxiv.org/pdf/2505.07773&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{&lt;span style="color:#f92672">&amp;#34;source&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://arxiv.org/pdf/2503.09516&amp;#34;&lt;/span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>改 &lt;code>gpu_pipelines/kbcleaning/kbcleaning_pipeline_vllm.py&lt;/code>&lt;/strong>（与 1.1 同配方，差异只有两点）：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>参数&lt;/th>
 &lt;th>改为&lt;/th>
 &lt;th>与 1.1 的差异&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>first_entry_file_name&lt;/code>&lt;/td>
 &lt;td>工作区内 kbc_test.jsonl 绝对路径&lt;/td>
 &lt;td>数据源含 URL（新能力）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mineru_model_path&lt;/code> / &lt;code>tokenizer_name&lt;/code> / &lt;code>hf_model_name_or_path&lt;/code>&lt;/td>
 &lt;td>本地模型绝对路径&lt;/td>
 &lt;td>同 1.1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>num_gpus_per_replica&lt;/code>/&lt;code>util&lt;/code>&lt;/td>
 &lt;td>0.25/0.85&lt;/td>
 &lt;td>同 1.1（单卡显存编排）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>vllm_tensor_parallel_size&lt;/code> / &lt;code>max_model_len&lt;/code> / &lt;code>gpu_memory_utilization&lt;/code>&lt;/td>
 &lt;td>1 / 8192 / 0.85&lt;/td>
 &lt;td>同 1.1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lang&lt;/code>&lt;/td>
 &lt;td>保持 &amp;ldquo;en&amp;rdquo;&lt;/td>
 &lt;td>注意：示例数据是英文，与 1.1 的 zh 相反&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>附加逻辑&lt;/td>
 &lt;td>&lt;code>_release_mineru_gpu()&lt;/code> + &lt;code>input_qa_key=&amp;quot;QA_pairs&amp;quot;&lt;/code>&lt;/td>
 &lt;td>同 1.1（两个已知坑）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;img alt="pi 列出 GPU 流水线本地化修改项（复用 1.1 全部经验）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/35-gpu-pipeline-config.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;h3 id="94-独立运行流水线">9.4 独立运行流水线&lt;/h3>
&lt;p>区别于 1.1 的 &lt;code>dataflow pdf2model train&lt;/code> 一键封装，这里直接 &lt;code>python&lt;/code> 执行流水线脚本，结构更直观：&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &amp;gt; /tmp/run_kbc_gpu.sh &lt;span style="color:#e6db74">&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">source ~/miniconda3/etc/profile.d/conda.sh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">conda activate dataflow
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">cd /home/ubuntu/dataflow_ws
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">exec python gpu_pipelines/kbcleaning/kbcleaning_pipeline_vllm.py
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>setsid nohup /tmp/run_kbc_gpu.sh &amp;gt; kbc_gpu.log 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff">1&lt;/span> &amp;lt; /dev/null &amp;amp;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>运行过程要点（日志中依次出现）：&lt;/p>
&lt;ul>
&lt;li>URL 自动抓取：2 篇 arxiv 论文下载为 &lt;code>raw/crawled/crawled_*.pdf&lt;/code>，网页走 HTML 解析通道&lt;/li>
&lt;li>Flash 解析 185 页（GPU ~11.5GB/100%）→ &lt;code>_release_mineru_gpu()&lt;/code> 释放 → Qwen 清洗/QA（GPU ~30GB/95%）&lt;/li>
&lt;li>全程约 15~20 分钟&lt;/li>
&lt;/ul>
&lt;p>&lt;img alt="独立运行流水线的启动命令与结果查看路径（.cache/gpu 每步一档）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/36-run-pipeline.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="kbc_gpu.log 实时进度：LLM 清洗批处理推进至 99%（184/185）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/37-kbc-gpu-log.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>&lt;img alt="阶段状态：URL 抓取完成 → Flash 解析 185 页完成 → Qwen 清洗进行中（GPU 30GB/95%）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/38-pipeline-stages.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;blockquote>
&lt;p>已知问题：vLLM 退出阶段可能挂起不自动结束（结果已全部落盘，不影响），需要 &lt;code>pkill -9 -f kbcleaning&lt;/code> 手动清理。&lt;/p>&lt;/blockquote>
&lt;h3 id="95-结果数据逐级演化12-最值得看的部分">9.5 结果：数据逐级演化（1.2 最值得看的部分）&lt;/h3>
&lt;p>&lt;code>.cache/gpu/&lt;/code> 下每个 step 一档（教程说的 cache_local 等价物），可以直接观察数据演化：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>步骤&lt;/th>
 &lt;th>产物&lt;/th>
 &lt;th>数据量&lt;/th>
 &lt;th>说明&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>step1&lt;/td>
 &lt;td>解析结果&lt;/td>
 &lt;td>4 条&lt;/td>
 &lt;td>1 本地 PDF + 2 arxiv URL + 1 网页 → Markdown&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>step2&lt;/td>
 &lt;td>文本分块&lt;/td>
 &lt;td>115 条&lt;/td>
 &lt;td>512-token 块&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>step3&lt;/td>
 &lt;td>知识清洗&lt;/td>
 &lt;td>115 条&lt;/td>
 &lt;td>Qwen 逐块英文清洗&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>step4&lt;/td>
 &lt;td>QA 生成&lt;/td>
 &lt;td>91 条有效块&lt;/td>
 &lt;td>每块多跳生成 5 问&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>step5&lt;/td>
 &lt;td>格式化&lt;/td>
 &lt;td>&lt;strong>432 组 QA&lt;/strong>&lt;/td>
 &lt;td>Alpaca 格式，存 &lt;code>.cache/data/qa.json&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;img alt=".cache/gpu/ 下 step1~step5 五档缓存文件（数据逐级演化的直接证据）" loading="lazy" src="https://blog-img-1256188149.cos.ap-shanghai.myqcloud.com/dataflow-task1/39-step-cache-files.jpg?imageMogr2/thumbnail/1440x/format/webp/quality/85">&lt;/p>
&lt;p>质量抽样（来自 arxiv 论文）：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Q&lt;/strong>: What is the role of synchronous collection in managing data flow during reinforcement learning?
&lt;strong>A&lt;/strong>: Synchronous collection ensures that there&amp;rsquo;s no excessive data accumulation and manages data shortages efficiently.&lt;/p>&lt;/blockquote>
&lt;h2 id="最终状态确认">最终状态确认&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>验证项&lt;/th>
 &lt;th>结果&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>dataflow -v&lt;/code>&lt;/td>
 &lt;td>1.0.11&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>torch 2.7.0 + V100&lt;/td>
 &lt;td>CUDA 可用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PDF → Markdown&lt;/td>
 &lt;td>&lt;code>.cache/flash/.../vlm/*.md&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>QA 自动生成&lt;/td>
 &lt;td>40 组中文问答对&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>LoRA 微调&lt;/td>
 &lt;td>train_loss 3.25 / eval_loss 3.60&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>对话验证&lt;/td>
 &lt;td>正确回答报告相关问题&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>量化测评&lt;/td>
 &lt;td>base 0.825 vs fine_tuned 0.775（40 题裁判判卷，含逐题明细）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>1.2 GPU 流水线&lt;/td>
 &lt;td>PDF+URL 混合源 → 432 组英文 QA（step1~5 全链路）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>/home/ubuntu/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── DataFlow/ # 代码仓库
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── dataflow_ws/ # 1.2 工作区（dataflow init 生成的完整流水线脚本库）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── cpu_pipelines/ gpu_pipelines/ api_pipelines/ playground/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── example_data/ # 示例数据（PDF + URL 清单）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── .cache/{gpu/step1~5.json, flash/, data/qa.json} # 432 组英文QA
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── run_dataflow/ # 1.1 工作区（日常 chat / train / eval 都在这里执行）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── input.jsonl # 自建：PDF 输入清单（追加 PDF 即加一行）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── pdf_to_model_pipeline.py # 已本地化修正
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── eval_local.py # 已配置：量化测评（Step 8）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── eval_results/ # 测评产物（分数/逐题回答/判分明细）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── .cache/{train_config.yaml, flash/, data/qa.json, saves/}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└── models/ # 自建：本地模型库
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ├── MinerU2.5-2509-1.2B/ # 2.2GB Flash 解析 VLM
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ├── Qwen2.5-7B-Instruct/ # 14.3GB 基座模型（兼裁判/训练前对照）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> └── Qwen2.5-7B-finetuned/ # 15GB LoRA 合并后模型（训练后对照，磁盘紧张可删）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>这次只喂了 1 份摘要版报告（40 组 QA），目的是打通流程；换完整版报告、多喂几份 PDF，模型的领域贴合度会明显上来。&lt;/p>
&lt;hr>
&lt;p>&lt;em>环境：腾讯云 Ubuntu 22.04 / 1×V100-32GB / Miniconda 26.9.3 / open-dataflow 1.0.11 ｜ 2026-10-21&lt;/em>&lt;/p></description></item></channel></rss>