RUST笔记:candle使用基础

news2024/9/28 19:31:51

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/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu20.04 安装 ROS noetic + MAVROS

本文在 AlphaCatOvO【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程 基础上&#xff0c;根据实际安装经验&#xff0c;稍微进行补充。 一、安装Ubuntu20.04 假设已经正确安装。 二、安装 ROS noetic 2.1 换源 执行 sudo apt update sudo mv /etc/apt/sources.list /etc/apt/…

过采样和欠采样是处理类别不平衡问题的两种常见方法,它们的特点是什么?

问题描述&#xff1a;过采样和欠采样是处理类别不平衡问题的两种常见方法&#xff0c;它们的特点是什么&#xff1f; 问题解答&#xff1a; 过采样和欠采样是处理类别不平衡问题的两种常见方法&#xff0c;它们各自具有一些特点&#xff1a; 过采样&#xff08;Oversampling&…

反射机制学习

因为反射java变成了动态 反射 Reflection(反射)是java被视为动态语言的关键&#xff0c;反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法 Class C Class.forName("java.lang.String") 加…

扩散视觉反事实算法 DVC:对抗性鲁棒分类器 + 扩散模型,跨模态对比原始的 fundus 图 VS 生成的 OCT 图

对抗性鲁棒分类器 扩散模型&#xff1a;为 正常的 fundus 和 OCT 图&#xff0c;生成更多病症图 解决问题创新点 效果调参技巧总结Fundus 转 OCT&#xff08;只是猜想&#xff0c;不一定&#xff09;1. 疾病特征模拟2. 数据增强3. 疾病进展模拟4. 跨模态学习 解决问题 论文&a…

Ultraleap 3Di示例Interactable Objects组件分析

该示例代码位置如下&#xff1a; 分析如下&#xff1a; Hover Enabled&#xff1a;悬停功能&#xff0c;手放在这个模型上&#xff0c;会触发我们手放在这个模型上的悬停功能。此时当手靠近模型的时候&#xff0c;手的模型的颜色会发生改变&#xff0c;反之&#xff0c;则不会…

npm create vue3项目特别慢

问题&#xff1a;Vue CLI v5.0.8在配置了淘宝镜像的情况下&#xff0c;创建项目报Failed to check for updates&#xff0c;还特别慢&#xff0c;等了好久都创建不好 查看 npm config get registry更换npm镜像 npm config set registryhttps://registry.npmmirror.com这样创建…

如何监控两台android设备之间串口通讯的ADB日志?

如果你的目标是将设备通过 Wi-Fi 连接到计算机&#xff0c;可以执行以下步骤&#xff1a; 一.通过 USB 连接设备&#xff1a; adb devices 确保设备通过 USB 连接&#xff0c;并且可以通过 adb devices 命令正常识别。 二、将设备1和设备2都切换到 TCP/IP 模式&#xff1a;…

guitar pro2024永久免费许可证(下载安装步骤教程)

1-guitar pro 版本有win版和mac版两种&#xff0c;本次以安装guitar pro 7 win版做步骤详解。 2-下载就不教了&#xff0c;把下载链接复制到浏览器&#xff08;这里建议用迅雷下载&#xff0c;速度快&#xff0c;浏览器下载容易中途断开&#xff09; 3-打开软件安装包&#x…

Kubernetes多租户实践

由于namespace本身的限制&#xff0c;Kubernetes对多租户的支持面临很多困难&#xff0c;本文梳理了K8S多租户支持的难点以及可能的解决方案。原文: Multi-tenancy in Kubernetes 是否应该让多个团队使用同一个Kubernetes集群? 是否能让不受信任的用户安全的运行不受信任的工作…

【JaveWeb教程】(28)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(1)

目录 SpringBootWeb案例011. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理 SpringBootWeb案例01 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库…

JavaWeb:商品管理系统(Vue版)

文章目录 1、功能介绍2、技术栈3、环境准备3.1、数据库准备3.2、在新建web项目中导入依赖3.3、编写Mybatis文件3.4、编写pojo类3.5、编写Mybatis工具类3.6、导入前端素材&#xff08;element-ui & vue.js & axios.js&#xff09;3.7、前端页面 4、功能实现4.1、查询所有…

ChatGPT惊艳更新!一个@让三百万GPTs为你打工

ChatGPT悄悄更新个大功能&#xff01;看起来要把插件系统迭代掉了。 部分(灰度)用户已经收到这样的提示&#xff1a; 现在可以在对话中任意GPT商店里的GPTs&#xff0c;就像在群聊中一个人。 体验到的博主Dan Shipper第一时间录视频激动地分享&#xff1a;一个改变游戏规则的…

Jenkins邮件推送配置

目录 涉及Jenkins插件&#xff1a; 邮箱配置 什么是授权码 在第三方客户端/服务怎么设置 IMAP/SMTP 设置方法 POP3/SMTP 设置方法 获取授权码&#xff1a; Jenkins配置 从Jenkins主面板System configuration>System进入邮箱配置 在Email Extension Plugin 邮箱插件…

excel中多行合并后调整行高并打印

首先参考该文&#xff0c;调整全文的行高。 几个小技巧&#xff1a; 1.转换成pdf查看文件格式 2.通过视图--》分页预览&#xff0c;来确定每页的内容&#xff08;此时页码会以水印的形式显示&#xff09; 3. 页面布局中的&#xff0c;宽度可以选为自动&#xff0c;因为已经是…

C# .Net6搭建灵活的RestApi服务器

1、准备 C# .Net6后支持顶级语句&#xff0c;更简单的RestApi服务支持&#xff0c;可以快速搭建一个极为简洁的Web系统。推荐使用Visual Studio 2022&#xff0c;安装"ASP.NET 和Web开发"组件。 2、创建工程 关键步骤如下&#xff1a; 包添加了“Newtonsoft.Json”&…

锂电池升6V输出3A芯片。2.7v-5.5v输入,输出6v给马达供电

锂电池升压输出芯片是一种常见的电子元件&#xff0c;广泛应用于各种电子设备中。本文将介绍一款锂电池升压输出芯片&#xff0c;AH8681可以将2.7V-5.5V的输入电压升压至6V&#xff0c;电流可达3A&#xff0c;内置MOS管。 该锂电池升压输出芯片具有以下特点&#xff1a; 1. 输…

蓝桥杯备战——6.串口通讯

1.分析原理图 由上图我们可以看到串口1通过CH340接到了USB口上&#xff0c;通过串口1我们就能跟电脑进行数据交互。 另外需要注意的是STC15F是有两组高速串口的&#xff0c;而且可以切换端口。 2.配置串口 由于比赛时间紧&#xff0c;我们最好不要去现场查寄存器手册&#x…

Redis学习——入门篇③

Redis学习——入门篇③ 1. Redis事务1.1 事务实际操作1.2 watch 2. Redis管道&#xff08;pipelining&#xff09;2.1 管道简介2.2 管道实际操作2.3 管道小总结 3. Redis&#xff08;pub、sub&#xff09;发布订阅(不重要)3.1 简介3.2 发布订阅实际操作 这是一个分水岭…

uniapp 实现路由拦截,权限或者登录控制

背景&#xff1a; 项目需要判断token&#xff0c;即是否登录&#xff0c;登录之后权限 参考uni-app官方&#xff1a; 为了兼容其他端的跳转权限控制&#xff0c;uni-app并没有用vue router路由&#xff0c;而是内部实现一个类似此功能的钩子&#xff1a;拦截器&#xff0c;由…

Jmeter连接数据库报错Cannot load JDBC driver class‘com.mysql.jdbc.Driver’解决

问题产生: 我在用jmeter连接数据库查询我的接口是否添加数据成功时,结果树响应Cannot load JDBC driver class com.mysql.jdbc.Driver 产生原因: 1、连接数据库的用户密码等信息使用的变量我放在了下面,导致没有取到用户名密码IP等信息,导致连接失败 2、jmeter没有JDB…