张量(Tensor)是深度学习的核心数据结构。Born 的张量系统有一个独特的设计:泛型 + 后端参数。
Tensor[T, B] 的设计
type Tensor[T DType, B Backend] struct {
shape Shape // [2, 3, 4]
strides Strides // [12, 4, 1]
dtype DType // f32, f64, i32
data RawTensor // 底层字节缓冲区
backend B // CPU 或 WebGPU
}
T 是数据类型,B 是后端类型。编译期就能捕获这种错误:
a := tensor.Zeros[float32](shape, cpuBackend)
b := tensor.Zeros[float64](shape, cpuBackend)
c := a.Add(b) // 编译错误:类型不匹配
RawTensor:物理张量
RawTensor 是 Born 内部的物理张量表示,操作原始字节,不携带类型信息。它的核心职责:
- 内存分配(通过
BufferPool复用) - 引用计数(Copy-on-Write)
- 设备同步(CPU ↔ GPU 数据传输)
type RawTensor struct {
buffer *Buffer // 内存缓冲区
shape Shape
strides Strides
refCount int32 // 引用计数
}
广播(Broadcasting)
a := tensor.Ones[float32](tensor.Shape{3, 1}, backend) // [3, 1]
b := tensor.Ones[float32](tensor.Shape{1, 4}, backend) // [1, 4]
c := a.Add(b) // [3, 4]
Broadcasting 规则与 NumPy 一致:从右向左比较形状,长度相等或其中一个为 1 时可以广播。
内存管理策略
| 策略 | 说明 | 场景 |
|---|---|---|
| BufferPool | 对象池复用 | 频繁创建/销毁的张量 |
| Copy-on-Write | 写时复制 | 切片、转置等共享内存操作 |
| Persist/Unpersist | 显式持久化 | 模型参数标记为持久化 |
设备同步
WebGPU 后端的张量数据默认在 GPU 上。当你调用 .Data() 读取到 CPU 时,Born 自动处理同步:
// 在 GPU 上创建
x := tensor.Randn[float32](tensor.Shape{1000, 1000}, webgpuBackend)
// 隐式同步:从 GPU 读取到 CPU
data := x.Data() // 自动 await GPU 命令队列
📘 《Born》连载技术书,第 4/22 章。
登录后可参与表态
讨论回复
加载中...
正在加载回复...
正在加载回复...
推荐
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
领取 2000万 Tokens
通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力