[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-666DZY666--micronet":3,"tool-666DZY666--micronet":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",155373,2,"2026-04-14T11:34:08",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108322,"2026-04-10T11:39:34",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":78,"owner_twitter":78,"owner_website":78,"owner_url":79,"languages":80,"stars":85,"forks":86,"last_commit_at":87,"license":88,"difficulty_score":10,"env_os":89,"env_gpu":90,"env_ram":89,"env_deps":91,"category_tags":100,"github_topics":101,"view_count":32,"oss_zip_url":78,"oss_zip_packed_at":78,"status":17,"created_at":122,"updated_at":123,"faqs":124,"releases":160},7493,"666DZY666\u002Fmicronet","micronet","micronet, a model compression and deploy lib. compression: 1、quantization: quantization-aware-training(QAT), High-Bit(>2b)(DoReFa\u002FQuantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference)、Low-Bit(≤2b)\u002FTernary and Binary(TWN\u002FBNN\u002FXNOR-Net); post-training-quantization(PTQ), 8-bit(tensorrt); 2、 pruning: normal、regular and group convolutional channel pruning; 3、 group convolution structure; 4、batch-normalization fuse for quantization. deploy: tensorrt, fp32\u002Ffp16\u002Fint8(ptq-calibration)、op-adapt(upsample)、dynamic_shape","micronet 是一款专注于深度学习模型压缩与部署的开源工具库，旨在解决复杂神经网络在移动端及嵌入式设备上存储占用大、计算资源消耗高的问题。它通过量化、剪枝和结构优化等技术，帮助开发者将庞大的模型“瘦身”，使其能更高效、稳定地运行在各类硬件平台上。\n\n该工具特别适合从事算法落地工程的开发人员及研究人员使用。micronet 提供了丰富的量化策略，既支持面向训练的高精度量化（QAT）和训练后量化（PTQ），涵盖从二值、三值到低比特等多种精度选择；也提供常规、规整及分组卷积通道剪枝功能。其独特的技术亮点在于灵活的批归一化（BN）融合机制，能够针对不同类型的量化方案自动调整融合策略，有效减少推理延迟。此外，micronet 深度集成了 TensorRT 部署方案，支持动态形状、算子自适应及多种精度校准，打通了从模型压缩到高性能部署的全流程，让算法落地变得更加简单可控。","# micronet\n\n*\"目前在深度学习领域分类两个派别，一派为学院派，研究强大、复杂的模型网络和实验方法，为了追求更高的性能；另一派为工程派，旨在将算法更稳定、高效的落地在硬件平台上，效率是其追求的目标。复杂的模型固然具有更好的性能，但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。所以，深度神经网络日益增长的规模为深度学习在移动端的部署带来了巨大的挑战，深度学习模型压缩与部署成为了学术界和工业界都重点关注的研究领域之一\"*\n\n## 项目简介\n\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fmicronet)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fmicronet) ![PyPI - Python Version](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fpyversions\u002Fmicronet)\n\n*micronet, a model compression and deploy lib.*\n\n### 压缩\n\n- 量化：High-Bit(>2b): QAT, PTQ, QAFT; Low-Bit(≤2b)\u002FTernary and Binary: QAT\n- 剪枝：正常、规整和分组卷积结构剪枝\n- 针对特征(A)二值量化的BN融合(训练量化后，BN参数 —> conv的偏置b)\n- High-Bit量化的BN融合(训练量化中，先融合再量化，融合：BN参数 —> conv的权重w和偏置b)\n\n### 部署\n\n- TensorRT(fp32\u002Ffp16\u002Fint8(ptq-calibration)、op-adapt(upsample)、dynamic_shape等)\n\n\n## 代码结构\n\n![code_structure](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002F666DZY666_micronet_readme_e2c9a7756d3d.jpg)\n\n```\nmicronet\n├── __init__.py\n├── base_module\n│   ├── __init__.py\n│   └── op.py\n├── compression\n│   ├── README.md\n│   ├── __init__.py\n│   ├── pruning\n│   │   ├── README.md\n│   │   ├── __init__.py\n│   │   ├── gc_prune.py\n│   │   ├── main.py\n│   │   ├── models_save\n│   │   │   └── models_save.txt\n│   │   └── normal_regular_prune.py\n│   └── quantization\n│       ├── README.md\n│       ├── __init__.py\n│       ├── wbwtab\n│       │   ├── __init__.py\n│       │   ├── bn_fuse\n│       │   │   ├── bn_fuse.py\n│       │   │   ├── bn_fused_model_test.py\n│       │   │   └── models_save\n│       │   │       └── models_save.txt\n│       │   ├── main.py\n│       │   ├── models_save\n│       │   │   └── models_save.txt\n│       │   └── quantize.py\n│       └── wqaq\n│           ├── __init__.py\n│           ├── dorefa\n│           │   ├── __init__.py\n│           │   ├── main.py\n│           │   ├── models_save\n│           │   │   └── models_save.txt\n│           │   ├── quant_model_test\n│           │   │   ├── models_save\n│           │   │   │   └── models_save.txt\n│           │   │   ├── quant_model_para.py\n│           │   │   └── quant_model_test.py\n│           │   └── quantize.py\n│           └── iao\n│               ├── __init__.py\n│               ├── bn_fuse\n│               │   ├── bn_fuse.py\n│               │   ├── bn_fused_model_test.py\n│               │   └── models_save\n│               │       └── models_save.txt\n│               ├── main.py\n│               ├── models_save\n│               │   └── models_save.txt\n│               └── quantize.py\n├── data\n│   └── data.txt\n├── deploy\n│   ├── README.md\n│   ├── __init__.py\n│   └── tensorrt\n│       ├── README.md\n│       ├── __init__.py\n│       ├── calibrator.py\n│       ├── eval_trt.py\n│       ├── models\n│       │   ├── __init__.py\n│       │   └── models_trt.py\n│       ├── models_save\n│       │   └── calibration_seg.cache\n│       ├── test_trt.py\n│       └── util_trt.py\n├── models\n│   ├── __init__.py\n│   ├── nin.py\n│   ├── nin_gc.py\n│   └── resnet.py\n└── readme_imgs\n    ├── code_structure.jpg\n    └── micronet.xmind\n```\n\n\n## 项目进展\n- **2019.12.4**, 初次提交\n- **12.8**, DoReFa特征(A)量化前先进行缩放(* 0.1)，然后再截断，以减小截断误差\n- **12.11**, 增加项目代码结构图\n- 12.12, 完善使用示例\n- 12.14, 增加:1、BN融合量化情况(W三值\u002F二值)可选，即训练量化时选择W三\u002F二值，这里则对应选择; 2、BN融合时对卷积核(conv)不带偏置(bias)的处理\n- **12.17**, 增加模型压缩前后数据对比(示例)\n- 12.20, 增加设备可选(cpu、gpu(单卡、多卡))\n- **12.27**, 补充相关论文\n- 12.29, 取消High-Bit量化8-bit以内的限制，即现在可以量化至10-bit、16-bit等\n- **2020.2.17**, 1、精简W三值\u002F二值量化代码; 2、加速W三值量化训练\n- **2.18**, 优化针对特征(A)二值的BN融合:去除对BN层gamma参数的限制，即现在此情况下融合时BN可正常训练\n- **2.24**, 再次优化三\u002F二值量化代码组织结构，增强可移植性，旧版确实不太好移植。目前移植方法：将想要量化的Conv用compression\u002Fquantization\u002Fwbwtab\u002Fmodels\u002Futil_wbwtab.py中的QuantConv2d替换即可，可参照该路径下nin_gc.py中的使用方法\n- **3.1**, 新增：1、google的High-Bit量化方法; 2、训练中High-Bit量化的BN融合\n- **3.2、3.3**, 规整量化代码整体结构，目前所有量化方法都可采取类似的移植方式：将想要量化的Conv(或FC，目前dorefa支持，其他方法类似可写)用models\u002Futil_wxax.py中的QuantConv2d(或QuantLinear)替换即可，可分别参照该路径下nin_gc.py中的使用方法进行移植（分类、检测、分割等均适用，但需要据实际情况具体调试）\n- **3.4**, 规整优化wbwtab\u002Fbn_fuse中“针对特征(A)二值的BN融合”的相关实现代码，可进行BN融合及融合前后模型对比测试(精度\u002F速度\u002F(大小))\n- 3.11, 调整compression\u002Fwqaq\u002Fiao中的BN层momentum参数(0.1 —> 0.01),削弱batch统计参数占比,一定程度抑制量化带来的抖动。经实验,量化训练更稳定,acc提升1%左右\n- **3.13**, 更新代码结构图\n- 4.6, 修正二值量化训练中W_clip的相关问题(之前由于这个，导致二值量化训练精度上不去，现在已可正常使用)(同时修正无法找到一些模块如models\u002Futil_wxax.py的问题)\n- **12.14**, 1、improve code structure; 2、add deploy-tensorrt(main module, but not running yet)\n- 12.18, 1、improve code structure\u002Fmodule reference\u002Fmodule_name; 2、add transfer-use demo\n- **12.21**, improve pruning-quantization pipeline and code\n- **2021.1.4**, add other quant_op\n- 1.5, add quant_weight's per-channel and per-layer selection\n- **1.7**, fix iao's loss-nan bug. The bug is due to per-channel min\u002Fmax error\n- 1.8, 1、improve quant_para save. Now, only save scale and zero_point; 2、add optional weight_observer(MinMaxObserver or MovingAverageMinMaxObserver)\n- **1.11**, fix bug in binary_a(1\u002F0) and binary_w preprocessing\n- **1.12**, add \"pip install\"\n- **1.22**, add auto_insert_quant_op(this still needs to be improved)\n- **1.27**, improve auto_insert_quant_op(now you can easily use quantization, as [quant_test_auto](#quant_test_auto.py))\n- 1.28, 1、fix prune-quantization pipeline and code; 2、improve code structure\n- **2.1**, improve wbwtab_bn_fuse\n- **2.4**, 1、add wqaq_bn_fuse; 2、add quant_model_inference_simulation; 3、improve code format\n- 4.30, 1、update code_structure img; 2、fix iao's quant_weight_range, quant_contrans and quant_bn_fuse_conv pretrained_model bn_para load bug\n- **5.4**, add **qaft**, it's beneficial to improve the quantization accuracy\n- **5.6**, add **ptq**, its quantization accuracy is also good\n- 5.11, add bn_fuse_calib flag\n- **5.14**, 1、change **ste** to **clip_ste**, it's beneficial to improve the quant_train；2、remove quant_relu and add quant_leaky_relu\n- 5.15, fix bug in quant_model_para post-processing\n- **6.7**, add quant_add(need use base_module's op) and quant_resnet demo\n- **6.9**, iao_quant supports multi gpus\n- 6.16, fix quant_round() and quant_binary()\n- 10.6, format\n\n\n## 环境要求\n\n- python >= 3.5\n- torch >= 1.1.0\n- torchvison >= 0.3.0\n- numpy\n- onnx == 1.6.0\n- tensorrt == 7.0.0.11\n\n\n## 安装\n\n[PyPI](https:\u002F\u002Fpypi.org\u002Fproject\u002Fmicronet\u002F)\n\n```bash\npip install micronet -i https:\u002F\u002Fpypi.org\u002Fsimple\n```\n\n[GitHub](https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet)\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet.git\ncd micronet\npython setup.py install\n```\n\n*验证*\n\n```bash\npython -c \"import micronet; print(micronet.__version__)\"\n```\n\n## 测试\n\n*Install from github*\n\n### 压缩\n\n#### 量化\n\n*--refine,可加载预训练浮点模型参数,在其基础上做量化*\n\n##### wbwtab\n\n--W --A, 权重W和特征A量化取值\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwbwtab\n```\n\n- WbAb\n\n```bash\npython main.py --W 2 --A 2\n```\n\n- WbA32\n\n```bash\npython main.py --W 2 --A 32\n```\n\n- WtAb\n\n```bash\npython main.py --W 3 --A 2\n```\n\n- WtA32\n\n```bash\npython main.py --W 3 --A 32\n```\n\n##### wqaq\n\n--w_bits --a_bits, 权重W和特征A量化位数\n\n###### dorefa\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\n```\n\n- W16A16\n\n```bash\npython main.py --w_bits 16 --a_bits 16\n```\n\n- W8A8\n\n```bash\npython main.py --w_bits 8 --a_bits 8\n```\n\n- W4A4\n\n```bash\npython main.py --w_bits 4 --a_bits 4\n```\n\n- 其他bits情况类比\n\n###### iao\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\n```\n\n*量化位数选择同dorefa*\n\n*单卡*\n\n**QAT\u002FPTQ  —>  QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n--q_type, 量化类型(0-对称, 1-非对称)\n\n--q_level, 权重量化级别(0-通道级, 1-层级)\n\n--weight_observer, weight_observer选择(0-MinMaxObserver, 1-MovingAverageMinMaxObserver)\n\n--bn_fuse, 量化中bn融合标志\n\n--bn_fuse_calib, 量化中bn融合校准标志\n\n--pretrained_model, 预训练浮点模型\n\n--qaft, qaft标志\n\n--ptq, ptq_observer\n\n--ptq_control, ptq_control\n\n--ptq_batch, ptq的batch数量\n\n--percentile, ptq校准的比例\n\n**QAT**\n\n- 默认: 对称、(权重)通道级量化, bn不融合, weight_observer-MinMaxObserver, 不加载预训练浮点模型, 进行qat\n\n```bash\npython main.py --q_type 0 --q_level 0 --weight_observer 0\n```\n\n- 对称、(权重)通道级量化, bn不融合, weight_observer-MovingAverageMinMaxObserver\n\n```bash\npython main.py --q_type 0 --q_level 0 --weight_observer 1\n```\n\n- 对称、(权重)层级量化, bn不融合\n\n```bash\npython main.py --q_type 0 --q_level 1\n```\n\n- 非对称、(权重)通道级量化, bn不融合\n\n```bash\npython main.py --q_type 1 --q_level 0\n```\n\n- 非对称、(权重)层级量化, bn不融合\n\n```bash\npython main.py --q_type 1 --q_level 1\n```\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --q_type 0 --q_level 0 --bn_fuse\n```\n\n- 对称、(权重)层级量化, bn融合\n\n```bash\npython main.py --q_type 0 --q_level 1 --bn_fuse\n```\n\n- 非对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --q_type 1 --q_level 0 --bn_fuse\n```\n\n- 非对称、(权重)层级量化, bn融合\n\n```bash\npython main.py --q_type 1 --q_level 1 --bn_fuse\n```\n\n- 对称、(权重)通道级量化, bn融合校准\n\n```bash\npython main.py --q_type 0 --q_level 0 --bn_fuse --bn_fuse_calib\n```\n\n**PTQ**\n\n*需要加载预训练浮点模型,本项目中其可由剪枝中采用正常训练获取*\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --refine ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc.pth --q_level 0 --bn_fuse --pretrained_model --ptq_control --ptq --batch_size 32 --ptq_batch 200 --percentile 0.999999\n```\n\n- 其他情况类比\n\n**QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n**QAT  —>  QAFT**\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --resume models_save\u002Fnin_gc_bn_fused.pth --q_type 0 --q_level 0 --bn_fuse --qaft --lr 0.00001\n```\n\n- 其他情况类比\n\n**PTQ  —>  QAFT**\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --resume models_save\u002Fnin_gc_bn_fused.pth --q_level 0 --bn_fuse --qaft --lr 0.00001 --ptq\n```\n\n- 其他情况类比\n\n#### 剪枝\n\n*稀疏训练  —>  剪枝  —>  微调*\n\n```bash\ncd micronet\u002Fcompression\u002Fpruning\n```\n\n##### 稀疏训练\n\n-sr 稀疏标志\n\n--s 稀疏率(需根据dataset、model情况具体调整)\n\n--model_type 模型类型(0-nin, 1-nin_gc)\n\n- nin(正常卷积结构)\n\n```bash\npython main.py -sr --s 0.0001 --model_type 0\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py -sr --s 0.001 --model_type 1\n```\n\n##### 剪枝\n\n--percent 剪枝率\n\n--normal_regular 正常、规整剪枝标志及规整剪枝基数(如设置为N,则剪枝后模型每层filter个数即为N的倍数)\n\n--model 稀疏训练后的model路径\n\n--save 剪枝后保存的model路径（路径默认已给出, 可据实际情况更改）\n\n- 正常剪枝(nin)\n\n```bash\npython normal_regular_prune.py --percent 0.5 --model models_save\u002Fnin_sparse.pth --save models_save\u002Fnin_prune.pth\n```\n\n- 规整剪枝(nin)\n\n```bash\npython normal_regular_prune.py --percent 0.5 --normal_regular 8 --model models_save\u002Fnin_sparse.pth --save models_save\u002Fnin_prune.pth\n```\n\n或\n\n```bash\npython normal_regular_prune.py --percent 0.5 --normal_regular 16 --model models_save\u002Fnin_sparse.pth --save models_save\u002Fnin_prune.pth\n```\n\n- 分组卷积结构剪枝(nin_gc)\n\n```bash\npython gc_prune.py --percent 0.4 --model models_save\u002Fnin_gc_sparse.pth\n```\n\n##### 微调\n\n--prune_refine 剪枝后的model路径（在其基础上做微调）\n\n- nin\n\n```bash\npython main.py --model_type 0 --prune_refine models_save\u002Fnin_prune.pth\n```\n\n- nin_gc\n\n*需要传入**剪枝**后得到的新模型的**cfg***\n\n*如*\n\n```bash\npython main.py --model_type 1 --gc_prune_refine 154 162 144 304 320 320 608 584\n```\n\n#### 剪枝 —> 量化（注意剪枝率和量化率平衡）\n\n*加载剪枝后的浮点模型再做量化*\n\n##### 剪枝 —> 量化（高位）（剪枝率偏大、量化率偏小）\n\n###### w8a8(dorefa)\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\n```\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth\n```\n\n###### w8a8(iao)\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\n```\n\n**QAT\u002FPTQ  —>  QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n**QAT**\n\n*bn不融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth --lr 0.001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth --lr 0.001\n```\n\n*bn融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth --bn_fuse --pretrained_model --lr 0.001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth --bn_fuse --pretrained_model --lr 0.001\n```\n\n**PTQ**\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth --bn_fuse --pretrained_model --ptq_control --ptq --batch_size 32 --ptq_batch 200 --percentile 0.999999\n```\n\n- 其他情况类比\n\n**QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n**QAT  —>  QAFT**\n\n*bn不融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin.pth --qaft --lr 0.00001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc.pth --qaft --lr 0.00001\n```\n\n*bn融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin_bn_fused.pth --bn_fuse --qaft --lr 0.00001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc_bn_fused.pth --bn_fuse --qaft --lr 0.00001\n```\n\n**PTQ  —>  QAFT**\n\n*bn不融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin.pth --qaft --lr 0.00001 --ptq\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc.pth --qaft --lr 0.00001 --ptq\n```\n\n*bn融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin_bn_fused.pth --bn_fuse --qaft --lr 0.00001 --ptq\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc_bn_fused.pth --bn_fuse --qaft --lr 0.00001 --ptq\n```\n\n###### 其他可选量化配置类比\n\n##### 剪枝 —> 量化（低位）（剪枝率偏小、量化率偏大）\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwbwtab\n```\n\n###### wbab\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --W 2 --A 2 --model_type 0 --prune_quant ..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --W 2 --A 2 --model_type 1 --prune_quant ..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth\n```\n\n###### 其他取值情况类比\n\n\n#### BN融合与量化推理仿真测试\n\n##### wbwtab\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwbwtab\u002Fbn_fuse\n```\n\n###### bn_fuse(得到quant_model_train和quant_bn_fused_model_inference的结构和参数)\n\n*--model_type, 1 - nin_gc(含分组卷积结构); 0 - nin(正常卷积结构)*\n\n*--prune_quant, 剪枝_量化模型标志*\n\n*--W, weight量化取值*\n\n*均需要与量化训练保持一致,可直接用默认*\n\n- nin_gc, quant_model, wb\n\n```bash\npython bn_fuse.py --model_type 1 --W 2\n```\n\n- nin_gc, prune_quant_model, wb\n\n```bash\npython bn_fuse.py --model_type 1 --prune_quant --W 2\n```\n\n- nin_gc, quant_model, wt\n\n```bash\npython bn_fuse.py --model_type 1 --W 3\n```\n\n- nin, quant_model, wb\n\n```bash\npython bn_fuse.py --model_type 0 --W 2\n```\n\n###### bn_fused_model_test(对quant_model_train和quant_bn_fused_model_inference进行测试)\n\n```bash\npython bn_fused_model_test.py\n```\n\n##### dorefa\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\u002Fquant_model_test\n```\n\n###### quant_model_para(得到quant_model_train和quant_model_inference的结构和参数)\n\n*--model_type, 1 - nin_gc(含分组卷积结构); 0 - nin(正常卷积结构)*\n\n*--prune_quant, 剪枝_量化模型标志*\n\n*--w_bits, weight量化位数; --a_bits, activation量化位数*\n\n*均需要与量化训练保持一致,可直接用默认*\n\n- nin_gc, quant_model, w8a8\n\n```bash\npython quant_model_para.py --model_type 1 --w_bits 8 --a_bits 8\n```\n\n- nin_gc, prune_quant_model, w8a8\n\n```bash\npython quant_model_para.py --model_type 1 --prune_quant --w_bits 8 --a_bits 8\n```\n\n- nin, quant_model, w8a8\n\n```bash\npython quant_model_para.py --model_type 0 --w_bits 8 --a_bits 8\n```\n\n###### quant_model_test(对quant_model_train和quant_model_inference进行测试)\n\n```bash\npython quant_model_test.py\n```\n\n##### iao\n\n***注意,量化训练时 --bn_fuse 需要设置为 True***\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\u002Fbn_fuse\n```\n\n###### bn_fuse(得到quant_bn_fused_model_train和quant_bn_fused_model_inference的结构和参数)\n\n*--model_type, 1 - nin_gc(含分组卷积结构); 0 - nin(正常卷积结构)*\n\n*--prune_quant, 剪枝_量化模型标志*\n\n*--w_bits, weight量化位数; --a_bits, activation量化位数*\n\n*--q_type, 0 - 对称; 1 - 非对称*\n\n*--q_level, 0 - 通道级; 1 - 层级*\n\n*均需要与量化训练保持一致,可直接用默认*\n\n- nin_gc, quant_model, w8a8\n\n```bash\npython bn_fuse.py --model_type 1 --w_bits 8 --a_bits 8\n```\n\n- nin_gc, prune_quant_model, w8a8\n\n```bash\npython bn_fuse.py --model_type 1 --prune_quant --w_bits 8 --a_bits 8\n```\n\n- nin, quant_model, w8a8\n\n```bash\npython bn_fuse.py --model_type 0 --w_bits 8 --a_bits 8\n```\n\n- nin_gc, quant_model, w8a8, 非对称, 层级\n\n```bash\npython bn_fuse.py --model_type 0 --w_bits 8 --a_bits 8 --q_type 1 --q_level 1\n```\n\n###### bn_fused_model_test(对quant_bn_fused_model_train和quant_bn_fused_model_inference进行测试)\n\n```bash\npython bn_fused_model_test.py\n```\n\n#### 设备选取\n\n*现支持cpu、gpu(单卡、多卡)*\n\n--cpu 使用cpu，--gpu_id 使用并选择gpu\n\n- cpu\n\n```bash\npython main.py --cpu\n```\n\n- gpu单卡\n\n```bash\npython main.py --gpu_id 0\n```\n\n或\n\n```bash\npython main.py --gpu_id 1\n```\n\n- gpu多卡\n\n```bash\npython main.py --gpu_id 0,1\n```\n\n或\n\n```bash\npython main.py --gpu_id 0,1,2\n```\n\n*默认，使用服务器全卡*\n\n### 部署\n\n#### TensorRT\n\n*目前仅提供相关**核心模块**代码，后续再加入完整可运行demo*\n\n##### 相关解读\n- [tensorrt-基础](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F336256668)\n- [tensorrt-op\u002Fdynamic_shape](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F335829625)\n\n\n## 迁移\n\n### 量化训练\n\n#### LeNet example\n\n##### quant_test_manual.py\n\n*A model can be quantized(High-Bit(>2b)、Low-Bit(≤2b)\u002FTernary and Binary) by simply replacing ***op*** with ***quant_op***.*\n\n```python\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n# some base_op, such as ``Add``、``Concat``\nfrom micronet.base_module.op import *\n\n# ``quantize`` is quant_module, ``QuantConv2d``, ``QuantLinear``, ``QuantMaxPool2d``, ``QuantReLU`` are quant_op\nfrom micronet.compression.quantization.wbwtab.quantize import (\n    QuantConv2d as quant_conv_wbwtab,\n)\nfrom micronet.compression.quantization.wbwtab.quantize import (\n    ActivationQuantizer as quant_relu_wbwtab,\n)\nfrom micronet.compression.quantization.wqaq.dorefa.quantize import (\n    QuantConv2d as quant_conv_dorefa,\n)\nfrom micronet.compression.quantization.wqaq.dorefa.quantize import (\n    QuantLinear as quant_linear_dorefa,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantConv2d as quant_conv_iao,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantLinear as quant_linear_iao,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantMaxPool2d as quant_max_pool_iao,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantReLU as quant_relu_iao,\n)\n\n\nclass LeNet(nn.Module):\n    def __init__(self):\n        super(LeNet, self).__init__()\n        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n        self.fc1 = nn.Linear(320, 50)\n        self.fc2 = nn.Linear(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nclass QuantLeNetWbWtAb(nn.Module):\n    def __init__(self):\n        super(QuantLeNetWbWtAb, self).__init__()\n        self.conv1 = quant_conv_wbwtab(1, 10, kernel_size=5)\n        self.conv2 = quant_conv_wbwtab(10, 20, kernel_size=5)\n        self.fc1 = nn.Linear(320, 50)\n        self.fc2 = nn.Linear(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = quant_relu_wbwtab()\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nclass QuantLeNetDoReFa(nn.Module):\n    def __init__(self):\n        super(QuantLeNetDoReFa, self).__init__()\n        self.conv1 = quant_conv_dorefa(1, 10, kernel_size=5)\n        self.conv2 = quant_conv_dorefa(10, 20, kernel_size=5)\n        self.fc1 = quant_linear_dorefa(320, 50)\n        self.fc2 = quant_linear_dorefa(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nclass QuantLeNetIAO(nn.Module):\n    def __init__(self):\n        super(QuantLeNetIAO, self).__init__()\n        self.conv1 = quant_conv_iao(1, 10, kernel_size=5)\n        self.conv2 = quant_conv_iao(10, 20, kernel_size=5)\n        self.fc1 = quant_linear_iao(320, 50)\n        self.fc2 = quant_linear_iao(50, 10)\n        self.max_pool = quant_max_pool_iao(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nlenet = LeNet()\nquant_lenet_wbwtab = QuantLeNetWbWtAb()\nquant_lenet_dorefa = QuantLeNetDoReFa()\nquant_lenet_iao = QuantLeNetIAO()\n\nprint(\"***ori_model***\\n\", lenet)\nprint(\"\\n***quant_model_wbwtab***\\n\", quant_lenet_wbwtab)\nprint(\"\\n***quant_model_dorefa***\\n\", quant_lenet_dorefa)\nprint(\"\\n***quant_model_iao***\\n\", quant_lenet_iao)\n\nprint(\"\\nquant_model is ready\")\nprint(\"micronet is ready\")\n```\n\n##### quant_test_auto.py\n\n*A model can be quantized(High-Bit(>2b)、Low-Bit(≤2b)\u002FTernary and Binary) by simply using ***micronet.compression.quantization.quantize.prepare(model)***.*\n\n```python\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n# some base_op, such as ``Add``、``Concat``\nfrom micronet.base_module.op import *\n\nimport micronet.compression.quantization.wqaq.dorefa.quantize as quant_dorefa\nimport micronet.compression.quantization.wqaq.iao.quantize as quant_iao\n\n\nclass LeNet(nn.Module):\n    def __init__(self):\n        super(LeNet, self).__init__()\n        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n        self.fc1 = nn.Linear(320, 50)\n        self.fc2 = nn.Linear(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\n\"\"\"\n--w_bits --a_bits, 权重W和特征A量化位数\n--q_type, 量化类型(0-对称, 1-非对称)\n--q_level, 权重量化级别(0-通道级, 1-层级)\n--weight_observer, weight_observer选择(0-MinMaxObserver, 1-MovingAverageMinMaxObserver)\n--bn_fuse, 量化中bn融合标志\n--bn_fuse_calib, 量化中bn融合校准标志\n--pretrained_model, 预训练浮点模型\n--qaft, qaft标志\n--ptq, ptq标志\n--percentile, ptq校准的比例\n\"\"\"\nlenet = LeNet()\nquant_lenet_dorefa = quant_dorefa.prepare(lenet, inplace=False, a_bits=8, w_bits=8)\nquant_lenet_iao = quant_iao.prepare(\n    lenet,\n    inplace=False,\n    a_bits=8,\n    w_bits=8,\n    q_type=0,\n    q_level=0,\n    weight_observer=0,\n    bn_fuse=False,\n    bn_fuse_calib=False,\n    pretrained_model=False,\n    qaft=False,\n    ptq=False,\n    percentile=0.9999,\n)\n\n# if ptq == False, do qat\u002Fqaft, need train\n# if ptq == True, do ptq, don't need train\n# you can refer to micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\u002Fmain.py\n\nprint(\"***ori_model***\\n\", lenet)\nprint(\"\\n***quant_model_dorefa***\\n\", quant_lenet_dorefa)\nprint(\"\\n***quant_model_iao***\\n\", quant_lenet_iao)\n\nprint(\"\\nquant_model is ready\")\nprint(\"micronet is ready\")\n```\n\n#### test\n\n##### quant_test_manual\n\n```bash\npython -c \"import micronet; micronet.quant_test_manual()\"\n```\n\n##### quant_test_auto\n\n```bash\npython -c \"import micronet; micronet.quant_test_auto()\"\n```\n\n*when outputting \"quant_model is ready\", micronet is ready.*\n\n### 量化推理\n\n***参考[BN融合与量化推理仿真测试](#bn融合与量化推理仿真测试)***\n\n## 模型压缩数据对比（仅供参考）\n\n*以下为cifar10示例，可在更冗余模型、更大数据集上尝试其他组合压缩方式*\n\n|类型|W(Bits)|A(Bits)|Acc|GFLOPs|Para(M)|Size(MB)|压缩率|损失|\n|:-:|:-----:|:-----:|:--:|:---:|:-----:|:------:|:---:|:-:|\n|原模型(nin)|FP32|FP32|91.01%|0.15|0.67|2.68|***|***|\n|采用分组卷积结构(nin_gc)|FP32|FP32|91.04%|0.15|0.58|2.32|13.43%|-0.03%|\n|剪枝|FP32|FP32|90.26%|0.09|0.32|1.28|52.24%|0.75%|\n|量化|1|FP32|90.93%|***|0.58|0.204|92.39%|0.08%|\n|量化|1.5|FP32|91%|***|0.58|0.272|89.85%|0.01%|\n|量化|1|1|86.23%|***|0.58|0.204|92.39%|4.78%|\n|量化|1.5|1|86.48%|***|0.58|0.272|89.85%|4.53%|\n|量化(DoReFa)|8|8|91.03%|***|0.58|0.596|77.76%|-0.02%|\n|量化(IAO,全量化,symmetric\u002Fper-channel\u002Fbn_fuse)|8|8|90.99%|***|0.58|0.596|77.76%|0.02%|\n|分组+剪枝+量化|1.5|1|86.13%|***|0.32|0.19|92.91%|4.88%|\n\n*--train_batch_size 256, 单卡*\n\n## 相关资料\n\n### 压缩\n\n#### 量化\n\n##### QAT\n\n###### 二值\n\n- [BinarizedNeuralNetworks: TrainingNeuralNetworkswithWeightsand ActivationsConstrainedto +1 or−1](https:\u002F\u002Farxiv.org\u002Fabs\u002F1602.02830)\n\n- [XNOR-Net:ImageNetClassiﬁcationUsingBinary ConvolutionalNeuralNetworks](https:\u002F\u002Farxiv.org\u002Fabs\u002F1603.05279)\n\n- [AN EMPIRICAL STUDY OF BINARY NEURAL NETWORKS’ OPTIMISATION](https:\u002F\u002Fopenreview.net\u002Fforum?id=rJfUCoR5KX)\n\n- [A Review of Binarized Neural Networks](https:\u002F\u002Fwww.semanticscholar.org\u002Fpaper\u002FA-Review-of-Binarized-Neural-Networks-Simons-Lee\u002F0332fdf00d7ff988c5b66c47afd49431eafa6cd1)\n\n###### 三值\n\n- [Ternary weight networks](https:\u002F\u002Farxiv.org\u002Fabs\u002F1605.04711)\n\n###### High-Bit\n\n- [DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients](https:\u002F\u002Farxiv.org\u002Fabs\u002F1606.06160)\n- [Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference](https:\u002F\u002Farxiv.org\u002Fabs\u002F1712.05877)\n- [Quantizing deep convolutional networks for efficient inference: A whitepaper](https:\u002F\u002Farxiv.org\u002Fabs\u002F1806.08342)\n\n##### PTQ\n\n###### High-Bit\n\n- [tensorrt-ptq-8-bit](https:\u002F\u002Fon-demand.gputechconf.com\u002Fgtc\u002F2017\u002Fpresentation\u002Fs7310-8-bit-inference-with-tensorrt.pdf)\n\n#### 剪枝\n\n- [Learning Efficient Convolutional Networks through Network Slimming](https:\u002F\u002Farxiv.org\u002Fabs\u002F1708.06519)\n- [RETHINKING THE VALUE OF NETWORK PRUNING](https:\u002F\u002Farxiv.org\u002Fabs\u002F1810.05270)\n\n#### 适配专用芯片的模型压缩\n\n- [Convolutional Networks for Fast, Energy-Efficient Neuromorphic Computing](https:\u002F\u002Farxiv.org\u002Fabs\u002F1603.08270)\n\n### 部署\n\n#### TensorRT\n\n- [github](https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FTensorRT)\n- [ptq](https:\u002F\u002Fon-demand.gputechconf.com\u002Fgtc\u002F2017\u002Fpresentation\u002Fs7310-8-bit-inference-with-tensorrt.pdf)\n- [tensorrt-基础](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F336256668)\n- [tensorrt-op\u002Fdynamic_shape](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F335829625)\n- [summary](https:\u002F\u002Fgithub.com\u002Fmileistone\u002Fstudy_resources\u002Fblob\u002Fmaster\u002Fengineering\u002Ftensorrt\u002Ftensorrt.md)\n\n\n## 后续\n\n- tensorrt完整demo\n- 其他压缩算法(量化\u002F剪枝\u002F蒸馏\u002FNAS等)\n- 其他部署框架(mnn\u002Ftnn\u002Ftengine等)\n- 压缩 —> 部署","# micronet\n\n*\"目前在深度学习领域分类两个派别，一派为学院派，研究强大、复杂的模型网络和实验方法，为了追求更高的性能；另一派为工程派，旨在将算法更稳定、高效的落地在硬件平台上，效率是其追求的目标。复杂的模型固然具有更好的性能，但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。所以，深度神经网络日益增长的规模为深度学习在移动端的部署带来了巨大的挑战，深度学习模型压缩与部署成为了学术界和工业界都重点关注的研究领域之一\"*\n\n## 项目简介\n\n[![PyPI](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fv\u002Fmicronet)](https:\u002F\u002Fpypi.org\u002Fproject\u002Fmicronet) ![PyPI - Python Version](https:\u002F\u002Fimg.shields.io\u002Fpypi\u002Fpyversions\u002Fmicronet)\n\n*micronet, a model compression and deploy lib.*\n\n### 压缩\n\n- 量化：High-Bit(>2b): QAT, PTQ, QAFT; Low-Bit(≤2b)\u002FTernary and Binary: QAT\n- 剪枝：正常、规整和分组卷积结构剪枝\n- 针对特征(A)二值量化的BN融合(训练量化后，BN参数 —> conv的偏置b)\n- High-Bit量化的BN融合(训练量化中，先融合再量化，融合：BN参数 —> conv的权重w和偏置b)\n\n### 部署\n\n- TensorRT(fp32\u002Ffp16\u002Fint8(ptq-calibration)、op-adapt(upsample)、dynamic_shape等)\n\n\n## 代码结构\n\n![code_structure](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002F666DZY666_micronet_readme_e2c9a7756d3d.jpg)\n\n```\nmicronet\n├── __init__.py\n├── base_module\n│   ├── __init__.py\n│   └── op.py\n├── compression\n│   ├── README.md\n│   ├── __init__.py\n│   ├── pruning\n│   │   ├── README.md\n│   │   ├── __init__.py\n│   │   ├── gc_prune.py\n│   │   ├── main.py\n│   │   ├── models_save\n│   │   │   └── models_save.txt\n│   │   └── normal_regular_prune.py\n│   └── quantization\n│       ├── README.md\n│       ├── __init__.py\n│       ├── wbwtab\n│       │   ├── __init__.py\n│       │   ├── bn_fuse\n│       │   │   ├── bn_fuse.py\n│       │   │   ├── bn_fused_model_test.py\n│       │   │   └── models_save\n│       │   │       └── models_save.txt\n│       │   ├── main.py\n│       │   ├── models_save\n│       │   │   └── models_save.txt\n│       │   └── quantize.py\n│       └── wqaq\n│           ├── __init__.py\n│           ├── dorefa\n│           │   ├── __init__.py\n│           │   ├── main.py\n│           │   ├── models_save\n│           │   │   └── models_save.txt\n│           │   ├── quant_model_test\n│           │   │   ├── models_save\n│           │   │   │   └── models_save.txt\n│           │   │   ├── quant_model_para.py\n│           │   │   └── quant_model_test.py\n│           │   └……\n```\n\n\n## 项目进展\n- **2019.12.4**, 初次提交\n- **12.8**, DoReFa特征(A)量化前先进行缩放(* 0.1)，然后再截断，以减小截断误差\n- **12.11**, 增加项目代码结构图\n- 12.12, 完善使用示例\n- 12.14, 增加:1、BN融合量化情况(W三值\u002F二值)可选，即训练量化时选择W三\u002F二值，这里则对应选择; 2、BN融合时对卷积核(conv)不带偏置(bias)的处理\n- **12.17**, 增加模型压缩前后数据对比(示例)\n- 12.20, 增加设备可选(cpu、gpu(单卡、多卡))\n- **12.27**, 补充相关论文\n- 12.29, 取消High-Bit量化8-bit以内的限制，即现在可以量化至10-bit、16-bit等\n- **2020.2.17**, 1、精简W三值\u002F二值量化代码; 2、加速W三值量化训练\n- **2.18**, 优化针对特征(A)二值的BN融合:去除对BN层gamma参数的限制，即现在此情况下融合时BN可正常训练\n- **2.24**, 再次优化三\u002F二值量化代码组织结构，增强可移植性，旧版确实不太好移植。目前移植方法：将想要量化的Conv用compression\u002Fquantization\u002Fwbwtab\u002Fmodels\u002Futil_wbwtab.py中的QuantConv2d替换即可，可参照该路径下nin_gc.py中的使用方法\n- **3.1**, 新增：1、google的High-Bit量化方法; 2、训练中High-Bit量化的BN融合\n- **3.2、3.3**, 规整量化代码整体结构，目前所有量化方法都可采取类似的移植方式：将想要量化的Conv(或FC，目前dorefa支持，其他方法类似可写)用models\u002Futil_wxax.py中的QuantConv2d(或QuantLinear)替换即可，可分别参照该路径下nin_gc.py中的使用方法进行移植（分类、检测、分割等均适用，但需要据实际情况具体调试）\n- **3.4**, 规整优化wbwtab\u002Fbn_fuse中“针对特征(A)二值的BN融合”的相关实现代码，可进行BN融合及融合前后模型对比测试(精度\u002F速度\u002F(大小))\n- 3.11, 调整compression\u002Fwqaq\u002Fiao中的BN层momentum参数(0.1 —> 0.01),削弱batch统计参数占比,一定程度抑制量化带来的抖动。经实验,量化训练更稳定,acc提升1%左右\n- **3.13**, 更新代码结构图\n- 4.6, 修正二值量化训练中W_clip的相关问题(之前由于这个，导致二值量化训练精度上不去，现在已可正常使用)(同时修正无法找到一些模块如models\u002Futil_wxax.py的问题)\n- **12.14**, 1、improve code structure; 2、add deploy-tensorrt(main module, but not running yet)\n- 12.18, 1、improve code structure\u002Fmodule reference\u002Fmodule_name; 2、add transfer-use demo\n- **12.21**, improve pruning-quantization pipeline和代码\n- **2021.1.4**, add other quant_op\n- 1.5, add quant_weight's per-channel和 per-layer selection\n- **1.7**, fix iao's loss-nan bug. The bug is due to per-channel min\u002Fmax error\n- 1.8, 1、improve quant_para save. Now, only save scale and zero_point; 2、add optional weight_observer(MinMaxObserver or MovingAverageMinMaxObserver)\n- **1.11**, fix bug in binary_a(1\u002F0) and binary_w preprocessing\n- **1.12**, add \"pip install\"\n- **1.22**, add auto_insert_quant_op(this still needs to be improved)\n- **1.27**, improve auto_insert_quant_op(now you can easily use quantization, as [quant_test_auto](#quant_test_auto.py))\n- 1.28, 1、fix prune-quantization pipeline和代码; 2、improve code structure\n- **2.1**, improve wbwtab_bn_fuse\n- **2.4**, 1、add wqaq_bn_fuse; 2、add quant_model_inference_simulation; 3、improve code format\n- 4.30, 1、update code_structure img; 2、fix iao's quant_weight_range, quant_contrans and quant_bn_fuse_conv pretrained_model bn_para load bug\n- **5.4**, add **qaft**, it's beneficial to improve the quantization accuracy\n- **5.6**, add **ptq**, its quantization accuracy is also good\n- 5.11, add bn_fuse_calib flag\n- **5.14**, 1、change **ste** to **clip_ste**, it's beneficial to improve the quant_train；2、remove quant_relu和 add quant_leaky_relu\n- 5.15, fix bug in quant_model_para post-processing\n- **6.7**, add quant_add(need use base_module's op) and quant_resnet demo\n- **6.9**, iao_quant supports multi gpus\n- 6.16, fix quant_round() and quant_binary()\n- 10.6, format\n\n\n## 环境要求\n\n- python >= 3.5\n- torch >= 1.1.0\n- torchvison >= 0.3.0\n- numpy\n- onnx == 1.6.0\n- tensorrt == 7.0.0.11\n\n\n## 安装\n\n[PyPI](https:\u002F\u002Fpypi.org\u002Fproject\u002Fmicronet\u002F)\n\n```bash\npip install micronet -i https:\u002F\u002Fpypi.org\u002Fsimple\n```\n\n[GitHub](https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet)\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet.git\ncd micronet\npython setup.py install\n```\n\n*验证*\n\n```bash\npython -c \"import micronet; print(micronet.__version__)\"\n```\n\n## 测试\n\n*Install from github*\n\n### 压缩\n\n#### 量化\n\n*--refine,可加载预训练浮点模型参数,在其基础上做量化*\n\n##### wbwtab\n\n--W --A, 权重W和特征A量化取值\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwbwtab\n```\n\n- WbAb\n\n```bash\npython main.py --W 2 --A 2\n```\n\n- WbA32\n\n```bash\npython main.py --W 2 --A 32\n```\n\n- WtAb\n\n```bash\npython main.py --W 3 --A 2\n```\n\n- WtA32\n\n```bash\npython main.py --W 3 --A 32\n```\n\n##### wqaq\n\n--w_bits --a_bits, 权重W和特征A量化位数\n\n###### dorefa\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\n```\n\n- W16A16\n\n```bash\npython main.py --w_bits 16 --a_bits 16\n```\n\n- W8A8\n\n```bash\npython main.py --w_bits 8 --a_bits 8\n```\n\n- W4A4\n\n```bash\npython main.py --w_bits 4 --a_bits 4\n```\n\n- 其他bits情况类比\n\n###### iao\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\n```\n\n*量化位数选择同dorefa*\n\n*单卡*\n\n**QAT\u002FPTQ  —>  QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n--q_type, 量化类型(0-对称, 1-非对称)\n\n--q_level, 权重量化级别(0-通道级, 1-层级)\n\n--weight_observer, weight_observer选择(0-MinMaxObserver, 1-MovingAverageMinMaxObserver)\n\n--bn_fuse, 量化中bn融合标志\n\n--bn_fuse_calib, 量化中bn融合校准标志\n\n--pretrained_model, 预训练浮点模型\n\n--qaft, qaft标志\n\n--ptq, ptq_observer\n\n--ptq_control, ptq_control\n\n--ptq_batch, ptq的batch数量\n\n--percentile, ptq校准的比例\n\n**QAT**\n\n- 默认: 对称、(权重)通道级量化, bn不融合, weight_observer-MinMaxObserver, 不加载预训练浮点模型, 进行qat\n\n```bash\npython main.py --q_type 0 --q_level 0 --weight_observer 0\n```\n\n- 对称、(权重)通道级量化, bn不融合, weight_observer-MovingAverageMinMaxObserver\n\n```bash\npython main.py --q_type 0 --q_level 0 --weight_observer 1\n```\n\n- 对称、(权重)层级量化, bn不融合\n\n```bash\npython main.py --q_type 0 --q_level 1\n```\n\n- 非对称、(权重)通道级量化, bn不融合\n\n```bash\npython main.py --q_type 1 --q_level 0\n```\n\n- 非对称、(权重)层级量化, bn不融合\n\n```bash\npython main.py --q_type 1 --q_level 1\n```\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --q_type 0 --q_level 0 --bn_fuse\n```\n\n- 对称、(权重)层级量化, bn融合\n\n```bash\npython main.py --q_type 0 --q_level 1 --bn_fuse\n```\n\n- 非对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --q_type 1 --q_level 0 --bn_fuse\n```\n\n- 非对称、(权重)层级量化, bn融合\n\n```bash\npython main.py --q_type 1 --q_level 1 --bn_fuse\n```\n\n- 对称、(权重)通道级量化, bn融合校准\n\n```bash\npython main.py --q_type 0 --q_level 0 --bn_fuse --bn_fuse_calib\n```\n\n**PTQ**\n\n*需要加载预训练浮点模型,本项目中其可由剪枝中采用正常训练获取*\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --refine ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc.pth --q_level 0 --bn_fuse --pretrained_model --ptq_control --ptq --batch_size 32 --ptq_batch 200 --percentile 0.999999\n```\n\n- 其他情况类比\n\n**QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n**QAT  —>  QAFT**\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --resume models_save\u002Fnin_gc_bn_fused.pth --q_type 0 --q_level 0 --bn_fuse --qaft --lr 0.00001\n```\n\n- 其他情况类比\n\n**PTQ  —>  QAFT**\n\n- 对称、(权重)通道级量化, bn融合\n\n```bash\npython main.py --resume models_save\u002Fnin_gc_bn_fused.pth --q_level 0 --bn_fuse --qaft --lr 0.00001 --ptq\n```\n\n- 其他情况类比\n\n#### 剪枝\n\n*稀疏训练  —>  剪枝  —>  微调*\n\n```bash\ncd micronet\u002Fcompression\u002Fpruning\n```\n\n##### 稀疏训练\n\n-sr 稀疏标志\n\n--s 稀疏率(需根据dataset、model情况具体调整)\n\n--model_type 模型类型(0-nin, 1-nin_gc)\n\n- nin(正常卷积结构)\n\n```bash\npython main.py -sr --s 0.0001 --model_type 0\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py -sr --s 0.001 --model_type 1\n```\n\n##### 剪枝\n\n--percent 剪枝率\n\n--normal_regular 正常、规整剪枝标志及规整剪枝基数(如设置为N,则剪枝后模型每层filter个数即为N的倍数)\n\n--model 稀疏训练后的model路径\n\n--save 剪枝后保存的model路径（路径默认已给出, 可据实际情况更改）\n\n- 正常剪枝(nin)\n\n```bash\npython normal_regular_prune.py --percent 0.5 --model models_save\u002Fnin_sparse.pth --save models_save\u002Fnin_prune.pth\n```\n\n- 规整剪枝(nin)\n\n```bash\npython normal_regular_prune.py --percent 0.5 --normal_regular 8 --model models_save\u002Fnin_sparse.pth --save models_save\u002Fnin_prune.pth\n```\n\n或\n\n```bash\npython normal_regular_prune.py --percent 0.5 --normal_regular 16 --model models_save\u002Fnin_sparse.pth --save models_save\u002Fnin_prune.pth\n```\n\n- 分组卷积结构剪枝(nin_gc)\n\n```bash\npython gc_prune.py --percent 0.4 --model models_save\u002Fnin_gc_sparse.pth\n```\n\n##### 微调\n\n--prune_refine 剪枝后的model路径（在其基础上做微调）\n\n- nin\n\n```bash\npython main.py --model_type 0 --prune_refine models_save\u002Fnin_prune.pth\n```\n\n- nin_gc\n\n*需要传入**剪枝**后得到的新模型的**cfg***\n\n*如*\n\n```bash\npython main.py --model_type 1 --gc_prune_refine 154 162 144 304 320 320 608 584\n```\n\n#### 剪枝 —> 量化（注意剪枝率和量化率平衡）\n\n*加载剪枝后的浮点模型再做量化*\n\n##### 剪枝 —> 量化（高位）（剪枝率偏大、量化率偏小）\n\n###### w8a8(dorefa)\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\n```\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth\n```\n\n###### w8a8(iao)\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\n```\n\n**QAT\u002FPTQ  —>  QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n**QAT**\n\n*bn不融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth --lr 0.001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth --lr 0.001\n```\n\n*bn融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth --bn_fuse --pretrained_model --lr 0.001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth --bn_fuse --pretrained_model --lr 0.001\n```\n\n**PTQ**\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth --bn_fuse --pretrained_model --ptq_control --ptq --batch_size 32 --ptq_batch 200 --percentile 0.999999\n```\n\n- 其他情况类比\n\n**QAFT**\n\n**! 注意，需要在QAT\u002FPTQ之后再做QAFT !**\n\n**QAT  —>  QAFT**\n\n*bn不融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin.pth --qaft --lr 0.00001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc.pth --qaft --lr 0.00001\n```\n\n*bn融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin_bn_fused.pth --bn_fuse --qaft --lr 0.00001\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc_bn_fused.pth --bn_fuse --qaft --lr 0.00001\n```\n\n**PTQ  —>  QAFT**\n\n*bn不融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin.pth --qaft --lr 0.00001 --ptq\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc.pth --qaft --lr 0.00001 --ptq\n```\n\n*bn融合*\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_qaft models_save\u002Fnin_bn_fused.pth --bn_fuse --qaft --lr 0.00001 --ptq\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --w_bits 8 --a_bits 8 --model_type 1 --prune_qaft models_save\u002Fnin_gc_bn_fused.pth --bn_fuse --qaft --lr 0.00001 --ptq\n```\n\n###### 其他可选量化配置类比\n\n##### 剪枝 —> 量化（低位）（剪枝率偏小、量化率偏大）\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwbwtab\n```\n\n###### wbab\n\n- nin(正常卷积结构)\n\n```bash\npython main.py --W 2 --A 2 --model_type 0 --prune_quant ..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth\n```\n\n- nin_gc(含分组卷积结构)\n\n```bash\npython main.py --W 2 --A 2 --model_type 1 --prune_quant ..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc_retrain.pth\n```\n\n###### 其他取值情况类比\n\n\n#### BN融合与量化推理仿真测试\n\n##### wbwtab\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwbwtab\u002Fbn_fuse\n```\n\n###### bn_fuse(得到quant_model_train和quant_bn_fused_model_inference的结构和参数)\n\n*--model_type, 1 - nin_gc(含分组卷积结构); 0 - nin(正常卷积结构)*\n\n*--prune_quant, 剪枝_量化模型标志*\n\n*--W, weight量化取值*\n\n*均需要与量化训练保持一致,可直接用默认*\n\n- nin_gc, quant_model, wb\n\n```bash\npython bn_fuse.py --model_type 1 --W 2\n```\n\n- nin_gc、剪枝量化模型、wb\n\n```bash\npython bn_fuse.py --model_type 1 --prune_quant --W 2\n```\n\n- nin_gc、量化模型、wt\n\n```bash\npython bn_fuse.py --model_type 1 --W 3\n```\n\n- nin、量化模型、wb\n\n```bash\npython bn_fuse.py --model_type 0 --W 2\n```\n\n###### bn_fused_model_test（对quant_model_train和quant_bn_fused_model_inference进行测试）\n\n```bash\npython bn_fused_model_test.py\n```\n\n##### dorefa\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\u002Fquant_model_test\n```\n\n###### quant_model_para（获取quant_model_train和quant_model_inference的结构和参数）\n\n*--model_type，1 - nin_gc（含分组卷积结构）；0 - nin（正常卷积结构）*\n\n*--prune_quant，剪枝_量化模型标志*\n\n*--w_bits，权重量化位数；--a_bits，激活量化的位数*\n\n*均需与量化训练保持一致，可直接使用默认值*\n\n- nin_gc、量化模型、w8a8\n\n```bash\npython quant_model_para.py --model_type 1 --w_bits 8 --a_bits 8\n```\n\n- nin_gc、剪枝量化模型、w8a8\n\n```bash\npython quant_model_para.py --model_type 1 --prune_quant --w_bits 8 --a_bits 8\n```\n\n- nin、量化模型、w8a8\n\n```bash\npython quant_model_para.py --model_type 0 --w_bits 8 --a_bits 8\n```\n\n###### quant_model_test（对quant_model_train和quant_model_inference进行测试）\n\n```bash\npython quant_model_test.py\n```\n\n##### iao\n\n***注意，量化训练时 --bn_fuse 需要设置为 True***\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\u002Fbn_fuse\n```\n\n###### bn_fuse（获取quant_bn_fused_model_train和quant_bn_fused_model_inference的结构和参数）\n\n*--model_type，1 - nin_gc（含分组卷积结构）；0 - nin（正常卷积结构）*\n\n*--prune_quant，剪枝_量化模型标志*\n\n*--w_bits，权重量化位数；--a_bits，激活量化的位数*\n\n*--q_type，0 - 对称；1 - 非对称*\n\n*--q_level，0 - 通道级；1 - 层级*\n\n*均需与量化训练保持一致，可直接使用默认值*\n\n- nin_gc、量化模型、w8a8\n\n```bash\npython bn_fuse.py --model_type 1 --w_bits 8 --a_bits 8\n```\n\n- nin_gc、剪枝量化模型、w8a8\n\n```bash\npython bn_fuse.py --model_type 1 --prune_quant --w_bits 8 --a_bits 8\n```\n\n- nin、量化模型、w8a8\n\n```bash\npython bn_fuse.py --model_type 0 --w_bits 8 --a_bits 8\n```\n\n- nin_gc、量化模型、w8a8、非对称、层级\n\n```bash\npython bn_fuse.py --model_type 0 --w_bits 8 --a_bits 8 --q_type 1 --q_level 1\n```\n\n###### bn_fused_model_test（对quant_bn_fused_model_train和quant_bn_fused_model_inference进行测试）\n\n```bash\npython bn_fused_model_test.py\n```\n\n#### 设备选取\n\n*目前支持CPU、GPU（单卡、多卡）*\n\n--cpu 使用CPU，--gpu_id 使用并选择GPU\n\n- CPU\n\n```bash\npython main.py --cpu\n```\n\n- GPU单卡\n\n```bash\npython main.py --gpu_id 0\n```\n\n或\n\n```bash\npython main.py --gpu_id 1\n```\n\n- GPU多卡\n\n```bash\npython main.py --gpu_id 0,1\n```\n\n或\n\n```bash\npython main.py --gpu_id 0,1,2\n```\n\n*默认情况下，使用服务器所有显卡*\n\n\n\n### 部署\n\n#### TensorRT\n\n*目前仅提供相关**核心模块**代码，后续再加入完整可运行demo*\n\n##### 相关解读\n- [tensorrt-基础](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F336256668)\n- [tensorrt-op\u002Fdynamic_shape](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F335829625)\n\n\n## 迁移\n\n### 量化训练\n\n#### LeNet示例\n\n##### quant_test_manual.py\n\n*只需将***op***替换为***quant_op***，即可对模型进行量化（高比特(>2b)、低比特(≤2b)\u002F三值和二值）。*\n\n```python\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n# 一些基础op，例如``Add``、``Concat``\nfrom micronet.base_module.op import *\n\n# ``quantize`` 是量化模块，``QuantConv2d``、``QuantLinear``、``QuantMaxPool2d``、``QuantReLU`` 是量化操作\nfrom micronet.compression.quantization.wbwtab.quantize import (\n    QuantConv2d as quant_conv_wbwtab,\n)\nfrom micronet.compression.quantization.wbwtab.quantize import (\n    ActivationQuantizer as quant_relu_wbwtab,\n)\nfrom micronet.compression.quantization.wqaq.dorefa.quantize import (\n    QuantConv2d as quant_conv_dorefa,\n)\nfrom micronet.compression.quantization.wqaq.dorefa.quantize import (\n    QuantLinear as quant_linear_dorefa,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantConv2d as quant_conv_iao,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantLinear as quant_linear_iao,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantMaxPool2d as quant_max_pool_iao,\n)\nfrom micronet.compression.quantization.wqaq.iao.quantize import (\n    QuantReLU as quant_relu_iao,\n)\n\n\nclass LeNet(nn.Module):\n    def __init__(self):\n        super(LeNet, self).__init__()\n        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n        self.fc1 = nn.Linear(320, 50)\n        self.fc2 = nn.Linear(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nclass QuantLeNetWbWtAb(nn.Module):\n    def __init__(self):\n        super(QuantLeNetWbWtAb, self).__init__()\n        self.conv1 = quant_conv_wbwtab(1, 10, kernel_size=5)\n        self.conv2 = quant_conv_wbwtab(10, 20, kernel_size=5)\n        self.fc1 = nn.Linear(320, 50)\n        self.fc2 = nn.Linear(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = quant_relu_wbwtab()\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nclass QuantLeNetDoReFa(nn.Module):\n    def __init__(self):\n        super(QuantLeNetDoReFa, self).__init__()\n        self.conv1 = quant_conv_dorefa(1, 10, kernel_size=5)\n        self.conv2 = quant_conv_dorefa(10, 20, kernel_size=5)\n        self.fc1 = quant_linear_dorefa(320, 50)\n        self.fc2 = quant_linear_dorefa(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nclass QuantLeNetIAO(nn.Module):\n    def __init__(self):\n        super(QuantLeNetIAO, self).__init__()\n        self.conv1 = quant_conv_iao(1, 10, kernel_size=5)\n        self.conv2 = quant_conv_iao(10, 20, kernel_size=5)\n        self.fc1 = quant_linear_iao(320, 50)\n        self.fc2 = quant_linear_iao(50, 10)\n        self.max_pool = quant_max_pool_iao(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\nlenet = LeNet()\nquant_lenet_wbwtab = QuantLeNetWbWtAb()\nquant_lenet_dorefa = QuantLeNetDoReFa()\nquant_lenet_iao = QuantLeNetIAO()\n\nprint(\"***ori_model***\\n\", lenet)\nprint(\"\\n***quant_model_wbwtab***\\n\", quant_lenet_wbwtab)\nprint(\"\\n***quant_model_dorefa***\\n\", quant_lenet_dorefa)\nprint(\"\\n***quant_model_iao***\\n\", quant_lenet_iao)\n\nprint(\"\\nquant_model is ready\")\nprint(\"micronet is ready\")\n```\n\n##### quant_test_auto.py\n\n*只需使用 ***micronet.compression.quantization.quantize.prepare(model)***，即可对模型进行量化（高比特（>2b）、低比特（≤2b）\u002F三值和二值）。*\n\n```python\nimport torch.nn as nn\nimport torch.nn.functional as F\n\n# 一些基础操作，如 ``Add``、``Concat``\nfrom micronet.base_module.op import *\n\nimport micronet.compression.quantization.wqaq.dorefa.quantize as quant_dorefa\nimport micronet.compression.quantization.wqaq.iao.quantize as quant_iao\n\n\nclass LeNet(nn.Module):\n    def __init__(self):\n        super(LeNet, self).__init__()\n        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)\n        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)\n        self.fc1 = nn.Linear(320, 50)\n        self.fc2 = nn.Linear(50, 10)\n        self.max_pool = nn.MaxPool2d(kernel_size=2)\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, x):\n        x = self.relu(self.max_pool(self.conv1(x)))\n        x = self.relu(self.max_pool(self.conv2(x)))\n        x = x.view(-1, 320)\n        x = self.relu(self.fc1(x))\n        x = F.dropout(x, training=self.training)\n        x = self.fc2(x)\n        return F.log_softmax(x, dim=1)\n\n\n\"\"\"\n--w_bits --a_bits，权重W和特征A量化位数\n--q_type，量化类型（0-对称，1-非对称）\n--q_level，权重量化级别（0-通道级，1-层级）\n--weight_observer，weight observer选择（0-MinMaxObserver，1-MovingAverageMinMaxObserver）\n--bn_fuse，量化中bn融合标志\n--bn_fuse_calib，量化中bn融合校准标志\n--pretrained_model，预训练浮点模型\n--qaft，qaft标志\n--ptq，ptq标志\n--percentile，ptq校准的比例\n\"\"\"\nlenet = LeNet()\nquant_lenet_dorefa = quant_dorefa.prepare(lenet，inplace=False，a_bits=8，w_bits=8)\nquant_lenet_iao = quant_iao.prepare(\n    lenet，\n    inplace=False，\n    a_bits=8，\n    w_bits=8，\n    q_type=0，\n    q_level=0，\n    weight_observer=0，\n    bn_fuse=False，\n    bn_fuse_calib=False，\n    pretrained_model=False，\n    qaft=False，\n    ptq=False，\n    percentile=0.9999，\n)\n\n# 如果ptq == False，进行qat\u002Fqaft，需要训练\n# 如果ptq == True，进行ptq，不需要训练\n# 可以参考 micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\u002Fmain.py\n\nprint(\"***ori_model***\\n\", lenet)\nprint(\"\\n***quant_model_dorefa***\\n\", quant_lenet_dorefa)\nprint(\"\\n***quant_model_iao***\\n\", quant_lenet_iao)\n\nprint(\"\\nquant_model is ready\")\nprint(\"micronet is ready\")\n```\n\n#### 测试\n\n##### quant_test_manual\n\n```bash\npython -c \"import micronet; micronet.quant_test_manual()\"\n```\n\n##### quant_test_auto\n\n```bash\npython -c \"import micronet; micronet.quant_test_auto()\"\n```\n\n*当输出“quant_model is ready”时，micronet即已准备就绪。*\n\n### 量化推理\n\n***参考[BN融合与量化推理仿真测试](#bn融合与量化推理仿真测试)***\n\n## 模型压缩数据对比（仅供参考）\n\n*以下为cifar10示例，可在更冗余模型、更大数据集上尝试其他组合压缩方式*\n\n|类型|W(Bits)|A(Bits)|Acc|GFLOPs|Para(M)|Size(MB)|压缩率|损失|\n|:-:|:-----:|:-----:|:--:|:---:|:-----:|:------:|:---:|:-:|\n|原模型(nin)|FP32|FP32|91.01%|0.15|0.67|2.68|***|***|\n|采用分组卷积结构(nin_gc)|FP32|FP32|91.04%|0.15|0.58|2.32|13.43%|-0.03%|\n|剪枝|FP32|FP32|90.26%|0.09|0.32|1.28|52.24%|0.75%|\n|量化|1|FP32|90.93%|***|0.58|0.204|92.39%|0.08%|\n|量化|1.5|FP32|91%|***|0.58|0.272|89.85%|0.01%|\n|量化|1|1|86.23%|***|0.58|0.204|92.39%|4.78%|\n|量化|1.5|1|86.48%|***|0.58|0.272|89.85%|4.53%|\n|量化(DoReFa)|8|8|91.03%|***|0.58|0.596|77.76%|-0.02%|\n|量化(IAO,全量化,symmetric\u002Fper-channel\u002Fbn_fuse)|8|8|90.99%|***|0.58|0.596|77.76%|0.02%|\n|分组+剪枝+量化|1.5|1|86.13%|***|0.32|0.19|92.91%|4.88%|\n\n*--train_batch_size 256, 单卡*\n\n## 相关资料\n\n### 压缩\n\n#### 量化\n\n##### QAT\n\n###### 二值\n\n- [BinarizedNeuralNetworks: TrainingNeuralNetworkswithWeightsand ActivationsConstrainedto +1 or−1](https:\u002F\u002Farxiv.org\u002Fabs\u002F1602.02830)\n\n- [XNOR-Net:ImageNetClassiﬁcationUsingBinary ConvolutionalNeuralNetworks](https:\u002F\u002Farxiv.org\u002Fabs\u002F1603.05279)\n\n- [AN EMPIRICAL STUDY OF BINARY NEURAL NETWORKS’ OPTIMISATION](https:\u002F\u002Fopenreview.net\u002Fforum?id=rJfUCoR5KX)\n\n- [A Review of Binarized Neural Networks](https:\u002F\u002Fwww.semanticscholar.org\u002Fpaper\u002FA-Review-of-Binarized-Neural-Networks-Simons-Lee\u002F0332fdf00d7ff988c5b66c47afd49431eafa6cd1)\n\n###### 三值\n\n- [Ternary weight networks](https:\u002F\u002Farxiv.org\u002Fabs\u002F1605.04711)\n\n###### High-Bit\n\n- [DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients](https:\u002F\u002Farxiv.org\u002Fabs\u002F1606.06160)\n- [Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference](https:\u002F\u002Farxiv.org\u002Fabs\u002F1712.05877)\n- [Quantizing deep convolutional networks for efficient inference: A whitepaper](https:\u002F\u002Farxiv.org\u002Fabs\u002F1806.08342)\n\n##### PTQ\n\n###### High-Bit\n\n- [tensorrt-ptq-8-bit](https:\u002F\u002Fon-demand.gputechconf.com\u002Fgtc\u002F2017\u002Fpresentation\u002Fs7310-8-bit-inference-with-tensorrt.pdf)\n\n#### 剪枝\n\n- [Learning Efficient Convolutional Networks through Network Slimming](https:\u002F\u002Farxiv.org\u002Fabs\u002F1708.06519)\n- [RETHINKING THE VALUE OF NETWORK PRUNING](https:\u002F\u002Farxiv.org\u002Fabs\u002F1810.05270)\n\n#### 适配专用芯片的模型压缩\n\n- [Convolutional Networks for Fast, Energy-Efficient Neuromorphic Computing](https:\u002F\u002Farxiv.org\u002Fabs\u002F1603.08270)\n\n### 部署\n\n#### TensorRT\n\n- [github](https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FTensorRT)\n- [ptq](https:\u002F\u002Fon-demand.gputechconf.com\u002Fgtc\u002F2017\u002Fpresentation\u002Fs7310-8-bit-inference-with-tensorrt.pdf)\n- [tensorrt-基础](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F336256668)\n- [tensorrt-op\u002Fdynamic_shape](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F335829625)\n- [summary](https:\u002F\u002Fgithub.com\u002Fmileistone\u002Fstudy_resources\u002Fblob\u002Fmaster\u002Fengineering\u002Ftensorrt\u002Ftensorrt.md)\n\n\n## 后续\n\n- tensorrt完整demo\n- 其他压缩算法(量化\u002F剪枝\u002F蒸馏\u002FNAS等)\n- 其他部署框架(mnn\u002Ftnn\u002Ftengine等)\n- 压缩 —> 部署","# Micronet 快速上手指南\n\nMicronet 是一个专注于深度学习模型压缩（量化、剪枝）与部署（TensorRT）的开源库，旨在解决复杂模型在移动端及嵌入式设备上的落地难题。\n\n## 1. 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**: Linux \u002F Windows \u002F macOS\n*   **Python**: >= 3.5\n*   **PyTorch**: >= 1.1.0\n*   **Torchvision**: >= 0.3.0\n*   **其他依赖**:\n    *   `numpy`\n    *   `onnx` == 1.6.0\n    *   `tensorrt` == 7.0.0.11 (如需使用部署功能)\n\n建议先安装基础深度学习框架：\n```bash\npip install torch>=1.1.0 torchvision>=0.3.0 numpy\n```\n\n## 2. 安装步骤\n\n您可以通过 PyPI 直接安装，或从 GitHub 源码安装（推荐源码安装以获取最新功能）。\n\n### 方式一：PyPI 安装（使用国内镜像加速）\n\n```bash\npip install micronet -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n### 方式二：GitHub 源码安装\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet.git\ncd micronet\npython setup.py install\n```\n\n### 验证安装\n\n运行以下命令检查是否安装成功及版本号：\n\n```bash\npython -c \"import micronet; print(micronet.__version__)\"\n```\n\n## 3. 基本使用\n\nMicronet 的核心功能分为**模型压缩**（量化、剪枝）和**模型部署**。以下是基于命令行的最简使用示例。\n\n### 3.1 模型量化 (Quantization)\n\nMicronet 支持多种量化策略，包括高位量化（QAT, PTQ, QAFT）和低位\u002F二值量化。\n\n#### 示例 A：DoReFa 高位量化 (W8A8)\n进入 DoReFa 量化目录并执行训练：\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\npython main.py --w_bits 8 --a_bits 8\n```\n\n#### 示例 B：IAO 量化训练 (QAT) + BN 融合\n支持对称\u002F非对称量化及通道级\u002F层级量化选择。以下是对称、通道级量化并开启 BN 融合的示例：\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fiao\npython main.py --q_type 0 --q_level 0 --bn_fuse\n```\n\n#### 示例 C：完整量化流程 (PTQ -> QAFT)\n对于生产环境，推荐先进行 PTQ（训练后量化），再进行 QAFT（量化感知微调）以提升精度。\n\n1.  **执行 PTQ** (需指定预训练浮点模型路径):\n    ```bash\n    python main.py --refine ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_gc.pth --q_level 0 --bn_fuse --pretrained_model --ptq_control --ptq --batch_size 32 --ptq_batch 200 --percentile 0.999999\n    ```\n\n2.  **执行 QAFT** (加载上一步生成的模型进行微调):\n    ```bash\n    python main.py --resume models_save\u002Fnin_gc_bn_fused.pth --q_level 0 --bn_fuse --qaft --lr 0.00001 --ptq\n    ```\n\n### 3.2 模型剪枝 (Pruning)\n\n剪枝流程通常分为三步：**稀疏训练 -> 剪枝 -> 微调**。\n\n1.  **稀疏训练** (以 nin_gc 模型为例):\n    ```bash\n    cd micronet\u002Fcompression\u002Fpruning\n    python main.py -sr --s 0.001 --model_type 1\n    ```\n\n2.  **执行剪枝** (设置剪枝率为 40%):\n    ```bash\n    python gc_prune.py --percent 0.4 --model models_save\u002Fnin_gc_sparse.pth\n    ```\n\n3.  **微调模型** (加载剪枝后的模型结构进行重训练):\n    ```bash\n    # 注意：nin_gc 需要传入剪枝后新的 cfg 参数\n    python main.py --model_type 1 --gc_prune_refine 154 162 144 304 320 320 608 584\n    ```\n\n### 3.3 组合使用：先剪枝后量化\n\n为了获得更小的模型体积，可以先对浮点模型进行剪枝，再对剪枝后的模型进行量化。\n\n```bash\ncd micronet\u002Fcompression\u002Fquantization\u002Fwqaq\u002Fdorefa\n# 加载剪枝微调后的模型进行 W8A8 量化\npython main.py --w_bits 8 --a_bits 8 --model_type 0 --prune_quant ..\u002F..\u002F..\u002Fpruning\u002Fmodels_save\u002Fnin_finetune.pth\n```\n\n### 3.4 模型部署 (TensorRT)\n\n压缩后的模型可导出并通过 TensorRT 进行加速部署（支持 fp32\u002Ffp16\u002Fint8）。相关脚本位于 `micronet\u002Fdeploy\u002Ftensorrt` 目录下，主要包含校准器 (`calibrator.py`) 和评估脚本 (`eval_trt.py`)。\n\n> **提示**：具体部署流程需结合生成的 ONNX 模型及 TensorRT 环境配置，详细参数请参考 `deploy\u002Ftensorrt\u002FREADME.md`。","某边缘计算团队正致力于将高精度的人脸识别模型部署到算力受限的安防摄像头端，以满足实时门禁需求。\n\n### 没有 micronet 时\n- **显存溢出无法运行**：原始浮点模型体积过大，远超嵌入式设备的存储上限，导致模型根本无法加载。\n- **推理延迟过高**：在 CPU 上进行全精度计算耗时严重，单帧处理时间超过 500ms，完全无法满足“秒级开门”的体验要求。\n- **量化调试极其繁琐**：尝试手动实现低比特量化时，缺乏对 BatchNorm 层融合的支持，导致精度大幅下跌且难以定位误差来源。\n- **硬件适配困难**：面对 TensorRT 部署中动态形状（dynamic_shape）和特殊算子（如 upsample）的兼容性问题，需耗费数周编写底层适配代码。\n\n### 使用 micronet 后\n- **模型体积缩减 75%**：利用 micronet 的二值化（BNN）或三值化（TWN）量化技术，将模型压缩至原大小的四分之一，轻松存入设备闪存。\n- **推理速度提升 4 倍**：通过量化感知训练（QAT）结合 TensorRT 的 INT8 部署，单帧推理耗时降至 120ms 以内，实现流畅实时检测。\n- **精度损失可控**：借助 micronet 特有的训练中 BN 参数融合机制（将 BN 统计量合并至卷积权重），有效抑制了量化抖动，精度仅下降约 1%。\n- **部署流程自动化**：直接调用 micronet 的部署模块即可自动处理算子适配与动态形状校准，将原本数周的移植工作缩短至两天完成。\n\nmicronet 通过一站式的高阶量化与剪枝方案，成功打通了从复杂算法模型到高效边缘落地的“最后一公里”。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002F666DZY666_micronet_ed0713f4.png","666DZY666","dzy","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002F666DZY666_4526cc31.png","dzy_pku@pku.edu.cn","Peking University","Beijing",null,"https:\u002F\u002Fgithub.com\u002F666DZY666",[81],{"name":82,"color":83,"percentage":84},"Python","#3572A5",100,2269,477,"2026-04-03T09:27:28","MIT","未说明","非必需（支持 CPU 及单卡\u002F多卡 GPU），具体型号和显存大小未说明，需匹配所安装的 PyTorch 和 TensorRT 版本对应的 CUDA 环境",{"notes":92,"python":93,"dependencies":94},"该工具专注于模型压缩（量化、剪枝）与部署。量化部分支持高位（>2bit）和低比特（≤2bit\u002F二值\u002F三值）量化；部署部分主要依赖 TensorRT 7.0.0.11 进行 fp32\u002Ffp16\u002Fint8 推理。代码示例中展示了在 CPU 和 GPU（单卡\u002F多卡）上的运行选项。由于依赖特定版本的 ONNX (1.6.0) 和 TensorRT (7.0.0.11)，安装时需注意版本兼容性。",">=3.5",[95,96,97,98,99],"torch>=1.1.0","torchvision>=0.3.0","numpy","onnx==1.6.0","tensorrt==7.0.0.11",[14],[102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121],"quantization","pruning","dorefa","twn","bnn","xnor-net","pytorch","model-compression","group-convolution","network-slimming","neuromorphic-computing","convolutional-networks","network-in-network","integer-arithmetic-only","quantization-aware-training","post-training-quantization","tensorrt","onnx","tensorrt-int8-python","batch-normalization-fuse","2026-03-27T02:49:30.150509","2026-04-15T04:35:53.259806",[125,130,135,140,145,150,155],{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},33595,"QAT（量化感知训练）和 QAFT 有什么区别？","QAFT 通常指在 QAT 或 PTQ（训练后量化）之后的微调阶段。在此阶段，会冻结 BN（批归一化）的统计参数和模型的量化参数，这有助于提升量化训练的最终效果。此外，设置 bn_fuse_calib 是为了解决量化训练中的抖动问题，具体原理可参考论文《Quantizing deep convolutional networks for efficient inference: A whitepaper》中的 BN 融合部分。","https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet\u002Fissues\u002F84",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},33596,"是否支持对训练好的模型（如.pth 文件）进行训练后量化（PTQ）压缩？","支持。对于训练后量化（PTQ），可以参考项目中的 deploy-tensorrt 部分。目前 PTQ 比较适合做 8-bit 量化，4-bit 量化的效果可能不太理想。如果是目标检测网络（如基于 MaskRcnn），建议先尝试对 backbone（主干网络）进行量化以观察效果。","https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet\u002Fissues\u002F29",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},33597,"运行代码时遇到显存不足（CUDA out of memory）报错怎么办？","即使 nvidia-smi 显示显存未用完，也可能在训练过程中出现显存溢出。常见的解决方法是大幅减小 batch size（例如从 50 调整为 5）。如果调整 batch size 后仍然报错，可能需要检查模型结构或显存泄漏问题，但首要步骤是降低 batch size 以适应显存限制。","https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet\u002Fissues\u002F6",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},33598,"运行该项目的量化功能对显卡硬件有特定要求吗？必须使用带有 Tensor Core 的显卡吗？","没有特定的显卡硬件要求，也不强制需要带有 Tensor Core 的显卡。该项目可以在 CPU 上运行，只是在 CPU 上运行速度会比较慢。","https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet\u002Fissues\u002F5",{"id":146,"question_zh":147,"answer_zh":148,"source_url":149},33599,"代码中缺乏注释和相关论文，哪里可以找到学习资料？","作者已将相关论文链接补充至项目的 README 文件中。此外，关于量化和 BN 融合的具体实现细节，强烈建议参考论文《Quantizing deep convolutional networks for efficient inference: A whitepaper》，其中详细解释了代码背后的思想。","https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet\u002Fissues\u002F9",{"id":151,"question_zh":152,"answer_zh":153,"source_url":154},33600,"在 WbWtAb 二值化实现中，STE（直通估计器）是用在权重还是激活上？Sign 函数会导致三值化吗？","1. STE 同时应用在权重（weight）和激活（activation）的反向传播中。\n2. 虽然 torch.sign() 理论上输出包含 0，但在该实现的二值化逻辑中实际上不会产生 0，因此不是三值化。\n3. 当激活位宽 A!=2 时添加 ReLU 函数，是因为此时激活不进行二值化，需要正常的激活函数。\n4. 量化后的模型大小和压缩率是可以计算的，后续代码中也会加入相关计算功能。","https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet\u002Fissues\u002F40",{"id":156,"question_zh":157,"answer_zh":158,"source_url":159},33601,"BNFold_Conv2d_Q 中计算 bias 时为什么使用 batch_mean\u002Fvar 而不是 running_mean\u002Fvar？","这是为了遵循特定的量化融合策略。在 BNFold 操作中，bias 的融合通常使用当前 batch 的统计量（batch_mean\u002Fvar），而 weight 的融合使用全局统计量（running_mean\u002Fvar）。这种处理方式旨在优化量化训练过程中的数值稳定性，具体理论依据可参考论文《Quantizing deep convolutional networks for efficient inference: A whitepaper》中关于高比特量化的章节。","https:\u002F\u002Fgithub.com\u002F666DZY666\u002Fmicronet\u002Fissues\u002F60",[]]