RUST笔记:candle使用基础

candle介绍

  • candle是huggingface开源的Rust的极简 ML 框架。

candle-矩阵乘法示例

cargo new myapp
cd myapp
cargo add --git https://github.com/huggingface/candle.git candle-core
cargo build # 测试,或执行 cargo ckeck
  • main.rs
use candle_core::{Device, Tensor};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let device = Device::Cpu;

    let a = Tensor::randn(0f32, 1., (2, 3), &device)?;
    let b = Tensor::randn(0f32, 1., (3, 4), &device)?;

    let c = a.matmul(&b)?;
    println!("{c}");
    Ok(())
}

  • 项目输出
~/myrust$ cargo new myapp
     Created binary (application) `myapp` package
~/myrust$ cd myapp
~/myrust/myapp$ cargo add --git https://github.com/huggingface/candle.git candle-core
    Updating git repository `https://github.com/huggingface/candle.git`
    Updating git submodule `https://github.com/NVIDIA/cutlass.git`
      Adding candle-core (git) to dependencies.
             Features:
             - accelerate
             - cuda
             - cudarc
             - cudnn
             - metal
             - mkl
    Updating git repository `https://github.com/huggingface/candle.git`
    Updating crates.io index
~/myrust/myapp$ cargo build
  Downloaded serde_derive v1.0.195
  Downloaded either v1.9.0
  Downloaded autocfg v1.1.0
  Downloaded zerofrom v0.1.3
  Downloaded zerofrom-derive v0.1.3
  Downloaded synstructure v0.13.0
  Downloaded crossbeam-deque v0.8.5
  Downloaded yoke-derive v0.7.3
  Downloaded half v2.3.1
  Downloaded bytemuck v1.14.1
  Downloaded rand_core v0.6.4
  Downloaded paste v1.0.14
  Downloaded proc-macro2 v1.0.78
  Downloaded itoa v1.0.10
  Downloaded memmap2 v0.9.4
  Downloaded syn v2.0.48
  Downloaded crossbeam-epoch v0.9.18
  Downloaded cfg-if v1.0.0
  Downloaded bitflags v1.3.2
  Downloaded num_cpus v1.16.0
  Downloaded gemm-f32 v0.17.0
  Downloaded reborrow v0.5.5
  Downloaded stable_deref_trait v1.2.0
  Downloaded rayon-core v1.12.1
  Downloaded seq-macro v0.3.5
  Downloaded thiserror-impl v1.0.56
  Downloaded dyn-stack v0.10.0
  Downloaded thiserror v1.0.56
  Downloaded unicode-xid v0.2.4
  Downloaded rand_chacha v0.3.1
  Downloaded ppv-lite86 v0.2.17
  Downloaded bytemuck_derive v1.5.0
  Downloaded getrandom v0.2.12
  Downloaded once_cell v1.19.0
  Downloaded unicode-ident v1.0.12
  Downloaded byteorder v1.5.0
  Downloaded crc32fast v1.3.2
  Downloaded num-complex v0.4.4
  Downloaded gemm-common v0.17.0
  Downloaded crossbeam-utils v0.8.19
  Downloaded quote v1.0.35
  Downloaded ryu v1.0.16
  Downloaded num-traits v0.2.17
  Downloaded zip v0.6.6
  Downloaded rand_distr v0.4.3
  Downloaded serde v1.0.195
  Downloaded rand v0.8.5
  Downloaded raw-cpuid v10.7.0
  Downloaded libm v0.2.8
  Downloaded serde_json v1.0.111
  Downloaded rayon v1.8.1
  Downloaded libc v0.2.152
  Downloaded gemm-c64 v0.17.0
  Downloaded gemm-c32 v0.17.0
  Downloaded safetensors v0.4.2
  Downloaded gemm-f64 v0.17.0
  Downloaded gemm v0.17.0
  Downloaded gemm-f16 v0.17.0
  Downloaded yoke v0.7.3
  Downloaded pulp v0.18.6
  Downloaded 60 crates (3.1 MB) in 14.91s
   Compiling proc-macro2 v1.0.78
   Compiling unicode-ident v1.0.12
   Compiling libc v0.2.152
   Compiling cfg-if v1.0.0
   Compiling libm v0.2.8
   Compiling autocfg v1.1.0
   Compiling crossbeam-utils v0.8.19
   Compiling ppv-lite86 v0.2.17
   Compiling rayon-core v1.12.1
   Compiling reborrow v0.5.5
   Compiling paste v1.0.14
   Compiling either v1.9.0
   Compiling bitflags v1.3.2
   Compiling seq-macro v0.3.5
   Compiling once_cell v1.19.0
   Compiling unicode-xid v0.2.4
   Compiling raw-cpuid v10.7.0
   Compiling serde v1.0.195
   Compiling crc32fast v1.3.2
   Compiling serde_json v1.0.111
   Compiling stable_deref_trait v1.2.0
   Compiling itoa v1.0.10
   Compiling ryu v1.0.16
   Compiling thiserror v1.0.56
   Compiling byteorder v1.5.0
   Compiling num-traits v0.2.17
   Compiling zip v0.6.6
   Compiling crossbeam-epoch v0.9.18
   Compiling quote v1.0.35
   Compiling syn v2.0.48
   Compiling crossbeam-deque v0.8.5
   Compiling getrandom v0.2.12
   Compiling memmap2 v0.9.4
   Compiling num_cpus v1.16.0
   Compiling rand_core v0.6.4
   Compiling rand_chacha v0.3.1
   Compiling rayon v1.8.1
   Compiling rand v0.8.5
   Compiling rand_distr v0.4.3
   Compiling synstructure v0.13.0
   Compiling bytemuck_derive v1.5.0
   Compiling serde_derive v1.0.195
   Compiling zerofrom-derive v0.1.3
   Compiling thiserror-impl v1.0.56
   Compiling yoke-derive v0.7.3
   Compiling bytemuck v1.14.1
   Compiling num-complex v0.4.4
   Compiling dyn-stack v0.10.0
   Compiling half v2.3.1
   Compiling zerofrom v0.1.3
   Compiling yoke v0.7.3
   Compiling pulp v0.18.6
   Compiling gemm-common v0.17.0
   Compiling gemm-f32 v0.17.0
   Compiling gemm-c64 v0.17.0
   Compiling gemm-f64 v0.17.0
   Compiling gemm-c32 v0.17.0
   Compiling gemm-f16 v0.17.0
   Compiling gemm v0.17.0
   Compiling safetensors v0.4.2
   Compiling candle-core v0.3.3 (https://github.com/huggingface/candle.git#fd7c8565)
   Compiling myapp v0.1.0 (/home/pdd/myrust/myapp)
    Finished dev [unoptimized + debuginfo] target(s) in 32.90s

candle_test的简单测试项目

  • https://github.com/RileySeaburg/candle_test

  • git clone https://github.com/RileySeaburg/candle_test.git

Cargo.toml 文件

[package]
name = "candle_test"
version = "0.1.0"
edition = "2021" #  Rust 版本

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
candle-core = { git = "https://github.com/huggingface/candle.git", version = "0.2.1", features = ["cuda"] }
# `candle-core`:项目依赖的包的名称。`git` 字段指定了包的源代码仓库地址。`version` 字段指定了使用的包的版本。`features` 字段是一个数组,指定了启用的功能。在这里,启用了 "cuda" 功能。
# 可以通过以下命令添加,取消可注释掉"cuda",再cargo build
# cargo add --git https://github.com/huggingface/candle.git candle-core
# cargo add candle-core --features cuda

main.rs

use candle_core::{DType, Device, Result, Tensor};

// 定义一个模型结构体
struct Model {
    first: Tensor,
    second: Tensor,
}

impl Model {
    // 定义模型的前向传播方法
    fn forward(&self, image: &Tensor) -> Result<Tensor> {
        let x = image.matmul(&self.first)?; // 输入乘以第一层权重
        let x = x.relu()?; // 使用 ReLU 激活函数
        x.matmul(&self.second) // 结果乘以第二层权重
    }
}

fn main() -> Result<()> {
    // 初始化设备,如果 GPU 可用则使用 GPU,否则使用 CPU
    let device = match Device::new_cuda(0) {
        Ok(device) => device,
        Err(_) => Device::Cpu,
    };

    // 创建模型的第一层和第二层权重张量
    let first = Tensor::zeros((784, 100), DType::F32, &device)
        .unwrap()
        .contiguous()?;
    let second = Tensor::zeros((100, 10), DType::F32, &device)
        .unwrap()
        .contiguous()?;
    
    // 初始化模型
    let model = Model { first, second };

    // 创建一个用于测试的虚拟图像张量
    let dummy_image = Tensor::zeros((1, 784), DType::F32, &device)
        .unwrap()
        .contiguous()?;

    // 调用模型的前向传播方法获取预测结果
    let digit = model.forward(&dummy_image)?;

    // 打印预测结果
    println!("Digit {digit:?} digit");

    Ok(())
}

知识点总结

candle_core:: Result

在这里插入图片描述

// Result定义在/home/pdd/.cargo/git/checkouts/candle-0c2b4fa9e5801351/e8e3375/candle-core/src/error.rs
pub type Result<T> = std::result::Result<T, Error>; // 定义了一个 `Result` 类型,这是一个 `Result<T, Error>` 类型的别名。其中 `T` 是成功时的返回类型,而 `Error` 是失败时的错误类型。
// Ok(()) 定义在 /home/pdd/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs
// 这是 Rust 标准库中的 `Result` 公共的枚举类型,它有两个泛型参数 `T` 和 `E`。`T` 代表成功时返回的值的类型,`E` 代表错误时返回的错误类型。
// #[]是属性(attribute),提供额外信息
pub enum Result<T, E> {
    /// Contains the success value
    #[lang = "Ok"]
    #[stable(feature = "rust1", since = "1.0.0")]
    Ok(#[stable(feature = "rust1", since = "1.0.0")] T),// `Ok(T)`: 这是 `Result` 枚举的一个变体,用于表示成功的情况
                                                        // (): 是 Rust 中的单元类型(unit type),类似于其他语言中的 void。

    /// Contains the error value
    #[lang = "Err"]
    #[stable(feature = "rust1", since = "1.0.0")]
    Err(#[stable(feature = "rust1", since = "1.0.0")] E),// `Err(E)`: 这是 `Result` 枚举的另一个变体,用于表示错误的情况。
}

?符号

  • 在 Rust 中,? 符号用于处理 ResultOption 类型的返回值。这个符号的作用是将可能的错误或 None 值快速传播到调用链的最上层,使得代码更加简洁和易读。
fn forward(&self, image: &Tensor) -> Result<Tensor> {
    let x = image.matmul(&self.first)?; // 如果matmul返回Err,则整个forward函数返回Err
    let x = x.relu()?; // 如果relu返回Err,则整个forward函数返回Err
    x.matmul(&self.second) // 如果matmul返回Err,则整个forward函数返回Err;否则返回Ok(Tensor)
}

语句和表达式:语句以分号结尾,而表达式通常不需要分号。

  • 函数体:函数体是一个块表达式,其值是最后一个表达式的值。

    fn add(x: i32, y: i32) -> i32 {
        x + y // 表达式
    }
    

CG

  • Burn is a new comprehensive dynamic Deep Learning Framework built using Rust with extreme flexibility, compute efficiency and portability as its primary goals.
  • resnet for caddle: https://github.com/iFREEGROUP/candle-models
  • Using candle to build a transformers for Rust.
  • https://github.com/joker3212/candle-clip
  • https://github.com/jonysugianto/candle_fastformer
  • Candle Silu inplace
  • https://github.com/ansleliu/PortableTelemedicineMonitoringSystem
  • https://mobile-aloha.github.io/
  • Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardwarehttps://arxiv.org/pdf/2304.13705.pdf
  • A flexible, high-performance 3D simulator for Embodied AI research.
  • https://github.com/huggingface/huggingface.js
  • https://www.zhihu.com/people/wasmedge
  • https://wasmedge.org/docs/start/install/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/351346.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

惊了!用vue开发官网,以前我觉得胡闹,现在觉得未尝不可。

以前&#xff0c;有人做好官网UI&#xff08;展示性&#xff0c;没啥功能&#xff09;&#xff0c;找我开发前端&#xff0c;说要vue来做&#xff0c;我都劝了。 基于以下四个原因&#xff1a; 1、官网毕竟还是考虑seo的&#xff0c;流量多少算多少&#xff0c;总比没有强&am…

Doris 与 Clickhouse 对比(一)

1. 常用引擎 ☕️ Doris 表数据模型 duplicate key &#x1f3ac; 场景&#xff1a;适用于数据无需提前聚合的分析业务。 ⚠️ 注意点&#xff1a;只指定排序列&#xff0c;相同的行并不会合并。 unique key &#x1f3ac; 场景&#xff1a;适用于有更新需求的业务。 ⚠…

Flink 集成 Debezium Confluent Avro ( format=debezium-avro-confluent )

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

数据结构——链式二叉树(2)

目录 &#x1f341;一、二叉树的销毁 &#x1f341;二、在二叉树中查找某个数&#xff0c;并返回该结点 &#x1f341;三、LeetCode——检查两棵二叉树是否相等 &#x1f315;&#xff08;一&#xff09;、题目链接&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&a…

私有化部署ASR的方案,优缺点

私有化部署自动语音识别&#xff08;ASR&#xff09;系统的方案具有一些优点和缺点&#xff0c;下面苏州磐石云提出一些常见的优缺点&#xff1a; 优点&#xff1a; 数据隐私和安全性&#xff1a;私有化部署ASR系统可以确保数据在本地环境中进行处理和存储&#xff0c;更好地保…

《动手学深度学习(PyTorch版)》笔记4.5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

Notepad在文件中查找多行相同内容的文字

Notepad在文件中查找多行相同的内容 查找&#xff1a;打开 Notepad软件&#xff0c; Ctrl F 查找 。输入关键词&#xff0c; 点击【在当前文件中查找】。 复制&#xff1a;直接在下方的【搜索结果】复制。 Notepad提取含有特定字符串的行 详情见&#xff1a; https://blog…

[HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

IndexedDB

Web SQL Database | Can I use... Support tables for HTML5, CSS3, etc IndexedDB | Can I use... Support tables for HTML5, CSS3, etc 为什么websql被废弃&#xff1f;_笔记大全_设计学院 WebSQL有兼容、性能、安全问题&#xff0c;要考虑使用IndexedDB替代。 一文看懂 In…

上位机图像处理和嵌入式模块部署(极致成本下的图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前&#xff0c;大家都习惯了特定的图像处理方式&#xff0c;要么是windows上位机来处理&#xff0c;要么是arm soc来进行处理&#xff0c;要么是…

远程git开发

两种本地与远程仓库同步 """ 1&#xff09;你作为项目仓库初始化人员&#xff1a;线上要创建空仓库 > 本地初始化好仓库 > 建立remote链接(remote add) > 提交本地仓库到远程(push)2&#xff09;你作为项目后期开发人员&#xff1a;远程项目仓库已经创…

快速恢复区域 - 空间管理警告和警报(文档 ID 305812.1)

快速恢复区域 - 空间管理警告和警报&#xff08;文档 ID 305812.1&#xff09;

Stable Diffusion插件Recolor实现黑白照片上色

今天跟大家分享一个使用Recolor插件通过SD实现老旧照片轻松变彩色&#xff0c;Recolor翻译过来的含义就是重上色&#xff0c;该模型可以保持图片的构图&#xff0c;它只会负责上色&#xff0c;图片不会发生任何变化。 一&#xff1a;插件下载地址 https://github.com/pkuliyi…

pinctrl子系统与gpio子系统实验-测试Led驱动框架代码

一. 简介 上一篇文章学习编写了 led驱动框架代码&#xff0c;并正常编译通过。文章地址如下&#xff1a; pinctrl子系统与gpio子系统实验-Led驱动框架代码实现-CSDN博客 本文对上一篇文章编写的驱动框架代码进行测试。测试方法与之前的驱动模块的测试方法一样。 二. 测试Le…

快速上手!使用Docker和Nginx部署Web服务的完美指南

前言 Docker是一种容器化技术&#xff0c;它可以将应用程序及其依赖项打包到一个独立的、可移植的容器中。这意味着开发人员可以在任何环境中轻松部署和运行他们的应用程序&#xff0c;而无需担心环境差异和依赖问题。而Nginx则是一款高性能的Web服务器和反向代理服务器&#x…

Chapter 8 - 1. Congestion Management in TCP Storage Networks

This chapter covers the following topics. 本章包括以下主题。 Understanding congestion in TCP storage networks. Detecting congestion in TCP storage networks. Traffic patterns with iSCSI and NVMe/TCP and correlation with network congestion. Preventing co…

Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析

2.3.3 集成 阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了&#xff0c;接下来我们就需要在案例当中集成oss对象存储服务&#xff0c;来存储和管理案例中上传的图片。 在新增员工的时候&#xff0c;上传员工的图像&#xff0c;而之所以需要上传员工的图像&…

C++版QT:分割窗口

目录 mainwindow.h mainwindow.cpp main.cpp Qt的分割窗口功能允许用户将一个窗口分割成多个区域&#xff0c;每个区域可以独立地显示不同的内容。这种功能在许多应用程序中非常有用&#xff0c;例如编辑器、浏览器和IDE等。 理解Qt的分割窗口&#xff0c;需要从以下几个方面…

SQL注入流程与常用语句

FLAG&#xff1a;别来我梦里了&#xff0c;我已负担不起醒来的失落 专研方向: Mysql&#xff0c;sql注入 每日emo&#xff1a;好久不见&#xff0c;寒暄几句&#xff0c;缺耗尽了半生的勇气 欢迎各位与我这个菜鸟交流学习 SQL注入流程与常用语句 1、判断注入类型&#xff0c;数…

华为三层交换机之基本操作

Telnet简介 Telnet是一个应用层协议,可以在Internet上或局域网上使用。它提供了基于文本的远程终端接口&#xff0c;允许用户在本地计算机上登录到远程计算机&#xff0c;然后像在本地计算机上一样使用远程计算机的资源。Telnet客户端和服务器之间的通信是通过Telnet协议进行的…