Spaces:
Running
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 量化脚本
工作流程
- PTQ 校准 — mtq.quantize(model, INT8_DEFAULT_CFG, forward_loop) 插入假量化器并设置初始 amax
- QAT 微调 — SGD + CosineAnnealing,带假量化 + STE 后向传播
- Amax 更新 — mtq.calibrate(model, "max", forward_loop) 在 QAT 后重新校准
- ONNX 导出 — torch.onnx.export(dynamo=False) (用于 modelopt 的旧版路径)
- 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
✅ 全部完成
- 项目传输
| 项目 | 大小 | 目标路径 | 状态 |
|---|---|---|---|
| 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/ | ✅ |
- 远程环境配置
| 组件 | 版本 | 状态 |
|---|---|---|
| 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) | ✅ |
- prepare_env.sh
已创建在 /home/richard/repos/hf_playground/modules_play/prepare_env.sh,包含 7 步:
系统包 (build-essential, libgl 等)
PyTorch + CUDA 栈
ONNX 栈 (onnx, onnxruntime-gpu, onnx_graphsurgeon 等)
模型/数据集库 (timm≥1.0, transformers, datasets 等)
NVIDIA ModelOpt
工具/评估库 (numpy, scikit-learn, paramiko 等)
HF 离线模式设置 (HF_HUB_OFFLINE=1)
端到端验证
在远程 H20 GPU 上成功运行了量化模型评估: hgnetv2_b2 INT4 rtn_dq: Top-1=90%, Top-5=98% (200 images, 1.2s)
- 代码修复
- 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)
- 加载模型(Qwenbf16,device_map="auto")和 processor。
- 加载 DriveLM 则从 HF 下载v1_1__nus.json)。
- 跑推理(evalua 桶收集预测。
- 按 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 缓存预测,省去重