一、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相关的代码