--- 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/ | ✅ | 2. 远程环境配置 | 组件 | 版本 | 状态 | | --- | ---------------------- | ---- | | 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) | ✅ | 3. 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) 4. 端到端验证 在远程 H20 GPU 上成功运行了量化模型评估: hgnetv2_b2 INT4 rtn_dq: Top-1=90%, Top-5=98% (200 images, 1.2s) 5. 代码修复 - 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 缓存预测,省去重