modules_play / README.md
richard.lin
fix: GPT-score can't work in China.
f663d2c
|
Raw
History Blame Contribute Delete
13.9 kB
metadata
title: Modules Play
emoji: 🖼️
colorFrom: yellow
colorTo: red
sdk: static
pinned: false
license: apache-2.0

QAT

脚本 hgnetv2_b2_qat.py 已完成并验证。以下是摘要:

hgnetv2_b2_qat.py — QAT INT8 量化脚本

工作流程

  1. PTQ 校准 — mtq.quantize(model, INT8_DEFAULT_CFG, forward_loop) 插入假量化器并设置初始 amax
  2. QAT 微调 — SGD + CosineAnnealing,带假量化 + STE 后向传播
  3. Amax 更新 — mtq.calibrate(model, "max", forward_loop) 在 QAT 后重新校准
  4. ONNX 导出 — torch.onnx.export(dynamo=False) (用于 modelopt 的旧版路径)
  5. ONNX Runtime 评估 — 批处理=1,支持 CUDA

主要设计决策

  • 默认使用 CPU,因为 modelopt 的 CUDA 假量化扩展在此系统上无法编译 (nvcc 不支持 c++20)。请使用 --device cuda,如果您的 CUDA 扩展正常工作。
  • 使用 modelopt PyTorch QAT (modelopt.torch.quantization) 而非已弃用的 torch.ao.quantization,因为 modelopt 已安装并支持 INT8_DEFAULT_CFG 下的 CNN 模型。
  • ONNX 导出使用 dynamo=False,因为 modelopt 中的数据相关控制流(if min_amax < 0)与 torch.export 不兼容。

CLI 标志

标志 默认值 描述
--epochs 3 QAT 微调周期数
--lr 1e-5 学习率
--batch-size 32 训练/评估的批处理大小
--calib-samples 1000 PTQ 校准图像数量
--train-samples 0 限制 QAT 训练样本(0=全部)
--device cpu 训练设备(如可用则使用 cuda)
--subset 0 评估前 N 张图像(0=所有 5万张)
--skip-eval - 跳过中间 PTQ/QAT PyTorch 评估
  • 默认使用 CPU,因为 modelopt 的 CUDA 假量化扩展在此系统上无法编译 (nvcc 不支持 c++20)。请使用 --device cuda,如果您的 CUDA 扩展正常工作。
  • 使用 modelopt PyTorch QAT (modelopt.torch.quantization) 而非已弃用的 torch.ao.quantization,因为 modelopt 已安装并支持 INT8_DEFAULT_CFG 下的 CNN 模型。
  • ONNX 导出使用 dynamo=False,因为 modelopt 中的数据相关控制流(if min_amax < 0)与 torch.export 不兼容。

CLI 标志

标志 默认值 描述
--epochs 3 QAT 微调周期数
--lr 1e-5 学习率
--calib-samples 1000 PTQ 校准图像数量
--train-samples 0 限制 QAT 训练样本(0=全部)
下的 CNN 模型。
  • ONNX 导出使用 dynamo=False,因为 modelopt 中的数据相关控制流(if min_amax < 0)与 torch.export 不兼容。

CLI 标志

标志 默认值 描述
--epochs 3 QAT 微调周期数
--lr 1e-5 学习率
--batch-size 32 训练/评估的批处理大小
--calib-samples 1000 PTQ 校准图像数量
--train-samples 0 限制 QAT 训练样本(0=全部)
--device cpu 训练设备(如可用则使用 cuda)
--subset 0 评估前 N 张图像(0=所有 5万张)
--lr 1e-5 学习率
--batch-size 32 训练/评估的批处理大小
--calib-samples 1000 PTQ 校准图像数量
--train-samples 0 限制 QAT 训练样本(0=全部)
--device cpu 训练设备(如可用则使用 cuda)
--subset 0 评估前 N 张图像(0=所有 5万张)
--batch-size 32 训练/评估的批处理大小
--calib-samples 1000 PTQ 校准图像数量
--train-samples 0 限制 QAT 训练样本(0=全部)
--device cpu 训练设备(如可用则使用 cuda)
--subset 0 评估前 N 张图像(0=所有 5万张)
--train-samples 0 限制 QAT 训练样本(0=全部)
--device cpu 训练设备(如可用则使用 cuda)
--subset 0 评估前 N 张图像(0=所有 5万张)
--device cpu 训练设备(如可用则使用 cuda)
--subset 0 评估前 N 张图像(0=所有 5万张)
--subset 0 评估前 N 张图像(0=所有 5万张)
下的 CNN 模型。
  • ONNX 导出使用 dynamo=False,因为 modelopt 中的数据相关控制流(if min_amax < 0)与 torch.export 不兼容。

CLI 标志

标志 默认值 描述
--epochs 3 QAT 微调周期数
--lr 1e-5 学习率
--batch-size 32 训练/评估的批处理大小
--calib-samples 1000 PTQ 校准图像数量
--train-samples 0 限制 QAT 训练样本(0=全部)
--device cpu 训练设备(如可用则使用 cuda)
--subset 0 评估前 N 张图像(0=所有 5万张)
--skip-eval - 跳过中间 PTQ/QAT PyTorch 评估
--calib-only - 在 PTQ 校准后停止
--eval-only - 只评估现有 ONNX 模型

输出文件

qat/int8_qat/ ├── hgnetv2_b2_int8_qat.onnx 45.4 MB # 最终量化 ONNX 模型 ├── hgnetv2_b2_int8_qat.pth 45.3 MB # QAT PyTorch 检查点 └── hgnetv2_b2_int8_qat_calib.pth 45.3 MB # PTQ 校准检查点


脚本已创建完成:prepare_env.sh

✅ 全部完成

  1. 项目传输
项目 大小 目标路径 状态
MODULES_PLAY 7.8 GB /mnt/vepfs/share/GW00387266/MODULES_PLAY/
ImageNet arrow shards (14个) 6.3 GB ~/.cache/huggingface/datasets/Tsomaros___imagenet-1k_validation/...
HF model cache (ViT + hgnetv2) 2.4 GB ~/.cache/huggingface/hub/
  1. 远程环境配置
组件 版本 状态
GPU NVIDIA H20 48GB
CUDA 12.6
PyTorch 2.6.0+cu126
ONNX Runtime GPU 1.21.0 (CUDA+TensorRT)
timm 1.0.27 (升级自0.9.2)
transformers 4.57.6
nvidia-modelopt 0.43.0.dev99
numpy 1.26.4 (升级自1.23.0)
HF_HUB_OFFLINE 1 (已写入.bashrc)
  1. prepare_env.sh

已创建在 /home/richard/repos/hf_playground/modules_play/prepare_env.sh,包含 7 步:

  1. 系统包 (build-essential, libgl 等)

  2. PyTorch + CUDA 栈

  3. ONNX 栈 (onnx, onnxruntime-gpu, onnx_graphsurgeon 等)

  4. 模型/数据集库 (timm≥1.0, transformers, datasets 等)

  5. NVIDIA ModelOpt

  6. 工具/评估库 (numpy, scikit-learn, paramiko 等)

  7. HF 离线模式设置 (HF_HUB_OFFLINE=1)

  8. 端到端验证

在远程 H20 GPU 上成功运行了量化模型评估: hgnetv2_b2 INT4 rtn_dq: Top-1=90%, Top-5=98% (200 images, 1.2s)

  1. 代码修复
  • hgnetv2_b2_eval_quantized.py: pretrained=True → pretrained=False(获取 transform 不需要下载权重)

脚本已创建完成:unidrive_vla_nusc_base_evaluation.py

功能概览

脚本参考 vit_large_patch16_224_evaluate.py 的结构,实现了以下功能:

模型加载

  • 下载并加载 owl10/UniDriveVLA_Nusc_Base_Stage1(Qwen3VLForConditionalGeneration,~2.1B 参数,BF16 精度)
  • 使用 AutoProcessor + qwen_vl_utils.process_vision_info 处理多视角图像输入
  • 6 个 nuScenes 摄像头视角通过特殊 token 映射:, 等

数据集

  • 从 HuggingFace 下载 OpenDriveLab/DriveLM 的 v1.1 nuScenes JSON( gated,需先申请访问权限)
  • 自动解析 scene → key_frame → QA 的层级结构
  • 支持 4 类任务:perception / prediction / planning / behavior
  • 图像路径自动解析到 nuScenes samples/ 目录

评测指标(遵循 DriveLM Challenge 规范)

Tag 指标 适用问题类型 实现
0 Accuracy 多选/是否/behavior 精确匹配
1 GPT-Score 开放式 planning GPT-3.5 打分 (0-100)
2 Language 描述性 perception BLEU-1/2/3/4, ROUGE-L, CIDEr
3 Match 坐标引用 prediction F1(16px L1阈值) + GPT打分

Final Score = 0.4×GPT + 0.2×Language + 0.2×Match + 0.2×Accuracy

使用方法

基本评测(不含 GPT-Score)

python unidrive_vla_nusc_base_evaluation.py
--data_dir /path/to/DriveLM
--nuscenes_dir /path/to/nuscenes

完整评测(含 GPT-Score,需 OpenAI API Key)

python unidrive_vla_nusc_base_evaluation.py
--data_dir /path/to/DriveLM
--nuscenes_dir /path/to/nuscenes
--gpt_eval --openai_api_key sk-xxx

快速测试(子集)

python unidrive_vla_nusc_base_evaluation.py
--subset 50 --data_dir /path/to/DriveLM

保存/加载预测结果(避免重复推理)

python unidrive_vla_nusc_base_evaluation.py
--save_predictions results.json ... python unidrive_vla_nusc_base_evaluation.py
--load_predictions results.json --gpt_eval

依赖

  • transformers (需 Qwen3-VL 支持)
  • qwen-vl-utils
  • nltk, rouge-score, pycocoevalcap(Language 指标)
  • openai(GPT-Score,可选)
  • huggingface_hub(数据集下载)

unidrive_vla_nusc_base_quantize_all.py 已创建完成 (586 行)。

脚本结构

量化 (ModelOpt PyTorch 原生 API)

模式 方法 说明
INT8 percentile calibration 激活+权重均量化,percentile 对 VLM 比 max 更稳健
NVFP4 awq_lite weight-only NVIDIA FP4 格式,仅量化权重,AWQ保留重要权重

校准数据

  • 从 DriveLM 训练集取 128 个样本的多视角图像+问题
  • 通过 forward_loop 传入 mtq.quantize() 收集激活统计

评测

  • 完全复用 unidrive_vla_nusc_base_evaluation.py 的全套指标:
    • Accuracy (tag 0)、GPT-Score (tag 1)、Language Score (tag 2)、Match Score (tag 3)
    • Final Score = 0.4×GPT + 0.2×Language + 0.2×Match + 0.2×Accuracy

执行流程

bf16 baseline → INT8 量化+评测 → NVFP4 量化+评测 → 汇总对比表 → JSON 保存

CLI 用法

python unidrive_vla_nusc_base_quantize_all.py # 全部模式 python unidrive_vla_nusc_base_quantize_all.py --mode int8 # 仅 INT8 python unidrive_vla_nusc_base_quantize_all.py --mode nvfp4 # 仅 NVFP4 python unidrive_vla_nusc_base_quantize_all.py --skip_baseline_eval # 跳过 bf16 python unidrive_vla_nusc_base_quantize_all.py --gpt_eval --openai_api_key KEY # GPT评分 python unidrive_vla_nusc_base_quantize_all.py --subset 100 # 评测前100样本

▎ 注意: 实际运行时 ModelOpt 的 NVFP4 配置可能需要根据安装版本微调 (nf4 vs fp4 格式名、block_size 参数等),建议先跑 --mode int8 验证基础流程,再调试 NVFP4。


评测 owl10/UniDriveVLA_Nusc_Base_Stage1(基于 Qwen3-VL-2B 的驾驶 VLA 模型,benchmark上的表现。DriveLM 是 nuScenes 多视角相机 + 感知/预测/规划/

整体流程(main)

  1. 加载模型(Qwenbf16,device_map="auto")和 processor。
  2. 加载 DriveLM 则从 HF 下载v1_1__nus.json)。
  3. 跑推理(evalua 桶收集预测。
  4. 按 tag 算指标 → 加权得到 Final Score → 打印 + 可选保存预测。

关键设计:QA 分类

classify_questio问题/答案内容启发式分桶(对齐 DriveLM extract_data.py 逻辑):

tag task_type 指标 含义
0 behavior / 多选 / yes-no Accuracy 精确匹配(支持 A/B/C/D 前缀)
1 planning(开放式) GPT-Score GPT 打分 0-100
2 perception(描述性) Language BLEU-1/2/3/4 + ROUGE-L + CIDEr
3 prediction(带坐标 c-tag) Match 坐标 F1(L1 距离 < 16px)+ GPT 分量

Final Score = 0.4·GPT + 0.2·Language + 0.2·Match +

多视角推理(run_

用 UniDriveVLA 等)拼接 6路相机图,Qwen3-VL chat 格式,greedy 解码。

GPT-Score 的鲁棒性(我们刚改的部分)

compute_gpt_score 走 OpenAI(可配 --openai_base_url 代理 + --gpt_model);失(默认0.5)就落回本地 sentence-transformers(--fallback_model,默认 all-MiniLM-L6-v分量共用同一套逻辑。

CLI 参数

--subset N 只评前 N 条(0=全部) --split train|v --data_dir / --nuscenes_dir 本地数据路径 --max_new_token --gpt_eval 开启 GPT-Score(默认关,关了 Tag1/3 的 GPT 分量跳过) --openai_api_key / --openai_base_url / --gpt_model --fallback_mode --save_predictions / --load_predictions 缓存预测,省去重