[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-ekzhang--jax-js":3,"tool-ekzhang--jax-js":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 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[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":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":80,"owner_email":81,"owner_twitter":82,"owner_website":83,"owner_url":84,"languages":85,"stars":109,"forks":110,"last_commit_at":111,"license":112,"difficulty_score":113,"env_os":114,"env_gpu":115,"env_ram":116,"env_deps":117,"category_tags":121,"github_topics":122,"view_count":23,"oss_zip_url":132,"oss_zip_packed_at":132,"status":16,"created_at":133,"updated_at":134,"faqs":135,"releases":164},3686,"ekzhang\u002Fjax-js","jax-js","JAX in JavaScript – ML library for the web, running on WebGPU & Wasm","jax-js 是一款专为浏览器打造的机器学习框架，旨在让开发者直接在网页端运行高性能的数值计算与 AI 模型。它成功解决了传统机器学习依赖后端服务器或复杂环境配置的痛点，无需安装任何外部依赖，即可利用用户的本地 CPU 和 GPU 资源进行高效运算。\n\n这款工具非常适合前端开发者、算法研究人员以及希望构建交互式 AI 演示的教育工作者。其核心亮点在于完美复刻了 Python 生态中 JAX 和 NumPy 的 API 风格，让熟悉科学计算的开发者能无缝迁移技能。在技术底层，jax-js 从零构建，能将数组操作自动编译为 WebAssembly 和 WebGPU 内核，从而在浏览器中实现极致的执行速度。它不仅支持自动微分、JIT 即时编译等高级特性，还具备极高的便携性——只要有现代浏览器（包括移动端），就能流畅运行神经网络训练、语音克隆甚至流体模拟等复杂任务。凭借小巧的体积和对最新图形标准的广泛支持，jax-js 正成为推动“浏览器即算力平台”的重要力量。","\u003Ch1 align=\"center\">jax-js: JAX in pure JavaScript\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\u003Cstrong>\n  \u003Ca href=\"https:\u002F\u002Fjax-js.com\">Website\u003C\u002Fa> |\n  \u003Ca href=\"https:\u002F\u002Fjax-js.com\u002Fdocs\u002F\">API Reference\u003C\u002Fa> |\n  \u003Ca href=\".\u002FFEATURES.md\">Compatibility Table\u003C\u002Fa> |\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FBW6YsCd4Tf\">Discord\u003C\u002Fa>\n\u003C\u002Fstrong>\u003C\u002Fp>\n\n**jax-js** is a machine learning framework for the browser. It aims to bring\n[JAX](https:\u002F\u002Fjax.dev)-style, high-performance CPU and GPU kernels to JavaScript, so you can run\nnumerical applications on the web.\n\n```bash\nnpm i @jax-js\u002Fjax\n```\n\nUnder the hood, it translates array operations into a compiler representation, then synthesizes\nkernels in WebAssembly and WebGPU.\n\nThe library is written from scratch, with zero external dependencies. It maintains close API\ncompatibility with NumPy\u002FJAX. Since everything runs client-side, jax-js is likely the most portable\nGPU ML framework, since it runs anywhere a browser can run.\n\n## Quickstart\n\n```js\nimport { numpy as np } from \"@jax-js\u002Fjax\";\n\n\u002F\u002F Array operations, compatible with JAX\u002FNumPy.\nconst x = np.array([1, 2, 3]);\nconst y = x.mul(4); \u002F\u002F [4, 8, 12]\n```\n\n### Web usage (CDN)\n\nIn vanilla JavaScript (without a bundler), just import from a module script tag. This is the easiest\nway to get started on a blank HTML page.\n\n```html\n\u003Cscript type=\"module\">\n  import { numpy as np } from \"https:\u002F\u002Fesm.sh\u002F@jax-js\u002Fjax\";\n\u003C\u002Fscript>\n```\n\n### Platforms\n\nThis table refers to latest versions of each browser. WebGPU has gained wide support in browsers as\nof late 2025.\n\n| Platform            | CPU (Wasm) | GPU (WebGPU)   | GPU (WebGL) |\n| ------------------- | ---------- | -------------- | ----------- |\n| Chrome \u002F Edge       | ✅         | ✅             | ✅          |\n| Firefox             | ✅         | ✅ - macOS 26+ | ✅          |\n| Safari              | ✅         | ✅ - macOS 26+ | ✅          |\n| iOS                 | ✅         | ✅ - iOS 26+   | ✅          |\n| Chrome for Android  | ✅         | ✅             | ✅          |\n| Firefox for Android | ✅         | ❌             | ✅          |\n| Node.js             | ✅         | ❌             | ❌          |\n| Deno                | ✅         | ✅ - async     | ❌          |\n\n## Examples\n\nCommunity usage:\n\n- [**autoresearch-webgpu**: autoresesarch, in the browser](https:\u002F\u002Fautoresearch.lucasgelfond.online\u002F)\n- [**tanh.xyz**: Interactive ML visualizations](https:\u002F\u002Ftanh.xyz\u002F)\n- [**jax-js-bayes**: Declarative Bayesian modeling library](https:\u002F\u002Fgithub.com\u002FStefanSko\u002Fjax-js-bayes)\n\nDemos on the jax-js website:\n\n- [Training neural networks on MNIST](https:\u002F\u002Fjax-js.com\u002Fmnist)\n- [Voice cloning: Kyutai Pocket TTS](https:\u002F\u002Fjax-js.com\u002Ftts)\n- [CLIP embeddings for books in-browser](https:\u002F\u002Fjax-js.com\u002Fmobileclip)\n- [Object detection: DETR ResNet-50 (ONNX)](https:\u002F\u002Fjax-js.com\u002Fdetr-resnet-50)\n- [Fluid simulation (Navier-Stokes)](https:\u002F\u002Fjax-js.com\u002Ffluid-sim)\n- [In-browser REPL](https:\u002F\u002Fjax-js.com\u002Frepl)\n- [Matmul benchmark](https:\u002F\u002Fjax-js.com\u002Fbench\u002Fmatmul)\n- [Conv2d benchmark](https:\u002F\u002Fjax-js.com\u002Fbench\u002Fconv2d)\n- [Mandelbrot set](https:\u002F\u002Fjax-js.com\u002Fmandelbrot)\n\n## Feature comparison\n\nHere's a quick, high-level comparison with other popular web ML runtimes:\n\n| Feature                         | jax-js     | TensorFlow.js   | onnxruntime-web    |\n| ------------------------------- | ---------- | --------------- | ------------------ |\n| **Overview**                    |            |                 |                    |\n| API style                       | JAX\u002FNumPy  | TensorFlow-like | Static ONNX graphs |\n| Latest release                  | 2026       | ⚠️ 2024         | 2026               |\n| Speed                           | Fastest    | Fast            | Fastest            |\n| Bundle size (gzip)              | 80 KB      | 269 KB          | 90 KB + 24 MB Wasm |\n| **Autodiff & JIT**              |            |                 |                    |\n| Gradients                       | ✅         | ✅              | ❌                 |\n| Jacobian and Hessian            | ✅         | ❌              | ❌                 |\n| `jvp()` forward differentiation | ✅         | ❌              | ❌                 |\n| `jit()` kernel fusion           | ✅         | ❌              | ❌                 |\n| `vmap()` auto-vectorization     | ✅         | ❌              | ❌                 |\n| Graph capture                   | ✅         | ❌              | ✅                 |\n| **Backends & Data**             |            |                 |                    |\n| WebGPU backend                  | ✅         | 🟡 Preview      | ✅                 |\n| WebGL backend                   | ✅         | ✅              | ✅                 |\n| Wasm (CPU) backend              | ✅         | ✅              | ✅                 |\n| Eager array API                 | ✅         | ✅              | ❌                 |\n| Run ONNX models                 | 🟡 Partial | ❌              | ✅                 |\n| Read safetensors                | ✅         | ❌              | ❌                 |\n| Float64                         | ✅         | ❌              | ❌                 |\n| Float32                         | ✅         | ✅              | ✅                 |\n| Float16                         | ✅         | ❌              | ✅                 |\n| BFloat16                        | ❌         | ❌              | ❌                 |\n| Packed Uint8                    | ❌         | ❌              | 🟡 Partial         |\n| Mixed precision                 | ✅         | ❌              | ✅                 |\n| Mixed devices                   | ✅         | ❌              | ❌                 |\n| **Ops & Numerics**              |            |                 |                    |\n| Arithmetic functions            | ✅         | ✅              | ✅                 |\n| Matrix multiplication           | ✅         | ✅              | ✅                 |\n| General einsum                  | ✅         | 🟡 Partial      | 🟡 Partial         |\n| Sorting                         | ✅         | ❌              | ❌                 |\n| Activation functions            | ✅         | ✅              | ✅                 |\n| NaN\u002FInf numerics                | ✅         | ✅              | ✅                 |\n| Basic convolutions              | ✅         | ✅              | ✅                 |\n| n-d convolutions                | ✅         | ❌              | ✅                 |\n| Strided\u002Fdilated convolution     | ✅         | ✅              | ✅                 |\n| Cholesky, Lstsq                 | ✅         | ❌              | ❌                 |\n| LU, Solve, Determinant          | ✅         | ❌              | ❌                 |\n| SVD                             | ❌         | ❌              | ❌                 |\n| FFT                             | ✅         | ✅              | ✅                 |\n| Basic RNG (Uniform, Normal)     | ✅         | ✅              | ✅                 |\n| Advanced RNG                    | ✅         | ❌              | ❌                 |\n\n## Tutorial\n\nProgramming in `jax-js` looks [very similar to JAX](https:\u002F\u002Fdocs.jax.dev\u002Fen\u002Flatest\u002Fjax-101.html),\njust in JavaScript.\n\n### Arrays\n\nCreate an array with `np.array()`:\n\n```ts\nimport { numpy as np } from \"@jax-js\u002Fjax\";\n\nconst ar = np.array([1, 2, 3]);\n```\n\nBy default, this is a float32 array, but you can specify a different dtype:\n\n```ts\nconst ar = np.array([1, 2, 3], { dtype: np.int32 });\n```\n\nFor more efficient construction, create an array from a JS `TypedArray` buffer:\n\n```ts\nconst buf = new Float32Array([10, 20, 30, 100, 200, 300]);\nconst ar = np.array(buf).reshape([2, 3]);\n```\n\nOnce you're done with it, you can unwrap a `jax.Array` back into JavaScript. This will also apply\nany pending operations or lazy updates:\n\n```ts\n\u002F\u002F 1) Returns a possibly nested JavaScript array.\nar.js();\nawait ar.jsAsync(); \u002F\u002F Faster, non-blocking\n\n\u002F\u002F 2) Returns a flat TypedArray data buffer.\nar.dataSync();\nawait ar.data(); \u002F\u002F Fastest, non-blocking\n```\n\nArrays can have mathematical operations applied to them. For example:\n\n```ts\nimport { numpy as np, scipySpecial as special } from \"@jax-js\u002Fjax\";\n\nconst x = np.arange(100).astype(np.float32); \u002F\u002F array of integers [0..99]\n\nconst y1 = x.ref.add(x.ref); \u002F\u002F x + x\nconst y2 = np.sin(x.ref); \u002F\u002F sin(x)\nconst y3 = np.tanh(x.ref).mul(5); \u002F\u002F 5 * tanh(x)\nconst y4 = special.erfc(x.ref); \u002F\u002F erfc(x)\n```\n\nNotice that in the above code, we used `x.ref`. This is because of the memory model, jax-js uses\nreference-counted _ownership_ to track when the memory of an Array can be freed. More on this below.\n\n### Reference counting\n\nBig Arrays take up a lot of memory. Python ML libraries override the `__del__()` method to free\nmemory, but JavaScript has no such API for running object destructors\n([cf.](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FFinalizationRegistry)).\nThis means that you have to track references manually. jax-js tries to make this as ergonomic as\npossible, so you don't accidentally leak memory in a loop.\n\nEvery `jax.Array` has a reference count. This satisfies the following rules:\n\n- Whenever you create an Array, its reference count starts at `1`.\n- When an Array's reference count reaches `0`, it is freed and can no longer be used.\n- Given an Array `a`:\n  - Accessing `a.ref` returns `a` and changes its reference count by `+1`.\n  - Passing `a` into any function as argument changes its reference count by `-1`.\n  - Calling `a.dispose()` also changes its reference count by `-1`.\n\nWhat this means is that all functions in jax-js must _take ownership_ of their arguments as\nreferences. Whenever you would like to pass an Array as argument, you can pass it directly to\ndispose of it, or use `.ref` if you'd like to use it again later.\n\n**You must follow these rules on your own functions as well!** All combinators like `jvp`, `grad`,\n`jit` assume that you are following these conventions on how arguments are passed, and they will\nrespect them as well.\n\n```ts\n\u002F\u002F Bad: Uses `x` twice, decrementing its reference count twice.\nfunction foo_bad(x: np.Array, y: np.Array) {\n  return x.add(x.mul(y));\n}\n\n\u002F\u002F Good: The first usage of `x` is `x.ref`, adding +1 to refcount.\nfunction foo_good(x: np.Array, y: np.Array) {\n  return x.ref.add(x.mul(y));\n}\n```\n\nHere's another example:\n\n```ts\n\u002F\u002F Bad: Doesn't consume `x` in the `if`-branch.\nfunction bar_bad(x: np.Array, skip: boolean) {\n  if (skip) return np.zeros(x.shape);\n  return x;\n}\n\n\u002F\u002F Good: Consumes `x` the one time in each branch.\nfunction bar_good(x: np.Array, skip: boolean) {\n  if (skip) {\n    const ret = np.zeros(x.shape);\n    x.dispose();\n    return ret;\n  }\n  return x;\n}\n```\n\nYou can assume that every function in jax-js takes ownership properly, except with a couple of very\nrare exceptions that are documented.\n\n### grad(), vmap() and jit()\n\nJAX's signature composable transformations are also supported in jax-js. Here is a simple example of\nusing `grad` and `vmap` to compute the derivaive of a function:\n\n```ts\nimport { numpy as np, grad, vmap } from \"@jax-js\u002Fjax\";\n\nconst x = np.linspace(-10, 10, 1000);\n\nconst y1 = vmap(grad(np.sin))(x.ref); \u002F\u002F d\u002Fdx sin(x) = cos(x)\nconst y2 = np.cos(x);\n\nnp.allclose(y1, y2); \u002F\u002F => true\n```\n\nThe `jit` function is especially useful when doing long sequences of primitives on GPU, since it\nfuses operations together into a single kernel dispatch. This\n[improves memory bandwidth usage](https:\u002F\u002Fsubstack.com\u002Fhome\u002Fpost\u002Fp-163548742) on hardware\naccelerators, which is the bottleneck on GPU rather than raw FLOPs. For instance:\n\n```ts\nexport const hypot = jit(function hypot(x1: np.Array, x2: np.Array) {\n  return np.sqrt(np.square(x1).add(np.square(x2)));\n});\n```\n\nWithout JIT, the `hypot()` function would require four kernel dispatches: two multiplies, one add,\nand one sqrt. JIT fuses these together into a single kernel that does it all at once.\n\nAll functional transformations can take typed `JsTree` of inputs and outputs. These are similar to\n[JAX's pytrees](https:\u002F\u002Fdocs.jax.dev\u002Fen\u002Flatest\u002Fpytrees.html), and it's basically just a structure of\nnested JavaScript objects and arrays. For instance:\n\n```ts\nimport { grad, numpy as np } from \"@jax-js\u002Fjax\";\n\ntype Params = {\n  foo: np.Array;\n  bar: np.Array[];\n};\n\nfunction getSums(p: Params) {\n  const fooSum = p.foo.sum();\n  const barSum = p.bar.map((x) => x.sum()).reduce(np.add);\n  return fooSum.add(barSum);\n}\n\ngrad(getSums)({\n  foo: np.array([1, 2, 3]),\n  bar: [np.array([10]), np.array([11, 12])],\n});\n\u002F\u002F => { foo: [1, 1, 1], bar: [[1], [1, 1]] }\n```\n\nNote that you need to use `type` alias syntax rather than `interface` to define fine-grained\n`JsTree` types.\n\n### Devices\n\nSimilar to JAX, jax-js has a concept of \"devices\" which are a backend that stores Arrays in memory\nand determines how to execute compiled operations on them.\n\nThere are currently 4 devices in jax-js:\n\n- `cpu`: Slow, interpreted JS, only meant for debugging.\n- `wasm`: [WebAssembly](https:\u002F\u002Fwebassembly.org\u002F), multi-threaded when\n  [`SharedArrayBuffer`](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FSharedArrayBuffer)\n  is available.\n- `webgpu`: [WebGPU](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWebGPU_API), available on\n  [supported browsers](https:\u002F\u002Fcaniuse.com\u002Fwebgpu) (Chrome, Firefox, Safari, iOS).\n- `webgl`: [WebGL2](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FWebGL2RenderingContext), via\n  fragment shaders. This is an older graphics API that runs on almost all browsers, but it is much\n  slower than WebGPU. It's offered on a best-effort basis and not as well-supported.\n\n**We recommend `webgpu` for best performance, especially when running neural networks.** The default\ndevice is `wasm`, but you can change this at startup time:\n\n```ts\nimport { defaultDevice, init } from \"@jax-js\u002Fjax\";\n\nconst devices = await init(); \u002F\u002F Starts all available backends.\n\nif (devices.includes(\"webgpu\")) {\n  defaultDevice(\"webgpu\");\n} else {\n  console.warn(\"WebGPU is not supported, falling back to Wasm.\");\n}\n```\n\nYou can also place individual arrays on specific devices:\n\n```ts\nimport { devicePut, numpy as np } from \"@jax-js\u002Fjax\";\n\nconst ar = np.array([1, 2, 3]); \u002F\u002F Starts with device=\"wasm\"\nawait devicePut(ar, \"webgpu\"); \u002F\u002F Now device=\"webgpu\"\n```\n\n### Helper libraries\n\nThere are other libraries in the `@jax-js` namespace that can work with jax-js, or be used in a\nself-contained way in other projects.\n\n- [**`@jax-js\u002Floaders`**](packages\u002Floaders) can load tensors from various formats like Safetensors,\n  includes a fast and compliant implementation of BPE, and caches HTTP requests for large assets\n  like model weights in OPFS.\n- [**`@jax-js\u002Fonnx`**](packages\u002Fonnx) is a model loader from the [ONNX](https:\u002F\u002Fonnx.ai\u002F) format\n  into native jax-js functions.\n- [**`@jax-js\u002Foptax`**](packages\u002Foptax) provides implementations of optimizers like Adam and SGD.\n\n### Performance\n\nTo see per-kernel traces in browser development tools, call `jax.profiler.startTrace()`.\n\nThe WebGPU runtime includes an ML compiler with tile-aware optimizations, tuned for indiidual\nbrowsers. Also, this library uniquely has the `jit()` feature that fuses operations together and\nrecords an execution graph. jax-js achieves **over 7000 GFLOP\u002Fs** for matrix multiplication on an\nApple M4 Max chip ([try it](https:\u002F\u002Fjax-js.com\u002Fbench\u002Fmatmul)).\n\nFor that example, it's significantly faster than both\n[TensorFlow.js](https:\u002F\u002Fgithub.com\u002Ftensorflow\u002Ftfjs) and\n[ONNX Runtime Web](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fonnxruntime-web), which both use handwritten\nlibraries of custom kernels.\n\nIt's still early though. There's a lot of low-hanging fruit to continue optimizing the library, as\nwell as unique optimizations such as FlashAttention variants.\n\n### API Reference\n\nThat's all for this short tutorial. Please see the generated\n[API reference](https:\u002F\u002Fjax-js.com\u002Fdocs) for detailed documentation.\n\n## Development\n\n_The following technical details are for contributing to jax-js and modifying its internals._\n\nThis repository is managed by [`pnpm`](https:\u002F\u002Fpnpm.io\u002F). You can compile and build all packages in\nwatch mode with:\n\n```bash\npnpm install\npnpm run build:watch\n```\n\nThen you can run tests in a headless browser using [Vitest](https:\u002F\u002Fvitest.dev\u002F).\n\n```bash\npnpm exec playwright install\npnpm test\n```\n\nWe are currently on an older version of Playwright that supports using WebGPU in headless mode;\nnewer versions skip the WebGPU tests.\n\nTo start a Vite dev server running the website, demos and REPL:\n\n```bash\npnpm -C website dev\n```\n\nYou can run the linter, code formatter, and type checker with:\n\n```bash\npnpm lint          # Run ESLint\npnpm format        # Format all files with Prettier\npnpm format:check  # Check formatting without writing\npnpm check         # Run TypeScript type checking\n```\n\n## Future work \u002F help wanted\n\nContributions are welcomed! Some fruitful areas to look into:\n\n- Adding support for more JAX functions and operations, see [compatibility table](.\u002FFEATURES.md).\n- Improving performance of the WebGPU and Wasm runtimes, generating better kernels, and using SIMD\n  and multithreading. (Even single-threaded Wasm could be ~20x faster.)\n- Helping the JIT compiler to fuse operations in more cases, like `tanh` branches.\n- Making a fast transformer inference engine, comparing against onnxruntime-web.\n\nYou may join our [Discord server](https:\u002F\u002Fdiscord.gg\u002FBW6YsCd4Tf) and chat with the community.\n","\u003Ch1 align=\"center\">jax-js：纯 JavaScript 中的 JAX\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\u003Cstrong>\n  \u003Ca href=\"https:\u002F\u002Fjax-js.com\">官网\u003C\u002Fa> |\n  \u003Ca href=\"https:\u002F\u002Fjax-js.com\u002Fdocs\u002F\">API 参考文档\u003C\u002Fa> |\n  \u003Ca href=\".\u002FFEATURES.md\">兼容性表格\u003C\u002Fa> |\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FBW6YsCd4Tf\">Discord 社区\u003C\u002Fa>\n\u003C\u002Fstrong>\u003C\u002Fp>\n\n**jax-js** 是一个面向浏览器的机器学习框架。它的目标是将 JAX 风格的高性能 CPU 和 GPU 内核引入 JavaScript，从而让你能够在网页上运行数值计算应用。\n\n```bash\nnpm i @jax-js\u002Fjax\n```\n\n在底层实现中，它会将数组操作转换为编译器中间表示，然后利用 WebAssembly 和 WebGPU 合成内核代码。\n\n该库完全从零开始编写，没有任何外部依赖。它与 NumPy\u002FJAX 保持高度的 API 兼容性。由于所有计算都在客户端进行，jax-js 很可能是目前最便携的 GPU 机器学习框架，因为它可以在任何支持浏览器的环境中运行。\n\n## 快速入门\n\n```js\nimport { numpy as np } from \"@jax-js\u002Fjax\";\n\n\u002F\u002F 数组操作，与 JAX\u002FNumPy 兼容。\nconst x = np.array([1, 2, 3]);\nconst y = x.mul(4); \u002F\u002F [4, 8, 12]\n```\n\n### 在网页中使用（CDN）\n\n在原生 JavaScript 环境中（无需打包工具），只需通过 `\u003Cscript type=\"module\">` 标签导入即可。这是在空白 HTML 页面上快速上手的最简单方式。\n\n```html\n\u003Cscript type=\"module\">\n  import { numpy as np } from \"https:\u002F\u002Fesm.sh\u002F@jax-js\u002Fjax\";\n\u003C\u002Fscript>\n```\n\n### 平台支持情况\n\n本表格基于各浏览器的最新版本。截至 2025 年底，WebGPU 已在大多数主流浏览器中得到广泛支持。\n\n| 平台            | CPU (Wasm) | GPU (WebGPU)   | GPU (WebGL) |\n| ------------------- | ---------- | -------------- | ----------- |\n| Chrome \u002F Edge       | ✅         | ✅             | ✅          |\n| Firefox             | ✅         | ✅ - macOS 26+ | ✅          |\n| Safari              | ✅         | ✅ - macOS 26+ | ✅          |\n| iOS                 | ✅         | ✅ - iOS 26+   | ✅          |\n| Chrome for Android  | ✅         | ✅             | ✅          |\n| Firefox for Android | ✅         | ❌             | ✅          |\n| Node.js             | ✅         | ❌             | ❌          |\n| Deno                | ✅         | ✅ - 异步     | ❌          |\n\n## 示例\n\n社区使用案例：\n\n- [**autoresearch-webgpu**：浏览器中的自动研究](https:\u002F\u002Fautoresearch.lucasgelfond.online\u002F)\n- [**tanh.xyz**：交互式机器学习可视化](https:\u002F\u002Ftanh.xyz\u002F)\n- [**jax-js-bayes**：声明式贝叶斯建模库](https:\u002F\u002Fgithub.com\u002FStefanSko\u002Fjax-js-bayes)\n\njax-js 官网上的一些演示：\n\n- [在 MNIST 数据集上训练神经网络](https:\u002F\u002Fjax-js.com\u002Fmnist)\n- [语音克隆：Kyutai Pocket TTS](https:\u002F\u002Fjax-js.com\u002Ftts)\n- [在浏览器中为书籍生成 CLIP 嵌入](https:\u002F\u002Fjax-js.com\u002Fmobileclip)\n- [目标检测：DETR ResNet-50 (ONNX)](https:\u002F\u002Fjax-js.com\u002Fdetr-resnet-50)\n- [流体模拟（Navier-Stokes 方程）](https:\u002F\u002Fjax-js.com\u002Ffluid-sim)\n- [浏览器 REPL](https:\u002F\u002Fjax-js.com\u002Frepl)\n- [矩阵乘法性能基准测试](https:\u002F\u002Fjax-js.com\u002Fbench\u002Fmatmul)\n- [二维卷积性能基准测试](https:\u002F\u002Fjax-js.com\u002Fbench\u002Fconv2d)\n- [曼德勃罗集](https:\u002F\u002Fjax-js.com\u002Fmandelbrot)\n\n## 功能对比\n\n以下是 jax-js 与其他流行 Web ML 运行时的简要对比：\n\n| 特性                         | jax-js     | TensorFlow.js   | onnxruntime-web    |\n| ------------------------------- | ---------- | --------------- | ------------------ |\n| **概述**                    |            |                 |                    |\n| API 风格                       | JAX\u002FNumPy  | 类 TensorFlow   | 静态 ONNX 图       |\n| 最新版本                      | 2026       | ⚠️ 2024         | 2026               |\n| 速度                           | 最快    | 较快            | 最快            |\n| 打包大小（gzip）              | 80 KB      | 269 KB          | 90 KB + 24 MB Wasm |\n| **自动微分与 JIT**              |            |                 |                    |\n| 梯度                           | ✅         | ✅              | ❌                 |\n| 雅可比矩阵和海森矩阵           | ✅         | ❌              | ❌                 |\n| `jvp()` 正向微分               | ✅         | ❌              | ❌                 |\n| `jit()` 内核融合               | ✅         | ❌              | ❌                 |\n| `vmap()` 自动向量化           | ✅         | ❌              | ❌                 |\n| 图捕获                         | ✅         | ❌              | ✅                 |\n| **后端与数据**             |            |                 |                    |\n| WebGPU 后端                  | ✅         | 🟡 预览        | ✅                 |\n| WebGL 后端                   | ✅         | ✅              | ✅                 |\n| Wasm（CPU）后端              | ✅         | ✅              | ✅                 |\n| 勇于执行的数组 API           | ✅         | ✅              | ❌                 |\n| 运行 ONNX 模型                 | 🟡 部分    | ❌              | ✅                 |\n| 读取 safetensors 文件          | ✅         | ❌              | ❌                 |\n| Float64                        | ✅         | ❌              | ❌                 |\n| Float32                        | ✅         | ✅              | ✅                 |\n| Float16                        | ✅         | ❌              | ✅                 |\n| BFloat16                       | ❌         | ❌              | ❌                 |\n| 压缩 Uint8                     | ❌         | ❌              | 🟡 部分         |\n| 混合精度                     | ✅         | ❌              | ✅                 |\n| 多设备混合使用                 | ✅         | ❌              | ❌                 |\n| **操作与数值计算**          |            |                 |                    |\n| 算术函数                     | ✅         | ✅              | ✅                 |\n| 矩阵乘法                     | ✅         | ✅              | ✅                 |\n| 通用 einsum                    | ✅         | 🟡 部分        | 🟡 部分         |\n| 排序                         | ✅         | ❌              | ❌                 |\n| 激活函数                     | ✅         | ✅              | ✅                 |\n| NaN\u002FInf 数值计算               | ✅         | ✅              | ✅                 |\n| 基础卷积                     | ✅         | ✅              | ✅                 |\n| n 维卷积                     | ✅         | ❌              | ✅                 |\n| 步进\u002F空洞卷积                 | ✅         | ✅              | ✅                 |\n| Cholesky 分解、最小二乘问题   | ✅         | ❌              | ❌                 |\n| LU 分解、线性方程求解、行列式 | ✅         | ❌              | ❌                 |\n| 奇异值分解                   | ❌         | ❌              | ❌                 |\n| FFT                          | ✅         | ✅              | ✅                 |\n| 基础随机数生成（均匀分布、正态分布）| ✅         | ✅              | ✅                 |\n| 高级随机数生成               | ✅         | ❌              | ❌                 |\n\n## 教程\n\n在 `jax-js` 中进行编程看起来与 JAX [非常相似](https:\u002F\u002Fdocs.jax.dev\u002Fen\u002Flatest\u002Fjax-101.html)，只是使用 JavaScript 而已。\n\n### 数组\n\n使用 `np.array()` 创建一个数组：\n\n```ts\nimport { numpy as np } from \"@jax-js\u002Fjax\";\n\nconst ar = np.array([1, 2, 3]);\n```\n\n默认情况下，这是一个 float32 类型的数组，但你可以指定不同的数据类型：\n\n```ts\nconst ar = np.array([1, 2, 3], { dtype: np.int32 });\n```\n\n为了更高效地构建数组，可以从 JavaScript 的 `TypedArray` 缓冲区创建数组：\n\n```ts\nconst buf = new Float32Array([10, 20, 30, 100, 200, 300]);\nconst ar = np.array(buf).reshape([2, 3]);\n```\n\n当你完成操作后，可以将 `jax.Array` 解包回 JavaScript。这也会应用任何待处理的操作或惰性更新：\n\n```ts\n\u002F\u002F 1) 返回可能嵌套的 JavaScript 数组。\nar.js();\nawait ar.jsAsync(); \u002F\u002F 更快，非阻塞\n\n\u002F\u002F 2) 返回扁平的 TypedArray 数据缓冲区。\nar.dataSync();\nawait ar.data(); \u002F\u002F 最快，非阻塞\n```\n\n数组可以应用数学运算。例如：\n\n```ts\nimport { numpy as np, scipySpecial as special } from \"@jax-js\u002Fjax\";\n\nconst x = np.arange(100).astype(np.float32); \u002F\u002F 整数数组 [0..99]\n\nconst y1 = x.ref.add(x.ref); \u002F\u002F x + x\nconst y2 = np.sin(x.ref); \u002F\u002F sin(x)\nconst y3 = np.tanh(x.ref).mul(5); \u002F\u002F 5 * tanh(x)\nconst y4 = special.erfc(x.ref); \u002F\u002F erfc(x)\n```\n\n请注意，在上述代码中，我们使用了 `x.ref`。这是因为 jax-js 使用引用计数的“所有权”模型来跟踪数组内存何时可以释放。关于这一点将在下文详细说明。\n\n### 引用计数\n\n大型数组会占用大量内存。Python 的机器学习库会重写 `__del__()` 方法来释放内存，但 JavaScript 并没有这样的 API 来运行对象的析构函数（[参考](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FFinalizationRegistry)）。这意味着你必须手动跟踪引用。jax-js 尝试使这一过程尽可能地便捷，以避免在循环中意外泄漏内存。\n\n每个 `jax.Array` 都有一个引用计数。它遵循以下规则：\n\n- 每当你创建一个数组时，它的引用计数从 `1` 开始。\n- 当数组的引用计数达到 `0` 时，它会被释放，且不能再被使用。\n- 对于一个数组 `a`：\n  - 访问 `a.ref` 会返回 `a`，并将其引用计数加 `1`。\n  - 将 `a` 作为参数传递给任何函数时，其引用计数会减 `1`。\n  - 调用 `a.dispose()` 也会使其引用计数减 `1`。\n\n这意味着 jax-js 中的所有函数都必须以引用的方式“接管”它们的参数。每当你想将一个数组作为参数传递时，可以直接传递它以释放其所有权，或者使用 `.ref` 如果你希望稍后再使用它。\n\n**你也必须在自己的函数中遵守这些规则！** 所有组合函数如 `jvp`、`grad`、`jit` 都假定你按照这些约定传递参数，并且会尊重这些约定。\n\n```ts\n\u002F\u002F 不好：两次使用 `x`，导致其引用计数两次递减。\nfunction foo_bad(x: np.Array, y: np.Array) {\n  return x.add(x.mul(y));\n}\n\n\u002F\u002F 好：第一次使用 `x` 是通过 `x.ref`，引用计数加 `1`。\nfunction foo_good(x: np.Array, y: np.Array) {\n  return x.ref.add(x.mul(y));\n}\n```\n\n再看一个例子：\n\n```ts\n\u002F\u002F 不好：在 `if` 分支中没有消耗 `x`。\nfunction bar_bad(x: np.Array, skip: boolean) {\n  if (skip) return np.zeros(x.shape);\n  return x;\n}\n\n\u002F\u002F 好：在每个分支中只消耗一次 `x`。\nfunction bar_good(x: np.Array, skip: boolean) {\n  if (skip) {\n    const ret = np.zeros(x.shape);\n    x.dispose();\n    return ret;\n  }\n  return x;\n}\n```\n\n你可以假设 jax-js 中的每一个函数都会正确地接管所有权，除了少数极罕见且已记录的情况。\n\n### grad()、vmap() 和 jit()\n\nJAX 的可组合变换签名也在 jax-js 中得到支持。下面是一个使用 `grad` 和 `vmap` 计算函数导数的简单示例：\n\n```ts\nimport { numpy as np, grad, vmap } from \"@jax-js\u002Fjax\";\n\nconst x = np.linspace(-10, 10, 1000);\n\nconst y1 = vmap(grad(np.sin))(x.ref); \u002F\u002F d\u002Fdx sin(x) = cos(x)\nconst y2 = np.cos(x);\n\nnp.allclose(y1, y2); \u002F\u002F => true\n```\n\n`jit` 函数在 GPU 上执行长时间的基本操作序列时尤其有用，因为它会将多个操作融合为一次内核调度。这[提高了硬件加速器上的内存带宽利用率](https:\u002F\u002Fsubstack.com\u002Fhome\u002Fpost\u002Fp-163548742)，而 GPU 上的瓶颈往往不是浮点运算能力，而是内存带宽。例如：\n\n```ts\nexport const hypot = jit(function hypot(x1: np.Array, x2: np.Array) {\n  return np.sqrt(np.square(x1).add(np.square(x2)));\n});\n```\n\n如果没有 JIT，`hypot()` 函数需要四次内核调度：两次乘法、一次加法和一次平方根。而 JIT 会将这些操作融合为一个内核，一次性完成所有计算。\n\n所有函数式变换都可以接受输入和输出的类型化 `JsTree`。它们类似于 JAX 的 pytrees（[文档](https:\u002F\u002Fdocs.jax.dev\u002Fen\u002Flatest\u002Fpytrees.html)），基本上就是由嵌套的 JavaScript 对象和数组组成的结构。例如：\n\n```ts\nimport { grad, numpy as np } from \"@jax-js\u002Fjax\";\n\ntype Params = {\n  foo: np.Array;\n  bar: np.Array[];\n};\n\nfunction getSums(p: Params) {\n  const fooSum = p.foo.sum();\n  const barSum = p.bar.map((x) => x.sum()).reduce(np.add);\n  return fooSum.add(barSum);\n}\n\ngrad(getSums)({\n  foo: np.array([1, 2, 3]),\n  bar: [np.array([10]), np.array([11, 12])],\n});\n\u002F\u002F => { foo: [1, 1, 1], bar: [[1], [1, 1]] }\n```\n\n请注意，你需要使用 `type` 别名语法而不是 `interface` 来定义细粒度的 `JsTree` 类型。\n\n### 设备\n\n与 JAX 类似，jax-js 也引入了“设备”的概念。设备是后端，用于在内存中存储数组，并决定如何在其上执行编译后的操作。\n\n目前 jax-js 中有 4 种设备：\n\n- `cpu`：速度较慢的解释型 JavaScript 实现，仅用于调试。\n- `wasm`：WebAssembly，在支持 [`SharedArrayBuffer`](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FSharedArrayBuffer) 的情况下可实现多线程。\n- `webgpu`：WebGPU，在[支持的浏览器](https:\u002F\u002Fcaniuse.com\u002Fwebgpu)（Chrome、Firefox、Safari、iOS）上可用。\n- `webgl`：基于片段着色器的 WebGL2。这是一种较旧的图形 API，几乎可在所有浏览器上运行，但性能远低于 WebGPU。该选项以尽力而为的方式提供，支持程度较低。\n\n**我们推荐使用 `webgpu` 以获得最佳性能，尤其是在运行神经网络时。** 默认设备是 `wasm`，但您可以在启动时更改它：\n\n```ts\nimport { defaultDevice, init } from \"@jax-js\u002Fjax\";\n\nconst devices = await init(); \u002F\u002F 启动所有可用的后端。\n\nif (devices.includes(\"webgpu\")) {\n  defaultDevice(\"webgpu\");\n} else {\n  console.warn(\"WebGPU 不受支持，将回退到 Wasm。\");\n}\n```\n\n您还可以将单个数组放置在特定设备上：\n\n```ts\nimport { devicePut, numpy as np } from \"@jax-js\u002Fjax\";\n\nconst ar = np.array([1, 2, 3]); \u002F\u002F 默认设备为 \"wasm\"\nawait devicePut(ar, \"webgpu\"); \u002F\u002F 现在设备变为 \"webgpu\"\n```\n\n### 辅助库\n\n`@jax-js` 命名空间下还有其他库，既可以与 jax-js 配合使用，也可以在其他项目中独立使用。\n\n- [**`@jax-js\u002Floaders`**](packages\u002Floaders) 可从 Safetensors 等多种格式加载张量，包含快速且符合标准的 BPE 实现，并通过 OPFS 缓存大型资产（如模型权重）的 HTTP 请求。\n- [**`@jax-js\u002Fonnx`**](packages\u002Fonnx) 是一个将 ONNX 格式模型转换为原生 jax-js 函数的模型加载器。\n- [**`@jax-js\u002Foptax`**](packages\u002Foptax) 提供 Adam 和 SGD 等优化器的实现。\n\n### 性能\n\n要在浏览器开发者工具中查看每个内核的跟踪信息，请调用 `jax.profiler.startTrace()`。\n\nWebGPU 运行时包含一个面向 ML 的编译器，具备分块感知优化功能，并针对不同浏览器进行了调优。此外，该库还独有 `jit()` 功能，可以将多个操作融合在一起并记录执行图。在 Apple M4 Max 芯片上，jax-js 在矩阵乘法运算中可达到 **超过 7000 GFLOP\u002Fs** 的性能（[试一试](https:\u002F\u002Fjax-js.com\u002Fbench\u002Fmatmul)）。\n\n就该示例而言，其速度显著高于使用手写自定义内核库的 TensorFlow.js 和 ONNX Runtime Web。\n\n不过目前仍处于早期阶段，仍有大量易于实现的优化点可供挖掘，同时也有诸如 FlashAttention 变体等独特的优化方向。\n\n### API 参考\n\n本次简短教程到此结束。有关详细文档，请参阅生成的[API 参考](https:\u002F\u002Fjax-js.com\u002Fdocs)。\n\n## 开发\n\n_以下技术细节适用于参与 jax-js 的贡献以及对其内部进行修改。_\n\n本仓库由 [`pnpm`](https:\u002F\u002Fpnpm.io\u002F) 管理。您可以通过以下命令以监听模式编译和构建所有包：\n\n```bash\npnpm install\npnpm run build:watch\n```\n\n随后，您可以使用 [Vitest](https:\u002F\u002Fvitest.dev\u002F) 在无头浏览器中运行测试：\n\n```bash\npnpm exec playwright install\npnpm test\n```\n\n目前我们使用的是较旧版本的 Playwright，该版本支持在无头模式下使用 WebGPU；较新版本则会跳过 WebGPU 测试。\n\n要启动运行网站、演示和 REPL 的 Vite 开发服务器：\n\n```bash\npnpm -C website dev\n```\n\n您还可以通过以下命令运行代码检查工具、代码格式化工具和类型检查工具：\n\n```bash\npnpm lint          # 运行 ESLint\npnpm format        # 使用 Prettier 格式化所有文件\npnpm format:check  # 检查格式而不进行修改\npnpm check         # 运行 TypeScript 类型检查\n```\n\n## 未来工作 \u002F 招募帮助\n\n欢迎各位贡献！以下是一些值得探索的方向：\n\n- 添加对更多 JAX 函数和操作的支持，详见 [兼容性表](.\u002FFEATURES.md)。\n- 提升 WebGPU 和 Wasm 运行时的性能，生成更优的内核，并利用 SIMD 和多线程技术。（即使是单线程的 Wasm，性能也可能提升约 20 倍。）\n- 帮助 JIT 编译器在更多场景下融合操作，例如 `tanh` 分支。\n- 构建高效的 Transformer 推理引擎，与 onnxruntime-web 进行对比。\n\n您也可以加入我们的 [Discord 社区](https:\u002F\u002Fdiscord.gg\u002FBW6YsCd4Tf)，与社区成员交流讨论。","# jax-js 快速上手指南\n\njax-js 是一个专为浏览器设计的机器学习框架，旨在将 JAX 风格的高性能 CPU\u002FGPU 计算能力带入 JavaScript 环境。它无需外部依赖，完全在客户端运行，支持 WebAssembly 和 WebGPU 后端。\n\n## 环境准备\n\n*   **系统要求**：现代操作系统（Windows, macOS, Linux, iOS, Android）。\n*   **浏览器支持**：\n    *   **CPU (Wasm)**：所有主流浏览器（Chrome, Edge, Firefox, Safari）及 Node.js\u002FDeno。\n    *   **GPU (WebGPU)**：Chrome\u002FEdge (全平台), Firefox\u002FSafari (macOS 26+\u002FiOS 26+), Chrome for Android。\n    *   **GPU (WebGL)**：作为备选方案，支持更广泛的旧版浏览器。\n*   **前置依赖**：无外部依赖库。建议使用支持 ES Modules 的开发环境或现代浏览器。\n\n## 安装步骤\n\n你可以通过 npm 包管理器安装，或者直接在 HTML 中通过 CDN 引入。\n\n### 方式一：使用 npm 安装（推荐用于构建项目）\n\n```bash\nnpm i @jax-js\u002Fjax\n```\n\n### 方式二：使用 CDN（无需构建工具）\n\n在 HTML 文件中直接使用 `\u003Cscript type=\"module\">` 引入：\n\n```html\n\u003Cscript type=\"module\">\n  import { numpy as np } from \"https:\u002F\u002Fesm.sh\u002F@jax-js\u002Fjax\";\n\u003C\u002Fscript>\n```\n\n## 基本使用\n\njax-js 的 API 设计与 NumPy\u002FJAX 高度兼容。以下是核心用法示例。\n\n### 1. 创建与操作数组\n\n导入库并创建数组，执行基本的数学运算：\n\n```js\nimport { numpy as np } from \"@jax-js\u002Fjax\";\n\n\u002F\u002F 创建数组 (默认为 float32)\nconst x = np.array([1, 2, 3]);\n\n\u002F\u002F 执行运算\nconst y = x.mul(4); \u002F\u002F 结果: [4, 8, 12]\n\n\u002F\u002F 指定数据类型\nconst z = np.array([1, 2, 3], { dtype: np.int32 });\n\n\u002F\u002F 从 TypedArray 高效创建并重塑形状\nconst buf = new Float32Array([10, 20, 30, 100, 200, 300]);\nconst ar = np.array(buf).reshape([2, 3]);\n```\n\n### 2. 数据导出\n\n将 `jax.Array` 转换回原生 JavaScript 数据：\n\n```js\n\u002F\u002F 获取嵌套的 JS 数组\nconst jsArray = ar.js(); \n\u002F\u002F 或者异步非阻塞获取（推荐）\nconst jsArrayAsync = await ar.jsAsync(); \n\n\u002F\u002F 获取扁平化的 TypedArray 缓冲区\nconst dataBuffer = ar.dataSync();\n\u002F\u002F 或者异步非阻塞获取（最快）\nconst dataBufferAsync = await ar.data(); \n```\n\n### 3. 高级特性：自动微分与 JIT 编译\n\n利用 JAX 风格的变换函数进行梯度计算和算子融合：\n\n```js\nimport { numpy as np, grad, vmap, jit } from \"@jax-js\u002Fjax\";\n\n\u002F\u002F 自动微分示例：计算 sin(x) 的导数 (应为 cos(x))\nconst x = np.linspace(-10, 10, 1000);\nconst derivative = vmap(grad(np.sin))(x.ref); \nconst expected = np.cos(x);\nconsole.log(np.allclose(derivative, expected)); \u002F\u002F true\n\n\u002F\u002F JIT 编译示例：融合多个算子为单个内核，提升 GPU 性能\nconst hypot = jit(function hypot(x1, x2) {\n  return np.sqrt(np.square(x1).add(np.square(x2)));\n});\n```\n\n### ⚠️ 重要提示：引用计数管理\n\n由于 JavaScript 缺乏确定的析构机制，jax-js 采用**引用计数**来管理内存。\n*   **规则**：创建数组时引用计数为 `1`。传入函数参数会消耗引用（-1），访问 `.ref` 会增加引用（+1）。\n*   **最佳实践**：如果变量需要在当前作用域多次使用，请使用 `.ref`；如果只使用一次或直接传参，可直接使用变量。\n\n```js\n\u002F\u002F ✅ 正确用法：第一次使用 x 时调用 .ref 增加计数，第二次使用消耗计数\nfunction safeOp(x, y) {\n  return x.ref.add(x.mul(y));\n}\n\n\u002F\u002F ❌ 错误用法：两次使用 x 导致引用计数提前归零，引发内存错误或崩溃\nfunction unsafeOp(x, y) {\n  return x.add(x.mul(y)); \n}\n```","一家教育科技团队希望在浏览器中构建一个无需后端支持的交互式神经网络教学平台，让学生能实时调整参数并立刻看到模型训练效果。\n\n### 没有 jax-js 时\n- **依赖沉重后端**：所有矩阵运算和梯度计算必须发送到服务器，导致高延迟，学生操作后需等待数秒才能看到反馈，打断学习心流。\n- **部署复杂昂贵**：需要维护昂贵的 GPU 集群来处理并发推理请求，且必须为不同设备适配多套后端接口，运维成本极高。\n- **功能受限**：由于 TensorFlow.js 缺乏完整的 Hessian（海森矩阵）等高级微分功能，无法演示复杂的二阶优化算法，教学内容被迫简化。\n- **包体积过大**：引入完整的深度学习框架导致首屏加载超过 2MB，在弱网环境下学生几乎无法打开页面。\n\n### 使用 jax-js 后\n- **纯前端实时响应**：利用 WebGPU 直接在学生浏览器中进行高性能并行计算，参数调整后毫秒级重绘训练曲线，实现真正的“所见即所得”。\n- **零后端成本**：计算压力完全转移至客户端，服务器仅需托管静态网页，彻底消除了 GPU 集群开销，支持无限并发访问。\n- **完整科研级能力**：借助与 JAX\u002FNumPy 高度兼容的 API，轻松实现自动微分、雅可比矩阵及海森矩阵计算，完整复现大学教材中的高级优化案例。\n- **极致轻量便携**：核心库压缩后仅 80KB，无外部依赖，无论是老旧笔记本还是新款 iPad，只要打开浏览器即可流畅运行复杂模型。\n\njax-js 将原本需要云端算力支撑的科研级机器学习能力，变成了任何浏览器都能即时运行的轻量级交互体验。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fekzhang_jax-js_b4d48a3d.png","ekzhang","Eric Zhang","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fekzhang_893af512.jpg","An honest, more human kind of software","@thinking-machines-lab","New York, NY","ekzhang1@gmail.com","ekzhang1","https:\u002F\u002Fwww.ekzhang.com","https:\u002F\u002Fgithub.com\u002Fekzhang",[86,90,94,98,102,106],{"name":87,"color":88,"percentage":89},"TypeScript","#3178c6",85.3,{"name":91,"color":92,"percentage":93},"Svelte","#ff3e00",12,{"name":95,"color":96,"percentage":97},"Python","#3572A5",2.3,{"name":99,"color":100,"percentage":101},"JavaScript","#f1e05a",0.2,{"name":103,"color":104,"percentage":105},"HTML","#e34c26",0,{"name":107,"color":108,"percentage":105},"CSS","#663399",773,42,"2026-04-03T07:55:59","MIT",1,"未说明 (基于浏览器运行，支持 Windows, macOS, Linux, iOS, Android 等任何现代浏览器平台)","非必需。可选 WebGPU 后端 (需 Chrome\u002FEdge, Firefox\u002FSafari macOS 26+, iOS 26+ 等最新浏览器) 或 WebGL 后端。无需特定显卡型号、显存大小或 CUDA 版本。","未说明 (取决于浏览器环境和具体模型大小)",{"notes":118,"python":119,"dependencies":120},"该工具为纯 JavaScript 编写，零外部依赖，可直接在浏览器 (通过 CDN) 或 Node.js\u002FDeno 环境中运行。核心特性包括自动微分 (grad)、JIT 编译和向量化 (vmap)。由于 JavaScript 内存管理机制限制，使用时需手动管理数组的引用计数 (使用 .ref 或 .dispose()) 以防止内存泄漏。支持 Float64, Float32, Float16 等多种精度。","不需要 (纯 JavaScript\u002FTypeScript 库)",[],[13],[123,124,125,126,127,128,129,130,131],"jax","numpy","wasm","webgpu","javascript","jit","machine-learning","neural-networks","webgl",null,"2026-03-27T02:49:30.150509","2026-04-06T07:13:29.773961",[136,141,146,151,156,160],{"id":137,"question_zh":138,"answer_zh":139,"source_url":140},16894,"遇到 'gelu fails to compile' 或着色器编译错误（Failed to compile shader）该怎么办？","这通常是因为超过了存储缓冲区绑定（storage buffer bindings）的限制。维护者已发布修复版本，请将依赖项更新到 `^0.1.4` 并重新运行 `npm install` 即可解决。","https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fissues\u002F42",{"id":142,"question_zh":143,"answer_zh":144,"source_url":145},16895,"jax-js 是否支持排序（Sort）、Cholesky 分解或 FFT 等复杂运算符？","是的，目前已在所有后端添加了基础版本的 Cholesky 分解（CPU\u002FWasm），以及 `Sort` 和 `Argsort` 功能。注意：WebGPU 后端的排序功能目前仅限于适合单个 workgroup 的轴。这些功能现在可以通过自定义 lowering 实现。","https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fissues\u002F20",{"id":147,"question_zh":148,"answer_zh":149,"source_url":150},16896,"在 WebGPU 上运行模型时速度非常慢，可能是什么原因？","速度慢的主要原因可能是每次针对不同形状都重新构建新的内核（rebuilding new kernels），且未对模型进行 JIT 编译或未使用 KV 缓存。建议启用 JIT 编译并实施 KV 缓存优化，以减少不必要的计算开销（例如避免执行比需求多 256 倍的 FLOPs）。","https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fissues\u002F59",{"id":152,"question_zh":153,"answer_zh":154,"source_url":155},16897,"`lax.linalg.triangularSolve()` 在设置 `transposeA: true` 时结果与原生 JAX 不一致怎么办？","这是一个已知问题。当 `transposeA` 为 true 时，代码转置了输入矩阵但未相应调整 `lower` 参数，导致矩阵类型判断错误（如下三角被误判）。该问题源于内部实现未将转置后的矩阵视为上三角矩阵处理，需等待库更新修复此逻辑（翻转 `lower` 参数）。","https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fissues\u002F73",{"id":157,"question_zh":158,"answer_zh":159,"source_url":150},16898,"如何在 jax-js 中实现类似 Pocket TTS 的高效 CPU\u002F浏览器推理？","可以利用 jax-js 的可移植性在浏览器中运行小型自回归 Transformer 模型（如 100M 参数的 TTS）。关键在于配置正确的采样率（如 24kHz）和帧率，并实现高效的 KV 缓存机制。虽然目前可能因缺少 JIT 和缓存而较慢，但该框架支持将其打包为无依赖的 npm 库进行本地推理。",{"id":161,"question_zh":162,"answer_zh":163,"source_url":145},16899,"如何将自定义算子（如 GPU 上的 Cholesky 实现）整合到 jax-js 中？","目前可以将自定义实现（如 CPU\u002FWebGPU 版本）作为起点提交。维护者计划将其移动到“自定义算子”框架中，而不是全部放在 `array.ts` 文件中。对于 GPU 实现，注意只有在矩阵较大（如大于 512x512）时才会比 CPU\u002FWasm 版本更快。可以通过添加类似的 benchmark 来验证性能。",[165,170,175,180,185,190,195,200,205,210,215,220,225,230],{"id":166,"version":167,"summary_zh":168,"released_at":169},99135,"jax\u002Fv0.1.10","- 新特性\n  - 添加了若干新的 API 函数（见下文）\n  - 支持性能分析器，在浏览器 DevTools 中查看内核信息\n- 修复\n  - 对于 fp16 的矩阵乘法，始终使用 fp32 进行累加\n  - 修复三角形求解及其他线性代数运算的 JVP 规则\n  - 修复 `matrixPower` 和 `inv` 的输出类型与输入类型不一致的问题\n  - 阻止 `jax.random` 根据随机种子对内核进行特化\n- 新增\n  - `jax.Array.view()`\n  - `jax.lax.bitcastConvertType()`\n  - `jax.numpy.around()`（round 的别名）\n  - `jax.numpy.arrayEqual()`\n  - `jax.numpy.arrayEquiv()`\n  - `jax.numpy.average()`\n  - `jax.numpy.copysign()`\n  - `jax.numpy.cross()`\n  - `jax.numpy.linalg.cross()`\n  - `jax.numpy.logicalAnd()`\n  - `jax.numpy.logicalNot()`\n  - `jax.numpy.logicalOr()`\n  - `jax.numpy.logicalXor()`\n  - `jax.numpy.matvec()`\n  - `jax.numpy.rint()`\n  - `jax.numpy.round()`\n  - `jax.numpy.vecmat()`\n  - `jax.profiler.startTrace()`\n  - `jax.profiler.stopTrace()`\n\n\n\n## 完整变更日志\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F80 中实现，将 f16 求和归约操作在 f32 精度下执行\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F86 中修复三角形求解的 JVP 规则并添加测试\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F87 中修复 `inv` 和 `matrixPower` 的结果类型问题\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F88 中添加针对 Node.js\u002FDeno 的平台测试\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F89 中进行跨浏览器测试，并修复 WGSL 中浮点数到整数转换的边界情况\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F90 中新增 `jax.profiler` API\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F91 中新增用于位元转换操作的 `Array.view()`\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F92 中新增 `jax.numpy.average()`\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F93 中新增 `arrayEqual` 和 `arrayEquiv`\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F94 中实现 `vecmat` 和 `matvec`\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F95 中实现向量的 `cross` 乘积\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F96 中新增 `round`、`rint` 和 `copysign`\n* 由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F97 中添加对逻辑布尔运算的支持\n\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.9...jax\u002Fv0.1.10","2026-03-16T00:32:17",{"id":171,"version":172,"summary_zh":173,"released_at":174},99136,"jax\u002Fv0.1.9","## 变更内容\n* @mwbrulhardt 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F72 中实现了分类采样\n* 修复：@olli4 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F76 中移除了库函数中的多余 `.ref` 调用\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F77 中修复了因展开循环次数为 8 导致的性能回归问题\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F78 中使 `argsort` 稳定，并添加了对 `lax.topK()` 的支持\n\n## 新贡献者\n* @olli4 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F76 中做出了首次贡献\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.8...jax\u002Fv0.1.9","2026-02-08T22:25:14",{"id":176,"version":177,"summary_zh":178,"released_at":179},99137,"jax\u002Fv0.1.8","## 变更内容\n* 添加 pre-commit 钩子，由 @mwbrulhardt 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F71 中完成\n* 修复 `jax.lax.linalg.triangularSolve()` 的转置行为，由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F74 中完成\n\n## 新贡献者\n* @mwbrulhardt 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F71 中完成了首次贡献\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.7...jax\u002Fv0.1.8","2026-02-06T07:28:06",{"id":181,"version":182,"summary_zh":183,"released_at":184},99138,"jax\u002Fv0.1.7","## 变更内容\n* 实现 Kyutai Pocket TTS，并由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F64 中提供了演示\n* 添加 `nanToNum()` 函数，支持无穷大处理，由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F65 中实现\n* 其他变更：\n  * 修复了后端因 IR 简化规则错误而导致的罕见编译器 bug\n  * `jax.numpy.pad()` 现在更加灵活，可以接受以轴号为键的对象\n  * `jax.nn.dotProductAttention()` 支持所有关键字参数\n  * 各种其他细微的 API 改进\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.6...jax\u002Fv0.1.7","2026-01-23T17:49:51",{"id":186,"version":187,"summary_zh":188,"released_at":189},99139,"loaders\u002Fv0.1.1","- 添加了 SentencePiece 分词器支持。","2026-01-23T17:47:24",{"id":191,"version":192,"summary_zh":193,"released_at":194},99140,"jax\u002Fv0.1.6","## 变更内容\n* **重大变更** - `vjp()` 和 `linearize()` 现在接受数组作为参数，例如 `vjp(f, [...args])`，而不是 `vjp(f, ...args)`\n* 性能经过优化，例如，在 Safari 浏览器上矩阵乘法的速度提升了 2 到 5 倍\n* @wukath 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F56 中实现了 `swapaxes`\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F60 中允许向 `grad` 和 `valueAndGrad` 传递 `argnums`\n* @jimfleming 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F46 中为 `grad`、`valueAndGrad` 和 `vjp` 添加了 `hasAux` 支持\n  * `hasAux` 也已添加到 `jvp` 和 `linearize` 中\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F61 中实现了 `jax.hessian()` 函数\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F63 中实现了 `jax.nn.dotProductAttention()`\n* 新增了 `jax.lax.convTranspose()`\n\n## 新贡献者\n* @wukath 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F56 中做出了首次贡献\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.5...jax\u002Fv0.1.6","2026-01-18T03:32:36",{"id":196,"version":197,"summary_zh":198,"released_at":199},99141,"jax\u002Fv0.1.5","## 变更内容\n- 核心库\n  * 除了现有的 CPU、Wasm 和 WebGPU 后端之外，现在新增了第四个后端：**WebGL**！\n    * 这一后端作为 WebGPU 的替代方案，具有更广泛的浏览器兼容性；不过并非所有高级功能都能正常工作（尤其是 _routines_）。详情请参阅 #47。\n  * 线性代数例程（`cholesky`、`triangularSolve`、`lstsq`）不再仅限于 CPU，也可在 WebGPU 上运行。(#49)\n  * `jax.random` 的 API 现在可以进行 vmapped 操作。\n- 新增 API\n  * `jax.lax.linalg.lu()`，见 #53（同样支持 WebGPU）\n    * `jax.numpy.linalg.solve()`\n    * `jax.numpy.linalg.inv()`\n    * `jax.numpy.linalg.matrixPower()`\n    * `jax.numpy.linalg.slogdet()`\n    * `jax.numpy.linalg.det()`\n  * `jax.numpy.sinc()`，由 @abhiaiyer91 在 #35 中实现。\n  * `jax.numpy.logspace()`，由 @abhiaiyer91 在 #37 中实现。\n  * `jax.numpy.floorDivide()`，由 @abhiaiyer91 在 #36 中实现。\n  * `jax.numpy.divmod()`，由 @abhiaiyer91 在 #44 中实现。\n  * `jax.numpy.split()`，由 @ekzhang 在 #43 中实现（同时对 `concatenate` 进行了性能优化）。\n  * `jax.numpy.finfo()`，由 @ekzhang 在 #48 中实现。\n  * `jax.numpy.iinfo()`，由 @ekzhang 在 #48 中实现。\n  * `jax.numpy.take()`，由 @ekzhang 在 #53 中实现。\n  * `jax.random.multivariateNormal()`\n  * `jax.Array.refcount`，由 @jimfleming 在 #52 中实现（用于调试）。\n- 其他\n  * 修复 i32.eqz，并添加 arg* 基准测试，由 @klukaszek 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F22 中完成。\n  * Einsum 现在采用完整的 NumPy 广播规则进行广播，包括长度为 1 的轴。\n  * 在 `jax.numpy.array()` 构造函数中，默认情况下只有标量是弱类型的。\n\n## 新贡献者\n* @klukaszek 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F22 中完成了首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.4...jax\u002Fv0.1.5","2026-01-08T07:41:13",{"id":201,"version":202,"summary_zh":203,"released_at":204},99142,"optax\u002Fv0.1.2","**我们新建立了社区 Discord，请访问 https:\u002F\u002Fdiscord.gg\u002FBW6YsCd4Tf 加入！**\n\n## 变更内容\n* 添加了基于全局范数的梯度裁剪，以及由 @jimfleming 实现的树形工具，详见 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F40\n\n**完整变更日志**: https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Foptax\u002Fv0.1.1...optax\u002Fv0.1.2","2026-01-02T02:00:26",{"id":206,"version":207,"summary_zh":208,"released_at":209},99143,"jax\u002Fv0.1.4","**我们有一个新的社区 Discord，请访问 https:\u002F\u002Fdiscord.gg\u002FBW6YsCd4Tf 加入**\n\n## 变更内容\n* 新增：\n  * `jax.numpy.sort()`\n  * `jax.numpy.argsort()`\n  * `jax.numpy.linalg.cholesky()` - 仅限 CPU\u002FWasm\n  * `jax.numpy.linalg.lstsq()` - 仅限 CPU\u002FWasm\n  * `jax.lax.linalg.triangularSolve()` - 仅限 CPU\u002FWasm\n  * `jax.lax.linalg.cholesky()` - 仅限 CPU\u002FWasm\n  * `jax.numpy.convolve()`\n  * `jax.numpy.correlate()`\n  * `jax.numpy.cov()`\n  * `jax.numpy.corrcoef()`\n  * `jax.numpy.any()`\n  * `jax.numpy.all()`\n  * `jax.nn.sparsePlus()`\n  * `jax.nn.sparseSigmoid()`\n  * `jax.nn.hardSigmoid()`\n  * `jax.nn.hardSilu()` \u002F `jax.nn.hardSwish()`\n  * `jax.nn.hardTanh()`\n  * `jax.nn.selu()`\n  * `jax.random.cauchy()`\n  * `jax.random.gumbel()`\n  * `jax.random.laplace()`\n  * `jax.fft.fft()`\n  * `jax.fft.ifft()`\n* 重构了 `makeJaxpr` 的返回值，改为一种新的 `ClosedJaxpr` 类型，其中常量作为属性包含在内。\n* 移除了 JIT 中对常量的特殊处理，现在常量与普通数组一样对待，从而简化了代码并减少了边缘情况。\n* 修复了一个细微的 bug，该 bug 在 WebGPU 中有时会导致超过 10 个 JIT 参数，进而引发编译错误。\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F23 中添加了通过“Routines”进行自定义降级的功能。\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F25 中增加了 Cholesky 分解和三角解方程的支持。\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F27 中将 WebGPU 扩展为多通道着色器 + 均匀变量。\n* @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F28 中实现了全局内存中的完整 GPU 比较排序算法。\n* 功能（numpy）：添加 all() 和 any() 函数，并修复布尔归约问题，由 @abhiaiyer91 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F30 中完成。\n* 添加基于全局范数的梯度裁剪以及树形工具，由 @jimfleming 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F40 中实现。\n* 功能（random）：添加柯西、拉普拉斯和 Gumbel 随机采样器，由 @abhiaiyer91 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F33 中完成。\n* 核心库：在 jaxprs 中跟踪引用计数，由 @ekzhang 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F41 中实现。\n* 功能（numpy）：添加 expandDims 函数，由 @abhiaiyer91 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F29 中完成。\n\n## 新贡献者\n* @abhiaiyer91 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F30 中做出了他们的首次贡献。\n\n**完整变更日志**：https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.3...jax\u002Fv0.1.4","2026-01-02T01:59:18",{"id":211,"version":212,"summary_zh":213,"released_at":214},99144,"optax\u002Fv0.1.1","## 变更内容\n* 添加了 AdamW 优化器，为 SGD 增加了动量和 Nesterov 加速，并由 @jimfleming 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F21 中公开了一些 optax 工具函数。\n\n## 新贡献者\n* @jimfleming 在 https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F21 中完成了首次贡献。","2025-12-27T00:41:12",{"id":216,"version":217,"summary_zh":218,"released_at":219},99145,"jax\u002Fv0.1.3","This release is mostly about performance and for supporting our new ONNX model loader, `@jax-js\u002Fonnx`, which can load ONNX models that you would usually run with onnxruntime-web natively in jax-js, for `jit()` and `grad()` support.\r\n\r\nWe've also made some foundational improvements to the JIT compiler, it now automatically detects and fuses [_epilogues_](https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fcutlass\u002Fblob\u002Fmain\u002Finclude\u002Fcutlass\u002Fepilogue\u002Fthreadblock\u002Fepilogue.h) for reductions.\r\n\r\n## What's Changed\r\n* Added `jax.numpy.cumsum()` in 37dc26f960056fc9af766abe5a8a222e60436ca8\r\n* Added n-d grouped and depthwise convolution in 22b23aa2beb6da702c121e1b0edfcf87b0a8c7a4\r\n* Convolution is now vmappable in 9385227781b9e6ad73707e87ffcf5968a9348f2b\r\n* Fixed semantics of `jax.numpy.power()` for negative numbers to integer powers in 3b025516e2cd5a8cfde7795492bcf5f5bc07955d\r\n* Performance improvements\r\n  * JIT compiler fuses reduction epilogues by @ekzhang in https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F19\r\n  * jax-js now caches compiled WebAssembly modules\r\n  * Make DETR ResNet-50 3x faster by @ekzhang in https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F18\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.2...jax\u002Fv0.1.3","2025-12-25T00:14:42",{"id":221,"version":222,"summary_zh":223,"released_at":224},99146,"jax\u002Fv0.1.2","This release adds support for the `einsum` operation and 12 other JAX APIs, bringing us 5% closer to feature parity.\r\n\r\n```ts\r\nimport { numpy as np } from \"@jax-js\u002Fjax\";\r\n\r\nconst a = np.ones([2, 3]);\r\nconst b = np.ones([3]);\r\nnp.einsum(\"ij,j\", a, b); \u002F\u002F Shape [2]\r\n```\r\n\r\n```ts\r\nconst tx = np.arange(30).reshape([2, 3, 5]);\r\nconst ty = np.arange(60).reshape([3, 4, 5]);\r\nnp.einsum(\"ijk,jlk->il\", tx, ty);\r\n\u002F\u002F => [\r\n\u002F\u002F   [3340, 3865, 4390, 4915],\r\n\u002F\u002F   [8290, 9940, 11590, 13240],\r\n\u002F\u002F ];\r\n```\r\n\r\n## What's Changed\r\n* **Added `jax.numpy.einsum()` in #15 and #16**\r\n* Other new features:\r\n  * **Added `jax.lax.dot()`** in #16\r\n  * Added `jax.numpy.fmod()`\r\n  * Added `jax.numpy.remainder()`\r\n  * Added `jax.numpy.floor()`\r\n  * Added `jax.numpy.ceil()`\r\n  * Added `jax.numpy.tensordot()`\r\n  * Added `jax.numpy.trace()`\r\n  * Added `jax.numpy.frexp()`\r\n  * Added `jax.numpy.ldexp()`\r\n  * Added `jax.numpy.positive()`\r\n  * Added `jax.numpy.ptp()`\r\n  * Added `jax.numpy.squeeze()`\r\n* Add timer to REPL by @IsaacGemal in https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F13\r\n\r\n## New Contributors\r\n* @IsaacGemal made their first contribution in https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F13\r\n* @joyliu-q made their first contribution in #15\r\n* @gregzb made their first contribution in #15","2025-12-23T00:12:44",{"id":226,"version":227,"summary_zh":228,"released_at":229},99147,"jax\u002Fv0.1.1","## What's Changed\r\n* backend: Handle when browser does not support WebAssembly by @kevinji in https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F10\r\n* Add float64 type to CPU\u002FWasm backends by @ekzhang in https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F12\r\n* Fix comparison operations behavior with NaN values\r\n* Added `jax.numpy.isfinite`, `jax.numpy.isinf`, `jax.numpy.isnan`, `jax.numpy.isneginf`, `jax.numpy.isposinf`\r\n\r\n## New Contributors\r\n* @kevinji made their first contribution in https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fpull\u002F10\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fekzhang\u002Fjax-js\u002Fcompare\u002Fjax\u002Fv0.1.0...jax\u002Fv0.1.1","2025-12-20T01:40:06",{"id":231,"version":232,"summary_zh":233,"released_at":234},99148,"jax\u002Fv0.1.0","This is the first public release. [Announcement](https:\u002F\u002Fss.ekzhang.com\u002Fp\u002Fjax-js-an-ml-library-for-the-web)","2025-12-20T01:39:07"]