内容提要
PG Tensor Dancer项目旨在为PostgreSQL提供张量计算能力。文章讨论了使用BLAS库在PG中实现矩阵乘法的方法。它解释了将向量乘以矩阵的关键代码,并介绍了一种自定义的矩阵数据结构。文章还提到了项目结构,并提供了构建和安装项目的说明。最后提到了PG Tensor Dancer的未来。
延伸解读
为什么用 bytea 存储矩阵
文章选择用 PostgreSQL 的 bytea 类型存储矩阵,而不是定义新的矩阵类型。这样做的好处是跳过在数据库中定义新类型的工作,直接利用现有的 bytea 存储二进制数据。对于 256*4096 的 float32 矩阵,大小约 4.2 MB,PostgreSQL 完全能够处理。这降低了原型阶段的复杂度,但代价是失去了数据库层面的类型检查和约束。
自定义 Matrix 结构的设计取舍
Matrix 结构包含 magic、type、rows、columns 和 data 字段。magic 字段预留但未使用,type 遵循 ggml 的类型枚举,data 是 void* 并通过类型宏转换。这种设计简化了从二进制内存块加载矩阵的过程,但 load_matrix 函数跳过了错误检查,且直接使用 memcpy 复制数据。在原型阶段可以接受,但生产环境需要补充校验和错误处理。
安装与使用的实际步骤
要使用 vector_extra 插件,需先安装 pgvector 并创建扩展。然后通过 meson 构建项目,生成动态链接库,手动复制到 PostgreSQL 的库目录和扩展目录,最后在数据库中执行 create extension vector_extra。文章提到目前没有安装脚本,需要手工复制文件,这增加了部署的复杂性,适合开发测试环境。
矩阵乘法的 SQL 调用方式
文章展示了如何通过 SQL 调用 pgv_mulmv 函数进行矩阵乘法。使用 CTE 从 matrix 表获取矩阵数据,从 items 表获取向量,然后调用函数计算结果。这种集成方式使得可以在数据库内直接进行降维计算,避免数据导出。但函数参数为 bytea 和 vector,需要确保数据格式正确,且结果向量维度与矩阵行数一致。
Q&A
PG Tensor Dancer项目的主要目标是什么?
PG Tensor Dancer项目旨在为PostgreSQL提供张量计算能力,支持矩阵乘法。
如何在PG中实现矩阵乘法?
使用BLAS库中的cblas_sgemm函数,可以简化参数列表来实现矩阵乘法。
自定义的矩阵数据结构包含哪些字段?
自定义的矩阵数据结构包含magic、type、rows、columns和data字段。
如何从二进制内存块加载矩阵数据?
通过load_matrix函数,可以从二进制内存块加载矩阵数据,简化矩阵类型的定义。
在PostgreSQL中如何创建用于矩阵计算的数据库?
需要创建一个名为pgv的数据库,并包含items和matrix两个表。
安装vector_extra插件前需要做什么?
在安装vector_extra之前,需要先安装pgvector,并在数据库中创建扩展。