2 个版本
新版本 0.1.1 | 2024 年 8 月 10 日 |
---|---|
0.1.0 | 2024 年 7 月 30 日 |
在 #correct 中排名第 8
每月下载量 194
33KB
544 行
JYAFN 扩展
JYAFN 扩展对于添加标准实现无法提供的额外功能非常有用。主要用途是在拥有与 jyafn
不兼容的非常复杂的三方代码时(例如,调用原生函数)。这种代码通常 可以 在 jyafn
中重新实现,但这将需要时间和金钱。如果此代码还包含一个不依赖于(或最小程度依赖于)Python 的实现,则通常可以简单地创建一个 C 包装器并将其通过扩展 API 暴露给 JYAFN。此类代码的一个典型例子是 LightGBM 库,其扩展在 extensions
文件夹中实现。
该软件包提供了一种在 Rust 中编写扩展的方法,完全不需要不安全代码。它将使用 Rust 宏生成所有样板代码,并以正确的方式管理所有不安全性。
什么是扩展?
扩展只是符合特定 C API 的共享对象。这些共享对象存储在文件系统中某个位置,默认在 ~/.jyafn/extensions
中,更一般地,在 JYAFN_PATH
环境变量中。当新的计算图声明一个依赖于扩展提供的资源类型的资源时,jyafn 将加载它们。因此,扩展具有一些重大期望
- 扩展是 可信 代码。它们不在与
jyafn
函数相同的有限和沙箱环境中运行。它们可以运行 任何 东西,从令人惊叹的复杂算法到错误甚至病毒。 - 扩展是依赖项,必须管理依赖项。它们需要从某个地方预先安装,否则依赖于它们的图将无法工作。
- 扩展是系统相关的。没有一种代码可以在任何地方运行。它们需要为每个架构编译。
因此,应将扩展的使用保持在最低限度,并仅将其保留用于高度可重用的代码。
什么是资源?
资源,简单来说,就像Python中的对象。它们可以被创建,并可以通过方法进行访问。与Python对象不同,它们被设计成严格不可变,并且必须可序列化(即在文件中表示为字节)。一个扩展可以声明一个资源列表,每个资源都可以声明一个方法列表。资源具有简单的生命周期
- 它由一些外部二进制数据表示创建。
- 在
jyafn
函数中的每次方法调用都会对其查询方法。 - 将其序列化为字节,以便与
jyafn
图中的其他部分一起存入文件,可能用于在另一台机器上读取和重新创建。
因此,我们有一个非常简单的创建资源的接口
from_bytes
:从序列化的二进制数据构建一个新的资源。dump
:将资源表示为序列化数据。get_method
:获取有关方法的信息(其函数指针、输入和输出布局)以执行调用。
最后一个方法,size
,也将被实现以跟踪每个资源的堆消耗。
下一步是什么
如果您打算推出自己的扩展,可以查看extensions
文件夹中的示例实现。dummy
扩展提供了一个非常简单的扩展的基本示例,而lightgbm
扩展展示了LightGBM库的完整功能扩展。
但是,如果您像大多数人一样,正在寻找有关如何作为用户与扩展一起工作的信息,请查看“玩转扩展”(实现待定)以了解更多。
依赖项
~0.8–1.7MB
~36K SLoC