Rust in Everything
基于 burn 0.22.1

张量

这一部分走一遍张量主线:创建张量、算、读回主机。PyTorch 的 torch.Tensor 把形状、dtype、设备全放在运行期;burn 的 Tensor<D, K> 把秩 D 和种类 K(Float / Int / Bool)放在类型上,dtype 和设备留在运行期。于是有一类错误从运行期挪到了编译期(秩写错),另一类行为换了默认值(dtype 跟设备、归约保留维度),还有几处要自己多写一步(广播前补维、跨 dtype 运算前 cast)。

每页都是同一个任务的两份程序,数字从实测输出里贴。burn 内部怎么实现张量,见 burn 卷的张量。

  1. 创建与形状:torch.tensor 看值定 dtype,burn 看类型定种类;秩写错是编译错误,数据形状和秩对不上、0 维张量是运行期 panic;reshape 的 -1 两边一样,0 不一样;try_to_vec 不做 dtype 转换。
  2. dtype 与设备:默认 dtype 属于设备(Flex 上 Int 是 I32),configure 只能一次;没有类型提升,F32 + F64 在后端 panic,Int + 0.5 静默截断;设备两边都是运行期的值,to_device 不改 dtype。
  3. 归约与广播:sum_dim / mean_dim / argmax 永远保留维度,全局 sum / mean 返回 [1];广播规则相同,但秩要先用 unsqueeze 对齐;64×1000 的 f32 归约两边差 8.58e-6。
  4. 整数运算:整数除法和取余的取整方向和 PyTorch 的 //、% 对不对得上;I32 求和溢出。
  5. 切片与索引:a[:, 1:3] 对 slice 和 s!;越界、负下标、布尔掩码两边各怎么处理。
flowchart TB
  data["主机数据"] -->|"from_data"| t["Tensor D K"]
  dev["Device 设置"] -.->|"默认 dtype"| t
  t -->|"运算 归约 广播"| t2["结果 Tensor"]
  t2 -->|"into_data"| host["主机 Vec"]
  rank["秩写错"] -.->|编译期| ce["编译错误"]
  shape["形状 dtype 不符"] -.->|运行期| pn["panic"]

💬 关联讨论

发起讨论
加载中...