在 PG 中支持矩阵乘法

在 PG 中支持矩阵乘法

💡 原文中文,约5600字,阅读约需14分钟。
📝

内容提要

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,并在数据库中创建扩展。

🏷️

标签

➡️

继续阅读