【AIGC】训练数据入库(Milvus)

news2024/11/25 21:53:07

之前的文章有写如何获取数据、如何补充数据,也有说如何对数据进行清洗、如何使用结构化数据进行训练。但好像没有说如何将训练数据“入库”。这里说的入库不是指 MySQL 数据库,而是指向量检索库 Milvus。

众所周知,人工智能多用向量数据进行训练。数据先做向量处理并入库能有效减少训练时实时转换带来的性能消耗(之前在 Autokeras 训练时是读取 MySQL 结构化数据的,每次取数后都需要通过 Embedding 先做向量处理再训练)。

至于为什么要选择 Milvus ?这跟公司技术栈有关就不详述了。

部署 Milvus

Milvus 我是采用 Docker Compose 来部署的,主要是因为网上已有现成的 docker compose 脚本“milvus-standalone-docker-compose.yml”直接下载开箱即用即可。如下图:
image.png
整个脚本唯一值得关注的就是 Minio 管理后台账号和密码(若企业部署建议不要写在脚本中,透过添加 --env-file .env 参数的方式进行传递)。接着就通过以下命令启动就好了:

docker-compose -f milvus-standalone-docker-compose.yml up -d

启动结果如下图:
image.png
不得不说的是,Milvus 的 standalone 镜像是非常消耗资源的,为了避免运行过程中出现资源不足的情况,建议在 docker compose 脚本中根据自己机器的实际情况进行资源调整。

接着就可以通过 http://127.0.0.1:9001/login 访问 Minio 的管理后台,如下图:
image.png
至于 Minio 要如何使用,这个不是本节的重点就不再叙述了。

此外,按网上说法还需要部署一个名为 attu 的服务用于管理 Milvus 数据,执行下面命令即可:

docker run -d --name=attu -p 8000:3000 -e MILVUS_URL='宿主机ip':'milvus端口' zilliz/attu:v2.2.6

服务启动后通过 http://127.0.0.1:8000/ 访问 attu 的管理后台,如下图:
image.png
至此 Milvus 部署完毕。(后面若有空会补全 Milvus 相关的知识点内容,先挖个坑…)

代码实现

下面将讲讲如何用 python 将问答数据向量化并入库的。

  1. 创建测试入口并构建基础代码
from transformers import AutoTokenizer, AutoModel
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility

# baai 模型名称与 model 实例
baai_model_name = "BAAI/bge-large-zh-v1.5"
baai_model = AutoModel.from_pretrained(baai_model_name)

...

def data_transformer_to_vetor():
    # 通过 AutoTokenizer 获取 baai 的 tokenizer 对象
    tokenizer = AutoTokenizer.from_pretrained(baai_model_name)
    # 创建 milvus 连接
    connections.connect(milvus_name, host=milvus_url, port=milvus_port)
    # 获取 milvus 中指定的数据集
    collection = find_milvus_collection()
    try:
        while True:
            # 根据条件 flag = 0 分页查询 MySQL 的问答数据
            db_data = mu.query_by_pagination(mysql_page, mysql_page_size, mysql_table_name, 'FLAG = 0')
            if db_data != '':
                db_data_json_arr = json.loads(db_data)
                vectors = []
                ids = []
                # 遍历问答数据集将“问题”和“答案”字段重新组装成一条字符串
                for db_data_json in db_data_json_arr:
                    text = f"问题:{db_data_json[1]} 答案:{db_data_json[2]}"
                    # 使用 baai 模型对字符串进行向量转换
                    vector = change_to_vetor(tokenizer, text)
                    # 将向量数据装载到一个数据集中
                    vectors.append(vector)
                    # 同时,也将 MySQL 中对应记录的 id 进行记录
                    ids.append(db_data_json[0])
                if len(vectors) > 0:
                    # 批量插入向量数据到 milvus 数据集中
                    collection.insert(data=[vectors])
                    # 更新 MySQL 对应的记录,看 flag 设置为 1,这样在下一个循环时就不会被重新筛选出来了
                    mu.update_by_ids(mysql_table_name, 'FLAG = 1', ids)
            else:
                break
    except Exception as e:
        print(f"Error: {e}")
    finally:
        # 无论成功与否都释放数据集并关闭 milvus 连接
        collection.release()
        connections.disconnect(milvus_name)
...

if __name__ == '__main__':
    data_transformer_to_vetor()

在上面的代码中提到了 find_milvus_collection 和 change_to_vetor 函数,下面让我先对 change_to_vetor 函数进行解释。

  1. change_to_vetor 函数(baai 模型转换向量数据)
def change_to_vetor(tokenizer, text):
    # 定义输入内容
    inputs = tokenizer(text, return_tensors="pt",max_length=512, padding=True, truncation=True)
    # 调用 baai_model 并以 inputs 作为入参
    outputs = baai_model(**inputs)
    # outputs 转换成向量数据返回
    return outputs.last_hidden_state.mean(dim=1).squeeze().detach().numpy()

这个 3 行代码将非常有用,它不仅存储的时候需要使用,在后面做数据取回时也需要先将字符串向量化后,再提供给 Milvus 进行数据筛选的。因此有必要独立成一个函数,方便后面使用。

  1. find_milvus_collection 函数(获取 milvus 数据集)
def find_milvus_collection():
    # 使用 utility.has_collection 来判断在 milvus 中是否存在指定的数据集
    if utility.has_collection(milvus_collection_name, using=milvus_name):
        # 如果有直接获取
        collection = Collection(milvus_collection_name, using=milvus_name)
    else:
        # 没有则需要调用 create_milvus_collection 函数创建数据集
        collection = create_milvus_collection()
    # 加载数据到内存
    collection.load()
    return collection

这个函数首先使用了 pymilvus 的 utility.has_collection 进行判断,这里需要注意的是如果 Milvus 连接是自定义的情况下,必须加上 using 参数指向自定义连接,不然系统会使用默认“default”连接并报以下错误:

pymilvus.exceptions.ConnectionNotExistException: <ConnectionNotExistException: (code=1, message=should create connection first.)>

同理,在创建数据集时也需要用 using 参数指向自定义连接。

在获取到数据集之后需要将其加载到内存里面,不然在点击 attu 的 data preview 选项卡时会看到以下错误:

Failed to search: collection not loaded[collection=448914542771864105]

需要注意的是,加载大型集合可能需要一些时间,具体取决于集合的大小和系统资源。如果不再需要对集合进行操作,建议使用 collection.release() 方法将其从内存中释放,以节省资源。

  1. create_milvus_collection 函数(创建 Milvus 数据集)
def create_milvus_collection():
    # 创建 id 字段作为主键
    id_field = FieldSchema(name="id", dtype=DataType.INT64,is_primary=True, auto_id=True)
    # 创建向量数据存储字段
    vector_field = FieldSchema(name="vector_qa", dtype=DataType.FLOAT_VECTOR, dim=milvus_dim)
    # 定义schema
    schema = CollectionSchema(fields=[id_field, vector_field], description="TCM Question and Answer Dataset", enable_dynamic_field=True)
    # 创建数据集
    collection = Collection(name=milvus_collection_name,schema=schema, using=milvus_name)
    # 给向量数据字段添加索引
    collection.create_index(field_name="vector_qa", index_params={"metric_type": "L2", "index_type": "IVF_PQ", "params": {"nlist": milvus_dim}})
    return collection

这个创建数据集的函数其实也比较好理解,就像 MySQL 的表创建一样。

需要注意的是,在网上的例子中向量字段(本例子为:vector_field)会被创建成一个维度为 768 的 FLOAT_VECTOR 类型字段,但问答数据在经过 baai 模型转换后的默认维度为 1024,在数据保存的时候就会出现以下错误:

RPC error: [batch_insert], <ParamError: (code=1, message=Collection field dim is 768, but entities field dim is 1024)>, <Time:{'RPC start': '2024-04-07 16:02:07.393036', 'RPC error': '2024-04-07 16:02:07.393106'}>
Error: <ParamError: (code=1, message=Collection field dim is 768, but entities field dim is 1024)>

这时只需要将 dim 参数从 768 改为 1024 即可(可以简单理解为 MySQL 字段内容过长,那就加大字段长度呗)。如果维度一定要保持在 768,那么可以使用 PCA 进行降维处理。

既然需要重建数据集,那么如何将已有的数据集删除呢?

除了通过代码的方式删除外,我们还可以通过 attu 界面删除,如下图:

image.png

先确认是否当前的数据集,之后在上一页的可视化界面中删除即可。

image.png
至此,所有代码都已经编写完成了。噢,还有一件事儿。我这边在启动代码时会报这个警告:

/Users/yuanzhenhui/anaconda3/envs/transformer/lib/python3.11/site-packages/torch/_utils.py:831: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly.  To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage()
  return self.fget.__get__(instance, owner)()

这个警告信息是由 PyTorch 库引发的,它提示 TypedStorage 类已经被弃用,在未来的版本中将被移除,届时只会保留 UntypedStorage 类。这个警告主要与直接使用 storage 有关。TypedStorage 和 UntypedStorage 是 PyTorch 中用于存储张量(tensor)数据的底层存储类。TypedStorage 是针对特定数据类型(如 Float、Double、Int 等)的存储,而 UntypedStorage 是一种通用的存储类型。

这个警告并不影响代码的使用,暂时忽略即可,但如果有条件的可以按照提示进行切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1580331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人民网至顶科技:《开启智能新时代:2024中国AI大模型产业发展报告发布》

3月26日&#xff0c;人民网财经研究院与至顶科技联合发布《开启智能新时代&#xff1a;2024年中国AI大模型产业发展报告》。该报告针对AI大模型产业发展背景、产业发展现状、典型案例、挑战及未来趋势等方面进行了系统全面的梳理&#xff0c;为政府部门、行业从业者以及社会公众…

渗透知识贴

文章目录 基础知识同源策略 常见web漏洞SQL注入漏洞 web中间件 基础知识 同源策略 同源策略是目前所有浏览器都实行的一种安全政策。A网页设置的 Cookie&#xff0c;B网页不能打开&#xff0c;除非这两个网页同源。所谓同源&#xff0c;是指&#xff1a;协议、端口、域名相同…

蓝桥杯刷题--RDay5

清理水域--枚举 8.清理水域 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/2413/learning/?page1&first_category_id1&second_category_id3&tags2023 小蓝有一个n m大小的矩形水域&#xff0c;小蓝将这个水域划分为n行m列&#xff0c;行数从1…

一文详解:使用HTTPS有哪些优势?

互联网发展到今天&#xff0c;HTTP协议的明文传输会让用户存在非常大的安全隐患。试想一下&#xff0c;假如你在一个HTTP协议的网站上面购物&#xff0c;你需要在页面上输入你的银行卡号和密码&#xff0c;然后你把数据提交到服务器实现购买。假如这个环节稍有不慎&#xff0c;…

ST 意法半导体人工智能(AI)X-CUBE-AI 扩展包入门指南

引言 本用户手册指导了基于 IDE 逐步构建用于 STM32 微处理器的完整人工智能&#xff08;AI&#xff09;项目&#xff0c;自动转换预训练好的神经网络&#xff08;NN&#xff09;并集成所生成的优化库。本手册还介绍了 X-CUBE-AI 扩展包&#xff0c;该扩展包与 STM32CubeMX 工具…

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量…

【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)

目录 题目描述思路及实现方式一&#xff1a;动态规划法思路代码实现Java版本C语言版本Python3版本 复杂度分析 方式二&#xff1a;中心扩展法思路代码实现Java版本C语言版本Python3版本 复杂度分析 总结相似题目 标签(题目类型)&#xff1a;回文串、动态规划 题目描述 给定一…

OpenHarmony实战:瑞芯微RK3568移植案例

本文章是基于瑞芯微RK3568芯片的DAYU200开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c;WIFI&#xff0c;BT&#xff0c;vibrato…

利用电动车进电梯检测系统识别电动车入楼行为,算法上实现的难点与方案

目前&#xff0c;我国电动自行车保有量已超过3.5亿辆。有限的充电场所难以满足日益增长的充电需求。许多人选择将电动车通过电梯带进家中充电。因此&#xff0c;火灾事故时有发生。数据显示&#xff0c;与电动车有关的起火事故占火灾总比35%。电梯空间狭小密闭&#xff0c;电动…

备战蓝桥杯(日益更新)(刷题)

备战蓝桥杯&#xff08;日益更新&#xff09;&#xff08;刷题&#xff09; 文章目录 备战蓝桥杯&#xff08;日益更新&#xff09;&#xff08;刷题&#xff09;前言&#xff1a;一、二分&#xff1a;1. acwing503 借教室&#xff1a;&#xff08;二分 差分&#xff09;2. ac…

计算机硬件组成

计算机硬件组成 基本组成核心组件连接方式与总线架构与技术特殊组件总结脑图 基本组成 CPU: 执行指令和进行数据处理内存: 存储程序和数据&#xff0c;分为RAM和ROM主板: 连接所有硬件的平台&#xff0c;传输电子信号输入设备: 如键盘、鼠标等输出设备: 如显示器、打印机等 核…

Taro框架中的H5 模板基本搭建

1.H5 模板框架的搭建 一个h5 的基本框架的搭建 基础template 阿乐/H5 Taro 的基础模板

OpenHarmony实战:轻量系统STM32F407芯片移植案例

介绍基于STM32F407IGT6芯片在拓维信息Niobe407开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。 移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、littlefs、hdf等子系统及组件的适配…

论文学习D2UNet:用于地震图像超分辨率重建的双解码器U-Net

标题&#xff1a;&#xff1a;Dual Decoder U-Net for Seismic Image Super-Resolution Reconstruction ——D2UNet&#xff1a;用于地震图像超分辨率重建的双解码器U-Net 期刊&#xff1a;IEEE Transactions on Geoscience and Remote Sensing 摘要&#xff1a;从U-Net派生…

【Linux】进程的状态(运行、阻塞、挂起)详解,揭开孤儿进程和僵尸进程的面纱,一篇文章万字讲透!!!!进程的学习②

目录 1.进程排队 时间片 时间片的分配 结构体内存对齐 偏移量补充 对齐规则 为什么会有对齐 2.操作系统学科层面对进程状态的理解 2.1进程的状态理解 ①我们说所谓的状态就是一个整型变量&#xff0c;是task_struct中的一个整型变量 ②.状态决定了接下来的动作 2.2运行状态 2.…

R语言绘图 | 散点小提琴图

原文链接&#xff1a;R语言绘图 | 散点小提琴图 本期教程 写在前面 本期的图形来自发表在Nature期刊中的文章&#xff0c;这样的基础图形在日常分析中使用频率较高。 获得本期教程数据及代码&#xff0c;后台回复关键词&#xff1a;20240405 绘图 设置路径 setwd("You…

【数据结构】顺序表的动态分配(步骤代码详解)

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

算法设计与分析实验报告c++java实现(矩阵链连乘、投资问题、完全背包问题、旅行商问题、数字三角形)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用动态规…

防火墙操作!

当小编在Linux服务器上部署好程序以后&#xff0c;但是输入URL出现下述情况&#xff0c;原来是防火墙的原因&#xff01;&#xff01; 下面是一些防火墙操作&#xff01; 为保证系统安全&#xff0c;服务器的防火墙不建议关闭&#xff01;&#xff01; 但是&#xff0c;我们可…

idea(2023.1.3)配置全局Maven环境

问题来源一&#xff1a; 1、每次在下载依赖时&#xff0c;会遇到这样的报错信息&#xff0c;报错信息如下显示&#xff1a;sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid cert&#xff1b;百度结果是&#xff1a;通常表示IntelliJ IDEA …