Lion:闭源大语言模型的对抗性蒸馏

通过调整 70k 指令跟踪数据,Lion (7B) 可以实现 ChatGPT 95% 的能力!

消息

我们目前正在致力于训练更大尺寸的版本(如果可行的话,13B、33B 和 65B)。感谢您的耐心等待。

  • **[2023年6月10日]**我们发布了微调过程中解决OOM的说明,请在训练过程中查看。
  • **[2023年5月26日]**我们发布了模型权重。看看7B型号!
  • **[2023年5月25日]**我们发布了在线演示,在这里尝试我们的模型!
  • **[2023年5月23日]**我们发布了训练和推理的代码。

内容

文章目录

        • 通过调整 70k 指令跟踪数据,Lion (7B) 可以实现 ChatGPT 95% 的能力!
    • 消息
    • 内容
    • 概述
    • 在线演示
    • 恢复Lion权重
    • 推理
    • 培训流程
      • 1、模仿阶段
        • 1.1 获取老师对Train Pool的回复
        • 1.2 根据教师对训练池的反应对学生进行指令调整
      • 2. 歧视阶段
        • 2.1 获取老师对Cache Pool的响应
        • 2.2 获取学生对缓存池的回答
        • 2.3 要求裁判根据老师和学生的回答质量输出两个分数
        • 2.4 区分硬指令和简单指令
      • 3. 生成阶段
        • 3.1 生成新的硬指令
        • 3.2 生成新的简单指令
    • 评估
      • 使用 GPT-4 自动评估
      • 具有对齐标准的人类评估
    • 引文
    • 免责声明

概述

img

我们的对抗性蒸馏框架的高级概述,其中我们基于高级闭源 LLM 制作了一个紧凑的学生 LLM,该 LLM 服务于三个角色:教师**、裁判员生成器**。从左到右,迭代分为三个阶段:

  1. 模仿阶段*,*使学生的反应与教师的反应保持一致;
  2. 识别硬样本的辨别阶段;
  3. 生成阶段,用于生成新的硬样本*,*以升级向学生模型提出的挑战。

在线演示

我们将提供最新型号供您尽可能长时间地试用。您可以向 Lion 提出一些问题,我们很高兴听到您的反馈!

演示链接(72小时后过期,因此我们会定期更新链接)

img

由于训练数据是英文指令示例,因此您最好用英文提问。然而,我们发现Lion在一定程度上也能理解其他语言的指令。请看下面的案例:

img

恢复Lion权重

我们将 Lion 权重发布为增量权重,以符合 LLaMA 模型许可证。

  • Lion-7B(增量配重)

您可以将我们的增量添加到原始 LLaMA 权重中以获得 Lion 权重。指示:

  1. 按照此处的说明获取 Huggingface 格式的原始 LLaMA 权重
  2. 请从Hugging Face下载我们的 Delta 模型
  3. 使用以下脚本通过应用我们的增量来获取 Lion 权重:
python src/weight_diff.py recover --path_raw huggyllama/llama-7b --path_diff YuxinJiang/Lion --path_tuned <path_to_store_recovered_weights>

推理

对于Lion的推理和训练,请首先安装要求:

pip install -r requirements.txt

我们为Lion提供了解码脚本,它读取输入文件并为每个样本生成相应的响应,最后将它们合并到输出文件中。它可以在具有 16GB GPU 的单台机器上运行。

python src/lion_inference.py \--model_dir <path_to_hf_converted_lion_ckpt_and_tokenizer> \--data_dir <path_to_input_json_file> \--output_dir <path_to_output_json_file> \--num_gpus 1

培训流程

下面显示了我们的对抗性蒸馏框架的一种迭代。

image-20230703131839438

1、模仿阶段

1.1 获取老师对Train Pool的回复

python src/chatgpt_inference.py \-q <path_to_json_file_for_the_Train_Pool> \-o <path_to_chatgpt_inference_for_the_Train_Pool> \--api_key <your_openai_api_key>

1.2 根据教师对训练池的反应对学生进行指令调整

微调是在具有 8 个 A100 80G GPU 的机器上进行的。

torchrun --nproc_per_node=8 --master_port=<your_random_port> src/train.py \--model_name_or_path <path_to_hf_converted_ckpt_and_tokenizer> \--data_path <path_to_chatgpt_inference_for_the_Train_Pool> \--bf16 True \--output_dir result \--num_train_epochs 3 \--model_max_length 1024 \--per_device_train_batch_size 2 \--per_device_eval_batch_size 2 \--gradient_accumulation_steps 8 \--evaluation_strategy "no" \--save_strategy "steps" \--save_steps 500 \--save_total_limit 1 \--learning_rate 2e-5 \--weight_decay 0. \--warmup_ratio 0.03 \--lr_scheduler_type "cosine" \--logging_steps 1 \--fsdp "full_shard auto_wrap" \--fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \--tf32 True

解决 OOM

简单来说,微调 7B 模型需要大约 7 x 8 x 2 = 112 GB 的 VRAM。上面给出的命令启用参数分片,因此任何 GPU 上都不会存储冗余模型副本。如果您想进一步减少内存占用,可以选择以下一些选项:

  • 打开 FSDP 的 CPU 卸载--fsdp "full_shard auto_wrap offload"。这可以节省 VRAM,但代价是运行时间更长。

  • 根据我们的经验,DeepSpeed stage-3(带卸载)有时比带卸载的 FSDP 具有更高的内存效率。以下是使用具有 8 个 GPU 的 DeepSpeed stage-3 以及参数和优化器卸载的示例:

    deepspeed src/train_deepspeed.py \--model_name_or_path <path_to_hf_converted_ckpt_and_tokenizer> \--data_path <path_to_chatgpt_inference_for_the_Train_Pool> \--output_dir result \--num_train_epochs 3 \--model_max_length 1024 \--per_device_train_batch_size 16 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 1 \--evaluation_strategy "no" \--save_strategy "steps" \--save_steps 600 \--save_total_limit 1 \--learning_rate 2e-5 \--warmup_ratio 0.03 \--logging_steps 1 \--lr_scheduler_type "cosine" \--report_to "tensorboard" \--gradient_checkpointing True \--deepspeed srcs/configs/deepspeed_config.json \--fp16 True
    
    • DeepSpeed 库还提供了一些有用的函数来估计内存使用情况。
  • LoRA微调查询、键和值嵌入头的低秩切片。这可以将总内存占用量从 112GB 减少到大约 7x4=28GB。我们将来可能会发布对此的重新实现,但目前peft代码库可能是一个有用的资源。

2. 歧视阶段

2.1 获取老师对Cache Pool的响应

python src/chatgpt_inference.py \-q <path_to_json_file_for_the_Cache_Pool> \-o <path_to_chatgpt_inference_for_the_Cache_Pool> \--api_key <your_openai_api_key>

2.2 获取学生对缓存池的回答

python src/lion_inference.py \--model_dir <path_to_hf_converted_lion_ckpt_and_tokenizer> \--data_dir <path_to_json_file_for_the_Cache_Pool> \--output_dir <path_to_lion_inference_for_the_Cache_Pool> \--num_gpus 8

2.3 要求裁判根据老师和学生的回答质量输出两个分数

python src/chatgpt_referee.py \-a <path_to_chatgpt_inference_for_the_Cache_Pool> <path_to_lion_inference_for_the_Cache_Pool> \-o <path_to_output_review_file> \--api_key <your_openai_api_key>

2.4 区分硬指令和简单指令

python src/discrimination.py \--review_path <path_to_output_review_file> \--chatgpt_inference_path <path_to_chatgpt_inference_for_the_Cache_Pool> \--lion_inference_path <path_to_lion_inference_for_the_Cache_Pool> \--hard_save_path <path_to_identified_hard_instructions> \--easy_save_path <path_to_identified_easy_instructions>

3. 生成阶段

3.1 生成新的硬指令

python -m src/generate_hard_instruction generate_instruction_following_data \--seed_tasks_path <path_to_identified_hard_instructions> \--output_dir <path_to_generated_hard_instructions> \--num_instructions_to_generate 3000 \--api_key <your_openai_api_key>

3.2 生成新的简单指令

python -m src/generate_easy_instruction generate_instruction_following_data \--seed_tasks_path <path_to_identified_easy_instructions> \--output_dir <path_to_generated_easy_instructions> \--num_instructions_to_generate 3000 \--api_key <your_openai_api_key>

评估

使用 GPT-4 自动评估

我们利用 GPT-4 自动评估两个模型在 80 个未见过的Vicuna 指令上的响应质量(分数从 1 到 10)。ChatGPT 已被选为参考模型来评估不同法学硕士的相对能力。相对分数以百分比形式报告,计算为分数总和的比率。

相对整体响应质量

img

不同任务类别的相对响应质量

img

具有对齐标准的人类评估

我们采用 Askel 等人提出的对齐标准。(2021),其中定义如果助理具有乐于助人、诚实和无害(HHH)的特点,则被认为是一致的。我们对 252 个UserOriented-Instructions进行了人工评估。为了估计获胜率,我们比较了下面每对模型之间获胜、平局和失败的频率。

img

引文

如果您使用此存储库中的代码,请引用我们的论文。

@article{DBLP:journals/corr/abs-2305-12870,author       = {Yuxin Jiang andChunkit Chan andMingyang Chen andWei Wang},title        = {Lion: Adversarial Distillation of Closed-Source Large Language Model},journal      = {CoRR},volume       = {abs/2305.12870},year         = {2023},url          = {https://doi.org/10.48550/arXiv.2305.12870},doi          = {10.48550/arXiv.2305.12870},eprinttype    = {arXiv},eprint       = {2305.12870},timestamp    = {Fri, 26 May 2023 11:29:33 +0200},biburl       = {https://dblp.org/rec/journals/corr/abs-2305-12870.bib},bibsource    = {dblp computer science bibliography, https://dblp.org}
}

免责声明

Xiv},
eprint = {2305.12870},
timestamp = {Fri, 26 May 2023 11:29:33 +0200},
biburl = {https://dblp.org/rec/journals/corr/abs-2305-12870.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}


## 免责声明⚠️Lion**仅供研究使用**并获得许可。**严禁**商业用途。任何版本的Lion生成的内容都会受到随机性等不可控变量的影响,因此本项目无法保证输出的准确性。本项目对模型输出的内容不承担任何法律责任,也不承担因使用相关资源和输出结果而产生的任何损失。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

83、基于STM32单片机录音机录音笔语音存储回放TF卡TFT屏系统设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

【Linux】Haproxy搭建Web群集

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Haproxy搭建Web群集 一、Haproxy概述1.常见的Web集群调度器2.Haproxy应用分析3.Haproxy常用调度算法4.Haproxy的主要特性5.LVS、Nginx、Haproxy的区别 二、Haproxy搭建Web群集…

数据结构与算法_堆排序

堆排序&#xff0c;即利用堆的思想来进行排序。要实现堆排序&#xff0c;首先要建堆&#xff0c;建堆又分为建大堆和建小堆&#xff1b;然后再一步一步地删除堆的元素来进行排序。 目录 一、堆排序的时间复杂度 二、建堆 向上调整 向下调整 三、堆排序 四、代码实现 向…

【案例实战】高并发业务的多级缓存架构一致性解决方案

我们在高并发的项目中基本上都离不开缓存&#xff0c;那么既然引入缓存&#xff0c;那就会有一个缓存与数据库数据一致性的问题。 首先&#xff0c;我们先来看看高并发项目里面Redis常见的三种缓存读写模式。 Cache Aside 读写分离模式&#xff0c;是最常见的Redis缓存模式&a…

react菜鸟教程学习笔记

目录 第一个react实例 react安装 对react机制最直观的理解 如果你第一次用npm 关于初始化package.json的问题 使用 create-react-app 快速构建 React 开发环境 项目目录结构 修改一下代码执行源头APP.js React元素渲染 将元素渲染到DOM中 更新元素渲染 关于vue的更新…

golang 结构体struct转map实践

1、反射 type sign struct { Name string json:"name,omitempty" Age int json:"age,omitempty" } var s sign s.Name "csdn" s.Age 18 //方式1 反射 var data make(map[string]interface{}) t : reflect.TypeOf(s) v : …

记录使用ffmpeg把mp4转换成m3u8

背景:公司需要上一些视频资源,平均每一个都在600m以上,经过考虑以后采取视频分片以后上传到oss上进行加速播放的流程.这里记录一下使用ffmpeg进行转换视频格式的过程中的一些命令. 准备工作: 下载ffmpeg到本地,以及配置ffmpeg到环境变量中,这里就不多说了. 使用的时候先打开…

【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

代码自取【14.key_tree_pinctrl_gpios_interrupt】&#xff1a; https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数&#xff1a; 1. of_gpio_count&#xff08;获得GPIO的数量&#xff09; static inline int of_gpio_count(struct device_node *np)2. kzalloc…

用四元数表示旋转

旋转四元数以及如何使用它们 英文版参考链接:Quaternions 四元数&#xff0c;它是一种用四个实数表示复数的推广&#xff0c;可以用来高效地表示和计算三维空间中的旋转1。 旋转四元数的性质: All rotation quaternions must be unit quaternions.|q| 1For rotation quater…

Elasticsearch:使用 Redis 让 Elasticsearch 更快

Elasticsearch 是一个强大的搜索引擎&#xff0c;可让你快速轻松地搜索大量数据。但是&#xff0c;随着数据量的增长&#xff0c;响应时间可能会变慢&#xff0c;尤其是对于复杂的查询。在本文中&#xff0c;我们将探讨如何使用 Redis 来加快 Elasticsearch 搜索响应时间。 Re…

台阶仪是干什么的?在太阳能光伏行业能测什么?

太阳能作为应用广、无排放、无噪声的环保能源&#xff0c;在近些年迎来快速发展&#xff0c;而在各类型的太阳能电池及太阳能充电系统中&#xff0c;多会镀一层透明的ITO导电薄膜&#xff0c;其镀膜厚度对电池片的导电性能有着非常重要的影响&#xff0c;因而需要对镀膜厚度进行…

C/C++指针内存泄漏的原因详解及如何避免与问题定位

作为C/C开发人员&#xff0c;内存泄漏是最容易遇到的问题之一&#xff0c;这是由C/C语言的特性引起的。C/C语言与其他语言不同&#xff0c;需要开发者去申请和释放内存&#xff0c;即需要开发者去管理内存&#xff0c;如果内存使用不当&#xff0c;就容易造成段错误(segment fa…