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 myappCreated binary (application) `myapp` package
~/myrust$ cd myapp
~/myrust/myapp$ cargo add --git https://github.com/huggingface/candle.git candle-coreUpdating 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- mklUpdating git repository `https://github.com/huggingface/candle.git`Updating crates.io index
~/myrust/myapp$ cargo buildDownloaded serde_derive v1.0.195Downloaded either v1.9.0Downloaded autocfg v1.1.0Downloaded zerofrom v0.1.3Downloaded zerofrom-derive v0.1.3Downloaded synstructure v0.13.0Downloaded crossbeam-deque v0.8.5Downloaded yoke-derive v0.7.3Downloaded half v2.3.1Downloaded bytemuck v1.14.1Downloaded rand_core v0.6.4Downloaded paste v1.0.14Downloaded proc-macro2 v1.0.78Downloaded itoa v1.0.10Downloaded memmap2 v0.9.4Downloaded syn v2.0.48Downloaded crossbeam-epoch v0.9.18Downloaded cfg-if v1.0.0Downloaded bitflags v1.3.2Downloaded num_cpus v1.16.0Downloaded gemm-f32 v0.17.0Downloaded reborrow v0.5.5Downloaded stable_deref_trait v1.2.0Downloaded rayon-core v1.12.1Downloaded seq-macro v0.3.5Downloaded thiserror-impl v1.0.56Downloaded dyn-stack v0.10.0Downloaded thiserror v1.0.56Downloaded unicode-xid v0.2.4Downloaded rand_chacha v0.3.1Downloaded ppv-lite86 v0.2.17Downloaded bytemuck_derive v1.5.0Downloaded getrandom v0.2.12Downloaded once_cell v1.19.0Downloaded unicode-ident v1.0.12Downloaded byteorder v1.5.0Downloaded crc32fast v1.3.2Downloaded num-complex v0.4.4Downloaded gemm-common v0.17.0Downloaded crossbeam-utils v0.8.19Downloaded quote v1.0.35Downloaded ryu v1.0.16Downloaded num-traits v0.2.17Downloaded zip v0.6.6Downloaded rand_distr v0.4.3Downloaded serde v1.0.195Downloaded rand v0.8.5Downloaded raw-cpuid v10.7.0Downloaded libm v0.2.8Downloaded serde_json v1.0.111Downloaded rayon v1.8.1Downloaded libc v0.2.152Downloaded gemm-c64 v0.17.0Downloaded gemm-c32 v0.17.0Downloaded safetensors v0.4.2Downloaded gemm-f64 v0.17.0Downloaded gemm v0.17.0Downloaded gemm-f16 v0.17.0Downloaded yoke v0.7.3Downloaded pulp v0.18.6Downloaded 60 crates (3.1 MB) in 14.91sCompiling proc-macro2 v1.0.78Compiling unicode-ident v1.0.12Compiling libc v0.2.152Compiling cfg-if v1.0.0Compiling libm v0.2.8Compiling autocfg v1.1.0Compiling crossbeam-utils v0.8.19Compiling ppv-lite86 v0.2.17Compiling rayon-core v1.12.1Compiling reborrow v0.5.5Compiling paste v1.0.14Compiling either v1.9.0Compiling bitflags v1.3.2Compiling seq-macro v0.3.5Compiling once_cell v1.19.0Compiling unicode-xid v0.2.4Compiling raw-cpuid v10.7.0Compiling serde v1.0.195Compiling crc32fast v1.3.2Compiling serde_json v1.0.111Compiling stable_deref_trait v1.2.0Compiling itoa v1.0.10Compiling ryu v1.0.16Compiling thiserror v1.0.56Compiling byteorder v1.5.0Compiling num-traits v0.2.17Compiling zip v0.6.6Compiling crossbeam-epoch v0.9.18Compiling quote v1.0.35Compiling syn v2.0.48Compiling crossbeam-deque v0.8.5Compiling getrandom v0.2.12Compiling memmap2 v0.9.4Compiling num_cpus v1.16.0Compiling rand_core v0.6.4Compiling rand_chacha v0.3.1Compiling rayon v1.8.1Compiling rand v0.8.5Compiling rand_distr v0.4.3Compiling synstructure v0.13.0Compiling bytemuck_derive v1.5.0Compiling serde_derive v1.0.195Compiling zerofrom-derive v0.1.3Compiling thiserror-impl v1.0.56Compiling yoke-derive v0.7.3Compiling bytemuck v1.14.1Compiling num-complex v0.4.4Compiling dyn-stack v0.10.0Compiling half v2.3.1Compiling zerofrom v0.1.3Compiling yoke v0.7.3Compiling pulp v0.18.6Compiling gemm-common v0.17.0Compiling gemm-f32 v0.17.0Compiling gemm-c64 v0.17.0Compiling gemm-f64 v0.17.0Compiling gemm-c32 v0.17.0Compiling gemm-f16 v0.17.0Compiling gemm v0.17.0Compiling safetensors v0.4.2Compiling 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,否则使用 CPUlet 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 中,
?符号用于处理Result或Option类型的返回值。这个符号的作用是将可能的错误或None值快速传播到调用链的最上层,使得代码更加简洁和易读。
fn forward(&self, image: &Tensor) -> Result<Tensor> {let x = image.matmul(&self.first)?; // 如果matmul返回Err,则整个forward函数返回Errlet x = x.relu()?; // 如果relu返回Err,则整个forward函数返回Errx.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/
相关文章:
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 ckeckmain.rs use candle_core::{Device…...
Python算法题集_接雨水
本文为Python算法题集之一的代码示例 题目42:接雨水 说明:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]…...
FIND_IN_SET的使用:mysql表数据多角色、多用户查询
MySQL 函数 FIND_IN_SET 是用于在逗号分隔的字符串中查找特定值的函数。它的语法如下: FIND_IN_SET(search_value, comma_separated_string)search_value 是要查找的值。 comma_separated_string 是逗号分隔的字符串,在这个字符串中查找指定的值。FIND_…...
JVM篇----第十一篇
系列文章目录 文章目录 系列文章目录前言一、在新生代-复制算法二、在老年代-标记整理算法三、分区收集算法四、GC 垃圾收集器前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你…...
鸿蒙HarmonyOS获取GPS精确位置信息
参考官方文档 #1.初始化时获取经纬度信息 aboutToAppear() {this.getLocation() } async getLocation () {try {const result await geoLocationManager.getCurrentLocation()AlertDialog.show({message: JSON.stringify(result)})}catch (error) {AlertDialog.show({message…...
java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数
java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数 3.58是否为金额:true 3.582是否为金额:false 1284789qq.com是否为email:true 1284789qq.com是否为email࿱…...
php下curl发送cookie
目录 一:使用 CURLOPT_COOKIE 选项 二:CURLOPT_COOKIEFILE 三:CURLOPT_HTTPHEADER php curl发送cookie的几种方式,下面来介绍下 一:使用 CURLOPT_COOKIE 选项 通过设置 CURLOPT_COOKIE 选项,你可以将 cookie 字符…...
stable diffusion学习笔记——文生图(一)
模型设置 基本模型 基本模型也就是常说的checkpoint(大模型),基本模型决定了生成图片的主体风格。 如上图所示,基本模型的后缀为.safetensors。需要存放在特定的文件夹下。 如果用的是启动器,可以在启动器内直接下载。…...
Linux下安装openresty
Linux下安装openresty 十一、Linux下安装openresty11.1.概述11.2.下载OpenResty并安装相关依赖:11.3.使用wget下载:11.4.解压缩:11.5.进入OpenResty目录:11.6.编译和安装11.7.进入OpenResty的目录,找到nginx:11.8.在conf目录下的nginx.conf添…...
【IM】如何保证消息可用性(一)
目录 1. 基本概念1.1 长连接 和 短连接1.2 PUSH模式和PULL模式 2. 背景介绍2.1 理解端到端的思想 3. 方案选型3.1 技术挑战3.2 技术目标 1. 基本概念 在讲解消息可用性之前,需要理解几个通信领域的基本概念。 1.1 长连接 和 短连接 什么是长连接,短连接…...
js直接下载附件和通过blob数据类型下载文件
js下载文件方式有使用a标签的,也有直接用window.open的,还有用form表单的;这里采用的是a标签的下载方式,一种是url直接下载,另一种是文件的blob数据类型进行下载。 文件blob数据类型的获取一般是后端返回文件的二进制流…...
第2章-神经网络的数学基础——python深度学习
第2章 神经网络的数学基础 2.1 初识神经网络 我们来看一个具体的神经网络示例,使用 Python 的 Keras 库 来学习手写数字分类。 我们这里要解决的问题是, 将手写数字的灰度图像(28 像素28 像素)划分到 10 个类别 中(0…...
【Docker】Docker学习⑧ - Docker仓库之分布式Harbor
【Docker】Docker学习⑧ - Docker仓库之分布式Harbor 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理六、网络部分七、Docker仓库之单机Dokcer Registry八、 Docker仓库之分布式Harbor1 Harbor功能官方介绍2 安装Harbor…...
一行命令在 wsl-ubuntu 中使用 Docker 启动 Windows
在 wsl-ubuntu 中使用 Docker 启动 Windows 0. 背景1. 验证我的系统是否支持 KVM?2. 使用 Docker 启动 Windows3. 访问 Docker 启动的 Windows4. Docker Hub 地址5. Github 地址 0. 背景 我们可以在 Windows 系统使用安装 wsl-ubuntu,今天玩玩在 wsl-ub…...
Datawhale 组队学习之大模型理论基础 Task7 分布式训练
第8章 分布式训练 8.1 为什么分布式训练越来越流行 近年来,模型规模越来越大,对硬件(算力、内存)的发展提出要求。因为内存墙的存在,单一设持续提高芯片的集成越来越困难,难以跟上模型扩大的需求。 为了…...
05-使用结构体构建相关数据
上一篇: 04-了解所有权 结构体(struct)是一种自定义数据类型,可以将多个相关值打包命名,组成一个有意义的组。如果你熟悉面向对象的语言,那么结构体就像是对象的数据属性。在本章中,我们将对元组…...
【Android】Android中的系统镜像由什么组成?
文章目录 总览Boot Loader 的加锁与解锁Boot 镜像内核RAM diskARM 中的设备树 (Device Tree) /System 和/Data 分区镜像参考 总览 各种Android设备都只能刷专门为相应型号的设备定制的镜像。 厂商会提供一套系统镜像把它作为“出厂默认”的 Android 系统刷在设备上。 一个完…...
仿真机器人-深度学习CV和激光雷达感知(项目2)day7【ROS关键组件】
文章目录 前言Launch 文件了解 XML 文件Launch 文件作用Launch 文件常用标签实例--作业1的 Launch 文件TF Tree介绍发布坐标变换--海龟例程获取坐标变换--海龟自动跟随例程rqt_工作箱前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫本文内容是我为复试准备的第二个…...
解锁一些SQL注入的姿势
昨天课堂上布置了要去看一些sql注入的案例,以下是我的心得: 1.新方法 打了sqli的前十关,我发现一般都是联合查询,但是有没有不是联合查询的方法呢…...
Qt 拖拽事件示例
一、引子 拖拽这个动作,在桌面应用程序中是非常实用和具有很友好的交互体验的。我们常见的譬如有,将文件拖拽到某个窗口打开,或者拖拽文件到指定位置上传;在绘图软件中,选中某个模板、并拖拽到画布上,画布上变回绘制该模板的图像… 诸如此类,数不胜数。 那么,在Qt中我…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
