[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-pnnx--pnnx":3,"tool-pnnx--pnnx":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},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,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},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 真正成长为懂上",140436,2,"2026-04-05T23:32:43",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},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 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":67,"owner_name":67,"owner_avatar_url":75,"owner_bio":76,"owner_company":76,"owner_location":76,"owner_email":76,"owner_twitter":76,"owner_website":76,"owner_url":77,"languages":78,"stars":83,"forks":84,"last_commit_at":85,"license":76,"difficulty_score":86,"env_os":87,"env_gpu":88,"env_ram":89,"env_deps":90,"category_tags":98,"github_topics":76,"view_count":23,"oss_zip_url":76,"oss_zip_packed_at":76,"status":16,"created_at":99,"updated_at":100,"faqs":101,"releases":132},2968,"pnnx\u002Fpnnx","pnnx","PyTorch Neural Network eXchange","pnnx（PyTorch Neural Network eXchange）是一个专为 PyTorch 打造的开源模型互操作标准与转换工具。它旨在解决深度学习模型在部署过程中常见的痛点：传统导出方式往往依赖复杂的 Python 环境或特定的扩展包，导致模型难以在不同平台间流畅迁移。\n\npnnx 通过定义一套严格匹配 PyTorch 语义的高层算子和计算图格式，实现了模型的“无损”优化与转换。其核心亮点在于不仅能直接优化原生 Torch 模型，大幅减少运行时依赖，还能将 TorchScript、ONNX 甚至 TNN 等其他格式的模型逆向还原为可编辑的 Python 代码。此外，它支持将模型一键导出为轻量级的便携格式，或直接转换为 ncnn 等推理引擎专用格式，无需安装 CUDA 或完整的 PyTorch 运行环境即可执行。\n\n这款工具非常适合从事模型部署的 AI 工程师、希望简化工作流的算法研究人员，以及需要将模型落地到移动端或嵌入式设备的开发者。无论你是想摆脱繁琐的环境配置，还是寻求跨框架的模型复用方案，pnnx 都能提供高效、灵活的解决方案，让模型从训练到部署的过程更加顺畅自然。","# pnnx\n\n![download](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002Fpnnx\u002Fpnnx\u002Ftotal.svg?style=for-the-badge)\n\nPyTorch Neural Network eXchange\n\nNote: The current implementation is in https:\u002F\u002Fgithub.com\u002FTencent\u002Fncnn\u002Ftree\u002Fmaster\u002Ftools\u002Fpnnx\n\n# What is pnnx\n\nPyTorch Neural Network eXchange(PNNX) is an open standard for PyTorch model interoperability. PNNX provides an open model format for PyTorch. It defines computation graph as well as high level operators strictly matches PyTorch.\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd>\n\n* optimize torch model\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_f53238d3357c.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003Ctd>\n\n* reduce extension package dependency\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_257dc19b7d2a.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\n\n* convert torchscript \u002F onnx back to python\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_968f484c8581.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003Ctd>\n\n* export to portable pnnx format \u002F onnx-zero \u002F ncnn\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_19890447a71f.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n```mermaid\nflowchart TD\n    torchmodel[\"torch model\u003Cbr>torchvision.models.resnet18()\"]\n    othermodel[\"caffe, mxnet\u003Cbr>keras, tensorflow\u003Cbr>paddlepaddle, etc.\"]\n    torchscript[\"torchscript file\u003Cbr>resnet18.pt\"]\n    onnx[\"onnx file\u003Cbr>resnet18.onnx\"]\n    tnn[\"tnn file\u003Cbr>resnet18.tnnproto\u002Ftnnmodel\"]\n    optmodel[\"optimized torch model\u003Cbr>resnet18_pnnx.Model()\"]\n    ncnnmodel[\"ncnn model\u003Cbr>resnet18.ncnn.param\u002Fbin\"]\n    onnxzeromodel[\"onnx-zero model\u003Cbr>resnet18.pnnx.onnx\"]\n\n    subgraph pnnx\n        optmodel\n        ncnnmodel\n        onnxzeromodel\n    end\n\n    torchmodel -->|\"mod = torch.jit.trace(model, x)\u003Cbr>mod.save('resnet18.pt')\"| torchscript\n    torchmodel -->|\"torch.onnx.export(model, x, 'resnet18.onnx')\"| onnx\n    othermodel -->|\"export to onnx\"| onnx\n    torchmodel -->|\"pnnx.export(model, 'resnet18.pt', x)\"| pnnx\n    torchscript -->|\"pnnx.convert('resnet18.pt', x)\"| pnnx\n    onnx -->|\"pnnx.convert('resnet18.onnx', x)\"| pnnx\n    tnn -->|\"pnnx.convert('resnet18.tnnproto', x)\"| pnnx\n\n```\n\n# How to install pnnx\n\n### ----- A. python pip (recommended)\n\n* Windows\u002FLinux\u002FmacOS 64bit\n* python 3.7 or later\n\n```shell\npip3 install pnnx\n```\n\n### ----- B. portable binary package (recommended if you hate python)\n\n* Windows\u002FLinux\u002FmacOS 64bit\n* For Linux, glibc 2.17+\n\nDownload portable pnnx binary package from https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases and extract it.\n\nThis package includes all the binaries required. It is portable, so no CUDA or PyTorch runtime environment is needed :)\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_6a84e2a2daf3.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>Windows\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-windows.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_342b3a50c54d.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>Linux(x86_64)\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-linux.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_342b3a50c54d.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>Linux(aarch64)\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-linux-aarch64.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_5addd8d2ad40.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>macOS(universal)\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-macos.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n### ----- C. build from source\n\n1. install pytorch\n2. (optional) install torchvision for pnnx torchvision operator support\n3. (optional) install protobuf for pnnx onnx-zero support\n4. clone https:\u002F\u002Fgithub.com\u002FTencent\u002Fncnn.git\n5. build pnnx in ncnn\u002Ftools\u002Fpnnx with cmake\n\nYou will probably refer https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Frelease.yml for detailed steps\n\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002FTencent\u002Fncnn.git\nmkdir ncnn\u002Ftools\u002Fpnnx\u002Fbuild\ncd ncnn\u002Ftools\u002Fpnnx\u002Fbuild\ncmake -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=\u003Cyour libtorch install dir> -DTorchVision_INSTALL_DIR=\u003Cyour torchvision install dir> ..\ncmake --build . --config Release -j 4\ncmake --build . --config Release --target install\n```\n\n# How to use pnnx\n\n### ----- A. python\n\n1. optimize and export your torch model with pnnx.export()\n\n```python\nimport torch\nimport torchvision.models as models\nimport pnnx\n\nmodel = models.resnet18(pretrained=True)\n\nx = torch.rand(1, 3, 224, 224)\n\nopt_model = pnnx.export(model, \"resnet18.pt\", x)\n\n# use tuple for model with multiple inputs\n# opt_model = pnnx.export(model, \"resnet18.pt\", (x, y, z))\n```\n\n2. use optimized module just like the normal one\n\n```python\nresult = opt_model(x)\n```\n\n3. pick resnet18_pnnx.py for pnnx-optimized torch model\n4. pick resnet18.ncnn.param and resnet18.ncnn.bin for ncnn inference\n\n### ----- B. command line\n\n1. export your torch model to torchscript \u002F onnx\n\n```python\nimport torch\nimport torchvision.models as models\n\nnet = models.resnet18(pretrained=True)\nnet = net.eval()\n\nx = torch.rand(1, 3, 224, 224)\n\n# You could try disabling checking when tracing raises error\n# mod = torch.jit.trace(net, x, check_trace=False)\nmod = torch.jit.trace(net, x)\n\nmod.save(\"resnet18.pt\")\n\n# You could also try exporting to the good-old onnx\ntorch.onnx.export(net, x, 'resnet18.onnx')\n```\n\n2. pnnx convert torchscript \u002F onnx to optimized pnnx model and ncnn model files\n\n```shell\n.\u002Fpnnx resnet18.pt inputshape=[1,3,224,224]\n.\u002Fpnnx resnet18.onnx inputshape=[1,3,224,224]\n.\u002Fpnnx resnet18.tnnproto inputshape=[1,3,224,224]\n```\n\nmacOS zsh user may need double quotes to prevent ambiguity\n\n```shell\n.\u002Fpnnx resnet18.pt \"inputshape=[1,3,224,224]\"\n```\n\nFor model with multiple inputs, use list\n\n```shell\n.\u002Fpnnx resnet18.pt inputshape=[1,3,224,224],[1,32]\n```\n\nFor model with non-fp32 input data type, add type suffix\n\n```shell\n.\u002Fpnnx resnet18.pt inputshape=[1,3,224,224]f32,[1,32]i64\n```\n\n3. pick resnet18_pnnx.py for pnnx-optimized torch model\n4. pick resnet18.ncnn.param and resnet18.ncnn.bin for ncnn inference\n\n### ----- visualize pnnx with netron\n\nOpen https:\u002F\u002Fnetron.app\u002F in browser, and drag resnet18.pnnx.param or resnet18.pnnx.onnx into it.\n\n### ----- compare inference result\n\nNormally, you will get seven files\n\n|||\n|---|---|\n|resnet18.pnnx.param|PNNX graph definition|\n|resnet18.pnnx.bin|PNNX model weight|\n|resnet18_pnnx.py|PyTorch script for inference, the python code for model construction and weight initialization|\n|resnet18.pnnx.onnx|PNNX model in onnx format|\n|resnet18.ncnn.param|ncnn graph definition|\n|resnet18.ncnn.bin|ncnn model weight|\n|resnet18_ncnn.py|pyncnn script for inference|\n\n```shell\npip3 install ncnn\n```\n\nrun inference script generated by pnnx and check if the outputs are close enough.\n\n```shell\n$ python resnet18_pnnx.py\ntensor([[-1.5752e+00,  6.8381e-01,  1.4599e+00,  1.1986e+00,  1.0503e+00,\n         -5.0585e-01,  9.1962e-01,  1.4127e-01, -1.2256e+00, -3.8200e-01,\n          1.1840e+00,  2.5817e+00,  1.3319e+00,  2.8250e+00,  2.6328e+00,\n          1.1827e+00,  1.6862e+00,  2.9742e-01,  1.5851e+00,  1.9562e+00,\n          ...\n\n$ python resnet18_ncnn.py\ntensor([[-1.5719e+00,  6.8591e-01,  1.4592e+00,  1.1973e+00,  1.0503e+00,\n         -5.0833e-01,  9.1693e-01,  1.4180e-01, -1.2239e+00, -3.8417e-01,\n          1.1816e+00,  2.5768e+00,  1.3295e+00,  2.8196e+00,  2.6259e+00,\n          1.1806e+00,  1.6830e+00,  2.9536e-01,  1.5808e+00,  1.9530e+00,\n          ...\n```\n\n### ----- detailed options\n\n```\nUsage: pnnx [model.pt] [(key=value)...]\n  pnnxparam=model.pnnx.param\n  pnnxbin=model.pnnx.bin\n  pnnxpy=model_pnnx.py\n  pnnxonnx=model.pnnx.onnx\n  ncnnparam=model.ncnn.param\n  ncnnbin=model.ncnn.bin\n  ncnnpy=model_ncnn.py\n  fp16=1\n  optlevel=2\n  device=cpu\u002Fgpu\n  inputshape=[1,3,224,224],...\n  inputshape2=[1,3,320,320],...\n  customop=\u002Fhome\u002Fnihui\u002F.cache\u002Ftorch_extensions\u002Ffused\u002Ffused.so,...\n  moduleop=models.common.Focus,models.yolo.Detect,...\nSample usage: pnnx mobilenet_v2.pt inputshape=[1,3,224,224]\n              pnnx yolov5s.pt inputshape=[1,3,640,640]f32 inputshape2=[1,3,320,320]f32 device=gpu moduleop=models.common.Focus,models.yolo.Detect\n```\n\n|paramter|default value|description|\n|:---:|:---:|:---|\n|model.pt\u003Cbr>model.onnx\u003Cbr>model.tnnproto|**(required)**|The torchscript \u002F onnx \u002F tnn file path|\n|pnnxparam|*.pnnx.param\u003Cbr \u002F>(\\* is the model name)|PNNX graph definition file|\n|pnnxbin|*.pnnx.bin|PNNX model weight|\n|pnnxpy|*_pnnx.py|PyTorch script for inference, including model construction and weight initialization code|\n|pnnxonnx|*.pnnx.onnx|PNNX model in onnx format|\n|ncnnparam|*.ncnn.param|ncnn graph definition|\n|ncnnbin|*.ncnn.bin|ncnn model weight|\n|ncnnpy|*_ncnn.py|pyncnn script for inference|\n|fp16|1|save ncnn weight and onnx in fp16 data type|\n|optlevel|2|graph optimization level\u003Cbr \u002F>0 = do not apply optimization\u003Cbr \u002F>1 = optimize for inference\u003Cbr \u002F>2 = optimize more for inference|\n|device|cpu|device type for the input in torchscript model, ignored for onnx model, cpu or gpu|\n|inputshape|*(optional)*|shapes of model inputs. It is used to resolve tensor shapes in model graph. for example, `[1,3,224,224]` for the model with only 1 input, `[1,3,224,224],[1,3,224,224]` for the model that have 2 inputs.\u003Cbr \u002F>shape tuple can be optionally decorated by a typename, like `[1,3,224,224]f32` for float32 type.\u003Cbr \u002F>f32 = torch.float32 or torch.float\u003Cbr \u002F>f64 = torch.float64 or torch.double\u003Cbr \u002F>f16 = torch.float16 or torch.half\u003Cbr \u002F>u8 = torch.uint8\u003Cbr \u002F>i8 = torch.int8\u003Cbr \u002F>i16 = torch.int16 or torch.short\u003Cbr \u002F>i32 = torch.int32 or torch.int\u003Cbr \u002F>i64 = torch.int64 or torch.long\u003Cbr \u002F>c32 = torch.complex32\u003Cbr \u002F>c64 = torch.complex64\u003Cbr \u002F>c128 = torch.complex128\u003Cbr \u002F>|\n|inputshape2|*(optional)*|shapes of alternative model inputs, the format is identical to `inputshape`. Usually, it is used with `inputshape` to resolve dynamic shape (-1) in model graph.|\n|customop|*(optional)*|list of Torch extensions (dynamic library) for custom operators, ignored for onnx model, separated by \",\". For example, `\u002Fhome\u002Fnihui\u002F.cache\u002Ftorch_extensions\u002Ffused\u002Ffused.so,...`|\n|moduleop|*(optional)*|list of modules to keep as one big operator, ignored for onnx model, separated by \",\". for example, `models.common.Focus,models.yolo.Detect`|\n\n","# pnnx\n\n![download](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002Fpnnx\u002Fpnnx\u002Ftotal.svg?style=for-the-badge)\n\nPyTorch 神经网络交换格式\n\n注：当前实现位于 https:\u002F\u002Fgithub.com\u002FTencent\u002Fncnn\u002Ftree\u002Fmaster\u002Ftools\u002Fpnnx\n\n# 什么是 pnnx\n\nPyTorch 神经网络交换格式（PNNX）是用于 PyTorch 模型互操作性的开放标准。PNNX 为 PyTorch 提供了一种开放的模型格式，它严格遵循 PyTorch 的定义来描述计算图和高级算子。\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd>\n\n* 优化 Torch 模型\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_f53238d3357c.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003Ctd>\n\n* 减少扩展包依赖\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_257dc19b7d2a.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\n\n* 将 TorchScript \u002F ONNX 转换回 Python\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_968f484c8581.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003Ctd>\n\n* 导出为便携式 PNNX 格式 \u002F ONNX-Zero \u002F NCNN\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_19890447a71f.jpg\" height=\"160\">\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n```mermaid\nflowchart TD\n    torchmodel[\"torch 模型\u003Cbr>torchvision.models.resnet18()\"]\n    othermodel[\"caffe, mxnet\u003Cbr>keras, tensorflow\u003Cbr>paddlepaddle, 等\"]\n    torchscript[\"torchscript 文件\u003Cbr>resnet18.pt\"]\n    onnx[\"onnx 文件\u003Cbr>resnet18.onnx\"]\n    tnn[\"tnn 文件\u003Cbr>resnet18.tnnproto\u002Ftnnmodel\"]\n    optmodel[\"优化后的 torch 模型\u003Cbr>resnet18_pnnx.Model()\"]\n    ncnnmodel[\"ncnn 模型\u003Cbr>resnet18.ncnn.param\u002Fbin\"]\n    onnxzeromodel[\"onnx-zero 模型\u003Cbr>resnet18.pnnx.onnx\"]\n\n    subgraph pnnx\n        optmodel\n        ncnnmodel\n        onnxzeromodel\n    end\n\n    torchmodel -->|\"mod = torch.jit.trace(model, x)\u003Cbr>mod.save('resnet18.pt')\"| torchscript\n    torchmodel -->|\"torch.onnx.export(model, x, 'resnet18.onnx')\"| onnx\n    othermodel -->|\"导出到 onnx\"| onnx\n    torchmodel -->|\"pnnx.export(model, 'resnet18.pt', x)\"| pnnx\n    torchscript -->|\"pnnx.convert('resnet18.pt', x)\"| pnnx\n    onnx -->|\"pnnx.convert('resnet18.onnx', x)\"| pnnx\n    tnn -->|\"pnnx.convert('resnet18.tnnproto', x)\"| pnnx\n\n```\n\n# 如何安装 pnnx\n\n### ----- A. python pip（推荐）\n\n* Windows\u002FLinux\u002FmacOS 64位\n* python 3.7 或更高版本\n\n```shell\npip3 install pnnx\n```\n\n### ----- B. 便携式二进制包（如果你不喜欢 Python，推荐使用）\n\n* Windows\u002FLinux\u002FmacOS 64位\n* 对于 Linux，glibc 2.17+\n\n从 https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases 下载便携式 pnnx 二进制包并解压。\n\n该包包含了所有必要的二进制文件。它是便携式的，因此不需要 CUDA 或 PyTorch 运行时环境 :)\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_6a84e2a2daf3.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>Windows\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-windows.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_342b3a50c54d.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>Linux(x86_64)\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-linux.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_342b3a50c54d.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>Linux(aarch64)\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-linux-aarch64.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003Ctd>\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_readme_5addd8d2ad40.png\" width=\"auto\" height=\"60\">\n  \u003Cbr \u002F>\u003Cb>macOS(universal)\u003C\u002Fb>\u003Cbr \u002F>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-macos.zip\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdownload-blue?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n### ----- C. 从源码构建\n\n1. 安装 PyTorch\n2. （可选）安装 torchvision 以支持 pnnx 的 torchvision 算子\n3. （可选）安装 protobuf 以支持 pnnx 的 onnx-zero\n4. 克隆 https:\u002F\u002Fgithub.com\u002FTencent\u002Fncnn.git\n5. 使用 cmake 在 ncnn\u002Ftools\u002Fpnnx 中构建 pnnx\n\n你可能会参考 https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Frelease.yml 获取详细步骤\n\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002FTencent\u002Fncnn.git\nmkdir ncnn\u002Ftools\u002Fpnnx\u002Fbuild\ncd ncnn\u002Ftools\u002Fpnnx\u002Fbuild\ncmake -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=\u003Cyour libtorch install dir> -DTorchVision_INSTALL_DIR=\u003Cyour torchvision install dir> ..\ncmake --build . --config Release -j 4\ncmake --build . --config Release --target install\n```\n\n# 如何使用 pnnx\n\n### ----- A. python\n\n1. 使用 pnnx.export() 优化并导出你的 torch 模型\n\n```python\nimport torch\nimport torchvision.models as models\nimport pnnx\n\nmodel = models.resnet18(pretrained=True)\n\nx = torch.rand(1, 3, 224, 224)\n\nopt_model = pnnx.export(model, \"resnet18.pt\", x)\n\n# 对于多输入模型，可以使用元组\n# opt_model = pnnx.export(model, \"resnet18.pt\", (x, y, z))\n```\n\n2. 像使用普通模块一样使用优化后的模块\n\n```python\nresult = opt_model(x)\n```\n\n3. 选择 resnet18_pnnx.py 作为 pnnx 优化后的 torch 模型\n4. 选择 resnet18.ncnn.param 和 resnet18.ncnn.bin 用于 ncnn 推理\n\n### ----- B. 命令行\n\n1. 将你的 torch 模型导出为 torchscript \u002F onnx\n\n```python\nimport torch\nimport torchvision.models as models\n\nnet = models.resnet18(pretrained=True)\nnet = net.eval()\n\nx = torch.rand(1, 3, 224, 224)\n\n# 如果在跟踪时出现错误，可以尝试禁用检查\n# mod = torch.jit.trace(net, x, check_trace=False)\nmod = torch.jit.trace(net, x)\n\nmod.save(\"resnet18.pt\")\n\n# 也可以尝试导出为传统的 onnx 格式\ntorch.onnx.export(net, x, 'resnet18.onnx')\n```\n\n2. 使用 pnnx 将 torchscript \u002F onnx 转换为优化后的 pnnx 模型和 ncnn 模型文件\n\n```shell\n.\u002Fpnnx resnet18.pt inputshape=[1,3,224,224]\n.\u002Fpnnx resnet18.onnx inputshape=[1,3,224,224]\n.\u002Fpnnx resnet18.tnnproto inputshape=[1,3,224,224]\n```\n\nmacOS zsh 用户可能需要使用双引号以避免歧义\n\n```shell\n.\u002Fpnnx resnet18.pt \"inputshape=[1,3,224,224]\"\n```\n\n对于多输入模型，使用列表\n\n```shell\n.\u002Fpnnx resnet18.pt inputshape=[1,3,224,224],[1,32]\n```\n\n对于非 fp32 输入数据类型的模型，添加类型后缀\n\n```shell\n.\u002Fpnnx resnet18.pt inputshape=[1,3,224,224]f32,[1,32]i64\n```\n\n3. 选择 resnet18_pnnx.py 作为 pnnx 优化后的 torch 模型\n4. 选择 resnet18.ncnn.param 和 resnet18.ncnn.bin 用于 ncnn 推理\n\n### ----- 使用 netron 可视化 pnnx\n\n在浏览器中打开 https:\u002F\u002Fnetron.app\u002F，然后将 resnet18.pnnx.param 或 resnet18.pnnx.onnx 拖入其中。\n\n### ----- 比较推理结果\n\n通常情况下，你会得到七个文件：\n\n|||\n|---|---|\n|resnet18.pnnx.param|PNNX 图定义|\n|resnet18.pnnx.bin|PNNX 模型权重|\n|resnet18_pnnx.py|用于推理的 PyTorch 脚本，包含模型构建和权重初始化的 Python 代码|\n|resnet18.pnnx.onnx|以 ONNX 格式表示的 PNNX 模型|\n|resnet18.ncnn.param|NCNN 图定义|\n|resnet18.ncnn.bin|NCNN 模型权重|\n|resnet18_ncnn.py|用于推理的 pyncnn 脚本|\n\n```shell\npip3 install ncnn\n```\n\n运行由 PNNX 生成的推理脚本，并检查输出是否足够接近。\n\n```shell\n$ python resnet18_pnnx.py\ntensor([[-1.5752e+00,  6.8381e-01,  1.4599e+00,  1.1986e+00,  1.0503e+00,\n         -5.0585e-01,  9.1962e-01,  1.4127e-01, -1.2256e+00, -3.8200e-01,\n          1.1840e+00,  2.5817e+00,  1.3319e+00,  2.8250e+00,  2.6328e+00,\n          1.1827e+00,  1.6862e+00,  2.9742e-01,  1.5851e+00,  1.9562e+00,\n          ...\n\n$ python resnet18_ncnn.py\ntensor([[-1.5719e+00,  6.8591e-01,  1.4592e+00,  1.1973e+00,  1.0503e+00,\n         -5.0833e-01,  9.1693e-01,  1.4180e-01, -1.2239e+00, -3.8417e-01,\n          1.1816e+00,  2.5768e+00,  1.3295e+00,  2.8196e+00,  2.6259e+00,\n          1.1806e+00,  1.6830e+00,  2.9536e-01,  1.5808e+00,  1.9530e+00,\n          ...\n```\n\n### ----- 详细选项\n\n```\n用法：pnnx [model.pt] [(key=value)...]\n  pnnxparam=model.pnnx.param\n  pnnxbin=model.pnnx.bin\n  pnnxpy=model_pnnx.py\n  pnnxonnx=model.pnnx.onnx\n  ncnnparam=model.ncnn.param\n  ncnnbin=model.ncnn.bin\n  ncnnpy=model_ncnn.py\n  fp16=1\n  optlevel=2\n  device=cpu\u002Fgpu\n  inputshape=[1,3,224,224],...\n  inputshape2=[1,3,320,320],...\n  customop=\u002Fhome\u002Fnihui\u002F.cache\u002Ftorch_extensions\u002Ffused\u002Ffused.so,...\n  moduleop=models.common.Focus,models.yolo.Detect,...\n示例用法：pnnx mobilenet_v2.pt inputshape=[1,3,224,224]\n              pnnx yolov5s.pt inputshape=[1,3,640,640]f32 inputshape2=[1,3,320,320]f32 device=gpu moduleop=models.common.Focus,models.yolo.Detect\n```\n\n|参数|默认值|说明|\n|:---:|:---:|:---|\n|model.pt\u003Cbr>model.onnx\u003Cbr>model.tnnproto|**(必填)**|TorchScript \u002F ONNX \u002F TNN 文件路径|\n|pnnxparam|*.pnnx.param\u003Cbr \u002F>(\\* 是模型名称)|PNNX 图定义文件|\n|pnnxbin|*.pnnx.bin|PNNX 模型权重|\n|pnnxpy|*_pnnx.py|用于推理的 PyTorch 脚本，包含模型构建和权重初始化代码|\n|pnnxonnx|*.pnnx.onnx|以 ONNX 格式表示的 PNNX 模型|\n|ncnnparam|*.ncnn.param|NCNN 图定义|\n|ncnnbin|*.ncnn.bin|NCNN 模型权重|\n|ncnnpy|*_ncnn.py|用于推理的 pyncnn 脚本|\n|fp16|1|以 FP16 数据类型保存 NCNN 权重和 ONNX 模型|\n|optlevel|2|图优化级别\u003Cbr \u002F>0 = 不应用优化\u003Cbr \u002F>1 = 针对推理进行优化\u003Cbr \u002F>2 = 更进一步针对推理优化|\n|device|cpu|TorchScript 模型输入的设备类型，ONNX 模型忽略此参数，可为 cpu 或 gpu|\n|inputshape|*(可选)*|模型输入的形状。用于解析模型图中的张量形状。例如，对于只有一个输入的模型，使用 `[1,3,224,224]`；对于有两个输入的模型，使用 `[1,3,224,224],[1,3,224,224]`。\u003Cbr \u002F>形状元组可以附加数据类型后缀，如 `[1,3,224,224]f32` 表示 float32 类型。\u003Cbr \u002F>f32 = torch.float32 或 torch.float\u003Cbr \u002F>f64 = torch.float64 或 torch.double\u003Cbr \u002F>f16 = torch.float16 或 torch.half\u003Cbr \u002F>u8 = torch.uint8\u003Cbr \u002F>i8 = torch.int8\u003Cbr \u002F>i16 = torch.int16 或 torch.short\u003Cbr \u002F>i32 = torch.int32 或 torch.int\u003Cbr \u002F>i64 = torch.int64 或 torch.long\u003Cbr \u002F>c32 = torch.complex32\u003Cbr \u002F>c64 = torch.complex64\u003Cbr \u002F>c128 = torch.complex128\u003Cbr \u002F>|\n|inputshape2|*(可选)*|备选模型输入的形状，格式与 `inputshape` 相同。通常与 `inputshape` 一起使用，以解析模型图中的动态形状（-1）。|\n|customop|*(可选)*|自定义算子的 Torch 扩展库（动态链接库）列表，ONNX 模型忽略此参数，各库之间用逗号分隔。例如，`\u002Fhome\u002Fnihui\u002F.cache\u002Ftorch_extensions\u002Ffused\u002Ffused.so,...`|\n|moduleop|*(可选)*|需要保持为一个整体算子的模块列表，ONNX 模型忽略此参数，各模块之间用逗号分隔。例如，`models.common.Focus,models.yolo.Detect`|","# PNNX 快速上手指南\n\nPNNX (PyTorch Neural Network eXchange) 是一个专为 PyTorch 模型设计的开放标准格式。它能将 PyTorch 模型优化并转换为便携式格式，同时支持导出为 **ncnn**（高性能推理框架）和 **ONNX-Zero** 格式，旨在解决 PyTorch 模型部署中的依赖复杂和算子不匹配问题。\n\n## 1. 环境准备\n\n### 系统要求\n- **操作系统**: Windows \u002F Linux \u002F macOS (64 位)\n- **Python 版本**: 3.7 或更高 (若使用 Python 方式)\n- **Linux 额外要求**: glibc 2.17+ (若使用二进制包)\n\n### 前置依赖\n- **方式 A (Python)**: 需预先安装 `torch` 和 `torchvision`。\n- **方式 B (二进制包)**: **无需**安装 CUDA、PyTorch 或任何 Python 环境，开箱即用。\n- **方式 C (源码编译)**: 需安装 CMake、PyTorch (libtorch)、可选安装 torchvision 和 protobuf。\n\n## 2. 安装步骤\n\n推荐根据实际需求选择以下任一方式：\n\n### 方式 A：通过 pip 安装 (适合 Python 开发者)\n```shell\npip3 install pnnx\n```\n*注：国内用户如遇下载慢，可指定清华源：`pip3 install pnnx -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple`*\n\n### 方式 B：下载便携二进制包 (适合无 Python 环境或追求轻量)\n访问 GitHub Releases 页面下载对应系统的压缩包并解压：\n- **Windows**: [下载链接](https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-windows.zip)\n- **Linux (x86_64)**: [下载链接](https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-linux.zip)\n- **Linux (aarch64)**: [下载链接](https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-linux-aarch64.zip)\n- **macOS**: [下载链接](https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Freleases\u002Flatest\u002Fdownload\u002Fpnnx-20240815-macos.zip)\n\n解压后，目录内即包含可执行的 `pnnx` 程序。\n\n### 方式 C：源码编译 (适合高级用户)\n```shell\ngit clone https:\u002F\u002Fgithub.com\u002FTencent\u002Fncnn.git\nmkdir ncnn\u002Ftools\u002Fpnnx\u002Fbuild\ncd ncnn\u002Ftools\u002Fpnnx\u002Fbuild\n# 请替换 \u003Cyour libtorch install dir> 为你的实际路径\ncmake -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR=\u003Cyour libtorch install dir> -DTorchVision_INSTALL_DIR=\u003Cyour torchvision install dir> ..\ncmake --build . --config Release -j 4\ncmake --build . --config Release --target install\n```\n\n## 3. 基本使用\n\nPNNX 支持两种主要工作流：直接在 Python 中调用或通过命令行转换已有模型。\n\n### 场景一：在 Python 代码中直接优化并导出\n适用于你拥有原始的 PyTorch 模型代码。\n\n```python\nimport torch\nimport torchvision.models as models\nimport pnnx\n\n# 1. 加载模型\nmodel = models.resnet18(pretrained=True)\n\n# 2. 构造示例输入 (用于追踪计算图)\nx = torch.rand(1, 3, 224, 224)\n\n# 3. 导出模型\n# 生成 resnet18.pt (PNNX 格式), resnet18.ncnn.param\u002Fbin, resnet18_pnnx.py 等文件\nopt_model = pnnx.export(model, \"resnet18.pt\", x)\n\n# 4. 像普通模型一样使用优化后的模块\nresult = opt_model(x)\n```\n**产出文件说明**：\n- `resnet18_pnnx.py`: 可直接运行的 PyTorch 推理脚本。\n- `resnet18.ncnn.param` \u002F `.bin`: 用于 ncnn 推理的模型文件。\n\n### 场景二：通过命令行转换现有模型\n适用于你已经有导出的 TorchScript (`.pt`) 或 ONNX (`.onnx`) 模型。\n\n**第一步：准备模型文件**\n先使用 PyTorch 原生接口导出模型（如果尚未导出）：\n```python\nimport torch\nimport torchvision.models as models\n\nnet = models.resnet18(pretrained=True)\nnet = net.eval()\nx = torch.rand(1, 3, 224, 224)\n\n# 导出为 TorchScript\nmod = torch.jit.trace(net, x)\nmod.save(\"resnet18.pt\")\n\n# 或者导出为 ONNX\n# torch.onnx.export(net, x, 'resnet18.onnx')\n```\n\n**第二步：运行 PNNX 转换命令**\n在终端执行（假设已安装或在二进制包目录下）：\n\n```shell\n# 转换 TorchScript 模型\n.\u002Fpnnx resnet18.pt inputshape=[1,3,224,224]\n\n# 转换 ONNX 模型\n.\u002Fpnnx resnet18.onnx inputshape=[1,3,224,224]\n```\n\n*注意：macOS zsh 用户可能需要给参数加引号以防歧义：*\n```shell\n.\u002Fpnnx resnet18.pt \"inputshape=[1,3,224,224]\"\n```\n\n**第三步：验证结果**\n转换完成后会生成多个文件，运行生成的 Python 脚本对比输出：\n```shell\n# 运行 PNNX 优化的 PyTorch 脚本\npython resnet18_pnnx.py\n\n# 运行 ncnn 推理脚本 (需先安装 ncnn: pip3 install ncnn)\npython resnet18_ncnn.py\n```\n检查两者输出的 Tensor 数值是否接近，以确认转换成功。\n\n### 进阶提示\n- **多输入模型**: 使用逗号分隔形状，例如 `inputshape=[1,3,224,224],[1,32]`。\n- **指定数据类型**: 在形状后添加后缀，如 `f32` (float32), `i64` (int64)，例如 `inputshape=[1,3,224,224]f32`。\n- **可视化**: 将生成的 `resnet18.pnnx.param` 或 `resnet18.pnnx.onnx` 拖入 [Netron](https:\u002F\u002Fnetron.app\u002F) 即可查看模型结构。","某嵌入式团队正尝试将基于 PyTorch 训练的 ResNet18 图像分类模型部署到资源受限的 ARM 边缘设备上。\n\n### 没有 pnnx 时\n- **环境依赖沉重**：目标设备必须安装完整的 Python 解释器和庞大的 PyTorch 运行时库，导致固件体积激增，难以在存储有限的芯片上运行。\n- **算子兼容性差**：直接使用 TorchScript 或 ONNX 导出时，常因自定义算子或动态图特性导致推理引擎（如 ncnn）无法解析，需手动重写大量 C++ 代码。\n- **调试链路断裂**：一旦模型在端侧推理出错，由于计算图已被黑盒化，开发者很难将错误映射回原始的 Python 代码逻辑进行排查。\n- **多格式转换繁琐**：若需适配不同后端，往往需要在 PyTorch、ONNX 和各私有格式间反复横跳转换，每次转换都可能引入精度损失或结构畸变。\n\n### 使用 pnnx 后\n- **实现轻量部署**：pnnx 直接将模型优化并导出为纯二进制的 ncnn 格式，彻底移除了对 Python 和 PyTorch 环境的依赖，显著降低内存与存储占用。\n- **算子完美对齐**：pnnx 定义的高层算子严格匹配 PyTorch 语义，自动处理复杂图结构，确保模型在推理引擎中无需修改即可高精度运行。\n- **支持反向还原**：遇到推理异常时，可利用 pnnx 将中间格式无损还原为可执行的 Python 模型，快速定位是训练问题还是导出问题，极大缩短调试周期。\n- **统一交换标准**：作为开放的中间标准，pnnx 打通了从 PyTorch 到 ONNX Zero 及 ncnn 的单向流畅通路，避免了多格式反复转换带来的不确定性。\n\npnnx 通过定义严格的 PyTorch 互操作标准，成功打破了算法训练与端侧部署之间的“最后一公里”壁垒，让模型落地更高效、更可靠。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fpnnx_pnnx_f916be03.png","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fpnnx_b230f9c9.png",null,"https:\u002F\u002Fgithub.com\u002Fpnnx",[79],{"name":80,"color":81,"percentage":82},"Python","#3572A5",100,702,45,"2026-04-02T08:10:50",1,"Linux, macOS, Windows","非必需。支持 CPU 运行；若使用 TorchScript 模型转换且指定 device=gpu，则需本地安装匹配的 PyTorch CUDA 版本，README 未指定具体显卡型号或显存大小。","未说明",{"notes":91,"python":92,"dependencies":93},"提供两种主要使用方式：1. Python pip 安装（需 PyTorch 环境）；2. 下载便携版二进制包（无需安装 Python、CUDA 或 PyTorch 即可运行）。Linux 便携版要求 glibc 2.17+。从源码编译需手动安装 libtorch 和 torchvision。","3.7+",[94,95,96,97],"torch","torchvision (可选)","protobuf (可选，用于 onnx-zero 支持)","ncnn (用于推理)",[13],"2026-03-27T02:49:30.150509","2026-04-06T08:42:14.270934",[102,107,112,117,122,127],{"id":103,"question_zh":104,"answer_zh":105,"source_url":106},13699,"如何让 TorchScript (jit trace) 将自定义模块视为单个算子而不是展开为多个小算子？","在使用 pnnx 转换时，可以通过 `moduleop` 参数指定需要被视为整体模块的类名。命令格式如下：\n`.\u002Fpnnx mymodel.pt inputshape=[...] moduleop=MyCustomBigBlock`\n这样 pnnx 会在 pass_level0 阶段识别并内联该模块，将其作为一个整体算子处理，而不是展开内部的加法等操作。","https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fissues\u002F35",{"id":108,"question_zh":109,"answer_zh":110,"source_url":111},13700,"运行 pnnx 时报错 'terminate called after throwing an instance of torch::jit::ErrorReport' 且无详细错误信息怎么办？","这通常是由于 PyTorch 版本不兼容导致的。有用户反馈在使用 torch 1.12.1+cu116 时出现此崩溃，切换回 torch 1.11 版本后问题解决。建议尝试降低 PyTorch 版本或确保使用的 PyTorch 是通过 pip 安装的官方预编译版本，避免使用自行编译的版本导致二进制兼容性问题。","https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fissues\u002F51",{"id":113,"question_zh":114,"answer_zh":115,"source_url":116},13701,"转换 in_channels 为 1 的 Conv2d 层时加载模型报错 'ModelBin read quantization_value failed' 如何解决？","该问题在旧版本中存在，表现为处理输入通道数为 1 的卷积层时失败。维护者已确认在最新版本中修复了此 Bug。如果遇到此错误，请务必更新 pnnx 到最新版本。此外，曾有临时建议尝试增大输入尺寸（如将高度从 5 改为 50）来规避，但根本解决方法是升级软件。","https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fissues\u002F52",{"id":118,"question_zh":119,"answer_zh":120,"source_url":121},13702,"目前支持哪些尚未完全实现的 Torch 算子？","PNNX 正在持续增加对 Torch 算子的支持。根据社区进展，`torch.norm` 和 `torch.stack` 的转换功能已经实现。对于张量索引操作（Tensor index），相关支持已在 NCNN 项目中通过 PR #3483 添加，通常会同步到 PNNX 的支持列表中。遇到不支持的算子时，建议查看最新发行说明或提交 Issue 询问具体算子的支持状态。","https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fissues\u002F4",{"id":123,"question_zh":124,"answer_zh":125,"source_url":126},13703,"导出 ONNX 时 grid_sample 算子显示为 Aten 而不是标准的 GridSample 算子怎么办？","当处理高维输入（如 5 维）时，直接使用 pnnx 生成的 Python 脚本导出 ONNX 可能会将 `grid_sample` 降级为 `Aten` 算子。虽然可以通过修改导出脚本中的 `opset_version`（例如设为 17）尝试解决，但如果 Netron 中仍显示为 Aten，说明该特定维度组合下的算子映射可能尚未完美支持。建议检查输入维度是否符合常规（通常 grid_sample 用于 4 维 NCHW），或者等待后续版本对该高维情况的专门优化。","https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fissues\u002F133",{"id":128,"question_zh":129,"answer_zh":130,"source_url":131},13704,"PNNX 项目会开源吗？","是的，PNNX 已经开源。该项目托管在 GitHub 上，用户可以自由访问代码库、提交 Issue 以及参与贡献。","https:\u002F\u002Fgithub.com\u002Fpnnx\u002Fpnnx\u002Fissues\u002F2",[133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,193,197,201,205,209],{"id":134,"version":135,"summary_zh":76,"released_at":136},72575,"20260112","2026-01-12T08:58:18",{"id":138,"version":139,"summary_zh":76,"released_at":140},72576,"20251119","2025-11-19T09:45:56",{"id":142,"version":143,"summary_zh":76,"released_at":144},72577,"20251112","2025-11-12T12:24:43",{"id":146,"version":147,"summary_zh":76,"released_at":148},72578,"20251031","2025-10-31T08:09:33",{"id":150,"version":151,"summary_zh":76,"released_at":152},72579,"20251028","2025-10-28T08:11:42",{"id":154,"version":155,"summary_zh":76,"released_at":156},72580,"20251023","2025-10-23T03:41:13",{"id":158,"version":159,"summary_zh":76,"released_at":160},72581,"20251016","2025-10-16T07:27:45",{"id":162,"version":163,"summary_zh":76,"released_at":164},72582,"20250930","2025-09-30T09:11:17",{"id":166,"version":167,"summary_zh":76,"released_at":168},72583,"20250924","2025-09-24T09:51:16",{"id":170,"version":171,"summary_zh":76,"released_at":172},72584,"20250912","2025-09-12T06:51:33",{"id":174,"version":175,"summary_zh":76,"released_at":176},72585,"20250819","2025-08-19T06:17:14",{"id":178,"version":179,"summary_zh":76,"released_at":180},72586,"20250818","2025-08-18T06:30:38",{"id":182,"version":183,"summary_zh":76,"released_at":184},72587,"20250725","2025-07-25T03:59:50",{"id":186,"version":187,"summary_zh":76,"released_at":188},72588,"20250530","2025-05-30T09:31:47",{"id":190,"version":191,"summary_zh":76,"released_at":192},72589,"20250430","2025-04-30T10:34:13",{"id":194,"version":195,"summary_zh":76,"released_at":196},72590,"20250427","2025-04-27T08:35:52",{"id":198,"version":199,"summary_zh":76,"released_at":200},72591,"20250424","2025-04-24T09:43:30",{"id":202,"version":203,"summary_zh":76,"released_at":204},72592,"20250403","2025-04-03T09:01:41",{"id":206,"version":207,"summary_zh":76,"released_at":208},72593,"20241223","2024-12-23T04:37:45",{"id":210,"version":211,"summary_zh":76,"released_at":212},72594,"20240819","2024-08-19T08:50:09"]