优化器
一、什么是优化器
用于优化模型的参数。当前向计算完成后,根据loss获得参数的梯度后,优化器就是如何利用梯度来更新和计算模型的网络参数,使得在后期计算中能够让模型的损失最小化。优化器通过不断更新模型参数来拟合训练数据,从而使得在新数据上表现良好。
优化器不计算梯度,它只是梯度的更新者,它决定了以什么样的形式更新参数。
二、优化器算法
1、梯度下降法
一、什么是优化器
用于优化模型的参数。当前向计算完成后,根据loss获得参数的梯度后,优化器就是如何利用梯度来更新和计算模型的网络参数,使得在后期计算中能够让模型的损失最小化。优化器通过不断更新模型参数来拟合训练数据,从而使得在新数据上表现良好。
优化器不计算梯度,它只是梯度的更新者,它决定了以什么样的形式更新参数。
二、优化器算法
1、梯度下降法
整体比较简单,可以参考:我下面的二、pycharm中运行/调试deepspeed分布式训练
关键步骤为:
软链接distributed文件
通过对调用分布式的命令分析,我们首先需要找到torch.distributed.launch这个文件,并将它软链接到我们的Pycharm项目目录下。为什么使用软链接而不是直接复制呢?因为软链接不会变更文件的路径,从而使得launch.py文件可以不做任何改动的情况下去import它需要的包。
在Ubuntu中,通过以下命令创建软链接
ln -s /yourpython/lib/python3.6/site-packages/torch/distributed/ /yourprogram/
以上命令没有直接链接launch.py而是它的父目录distributed,是因为这样比较容易知道launch.py是一个软链接,不与项目中的其他文件混淆。
设置Pycharm运行参数
打开Pycharm,依次点击Run->Edit Configurations 进入参数配置界面
只需要配置Script path为launch.py路径;Parameters为launch.py运行参数,参考命令行调用的方法,设置如下。
--nproc_per_node=4
tools/train.py --cfg xxx.yaml
通过以上步骤就可以在Pycharm中运行分布式训练了。不过,如果是在调试模型最好还是修改一下trian.py文件,通过单GPU方式调试,并不是说分布式模式不能调试,仅仅是因为在单GPU方式下,对于数据流更好把控,减少调试时间
我用的是2020.1
(1)首先服务器上需要配好对应的环境,并且保留代码一份,以及对应的模型,用conda配好虚拟环境
(2)本地只需要拷贝对应的代码和数据,不用拷贝模型
(3)代码,我主要是复现大语言模型的预训练,https://github.com/hiyouga/LLaMA-Factory,其他代码同理
最主要的启动脚本,其他代码也是同理,主要是使用deepspeed启动就行。
pretarin.sh
deepspeed --master_port=9901 src/train_bash.py \
--deepspeed ./ds_config.json \
--stage pt \
--do_train \
--model_name_or_path ../Yi-34B \
--dataset input_test \
--finetuning_type full \
--lora_target q_proj,v_proj \
--output_dir Yi-34B_output_test \
--overwrite_cache \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--logging_steps 5 \
--save_steps 300 \
--learning_rate 5e-5 \
--num_train_epochs 1.0 \
--preprocessing_num_workers 20 \
--plot_loss \
--bf16
将虚拟环境的deepspeed安装包压缩,拷贝到本地。
我服务器虚拟环境的位置:/home/centos/anaconda3/envs/factory/lib/python3.10/site-packages/deepspeed/,
将deepspeed包压缩为zip包,拷贝到本地项目目录:D:codeLLaMA-Factory 然后解压,D:codeLLaMA-Factorydeepspeed
查看:vim /home/centos/anaconda3/envs/factory/bin/deepspeed 可以知道实际使用的hideepspeed.launcher.runner
文件,
通过对调用分布式的命令分析,我们首先需要找到deepspeed.launcher.runner这个文件,并将它软链接到我们的Pycharm项目目录下。为什么使用软链接而不是直接复制呢?因为软链接不会变更文件的路径,从而使得runner.py文件可以不做任何改动的情况下去import它需要的包。
在centos中,通过以下命令创建软链接
ln -s /home/centos/anaconda3/envs/factory/lib/python3.10/site-packages/deepspeed/ /data/liulei/cpt/LLaMA-Factory/
如果要删除软连接用:
unlink /data/liulei/cpt/LLaMA-Factorydeepspeed/
配置本地代码用远程服务器的python解析器:
(1)从set里面进去
(2)add新的解析器
(3)通过ssh 添加远程的,写Ip和用户名,后面输入密码
(4)从远程服务器中选择解析器、远程服务器代码和本地代码进行映射
(5)配置debug执行入口命令
(6)脚本、参数、python解析器、代码路径配置
入口脚本:D:codeLLaMA-Factorydeepspeedlauncherrunner.py
参数:注意这里面的脚步,就是上面的pretrain.sh启动脚本,但是需要把deepspeed命令去掉,并且把反斜杠去掉,且要把默认参数True 补充完整。
--master_port=9901 src/train_bash.py --deepspeed ./ds_config.json --stage pt --do_train True --model_name_or_path ../Yi-34B-Chat --dataset input_test --finetuning_type full --lora_target q_proj,v_proj --output_dir path_to_pt_checkp1 --overwrite_cache True --per_device_train_batch_size 1 --gradient_accumulation_steps 1 --lr_scheduler_type cosine --logging_steps 1 --save_steps 100 --learning_rate 5e-5 --num_train_epochs 1.0 --plot_loss True --fp16
完成就可以进行debug了,然后你就发现在实际运行的时候还是会报错的。需要几个地方的代码修改。
(7)本地对应代码修改
问题:1
ssh://centos@18:22/home/centos/anaconda3/envs/factory/bin/python -u /home/centos/.pycharm_helpers/pydev/pydevd.py --multiproc --qt-support=auto --client 0.0.0.0 --port 34567 --file /data/liulei/cpt/LLaMA-Factory/deepspeed/launcher/runner.py --master_port=9901 src/train_bash.py --deepspeed ./ds_config.json --stage pt --do_train True --model_name_or_path ../Yi-34B-Chat --dataset input_test --finetuning_type full --lora_target q_proj,v_proj --output_dir path_to_pt_checkp1 --overwrite_cache True --per_device_train_batch_size 1 --gradient_accumulation_steps 1 --lr_scheduler_type cosine --logging_steps 1 --save_steps 100 --learning_rate 5e-5 --num_train_epochs 1.0 --plot_loss True --fp16
/home/centos/.pycharm_helpers/pydev/pydevd.py:1806: DeprecationWarning: currentThread() is deprecated, use current_thread() instead
dummy_thread = threading.currentThread()
pydev debugger: process 232478 is connecting
Connected to pydev debugger (build 201.6668.115)
Traceback (most recent call last):
File "/home/centos/.pycharm_helpers/pydev/pydevd.py", line 1438, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
File "/home/centos/.pycharm_helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "/data/liulei/cpt/LLaMA-Factory/deepspeed/launcher/runner.py", line 24, in <module>
from .multinode_runner import PDSHRunner, OpenMPIRunner, MVAPICHRunner, SlurmRunner, MPICHRunner, IMPIRunner
ImportError: attempted relative import with no known parent package
解决办法:
将远程文件/data/liulei/cpt/LLaMA-Factory/deepspeed/launcher/runner.py 映射的本地文件D:\code\LLaMA-Factory\deepspeed\launcher\runner.py进行修改
修改前:
from .multinode_runner import PDSHRunner, OpenMPIRunner, MVAPICHRunner, SlurmRunner, MPICHRunner, IMPIRunner
from .constants import PDSH_LAUNCHER, OPENMPI_LAUNCHER, MVAPICH_LAUNCHER, SLURM_LAUNCHER, MPICH_LAUNCHER, IMPI_LAUNCHER
from ..constants import TORCH_DISTRIBUTED_DEFAULT_PORT
from ..nebula.constants import NEBULA_EXPORT_ENVS
from ..utils import logger
from ..autotuning import Autotuner
from deepspeed.accelerator import get_accelerator
修改后:
from deepspeed.launcher.multinode_runner import PDSHRunner, OpenMPIRunner, MVAPICHRunner, SlurmRunner, MPICHRunner, IMPIRunner
from deepspeed.launcher.constants import PDSH_LAUNCHER, OPENMPI_LAUNCHER, MVAPICH_LAUNCHER, SLURM_LAUNCHER, MPICH_LAUNCHER, IMPI_LAUNCHER
from deepspeed.constants import TORCH_DISTRIBUTED_DEFAULT_PORT
from deepspeed.nebula.constants import NEBULA_EXPORT_ENVS
from deepspeed.utils import logger
from deepspeed.autotuning import Autotuner
然后重新运行debug,就发现本地可以愉快的跑起来了。
大型语言模型的培训依赖于海量且多样化的数据资源。构建高品质的训练数据集对于这些模型的开发至关重要。尽管对于大规模模型的理论分析和解释仍不甚完善,且对于训练所用语言数据的精确说明和界定尚显不足,但广泛的研究共识认为,训练数据对于提升语言模型的性能和样本的泛化能力起着核心作用。为了增强模型的泛化和适应性,预训练数据应包含多种形式,如互联网内容、书籍、学术论文、百科全书以及社交媒体内容等,并且应尽可能广泛地覆盖不同的领域、语种、文化背景和不同的观点。
大型语言模型所需的数据资源大致可分为通用数据和专业数据两类。通用数据涵盖了网页内容、图书、新闻报道、对话文本等,以其庞大的规模、多样性和易于获取的特点,为大型语言模型提供了基础的语言建模和泛化能力。而专业数据则包括多语言资料、科学文献、编程代码以及特定领域的专有信息等,这些在预训练阶段的引入,能够显著增强大型语言模型解决特定任务的能力。
通用数据在大型语言模型训练数据中占比通常非常高,主要包括网页、书籍、对话文本等类型,为大型语言模型提供了大规模且多样的训练数据。
(1)网页数据
(Webpages)是通用数据中数量最大的一类。随着互联网的大规模普及,人们通过网站、论坛、博客、APP等各种类型网站和应用,创造了海量的数据。
维基百科:高质量。
(2)书籍
作为训练材料,语言模型得以接触丰富的词汇资源,这极大地提升了模型对不同领域和主题的理解力。与其他类型的语料相比,书籍通常提供了更加丰富和完整的长篇文本材料,它们是获取长文本书面语数据的主要,有时甚至是唯一来源。书籍中的完整句子和段落结构使得语言模型能够学习并理解上下文之间的联系,这对于模型把握句子的复杂结构、逻辑关系以及语义连贯性至关重要。书籍内容包括了多种文体和风格,如小说、科学论著、历史文献等,训练时使用这些书籍数据能够让模型掌握多样的写作风格和表达技巧,从而增强模型在处理各类文本时的能力。
专业数据虽在大型通用语言模型的训练数据中所占比重不高,但其对于提升模型在特定下游任务中的表现具有关键性作用。专业数据的类型繁多,而目前大型语言模型训练中常用的专业数据主要包括以下三类:
(1). 多语言数据:
这类数据包含了除英语以外的多种语言资源,它们对于构建能够理解和生成多语言文本的模型至关重要。多语言数据的引入能够帮助模型更好地服务于全球用户,提高其跨语言的交流能力和文化敏感性。
(2). 科学文本:
科学文本包括但不限于学术论文、研究报告、专业期刊等,这些文本通常包含专业术语和复杂概念。通过训练模型理解和处理这类文本,可以显著提高模型在学术研究和专业知识领域的应用能力。
(3). 代码:
代码数据涉及各种编程语言的源代码,这对于开发能够理解和生成代码的模型尤为重要。模型通过学习代码的结构和语法,可以在软件开发、代码审查和自动编程等任务中发挥作用。
书籍按照格式一般分为:word、pdf(扫描版、非扫描版)、txt、网页。
txt和网页版本相对好处理。word版本也好处理一些,占比最多和最难处理的就是pdf格式,pdf格式书籍又分为扫描版、非扫描版,扫描版需要做ocr识别,准确率会更低,本文不在研究。主要研究非扫描版的pdf格式。
较好的预训练数据要求:
1.知识层次划分
同一个知识点要在一个样本中,不要切分,例如可以按照章节切分
2.段落之间要有换行符\n (有争议)
多个段落拼接要有换行符"\n",
3.同一段落不要切分
pdf识别成txt过程中,容易将一个段落切分成多个,需要识别拼接。
4.模型支持长度
如果模型预处理最长能处理4096个token,那么样本的长度在4096以内。
5.特殊符号处理
将\t 、URL、图片链接、表格、表情符号、流程图等和语义无关的都清洗掉
比较好的样本如下:
{"text": "气管旁淋巴结,再进入颈深下淋巴结。\n第一章喉的应用解剖学及生理学313\n颈深淋\n结上群/1酱它百订日喉前淋巴结\n颈总动脉\n颈内静脉气管前淋巴结\n(1)喉矢状断面内面观(2)喉的淋巴
引流\n八、喉的神经\n喉的神经为喉上神经和喉返神经(图5-1-11、图5-1-12),两者均为迷走神经分支。\n结状神经节喉上神经喉上神经喉上神经喉上神经喉内支喉上神经喉外支迷走神经迷走押经迷走神经迷走神经图5-1-11喉的神经(正面观)图5-1-12喉的神经(背面观)\n喉上神经(superior laryngeal nerve)是迷走神经在结状神经节发出的分支,下行约2cm到达舌骨大角平面处分为内、外两>支。内支主要司感觉,外支主要司运动。内支和喉上动、静脉伴行穿过舌甲膜,分布于声门上区黏膜,司该处黏膜的感觉。外支在胸骨甲状肌肌健附着的深面行走,支配环甲肌的运动。\n喉返神经(recurrent laryngeal nerve)是喉的主要运动神经。迷走神经进入胸腔后在胸腔上部分出喉返神经,左侧喉返神经绕主动脉弓,右侧绕锁骨下动脉,继而上行,走行于甲状腺深面的气管食管沟处发出数个分支支配颈段气管食管>黏膜,主干在环甲关节后方入喉。支配除环甲肌以外的喉内各肌的运动,但亦有一些感觉支司声门下区黏膜的感觉。\n九、小儿喉部的解剖特点\n小儿喉部的解剖与成入有不同之处,其主要特点是:\\朴岔1.小儿
喉部黏膜下组织较疏松,炎症时容易发生肿胀。小儿喉腔尤其是声门区又特别窄小,所以小儿发生急性喉炎时容易发生喉阻塞,引起呼吸困难。2.小儿喉的位置较成入高,3个月的婴儿,其环状软骨弓相当于第4颈椎下缘水平;6岁时降至第5颈椎。3.小儿喉软骨尚未钙化,较成人软,行小儿甲状软骨和环状软骨触诊时,其感觉不如成人的明显。\n第二节喉的生理学\n喉的生理功能主要有四个方面,现分述如下:\n1呼吸功>
能喉是呼吸通道的重要组成部分,喉的声门裂又是呼吸通道最狭窄处,正常情况下中枢神经系统通过喉神经控制声带运动,调节声门裂的大小。当人们运动时声带外展,声门裂变大,以便吸入更多的空气。反之,
安静时声门裂变小,吸入的空气减少。\n2.发声功能喉是发声器官,人发声的主要部位是声带。喉如何发出各种声音的机制较为复杂,目前多数学者认为:发声时中枢神经系统通过喉神经使声带内收,再通过从肺呼出气体使声带发生振动形成基频,经咽、口、鼻腔的共鸣,舌、软腮、齿、颊、唇的构音器官运动,从而发出各种不同声音和言语。\n关于声带如何振动有不同的学说,目前比较公认的是“体-被覆层(body-cover)"黏膜波学说。其主要原理是:声带内收,声门闭合;声韧带和其下肌层构成声带体部(body),起固定声带、保持声带一定张力、维持声门一定阻力的作用。由于声门下气流的压力作用,冲开上皮层和浅固有>层构成的被覆层(cover),引起声门开放,由千伯努利效应(Bernoulli effect)声带靠拢声门又闭合,再开放、再闭合反复进行。被覆层在开放关闭时形成的黏膜波可经动态喉镜观察到。由于声带有规律地关闭产>生一系列振动,造成空气疏密相间的波动,形成声门波,即形成人发音的基频。\n3.保护下呼吸道功能喉对下呼吸道有保护作用。吞咽时,喉被上提,会厌向后下盖住喉入口,形成保护下呼吸道的第一道防线。两
侧室带内收向中线靠拢,形成第二道防线。声带也内收、声门闭合,形成第三道防线。在进食时,这三道防线同时关闭,食管口开放,食物经梨状窝进入食管。偶有食物或分泌物进入喉腔或下呼吸道,则会引起剧烈的反射性咳嗽,将其咳出。\n4.屏气功能当机体在完成某些生理功能时,例如咳嗽、排便、分挽、举重物等时,需增加胸腔和腹腔内的压力,此时声带内收、声门紧闭,这就是通常所说的屏气。屏气多随吸气之
后,此时呼吸暂停,胸腔固定,脯肌下移,胸廓肌肉和腹肌收缩。声门紧闭时间随需要而定,咳嗽时声门紧闭时间短,排便、分挽、举重物等时声门紧闭时间较长。"}