#自动微分 #cpu-gpu #数组 #深度学习 #gpu #固定大小 #auto-diff

sys no-std custos

一个最小的 OpenCL、WGPU、CUDA 和主机 CPU 数组操作引擎

15 个版本 (6 个重大更改)

0.7.0 2023年4月14日
0.6.3 2023年2月11日
0.5.0 2022年9月10日
0.4.0 2022年7月31日

#566 in 机器学习

Download history 6/week @ 2024-03-13 16/week @ 2024-03-27 21/week @ 2024-04-03

每月 97 次下载
用于 2 crate

MIT 许可证

380KB
8K SLoC

custos logo


Crates.io version Docs Rust GPU rust-clippy

A minimal OpenCL, WGPU, CUDA and host CPU array manipulation engine / framework written in Rust. This crate provides the tools for executing custom array and automatic differentiation operations with the CPU, as well as with CUDA, WGPU and OpenCL devices.
This guide demonstrates how operations can be implemented for the compute devices: implement_operations.md
or to see it at a larger scale, look here custos-math or here sliced (for automatic diff examples).

安装

将 "custos" 添加为依赖项

[dependencies]
custos = "0.7.0"

# to disable the default features (cpu, cuda, opencl, static-api, blas, macro) and use an own set of features:
#custos = {version = "0.7.0", default-features=false, features=["opencl", "blas"]}

可用功能

功能 描述
cpu 添加 CPU 设备
stack 添加 Stack 设备,启用堆栈分配的 Buffer
opencl 添加 OpenCL 功能。 (设备名称:OpenCL)
cuda 添加 CUDA 功能。 (设备名称:CUDA)
wgpu 添加 WGPU 功能。 (设备名称:WGPU)
no-std 对于无 std 环境,激活 stack 功能。
static-api 允许在不提供设备的情况下创建 Buffer
blas 添加来自系统(所选)BLAS 库的 gemm 函数。
opt-cache 使 '缓存图' 可优化,降低内存占用。
macro 重新导出 custos-macro
realloc 禁用所有设备的分配缓存。
autograd  添加自动微分功能。

示例

custos只实现了四种Buffer操作。这些操作是writereadcopy_sliceclear,然而,还有unary(仅设备)操作。
另一方面,[custos-math]实现了更多操作,包括自定义Matrix结构的矩阵操作。

CPU实现操作:如果您想为所有计算设备实现自己的操作,请考虑查看这里:implement_operations.md

use std::ops::Mul;
use custos::prelude::*;

pub trait MulBuf<T, S: Shape = (), D: Device = Self>: Sized + Device {
    fn mul(&self, lhs: &Buffer<T, D, S>, rhs: &Buffer<T, D, S>) -> Buffer<T, Self, S>;
}

impl<T, S, D> MulBuf<T, S, D> for CPU
where
    T: Mul<Output = T> + Copy,
    S: Shape,
    D: MainMemory,
{
    fn mul(&self, lhs: &Buffer<T, D, S>, rhs: &Buffer<T, D, S>) -> Buffer<T, CPU, S> {
        let mut out = self.retrieve(lhs.len(), (lhs, rhs));

        for ((lhs, rhs), out) in lhs.iter().zip(&*rhs).zip(&mut out) {
            *out = *lhs * *rhs;
        }

        out
    }
}

更多使用示例可以在testsexamples文件夹中找到。(或者在unary操作文件、custos-mathsliced中)

依赖项

~0–33MB
~465K SLoC