Spaces:
Running
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 量化脚本 | |
| 工作流程 | |
| 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 映射:<FRONT_VIEW>, <FRONT_LEFT_VIEW> 等 | |
| 数据集 | |
| - 从 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_<split>_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 缓存预测,省去重 |