deepspeed chat RLHF个人笔记(待完成)

一、linux配置

# 新的linux配置:
1. 查看linux版本
uname -a
2. linux装软件
    ubuntu:
        安装软件:sudo apt install 软件名
        更新软件源:sudo apt update
        升级已安装的软件:sudo apt upgrade

3. ubuntu 查看终端类型
    printenv | grep TERM
3. 安装 c++编译器
sudo apt-get update
sudo apt-get install build-essential

4. 安装 git 
sudo apt install 软件名

5.安装 git-lfs
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install

7. screen 开启滚动
echo 'termcapinfo xterm* ti@:te@' >> ~/.screenrc

8. 安装 netstat
sudo apt-get install net-tools
netstat -tuln | grep 29500  ---- 查端口

sudo apt install lsof


================================ 遇到 Ninja 错误, bash 运行没有问题, vscode 调试出错
pip install Ninja
sudo apt-get install ninja-build

===================== 线上机器root pip安装包后的 cuda cudnn ,有可能存在的环境变量问题 ==

# 1) 当前虚拟环境的 cuda是否成功
#     nvcc --version
# -bash: nvcc: command not found  说明没有成功,但是包我们已经下载了,需要手动指定环境变量命令.如果输出显示nvcc命令无法被识别或者找不到,那就意味着CUDA尚未安装或者环境变量PATH尚未正确设置。因此,nvcc --version命令提供了一种直接而简单的方式来验证CUDA是否安装成功,并检查其版本号。这对于确保与您的GPU和深度学习框架兼容非常有用。

# =====> 可能得原因,安装包的时候没有加入 --user ,导致包安装到了其他目录中了,没有添加到环境变量中

# 然后遇到问题:

# WARNING: The script cpuinfo is installed in '/root/.local/bin' which is not on PATH.
#   Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. 等等

#   ====> 手动添加'/root/.local/bin' 到环境变量到 PATH中,使用 .bashrc文件, 
#   按照后 source ~/.bashrc
#   export PATH="/root/.local/bin:$PATH" 这个一定要加载原机器默认的路径前面

#   添加后用 echo $PATH 查看是否正确


终极解决方案: 在 root 目录下 重新安装一个miniconda 并添加虚拟环境
然后初始化环境:
官方命令: https://docs.anaconda.com/free/miniconda/#quick-command-line-install

conda init
source ~/.bashrc
echo $PATH

验证一下: which conda

如果还不行手动安装: CUDA
linux安装cuda和pytorch方法: https://zhuanlan.zhihu.com/p/669440078
https://developer.nvidia.com/cuda-toolkit-archive
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-12.2/lib64
export PATH=$PATH:/usr/local/cuda-12.2/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-12.2/
测试:  nvcc --version

========================= linux 安装 https://mirrors.aliyun.com/nvidia-cuda/ubuntu2204/x86_64/?spm=a2c6h.25603864.0.0.4fbf4dcexHEMJS

二、 pip conda 相关

# pip 环境镜像
pip install numpy==1.19.2 -i https://pypi.mirrors.ustc.edu.cn/simple/

#conda 命令
#删除掉从不使用的packages
#Remove unused packages from writable package caches.
conda clean -p
#删除掉tar包
conda clean -t
#Remove index cache, lock files, unused cache packages,and tarballs.
conda clean -a
 
#删除虚拟环境
conda remove -n my_py_env --all
 
#创建虚拟环境
conda create -n env_name python=3.9
 
#conda 安装本地 tar
conda install --use-local <your-pkg-name>
 
#创建新环境并复制旧环境(用于测试)
conda create --name 新环境名 --clone 旧环境名
 
pip cache purge # 这个命令会清除所有缓存,包括已下载但未安装的软件包和已安装但未被使用的缓存。

三、git lfs

注意:GIT_LFS_SKIP_SMUDGE=1 git clone 会忽略大文件,需要注意的是如果一些Tokenizer相关的文件超过了 M的单位,也可能会被git 忽略,导致Tokenizer加载失败,因此git lfs除了下载模型文件以外,还要下载Tokenizer中较大的文件,当然,其他的大文件也要额外下载​​​​​​​ 

# 模型
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/facebook/opt-350m
cd opt-350m
git lfs pull --include="*.bin"
cd ..

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/facebook/opt-125m
cd opt-125m
git lfs pull --include="*.bin"
cd ..

四、总结

修改官方的代码:
1. dataset load 代码修改,官方会强制线上加载

2. opt tokenizer 默认无法分词 <|endoftext|>, 需要添加特殊的 <|endoftext|>, 官方的参数默认不打开
官方:
parser.add_argument(
        "--add_eot_token",
        action='store_true',
        help="Add <|endoftext|> as additional special token to tokenizer")

上面这个参数在 1/2/3阶段,均需要打开,为了保证 tokenizer 可以准确的分词 <|endoftext|> ,也就是说bash后需要加上 --add_eot_token

3. def save_hf_format() 这个函数中保存 tokenizer的信息只保存了 vocab, 没有保存特殊token
官方:
tokenizer.save_vocabulary(output_dir)
修改为:
tokenizer.save_pretrained(output_dir)

4. 阶段3生成经验数据的时候 generate 可否加入 eos_id 和 topk/topp/温度系数/长度重复度惩罚来扩大搜索

5. 混合引擎开始似乎出现了bug, 是否可以解决, 网传混合引擎开启后会使生成经验数据出现大量重复的字
    这个问题貌似现版本的deepspeed chat已经解决了, 有待验证


deepchat gpt 项目跑下来效果不是很好, 可以该进的地方有:

1. 可以使用更加强大的基座模型
2.SFT阶段可以选用更多更高质量的数据,SFT可以多训练几轮,需要让model具有基本的识别特殊字符<|endoftext|> 与 eos 的能力, 
  因为二阶段三阶段的奖励分值都是用<|endoftext|>的logits充当的, 一阶段需要模型可以充分更新<|endoftext|>与eos的embedding
  最后说明一点, rm/actor/crite 都是初始化为1阶段的模型

  思考: 是否可以不将pad_id == eos_id, 保留第一个eos的符号参与RM模型和三阶段优势函数的loss计算, 
        模型更能区分<|endoftext|> 与 eos_id (<|endoftext|>是奖励,eos_id是句尾结束符号)

3.RM的排序数据可以适当做一次清洗,筛除模棱两可的chosen与reject, RM没有做SFT微调, RM需要使用一阶段微调的模型
4.没有加入无监督数据,导致模型跑偏了,actor生成的文本很短,且有重复
5.超参数的设定,无监督数据的权重等
6.actor模型在采集经验数据时,官方默认的是greedy decode, 是否可以添加EOS/长度/重复度惩罚, topk/topp/温度系数采样, 提升经验数据的质量, 减少短样本的生成
7.deepspeed chat默认三阶段actor采集数据官方的代码会强制使用非pad_token_id外所有的token都计算, 
  是否可以根据experience中的anwser第一个命中了eos_toen_id的索引, 需要将后面的单词全部mask掉????
8. reward 模型输出的方差较大,模型难收敛,可以试试reward截断,reward scaling, 详见知乎

参考见: 知乎

================================== 随着训练, actor生成了短文本,重复token的情况 =====================
RM模型最后一层存在一层线性层用于计算奖励值,而actor没有,而且RM与actor初始化的模型也不一样,两者直观上看似乎没有什么直接关联的地方, 随着训练的进行,actor生成的序列在RM模型最后一个时刻的logits会越来越高,而actor最后一层没有线性层转换,可能并非和RM一样出现某些logits很大,在概率采样后更倾向生成短数据, 而对于actor训练后期出现推理样本越来越短或者出现重复token的情况, 下面有几个猜想可以解决的思路:
1. 加大SFT actor 模型的规模, 大力出奇迹,毕竟很多论文都证明了大模型会出现井喷式的智能
2. RM的acc是否达标, RM这个"教练"如果比较差的话,在它的监督下的actor想来也不会太好
    可以尝试清洗RM的数据,去除模棱两可的chosen reject对, 使用参数冻结 分组学习率
3. actor训练后期出现推理样本越来越短或者出现重复token是actor学习跑偏的宏观体现, 尝试加大actor旧策略与SFT KL散度的β参数, 增加ptx无监督预训练数据, 加大ptx无监督loss的权重λ
4. actor经验采集时,将简单的 greedy decode 修改 beam search do_sample 温度系数 长度惩罚 重复惩罚 等方式增加采样数据的多样性, 提高生成质量
5. actor推理效果越来越好, RM的reward将不断增大, RM模型的输出的方差较大, 而 critic 基于 MSE 拟合returns的难度会越来越大, critic loss 很难收敛, 甚至出现发散的情况, 可以考虑对reward值做reward scalar, 去除较大的方差, 降低MSE拟合难度

--------
上面5点的回答:
用更高质量模型和收敛问题这类就比较没什么争议了,
但从更深角度来看,一方面可能是模型学的是没被设计者留意的漏洞,类似于奖励误解,比如可能它刚好从偏好数据里发现了“说多错多”这件事,也就是在偏好设计上可能不小心设计成了“好回复”都是较短的,这类问题在设计偏好数据的时候比较难发现
是可以加ptx的,ptx就是防止RLHF训废的一个缓解手段
第5点提到的问题其实就是引入KL散度惩罚的原因之一,即使actor先行学好了也能通过惩罚让actor做更多其他探索,
另外关于critic输出值的问题,前段有人提出来把输出头损失从MSE换成分类交叉熵鲁棒性会更强,可能会更适合多变环境
 
但实际成因复杂,总的来说我觉得最直接的还是多扩充下偏好数据,防止模型误解之类的

--------
那些超参是没有经验值可考的,不同数据不同训练程度的模型需求的都不一样,只能烧时间反复运行来调
如果发现是初期生成的经验数据并不短,RLHF持续训练的过程中才变短的话,那尝试加入PTX项一起训呢,缓和下RLHF的影响

五、get requirements.txt

pip list --format=freeze > requirement_new.txt

六、prompt

你是一位精通python代码的程序员,尤其擅长人工智能相关的项目,请遵循我的指令完成相应的任务。
指令:对给定的代码逐行添加详细的中文注释并解析其中的技术及使用的原因。
任务要求:
* 需采用逐行注释的方式,将注释逐行穿插至代码中,必要时可以一行注释一行代码,具体可以参照"注释参考示例"。
* 禁止对原代码进行修改。
* 代码注释需对初学者十分友好,丰富详细的解释其中函数/参数/变量/核心代码等使用了哪些技术,使用这些技术的原因,具体解决了哪些问题。在这个过程中,你可能需要联系上下文代码,分析它们的架构。
* 代码注释勿简化,具体可以参照"注释参考示例"。若因篇幅原因无法完成整个对话也不要简化注释,可以通过和我多次会话解决篇幅问题。
输出格式:罗列技术/参数要点时,用1,2,3,4等序号使得结果更加清晰可读。
注释参考示例:
# DS Config
ds_config = get_train_ds_config(
    # 12. offload 参数指示是否启用 CPU Offload,将一些张量从 GPU 卸载到 CPU 以节省 GPU 内存。
    offload=self.args.offload,
    # 13. dtype 参数指定张量的数据类型,例如 torch.float16 用于混合精度训练。
    dtype=self.args.dtype,
    # 14. actor_zero_stage 参数指定了 DeepSpeed 的 ZeRO 优化阶段,用于控制模型参数的分片和优化策略。
    #     0/1/2/3 表示不同的优化策略,3 是最高级别的优化,可以支持训练更大的模型。
    stage=self.args.actor_zero_stage,
    # 15. enable_hybrid_engine 参数指示是否启用 DeepSpeed 的混合引擎,将部分计算卸载到 CPU 以节省 GPU 内存。
    enable_hybrid_engine=self.args.enable_hybrid_engine,
    # 16. inference_tp_size 参数指定推理时张量并行的大小,用于控制计算和内存使用。
    inference_tp_size=self.args.inference_tp_size,
    # 17. release_inference_cache 参数指示是否在推理时释放一些缓存,以节省内存。
    release_inference_cache=self.args.release_inference_cache,
    # 18. pin_parameters 参数指示是否将模型参数固定在内存中,以提高性能。
    pin_parameters=(not self.args.unpin_actor_parameters),
    # 19. tp_gather_partition_size 参数用于控制张量并行时的分区大小,影响计算和内存使用。
    tp_gather_partition_size=self.args.tp_gather_partition_size,
    # 20. max_out_tokens 参数指定生成序列的最大长度,用于限制内存使用。
    max_out_tokens=self.args.max_prompt_seq_len + self.args.max_answer_seq_len,
    # 21. enable_tensorboard 参数指示是否启用 TensorBoard 可视化,用于监控训练过程。
    enable_tensorboard=self.args.enable_tensorboard,
    # 22. enable_mixed_precision_lora 参数指示是否启用混合精度训练和 LoRA (Low-Rank Adaptation) 技术。
    #     LoRA 是一种用于微调大型预训练语言模型的技术,它通过引入低秩投影来修改模型权重,从而显著降低所需的参数数量。
    enable_mixed_precision_lora=self.args.enable_mixed_precision_lora,
    # 23. tensorboard_path 参数指定 TensorBoard 日志保存路径。
    tb_path=self.args.tensorboard_path,
    # 24. tb_name 参数指定 TensorBoard 运行的名称。
    tb_name="step3_actor")
# 25. train_micro_batch_size_per_gpu 参数指定每个 GPU 的微批次大小,用于控制内存使用和计算效率。
ds_config[
    'train_micro_batch_size_per_gpu'] = self.args.per_device_training_batch_size
#TODO(jeff): we should probably set grad accumlation steps here as well for clarity
# 26. train_batch_size 参数指定总的批次大小,通过乘以 GPU 数量和梯度累积步数计算得到。
ds_config[
    'train_batch_size'] = self.args.per_device_training_batch_size * torch.distributed.get_world_size(
    ) * self.args.gradient_accumulation_steps_actor

代码:
这是一段与LongQLora相关的代码

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

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

相关文章

使用Redis位图实现12306分段购票

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 很多编程语言都有位运算符,Java语言也不例外。在Java语言中,提供了7种位…

通信原理QPSK OQPSK MSK 信道编码 GMSK

通信原理 通信QPSKOQPSKMSK信道编码GMSK需要的联系qq&#xff1a;2329738917 通信 QPSK OQPSK MSK 信道编码 GMSK 需要的联系qq&#xff1a;2329738917

小黑开始了芙蓉路岔气恰巧看到芙蓉脱单,假期东方时尚的学车生活,跟尚香骑车去北大微电子学院,在雪天考科目二的leetcode之旅: 43. 字符串相乘

小黑代码1:暴力转换 class Solution:def multiply(self, num1: str, num2: str) -> str:num1 int(num1)num2 int(num2)return str(num1 * num2)小黑代码2:转化为多位数x一位数 class Solution:def multiply(self, num1: str, num2: str) -> str:# 定义多位数x一位数的…

Github简单入门教程

文章目录 使用前提查看项目内容查看项目介绍打包下载项目查看项目作者项目搜索复制项目分支项目创建向项目中添加文件对项目进行评论 使用前提 想要使用Github&#xff0c;首先需要学会科学上网&#xff0c;不然用国内的网在正规情况下是无法访问Github滴~ 查看项目内容 打开…

解决错误LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to

react native pod第三方包或者git clone的时候遇到 OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443两种解决方案 方法一 修改计算机网络配置 由于使用 IPv6 的原因&#xff0c;可能会导致这一问题的出现 系统在解析hostname时使用了ipv6 可以配…

联合体类型

结构体我们已经介绍在 自定义类型&#xff1a;结构体 中&#xff0c;今天我们来介绍另一种 自定义类型&#xff1a;联合体 目录 1.联合体的声明 2.联合体的特点 3.联合体大小的计算 4.联合体的应用 5.联合体的一个练习 1.联合体的声明 联合体与结构体类似&#xff0c;它也…

webpack练习之手写loader

手写一个style-loader来把样式文件插入head里面&#xff0c;准备工作 vue webpack就自己弄了&#xff0c;webpack的一些配置也自己配置好 一、创建index.css文件 .box{width: 100px;height: 100px;background-color: red; }然后在vue的main.js文件中引入它 二、创建自定义l…

深度学习知识【CSPNet网络详解】

CSPNet的贡献 1.增强了CNN的学习能力&#xff0c;能够在轻量化的同时保持准确性。 2.降低计算瓶颈。 3.降低内存成本。 CSPNet介绍 在神经网络推理过程中计算量过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中&#xff0c…

2024水业大会|水会|水务投资与EOD模式论坛

论坛召集人&#xff1a;邹权 上海大学研究员 丁贞玉 生态环境部环境规划院研究员(拟请) EOD模式&#xff1a;生态环境导向的开发模式 《生态环保金融支持项目储备库入库指南&#xff08;试行&#xff09;》文件精神与上述逻辑并不完全一致。《指南》提出&#xff0c;EOD模…

阿里云服务器 -- 为网站配置域名

思考&#xff1a;小云已经成功的通过云服务器ECS完成了网站的架设和测试工作&#xff0c;那么是否可以让他的网站直接对外提供服务&#xff1f; 小云&#xff1a;我已经成功的通过云服务器ECS完成了网站的架设和测试&#xff0c;那么是不是就可以正式对所有用户开放我的网站了…

MySql实战--行锁功过:怎么减少行锁对性能的影响

在上一篇文章中&#xff0c;我跟你介绍了MySQL的全局锁和表级锁&#xff0c;今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁&#xff0c;比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁&#xf…

国产半导体公司

1、移远通信---通信模组 物联网解决方案供应商&#xff0c;可提供完备的IoT产品和服务&#xff0c;涵盖蜂窝模组(5G/4G/3G/2G/LPWA)、车载前装模组、智能模组&#xff08;5G/4G/边缘计算&#xff09;、短距离通信模组(Wi-Fi&BT)、GNSS定位模组、卫星通信模组、天线等硬件产…

发送请求- header配置

请求头里是客户端的要求&#xff0c;把你的诉求告诉服务端&#xff0c;服务端按照你的要求返回数据 &#xff0c; 请求header需要严格全配置&#xff0c;把请求header全部传入&#xff0c;不能频繁访问&#xff0c;让后端知道它是正常请求 一般只配置User-Agent和Content Typ…

如何备份和恢复微信、企业微信的数据文件

备份和恢复微信、企业微信的数据文件&#xff0c;特别是聊天记录和微盘中的文件&#xff0c;可以通过以下方式进行&#xff1a; 备份微信个人版数据&#xff1a; 聊天记录备份&#xff1a; 目前微信客户端自身并不直接支持导出聊天记录至电脑查看&#xff0c;但可以通过手机微…

Clip Converter - 视频在线下载方法

Clip Converter - 视频在线下载方法 1. Video URL to Download2. Continue3. StartReferences YT to MP4 & MP3 Converter! https://www.clipconverter.cc/ Clip Converter is a free online media conversion application, which allows you to reocord, convert and do…

Go语言学习Day3:数据类型、运算符与流程控制

名人说&#xff1a;莫愁千里路&#xff0c;自有到来风。 ——钱珝 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据类型①布尔类型②整型③浮点型④string⑤类型转换 2、运算符①算术运算符②逻辑运算符③关…

FPGA内部资源介绍(1)-逻辑资源块

近期有许多小伙伴私信小编&#xff0c;希望小编出一些FPGA基础知识&#xff0c;能对FPGA有初步的认识。小编立马奋笔疾书&#xff0c;熬夜整理了一些学习FPGA必备的基础知识&#xff0c;双手呈上~~&#xff0c;每天一个干货&#xff0c;一星期带你入门FPGA&#xff01; 敲黑板…

如何查询电脑是否被锁定了IP地址?锁定IP会出现什么问题?

前言 电脑刚到手的时候&#xff0c;基本上是通过路由器DHCP进行IP分配的。路由器DHCP分配IP给电脑的好处是网络不会出现IP冲突&#xff0c;网络能正常使用。 有些电脑可能在DHCP自动获取IP时出现错误&#xff0c;所以小伙伴就会通过手动设置IP让电脑可以正常上网。 这样的操…

springboot企业级抽奖项目业务四(缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…

扫描电子显微镜如何对焦

扫描电子显微镜&#xff08;SEM&#xff09;的对焦过程是确保获得清晰、高分辨率图像的关键步骤。与传统光学显微镜相比&#xff0c;SEM使用电子束来照射样品&#xff0c;并通过检测样品发射的二次电子或背散射电子来生成图像。因此&#xff0c;对焦方法和原理也有所不同。以下…
最新文章