agent-l / README.md
zhou777's picture
Add files using upload-large-folder tool
cf0614b verified
|
Raw
History Blame Contribute Delete
11.8 kB
# agent-base
本仓库用于构建一个面向精准农业场景的多模态大模型闭环系统,当前聚焦于西红柿的单图多目标认知标注、审核、数据构建、训练评估与边缘部署前置实验。
当前论文构想暂定为 `AgriAgent: Semantic-Aware Multi-Agent Annotation Distillation for Edge-Oriented Tomato Maturity Detection`。仓库工程应围绕三条主线推进:
1. 语义感知自动标注:用云端 VLM 的颜色比例、遮挡程度和 reasoning 缓解半成熟边界模糊。
2. 多智能体闭环数据生产:按 Raw / Silver / Gold / Eval 分层沉淀结构化资产,保持审核和训练格式转换解耦。
3. 边缘导向蒸馏:用中型 VLM 做训练、评估和漏标挖掘,再将能力压缩到低资源小模型。
论文框架、当前证据和待补实验见 `docs/paper_alignment.md`
## 截至 2026-03-31 的最新状态
- 正式实验 A 已完整训练结束,产物目录为 `runs/mid/qwen3_5_35b_a3b_exp_a_official/v4-20260323-201311/`
- 当前推荐实验 A 验证模型目录为 `runs/mid/qwen3_5_35b_a3b_exp_a_official/v4-20260323-201311/checkpoint-151-merged/`
- 已补齐验证集推理链路:`prepare_validation_reference -> run_validation_inference -> evaluate_semantic_predictions`
- 验证推理当前默认支持 `vllm``transformers` 双后端,默认走 `vllm`
- 已修复验证解析 bug:模型输出中的字符串形式 `bbox_2d`(如 `"[290, 526, 380, 754]"`)现在可被正确解析,不再出现“模型明明输出了框但评估结果全 0”的假象。
- 实验 A 当前有效验证结果:`precision=0.9145``recall=0.8857``f1=0.8999``avg_iou_on_matched=0.9074`
- 实验 A 验证结果目录:`runs/validation_eval/qwen3_5_35b_a3b_exp_a_official/`
- `tests/test_semantic_evaluator.py` 已新增回归测试,覆盖 `think` 包裹 + 字符串 bbox 的真实模型输出格式。
- 实验 B 已完成正式训练,产物目录为 `runs/mid/qwen3_5_35b_a3b_exp_b_attr/v1-20260331-192847/`,merged 模型目录为 `runs/mid/qwen3_5_35b_a3b_exp_b_attr/v1-20260331-192847/checkpoint-145-merged/`
- 实验 B 首轮验证结果目录为 `runs/validation_eval/qwen3_5_35b_a3b_exp_b_attr/`,当前结果为 `precision=0.9341``recall=0.3699``f1=0.53``occlusion_accuracy_on_matched=0.7953`
- 已确认首轮实验 B 结果不能直接视为模型真实退化,主要问题是验证推理阶段丢失了 `assistant` 输出模板,导致属性增强版样本更容易输出长段分析文本并出现 `parse_failure_count=26`
- `run_validation_inference.py` 已在 `2026-03-31` 修复为:保留原始用户问题,并把 `val.jsonl` 中的 `assistant` 模板转成额外的显式 JSON 输出约束。
- 与该修复对应的回归测试已加入 `tests/test_semantic_evaluator.py`
- 当前待办不是继续改训练,而是在 GPU 空闲后重跑实验 B 验证推理,确认修复后 detection recall 和 parse failure 是否回升。
## 当前稳定数据契约
当前主链路严格遵循以下事实:
- 标注任务已经从“单图单目标”切换为“单图多目标”。
- 当前阶段不再保留 `disease_suspicion` 字段。
- 模型输出的 bbox 统一按 `0-1000` 归一化相对坐标理解。
- reviewer 负责把 `bbox_1000` 转换为像素 `bbox`
- `silver_dataset.jsonl` 采用“每个目标一行”的沉淀方式。
- `gold_builder``image_path` 聚合同图多目标 Silver 记录,再生成单图 Gold 样本。
- 正式 Gold 发布除 `gold_dataset.jsonl` 外,还应同时输出 `summary.json``report.md``sample_check.jsonl`
## 论文结果对应关系
当前仓库已能支撑论文中的数据集、系统架构和中型模型验证部分:
- Gold v1:`2620` 张图像、`22793` 个目标,平均每图 `8.6996` 个目标。
- 成熟度分布:`未成熟=14397``半成熟=3566``完熟=4830`
- 遮挡分布:`无=9727``轻度=9554``重度=3512`
- 实验 A 检测基线:`precision=0.9145``recall=0.8857``f1=0.8999`
- 实验 B 首轮显示属性表达有潜力:`occlusion_accuracy_on_matched=0.7953`,但当前低召回受验证输出协议影响,需要重跑。
论文草稿中提到的边缘 `0.8B/2B` 蒸馏、跨作物泛化和完整消融实验仍未完成,当前文档不得把这些写成已验证结论。
## 截至 2026-03-20 的当前状态
### 1. 数据链路状态
仓库当前已经具备一条可运行的新版多目标数据链路:
- `run_pipeline_silver.py`:生成 Silver
- `pipelines/clean_silver_dataset.py`:清洗已有 Silver
- `pipelines/evaluate_silver_dataset.py`:评估 Silver
- `pipelines/manual_qc.py`:人工复核抽样
- `pipelines/gold_builder.py`:构建 Gold
- `pipelines/check_gold_regression.py`:对比两版 Gold 发布结果,检查是否存在明显回归
- `pipelines/evaluate_semantic_predictions.py`:对结构化预测结果做逐图语义评估
当前推荐下游优先使用 cleaned Silver,而不是原始全量 Silver。
### 2. 现有数据资产
- 原始全量 Silver:`runs/silver/full_rerun_20260311_210637/silver_dataset.jsonl`
- cleaned Silver:`runs/silver/full_rerun_20260311_210637_cleaned/silver_dataset.jsonl`
- Silver 清洗摘要:`runs/silver_cleaning/silver_clean_20260311_223551/summary.json`
- cleaned Silver 评估摘要:`runs/evaluation/silver_eval_20260311_223604/summary.json`
当前 cleaned Silver 规模:
- 记录数:`22793`
- 清洗掉记录:`429`
- 其中超小框剔除:`424`
### 3. 正式 Gold 发布状态
当前已经基于 cleaned Silver 发布正式 Gold:
- 正式 Gold:`runs/gold/gold_release_v1/gold_dataset.jsonl`
- 发布摘要:`runs/gold/gold_release_v1/summary.json`
- 发布报告:`runs/gold/gold_release_v1/report.md`
- 抽样检查:`runs/gold/gold_release_v1/sample_check.jsonl`
当前 `gold_release_v1` 规模:
- 图像数:`2620`
- 目标数:`22793`
- 平均每图目标数:`8.6996`
说明:
- Gold 构建阶段已支持把历史 Windows `image_path` 重写为当前 Linux 可用路径。
- 原始路径会保存在 `source_image_path` 中,便于后续追溯。
- 当前 `gold_release_v1` 已可作为后续训练和评估的正式基线。
### 4. 训练数据与训练脚本准备状态
当前已经基于 `gold_release_v1` 导出两套 `Qwen3.5-35B-A3B` 训练数据:
- 实验 A(官方一致版):
- `runs/swift_data/qwen3_5_35b_a3b_exp_a_official_v2/train.jsonl`
- `runs/swift_data/qwen3_5_35b_a3b_exp_a_official_v2/val.jsonl`
- 实验 B(属性增强版):
- `runs/swift_data/qwen3_5_35b_a3b_exp_b_attr_v2/train.jsonl`
- `runs/swift_data/qwen3_5_35b_a3b_exp_b_attr_v2/val.jsonl`
两套数据共同遵循以下原则:
- 检测主格式走 Swift / Megatron-SWIFT grounding 兼容格式。
- `objects.bbox` 保持像素绝对框,交给 `ms-swift` 自动处理。
- Qwen3.5 的 bbox 输出仍按 `0-1000` 归一化相对坐标理解。
- 实验 A 只保留 `bbox_2d + label`
- 实验 B 在 `bbox_2d + label` 基础上额外增加 `attribute_text`
当前也已补齐两套训练脚本:
- `scripts/train_qwen3_5_35b_a3b_exp_a_official.sh`
- `scripts/train_qwen3_5_35b_a3b_exp_b_attr.sh`
### 5. 训练环境准备状态
当前已完成独立训练环境 `lsy-agent` 的准备和验收:
- Python:`3.11.15`
- `torch 2.10.0+cu128`
- `ms-swift 4.0.2`
- `transformers 5.3.0`
- `deepspeed 0.18.8`
- `flash-linear-attention 0.4.2`
- `flash_attn 2.8.3`
- `causal_conv1d 1.6.1`
已验证:
- `torch.cuda.is_available()``True`
- `flash_attn` 可导入
- `causal_conv1d` 可导入
当前训练环境统一约定为 `lsy-agent`,不要再混用历史 `lsy` 环境。
当前已额外完成并验证:
- `transformer_engine 2.12.0` 可在 `lsy-agent` 中导入
- `megatron-core 0.16.1` 已安装
- 训练脚本已统一把控制台日志落盘到 `runs/logs/`
- 当前正式实验 A 默认改为 `--attention_backend unfused`,以绕过本机 `flash` backend 不可用的问题
截至 `2026-03-23`,实验 A 正式训练已在 `lsy-agent` 中成功拉起并进入 step 级训练循环,最新日志位于 `runs/logs/tomato-exp-a-official_20260323-201257.log`
### 6. 服务器迁移准备状态
为了迁移到 Linux 服务器,当前仓库已经补齐:
- `requirements.txt`
- `.env.example`
- `docs/deployment/deploy_linux.md`
- 最小测试:`tests/test_reviewer.py``tests/test_gold_builder.py`
- 更稳定的 CLI 入口:`run_pipeline_silver.py``pipelines/gold_builder.py``pipelines/manual_qc.py`
另外,仓库中原来本地烟测脚本里的明文 key 已被移除,统一改为走环境变量。
## 当前推荐调用方式
### 1. Linux 上首次部署
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
然后按 `docs/deployment/deploy_linux.md` 配置环境变量与运行顺序。
### 2. Silver 小样本试跑
```bash
python run_pipeline_silver.py --process-limit 10
```
### 3. 评估 cleaned Silver
```bash
python -m pipelines.evaluate_silver_dataset \
--silver-dataset-path runs/silver/full_rerun_20260311_210637_cleaned/silver_dataset.jsonl \
--risk-sample-size 12
```
### 4. 构建正式 Gold
```bash
python -m pipelines.gold_builder \
--silver-dataset-path runs/silver/full_rerun_20260311_210637_cleaned/silver_dataset.jsonl \
--output-dir runs/gold/gold_release_v1
```
默认不传 `--output-dir` 时,会自动生成 `runs/gold/gold_release_<timestamp>/` 发布目录。
### 5. 对比两版 Gold,检查回归
```bash
python -m pipelines.check_gold_regression \
--baseline runs/gold/gold_release_v1 \
--candidate runs/gold/gold_release_v2
```
### 6. 评估结构化预测结果
```bash
python -m pipelines.evaluate_semantic_predictions \
--reference-dataset-path runs/gold/gold_release_v1/gold_dataset.jsonl \
--prediction-dataset-path runs/predictions/model_a_predictions.jsonl
```
### 7. 导出 Qwen3.5 训练数据
```bash
python -m pipelines.export_swift_sft_dataset \
--gold-dataset-path runs/gold/gold_release_v1/gold_dataset.jsonl \
--output-dir runs/swift_data/qwen3_5_35b_a3b_exp_a_official_v2 \
--export-mode official
```
```bash
python -m pipelines.export_swift_sft_dataset \
--gold-dataset-path runs/gold/gold_release_v1/gold_dataset.jsonl \
--output-dir runs/swift_data/qwen3_5_35b_a3b_exp_b_attr_v2 \
--export-mode attr_enhanced
```
### 8. 启动 Qwen3.5-35B-A3B 训练
训练日志会自动写入 `runs/logs/`,便于后续排查与复盘。
```bash
conda activate lsy-agent
bash scripts/train_qwen3_5_35b_a3b_exp_a_official.sh
```
```bash
conda activate lsy-agent
bash scripts/train_qwen3_5_35b_a3b_exp_b_attr.sh
```
说明:
- 当前脚本基于官方 `Qwen3.5-35B-A3B` + Megatron-SWIFT 最佳实践整理。
## 下一步最合理的计划
1. 在 GPU 空闲后,基于已修复的验证推理请求构造重跑实验 B。
2. 重新对比实验 A / B,整理成论文表格:detection、maturity、occlusion、parse failure。
3. 对三联图和风险样本做错误归类,重点分析半成熟、遮挡和密集目标。
4. 补一个可复现的颜色比例一致性检查,用于支撑 `Semantic-Aware Annotation Strategy`
5. 明确边缘模型路线,优先完成一个小模型训练与资源指标采集。
6.`SemanticEvaluator.evaluate_and_mine` 落地为漏标挖掘流程。
7. 在结果稳定后设计消融实验:去语义标注、去审核 Agent、去漏标挖掘、去蒸馏。
## 新会话建议先读
1. `AGENTS.md`
2. `README.md`
3. `docs/architecture.md`
4. `docs/roadmap.md`
5. `docs/current_status.md`
6. `docs/paper_alignment.md`
7. `docs/reference/repo_map.md`
8. `docs/deployment/deploy_linux.md`