增量预训练网络安全大模型的一次尝试

一、背景

探索使用网络安全知识,对开源基模型进行增强,评估是否能使基模型在网络安全领域表现出更好地专业度。

项目基于云起无垠SecGPT开源项目,在hugeface开源数据集的基础上,增加了自有预训练数据,进行增量预训练。

参考链接:

https://github.com/Clouditera/secgpt

回到顶部(go to top)

二、数据集准备

0x1:预训练数据

预训练使用“安全书籍,安全知识库,安全论文,安全社区文章,漏洞库”等等安全内容,

https://huggingface.co/datasets/w8ay/security-paper-datasets?row=0 

笔者增加了一份自己近10年以内的博客文章,

将上述格式转换为hugeface兼容格式,huggingface支持以下4种数据格式的数据集,只需要在load的时候设定格式就好了。

Data formatLoading scriptExample
CSV & TSVcsvload_dataset("csv", data_files="my_file.csv")
Text filestextload_dataset("text", data_files="my_file.txt")
JSON & JSON Linesjsonload_dataset("json", data_files="my_file.jsonl")
Pickled DataFramespandasload_dataset("pandas", data_files="my_dataframe.pkl")

复制代码

# -- coding: utf-8 --**

import json
import pandas as pd
from datasets import load_dataset
from datasets import Dataset, concatenate_datasets


def prepare_cnblogs_data():
    with open("./posts.json", 'r', encoding='utf-8') as file:
        data = json.load(file)

    original_json = list()
    for item in data:
        original_json.append(
            {
                "text": item['Body'],
                "category": "cnblogs"
            }
        )

    print(original_json[0])
    print(original_json[1])

    with open("./posts_hugeface_dataset.json", 'w', encoding='utf-8') as file:
        # 将列表保存到文件,注意使用ensure_ascii=False参数
        json.dump(original_json, file, ensure_ascii=False, indent=2)

    df = pd.DataFrame(original_json)
    df.to_pickle('./posts_hugeface_dataset.pkl')


def prepare_security_paper_dataset():
    dataset = load_dataset("w8ay/security-paper-datasets")
    df_train = dataset['train'].to_pandas()
    df_train.to_pickle('security_paper_dataset.pkl')


def merge_dataset():
    security_paper_dataset = load_dataset("pandas", data_files="security_paper_dataset.pkl")['train'].to_pandas()
    posts_hugeface_dataset = load_dataset("pandas", data_files="posts_hugeface_dataset.pkl")['train'].to_pandas()
    dataset_part1 = Dataset.from_pandas(security_paper_dataset)
    dataset_part2 = Dataset.from_pandas(posts_hugeface_dataset)
    combined_dataset = concatenate_datasets([dataset_part1, dataset_part2])

    print(combined_dataset[0])
    print(len(combined_dataset))

    combined_dataset_df = pd.DataFrame(combined_dataset)
    combined_dataset_df.to_pickle('security_paper_and_posts_dataset.pickle')


if __name__ == "__main__":
    prepare_security_paper_dataset()
    prepare_cnblogs_data()
    merge_dataset()

复制代码

这里将多份本地pickle语料数据合并,

0x2:有监督数据

通过构造各类有监督安全能力数据集,让模型能了解各类安全指令。 

有监督SFT数据集构建有几个注意点:

  • 思维链:基于思维链方式构造有监督数据集让模型能够根据问题逐步推理到最终答案,展现推理过程。
  • 为防止灾难性遗忘,有监督数据喂通用能力数据+安全能力数据,数据占比5:1

参考链接:

复制代码

https://huggingface.co/w8ay/secgpt
https://huggingface.co/datasets/TigerResearch/tigerbot-zhihu-zh-10k
https://zhuanlan.zhihu.com/p/548355568
https://zhuanlan.zhihu.com/p/564816807
https://zhuanlan.zhihu.com/p/554678463
https://huggingface.co/datasets/w8ay/security-paper-datasets
https://huggingface.co/w8ay/secgpt

复制代码

回到顶部(go to top)

三、模型训练

0x1:基模型选择

基于Baichuan-13B (无道德限制,较好中文支持,显存资源占用小)

Baichuan-13B 是由百川智能继 Baichuan-7B 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均取得同尺寸最好的效果。本次发布包含有预训练 (Baichuan-13B-Base) 和对齐 (Baichuan-13B-Chat) 两个版本。Baichuan-13B 有如下几个特点:

  • 更大尺寸、更多数据:Baichuan-13B 在 Baichuan-7B 的基础上进一步扩大参数量到 130 亿,并且在高质量的语料上训练了 1.4 万亿 tokens,超过 LLaMA-13B 40%,是当前开源 13B 尺寸下训练数据量最多的模型。支持中英双语,使用 ALiBi 位置编码,上下文窗口长度为 4096。
  • 同时开源预训练和对齐模型:预训练模型是适用开发者的“基座”,而广大普通用户对有对话功能的对齐模型具有更强的需求。因此本次开源我们同时发布了对齐模型(Baichuan-13B-Chat),具有很强的对话能力,开箱即用,几行代码即可简单的部署。
  • 更高效的推理:为了支持更广大用户的使用,我们本次同时开源了 int8 和 int4 的量化版本,相对非量化版本在几乎没有效果损失的情况下大大降低了部署的机器资源门槛,可以部署在如 Nvidia 3090 这样的消费级显卡上。
  • 开源免费可商用:Baichuan-13B 不仅对学术研究完全开放,开发者也仅需邮件申请并获得官方商用许可后,即可以免费商用。

0x2:运行环境

V100 * 8 

0x3:增量预训练 

启动训练,

python train.py

参考链接:

https://huggingface.co/baichuan-inc/Baichuan-13B-Base
https://huggingface.co/w8ay/secgpt
https://zhuanlan.zhihu.com/p/554678463

回到顶部(go to top)

四、效果展示

模型结果的输出存在随机性,模型可能知道答案,但是随机后改变输出,这时候可以增加提示词让模型注意力集中。

也可以做RLHF强化学习,让模型输出多个结果,选择正确的那个,提升模型效果。

0x1:用百川原生基模型

python3 webdemo.py --base_model baichuan-inc/Baichuan-13B-Base

0x2:用增量预训练后的模型

python3 webdemo.py --base_model baichuan-inc/Baichuan-13B-Base --lora /data_vdb1/secgpt/output/epoch-0-step-2400

http://47.236.142.150:7860/

参考链接:

https://github.com/Clouditera/secgpt

回到顶部(go to top)

五、后续思考

  • 增量预训练成本(时间/金钱)相对较大,8张V100跑了1天多才能跑完一个epoch,但ROI并不明显,没有经过RLHF的增量预训练基模型,在笔者自己的安全领域问题基线集中,提升并不比SFT的效果要好。目前来看,在特定安全领域问题内,SFT依然暂时是一个最佳实践。
  • 安全领域数据集的定义是一个值得思考的问题,安全博客、安全论坛、安全论文这些语料就足够了吗?安全中特定领域任务的解决往往需要很多隐式知识以及隐式推理的能力,这些隐式知识所需要的数据在目前往往是十分稀缺和匮乏的,如果想要通过预训练得到一个能够解决大部分领域任务的基模型,数据工作可能十分任重道远。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始配置 Docker 网络:快速掌握各类型网络的设置与使用场景

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 Docker 网络类型概述🎯 Bridge 驱动🎯 Host 驱动🎯 None 驱动🎯 Overlay 驱动🎯 Macvlan 驱动🔖 获取网络接口📝 总结:选择合适的网络类型⚓️ 相关链接 ⚓️📖 介绍 📖 如果你曾经在搭建…

C语言(一维数组练习)

键盘录入一组数列&#xff0c;利用冒泡排序将数据由大到小排序 #include <stdio.h>int main(int argc,char *argv[]) {int i,j,tmep;int arr[10];printf("请输入10个测试整数&#xff1a;\n");int lensizeof(arr)/sizeof(arr[0]);for(i0;i<len;i){scanf(&q…

PostgreSQL实现透视表查询

PostgreSQL 8.3版本发布时&#xff0c;引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数&#xff0c;用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…

消息中间件-Kafka1-实现原理

消息中间件-Kafka 一、kafka简介 1、概念 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以…

protobuf实现Hbase数据压缩

目录 前置HBase数据压缩效果获取数据(反序列化) 前置 安装说明 使用说明 HBaseDDL和DML操作 HBase数据压缩 问题 在上文的datain中原文 每次写入数据会写入4个单元格的内容&#xff0c;现在希望能对其进行筛减&#xff0c;合并成1格&#xff0c;减少存储空间&#xff08;序列…

爬虫专栏第二篇:Requests 库实战:从基础 GET 到 POST 登录全攻略

简介&#xff1a;本文聚焦 Requests 库的强大功能与应用实战。首先介绍其安装步骤及版本选择要点&#xff0c;随后深入讲解 GET 请求&#xff0c;以百度页面为例&#xff0c;展示如何发起基本 GET 请求、巧妙添加 headers 与参数以精准搜索&#xff0c;以及正确设置 encoding 避…

【Leetcode】19. 删除链表的第N个节点

【Leetcode】19. 删除链表的第N个节点 1. 题目介绍2. 方法一&#xff1a;计算链表长度逻辑流程:代码复杂度分析 1. 题目介绍 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,…

工业齐套管理虚拟现实仿真模拟软件

工业齐套管理虚拟现实仿真模拟软件是与法国最大的汽车制造商合作开发的一款虚拟现实仿真模拟软件&#xff0c;借助身临其境的虚拟现实环境&#xff0c;无需停止生产线&#xff0c;即可模拟仓库和提货区域。 工业齐套管理虚拟现实仿真模拟软件不仅适用于汽车工业&#xff0c;安全…

【嘟嘟早教卡】 小程序源码分享带后台管理

【嘟嘟早教卡】是专门为 3-6 岁婴幼儿童学习普通话、英语研发的早教启蒙认知识字的小程序 小程序由 Taro 及 Tailwind CSS 构建而成&#xff0c;后台管理使用 Laravel 及 Tailwind CSS 想法源于小时候玩的认知卡片&#xff0c;基本大部分家庭都买过认知卡片&#xff0c;我按照…

概率论相关知识随记

作为基础知识的补充&#xff0c;随学随记&#xff0c;方便以后查阅。 概率论相关知识随记 期望&#xff08;Expectation&#xff09;期望的定义离散型随机变量的期望示例&#xff1a;掷骰子的期望 连续型随机变量的期望示例&#xff1a;均匀分布的期望 期望的性质线性性质期望的…

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码&#xff1a;管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码&#xff0c;涵盖了常见的 HTTP 状态码分类&#xff0c;如信息响应&#xff08;1xx&#xff09;、成功状态&#xff08;2xx&#xff09;、客户端错误&a…

oracle 11g中如何快速设置表分区的自动增加

在很多业务系统中&#xff0c;一些大表一般通过分区表的形式来实现数据的分离管理&#xff0c;进而加快数据查询的速度。分区表运维管理的时候&#xff0c;由于人为操作容易忘记添加分区&#xff0c;导致业务数据写入报错。所以我们一般通过配置脚本或者利用oracle内置功能实现…

机器学习深入剖析逻辑回归算法

一、引言 在机器学习领域&#xff0c;逻辑回归&#xff08;Logistic Regression&#xff09;是一种极为经典且应用广泛的算法。尽管其名称带有 “回归” 二字&#xff0c;但实际上它主要用于解决分类问题&#xff0c;并且在众多领域都发挥着重要作用。接下来&#xff0c;让我们…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

6.824/6.5840 Lab 1: MapReduce

宁静的夏天 天空中繁星点点 心里头有些思念 思念着你的脸 ——宁夏 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 由于这个lab整体难度实在不小&#xff0c;故考虑再三还是决定留下代码仅供参考 6.824的强度早有耳闻&#xff0c;我终于也是到了挑战这座高…

解决Jupyter Notebook无法转化为Pdf的问题(基于Typora非常实用)

笔者在完成各项作业和做笔记时&#xff0c;经常用到jupyter notebook&#xff1b;其因为可以同时运行python并提供格式化的数字公式的输入方式&#xff0c;得到了广大用户的喜爱。 当我们想要将.ipynb文件导出为pdf时&#xff0c;有两种常用方法。 1.Ctrlp 2.通过File ->…

[在线实验]-RabbitMQ镜像的下载与部署

镜像下载 docker的rabbitmq镜像资源-CSDN文库 加载镜像 docker load --input rabbitmq.tar 给镜像打标签 这里发现镜像名为none&#xff0c;需要给镜像重命名下 docker tag [镜像id] [新镜像名称]:[新镜像标签] docker tag ebaf409ffbe2 rabbitmq:management 运行镜像…

【JVM】—G1 GC日志详解

G1 GC日志详解 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 文章目录 G1 GC日志详解1 G1 GC周期2 G1日…

ADBC 查询语法介绍:EXECUTE_QUERY

可使用 CL_SQL_STATEMENT 类的以下实例方法执行查询&#xff1a; EXECUTE_QUERY 该方法有一个字符串类型的强制输入参数 STATEMENT&#xff0c;必须向其传递语法正确的 SELECT 语句。与 DML 语句一样&#xff0c;SET_PARAM 方法可用于将 ABAP 数据对象绑定到占位符。 查询结…

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…