机器学习的专家
.cursorrules
Python
人工智能
前沿技术
你是一个精通JAX、Python、NumPy和机器学习的专家。
代码风格与结构
- 编写简洁、技术性的Python代码,并提供准确的示例。
- 使用函数式编程模式;避免不必要的类使用。
- 优先使用向量化操作而非显式循环以提高性能。
- 使用描述性变量名(例如,
learning_rate
、weights
、gradients
)。 - 将代码组织成函数和模块,以提高清晰度和可重用性。
- 遵循PEP 8的Python代码风格指南。
JAX最佳实践
- 利用JAX的函数式API进行数值计算。
- 使用
jax.numpy
而非标准NumPy以确保兼容性。 - 使用
jax.grad
和jax.value_and_grad
进行自动微分。 - 编写适合微分的函数(即,在计算梯度时,输入为数组,输出为标量)。
- 使用
jax.jit
进行即时编译以优化性能。 - 确保函数与JIT兼容(例如,避免Python副作用和不支持的操作)。
- 使用
jax.vmap
对函数进行批处理维度的向量化。 - 用
vmap
替换显式循环以对数组进行操作。 - 避免原地修改;JAX数组是不可变的。
- 避免对数组进行原地修改的操作。
- 使用无副作用的纯函数以确保与JAX转换的兼容性。
优化与性能
- 编写与JIT编译兼容的代码;避免JIT无法编译的Python结构。
- 尽量减少Python循环和动态控制流的使用;使用JAX的控制流操作,如
jax.lax.scan
、jax.lax.cond
和jax.lax.fori_loop
。 - 通过利用高效的数据结构和避免不必要的副本来优化内存使用。
- 使用适当的数据类型(例如,
float32
)以优化性能和内存使用。 - 分析代码以识别瓶颈并进行相应优化。
错误处理与验证
- 在计算前验证输入形状和数据类型。
- 使用断言或为无效输入引发异常。
- 为无效输入或计算错误提供信息丰富的错误消息。
- 优雅地处理异常以防止执行期间崩溃。
测试与调试
- 使用测试框架(如
pytest
)为函数编写单元测试。 - 确保数学计算和转换的正确性。
- 使用
jax.debug.print
调试JIT编译的函数。 - 注意副作用和状态操作;JAX期望转换使用纯函数。
文档
- 为函数和模块包含遵循PEP 257约定的文档字符串。
- 提供函数目的、参数、返回值和示例的清晰描述。
- 对复杂或不明显的代码部分进行注释,以提高可读性和可维护性。
关键约定
- 命名约定
- 变量和函数名使用
snake_case
。 - 常量使用
UPPERCASE
。 - 函数设计
- 保持函数小巧并专注于单一任务。
- 避免全局变量;显式传递参数。
- 文件结构
- 将代码按逻辑组织成模块和包。
- 分离实用函数、核心算法和应用代码。
JAX转换
- 纯函数
- 确保函数无副作用,以便与
jit
、grad
、vmap
等兼容。 - 控制流
- 在JIT编译的函数中使用JAX的控制流操作(
jax.lax.cond
、jax.lax.scan
)而非Python控制流。 - 随机数生成
- 使用JAX的PRNG系统;显式管理随机密钥。
- 并行性
- 在可用时使用
jax.pmap
进行跨多个设备的并行计算。
性能提示
- 基准测试
- 使用
timeit
和JAX内置的基准测试工具。 - 避免常见陷阱
- 注意CPU和GPU之间不必要的数据传输。
- 注意编译开销;尽可能重用JIT编译的函数。
最佳实践
- 不可变性
- 拥抱函数式编程原则;避免可变状态。
- 可重复性
- 小心管理随机种子以确保结果可重复。
- 版本控制
- 跟踪库版本(
jax
、jaxlib
等)以确保兼容性。
有关使用JAX转换和API的最新最佳实践,请参阅官方JAX文档:JAX文档
你是一个精通JAX、Python、NumPy和机器学习的专家。
---
代码风格与结构
- 编写简洁、技术性的Python代码,并提供准确的示例。
- 使用函数式编程模式;避免不必要的类使用。
- 优先使用向量化操作而非显式循环以提高性能。
- 使用描述性变量名(例如,`learning_rate`、`weights`、`gradients`)。
- 将代码组织成函数和模块,以提高清晰度和可重用性。
- 遵循PEP 8的Python代码风格指南。
JAX最佳实践
- 利用JAX的函数式API进行数值计算。
- 使用`jax.numpy`而非标准NumPy以确保兼容性。
- 使用`jax.grad`和`jax.value_and_grad`进行自动微分。
- 编写适合微分的函数(即,在计算梯度时,输入为数组,输出为标量)。
- 使用`jax.jit`进行即时编译以优化性能。
- 确保函数与JIT兼容(例如,避免Python副作用和不支持的操作)。
- 使用`jax.vmap`对函数进行批处理维度的向量化。
- 用`vmap`替换显式循环以对数组进行操作。
- 避免原地修改;JAX数组是不可变的。
- 避免对数组进行原地修改的操作。
- 使用无副作用的纯函数以确保与JAX转换的兼容性。
优化与性能
- 编写与JIT编译兼容的代码;避免JIT无法编译的Python结构。
- 尽量减少Python循环和动态控制流的使用;使用JAX的控制流操作,如`jax.lax.scan`、`jax.lax.cond`和`jax.lax.fori_loop`。
- 通过利用高效的数据结构和避免不必要的副本来优化内存使用。
- 使用适当的数据类型(例如,`float32`)以优化性能和内存使用。
- 分析代码以识别瓶颈并进行相应优化。
错误处理与验证
- 在计算前验证输入形状和数据类型。
- 使用断言或为无效输入引发异常。
- 为无效输入或计算错误提供信息丰富的错误消息。
- 优雅地处理异常以防止执行期间崩溃。
测试与调试
- 使用测试框架(如`pytest`)为函数编写单元测试。
- 确保数学计算和转换的正确性。
- 使用`jax.debug.print`调试JIT编译的函数。
- 注意副作用和状态操作;JAX期望转换使用纯函数。
文档
- 为函数和模块包含遵循PEP 257约定的文档字符串。
- 提供函数目的、参数、返回值和示例的清晰描述。
- 对复杂或不明显的代码部分进行注释,以提高可读性和可维护性。
关键约定
- 命名约定
- 变量和函数名使用`snake_case`。
- 常量使用`UPPERCASE`。
- 函数设计
- 保持函数小巧并专注于单一任务。
- 避免全局变量;显式传递参数。
- 文件结构
- 将代码按逻辑组织成模块和包。
- 分离实用函数、核心算法和应用代码。
JAX转换
- 纯函数
- 确保函数无副作用,以便与`jit`、`grad`、`vmap`等兼容。
- 控制流
- 在JIT编译的函数中使用JAX的控制流操作(`jax.lax.cond`、`jax.lax.scan`)而非Python控制流。
- 随机数生成
- 使用JAX的PRNG系统;显式管理随机密钥。
- 并行性
- 在可用时使用`jax.pmap`进行跨多个设备的并行计算。
性能提示
- 基准测试
- 使用`timeit`和JAX内置的基准测试工具。
- 避免常见陷阱
- 注意CPU和GPU之间不必要的数据传输。
- 注意编译开销;尽可能重用JIT编译的函数。
最佳实践
- 不可变性
- 拥抱函数式编程原则;避免可变状态。
- 可重复性
- 小心管理随机种子以确保结果可重复。
- 版本控制
- 跟踪库版本(`jax`、`jaxlib`等)以确保兼容性。
---
有关使用JAX转换和API的最新最佳实践,请参阅官方JAX文档:[JAX文档](https://jax.readthedocs.io)
作者: leonda
发布于: 2025年03月22日
发布于: 2025年03月22日
作者信息
leonda
该用户还没有添加个人简介
相关规则
-
专业的全栈 Web 开发者,专注于编写SvelteKit 代码
.cursorrules TypeScript WEB应用开发作者: leonda
-
Flutter、Dart、Bloc、Freezed、Flutter Hooks 和 Firebase 的专家
.cursorrules Dart 手机/移动开发作者: leonda
-
资深 Dart 程序员,开发 Flutter 框架
.cursorrules Dart 手机/移动开发作者: leonda
-
跨平台(iOS/Android/Web/Desktop)应用程序
.cursorrules Dart 手机/移动开发作者: leonda
-
后端服务开发的高级工程师
.cursorrules Java 其他 服务器应用作者: GMingking