AI情绪鼓励师模型训练营:课时1:AI情绪鼓励师模型微调实操教学
课程地址:https://developer.aliyun.com/trainingcamp/6035e78237f7495e8976bfbaaae739df
课时1:AI情绪鼓励师模型微调实操教学
内容介绍
一、介绍model scope
二、model scope教程
一、介绍 model scope
欢迎大家来参加model scope 的夸夸机器人翻译听悟训练营。今天我将给大家介绍如何使用model scope 来创建一个属于你的夸夸机器人,首先在使用之前,需要有一个model scope 账号和阿里云的账号,如果有这两个账号之后,你可以在model scope 到CN这个网站上登录你的model scope 账号,登录好后可以看到这样一个界面
在左边我的notebook点击。如果是第一次使用notebook的话,你这里可能没有绑定过阿里云账号,所以需要在这边先绑定一下你的阿里云账号。绑定完成后,会将出现跟我一样的画面。我们使用免费时令环境来训练。所以我们是点击免费时令环境。如果你之前没有使用过的话,在这里GPU环境中,你应该有36小时的额度。我们这次将使用GPU环境来反映我们的夸夸机器人。所以我们选择方式二,点击启动这个过程。
如果是第一次启动,可能会花费2到10分钟的时间。如果之前启动过,它可能会稍微快一点,先等待一会。在GP免费的GPU环境中,有16G的显存,所以没有办法在这次教程中使用GPTthree的预训练模型来训练。我们将使用一个对显存的要求更加小的预训练模型pom2.0来训练。如果你想要训练其他更大的模型,可以在付费实例环境当中去付费购买一个有更强大算力的环境来训练你的模型。
我们的实例已经启动了,点击查看notebook。这里我们不需要下载这个tutorial,可以直接关掉,可以等它下载完成。
如果你已经在我们的训练营网站上下载了训练所需要的教程,所需要的文件应该包括三个文件,主要是decay learning day 这张图片和local minimum 这张图片,这两张图片是教程中用到的插图和夸夸dot ipad notebook 这个文件。这个文件是主要使用的文件,双击它。
ipad thon notebook 使用方法主要是在每一个代码的blog 点击左上角的运行。或者如果你是windows 电脑用control 回车,你是MAC 电脑用command 回车来运行这一单个blog。
我们这个教程总共分为四步。第一步是获得夸夸数据集,第二步是反应tone的预训练模型,第三步是尝试体验一下已经训练好的模型和第四步上传你训练好的模型到model score。
二、model scope 教程
我们首先来看一下如何使用model scope 下载。在model scope 上的数据集。这一节中,我们将从这个网址。
使用这个网址上的数据集夸夸数据集。这段代码首先是引入PYTHON 所需要的package。这一步是为了防止在教程中出现过多大量没有意义的调试的输出。所以我们捕捉了这些调试的信息,其实你也可以去掉它。接下来就是下载这个数据集,并且展示了一下这个原始数据集中前十行的数据。如果你是第一次下载,我们运行一下这个blog。
如果你是第一次下载,这个过程可能会花费更久一点的时间。
我们看一下,这是前十行的数据。由于这是没有处理过的数据,每一行数据只是一条数据,它包含了两个部分,第一部分是夸夸的问题,要去打球求表演。第二个部分是夸夸帖的回答,真棒好好打乒乓球。它有一个竖线的分隔符分开。
因为palm2.0模型它对训练的数据有要求,所以我们需要处理一下这个数据。
首先以防万一,我们有一行数据没有这个分隔符。我们在每一行的末尾也添加一个分隔符,保证它每一行可以通过分隔符分开来。接下来第二步就是根据pom 模型所需要的格式,将这一行数据拆成两行,分别为source text 和target text。来运行一下这一行,很快就运行好了。接下来我们来看一下我们处理好的数据是长什么样子的。首先是train 和evaluation 的数据集的长度。我们用来训练的这个数据集,总共有14000行。用来评估模型训练效果的总有2486行。每一行中将source text和target text拼接起来,中间用冒号分开,可以看到确实是分开了,是前十行的数据。我们跑一下。这样就已经将夸夸数据集处理成了palm2.0所需要的数据格式。
第二步我们来获取预训练的模型底座palm2.0,并且配置参数来训练它,这个模型在这个网址。
当然这一步当中你也可以使用其他模型,具体的方法可以这样找
在模型库中选择同样文本生成类的。因为夸夸是个文本生成类的任务,找到你需要的模型,你也可以搜索关键字,比如GPTthree。但GPTthree 在免费的环境中你是训练不了的。
可以找到任意模型或者是预训练生成模型。然后复制这个就是模型的标识符,damo斜杠以及模型名。
回到我们的教程,首先我们引papter的来运行一下。
接下来要配置在训练过程中迭代我们learning rate 的函数。如果有对learning rate 了解的同学可以跳过这一步,如果之前没有接触过,可以读一下这部分,你更好的了解为什么我们要这样配。
大体上我们的目的是在学习的过程当中。因为如果在最开始的时候,探索的区域不够多,很容易就会被困在一个非常局部的最优解上,没有办法去找到更加global 的一个最优解。所以在最开始的训练过程当中,我们希望探索区域更大,也就是learning 学习的范围更广。而如果在训练过了一段时间之后,在下面这张图中我们可以看到
如果你已经在这部分开始收敛了,这时候如果learning rate 还是非常大,会导致这个模型没有办法收敛,会一直在这样子左右摇摆,始终没有办法到最优解的点。这时候我们需要做的就是将learning rate的逐渐缩小,这样子每一步就不会导致这样子不停的在左右震荡,而是慢慢趋近最优解的地方。
我们采用的方法是在transformer 这篇原始论文当中使用的norm scheme。具体的方法在下面会做出进一步的解释。首先是函数的定义,你可以看到这个部分其实就是在论文当中对应的minimum 的这一步。接下来我们来画一下这个norm skin对于我们learning rate有什么影响,这个norm steam它有一个参数叫做walmart,也可以理解为热身的步数。
在这张图当中,横坐标代表的是训练的步数,越到后面意味着你训练越趋近于最优解的地方,步数越多。而纵坐标则代表learning rate的值,我们可以看到,如果你的warm up的步数等于500,那么在500之后你的learning rate才会开始逐渐下降。在500之前你的learning rate是逐渐上升的。同样当你的warm up部署成了250,那在250步之前,the learning rate是逐步上升。而到了250步以后 learning rate会开始逐步下降。这就是我们自定义的norm scheme的作用。
配置好了这个之后,我们开始一些通用的训练的参数的配置。首先是配置了刚刚说的warm up step等于500,然后配置了这次训练总共需要训练的ipod x数,也就是十五。所谓i pox,就是在我们整个数据集上训练的个数。如果在整个数据集上训练了一遍,那这个i pox就等于1。如果我们在整个数据集上训练了十遍,那这i box就等于10。在每一个i pox中,我们并不是每一条样本、每一行数据、每一行对话训练一次的,我们一般都会采用batch的方法,也就是有多行数据来训练一次。
在这里我们设置了best size等于16。举个例子,如果batch ze等于8,那总共有一千行的数据。那么在这一个i pox里面,我们总共要训练1000除以8,就等于125个batch,也就是125步。在这个learning rate这步当中,如果buy a box把它设置为false,那learning rate的更新就不是每个apple更新,而是每一步更新。也就是每个batch更新一次。所以在narm lambda中,我们设置了warm等于500,意味着在第500个batch之后,我们的learning rate就开始下降。后面的optimized就是最常见的adam的optimize,初始的learning rate是十的负3次方。当然在batch 设定当中,不希望batch 过大,因为这样会导致我们的GPU 显存装不下。每次训练,当然我们也不希望match 过小,因为这样子会导致我们训练的步数过多,训练时间过长。
后面的两步其实并不是非常重要的部署,主要是配置了这个模型大概会多久保存一下模型,多久去更新一下最优的模型。我们这边只需要等这个模型整个都训练完以后直接使用,最终结果就行,而不是使用中间的这些结果。接下来是配置模型的一些参数。
像这个就是你要指定的预训练模型的底座。就像我们刚刚所说的,在这个模型的主要界面,你点击这一步的复制,就可以复制到模型的标识符。如果你想用其他的模型可以用其他模型的这个地方值来替换这边使用的这个。像这样就是使用GPT three。好,我们回去用这个palm2.0。接下来一个是我们用的训练数据集,也就是train dataset,是我们在一当中已经配置好了的。第二个设置一下我们的evaluation dataset,也是在一中配置好。第三步work directory是要将训练过程中以及最后训练好的模型保存的位置。在这里我们配置的是这个palm2.0下划线夸夸,你也可以使用其他的在左边,你可以没有这个文件夹,它在训练过程中会自动帮你生成。
这是我们将保存所有训练当中过程的数据,以及最后的结果的位置。
下面这个就是我们刚刚配置好的上面关于训练过程当中learning rate变化的一些参数。接下来我们就可以开始train。首先name选择的是通用的text generation trainer,也就是文本生成的trainer。将刚刚的参数赋予了default arguer argus的变量,然后开始train。因为这边我已经train过了,所以我就不点了。
如果你使用我们同样的配置是15位air pods的话,花费时间大约是1.5个小时。当然你也可以将这个数量减少,使用更少的epoch来训练。如果上面每一步都是对的话,你会看到这样子的输出,他会给你看一遍所有的配置,包括一些你上面没有配置过中的默认配置。
接下来就是每一步的这个learning rate 和loss,来看一下。
这是第一个i pox的第一步,第一个air pods的第二步。因为我们总共有14000条训练数据,我们设置的batch size等于16,14000除以16等于875步,也就是875个备需要训练。所以我们每个ipod s有875个要训练,这个是learning rate。后面的是每一步要花费的时间以及最后的loss。根据我们之前所说的,我们的earning rate会在第500步的时候开始变小应用的,这边没有显示。如果你在训练的过程当中关闭了notebook也不要紧。因为它训练所有数据都会保存在我们刚刚所说的这个文件夹当中。
在这个log日志里面,像刚刚显示到200多步就关掉了,但是他其实所有每一步都是在这个log文件当中,可以看一下到500步附近的时候,是不是如我们所说的开始下降了。
这是第500步。可以看到在500步之前的时候,这个模型它训练的learning rate是在上升的4.463、4.472。到了外部的时候开始下降,开始逐渐变小了4.459。所以这是符合learning rate变化的期望的。
在差不多所有epoch 训练完之后。这个日志文件会显示这样子,最后一段结尾表示它将最后的模型存储好了。这边ipx15结束之后,它会存储这个模型。
你也可以在训练当中改变一些超参。比如warm up the steps或者说这个i pox,你可以尝试调试它们,还有learning rate 的初始值。在通过不同的套餐的组合,你可能可以获得比我们更好的模型效果。
我们所有的日志都已经保存好之后,你可以在这边。当然这个是我这边的日志的文件名,你可能会不同,取决于你跑这个的时间,来看一下各个训练过程中各个值的变化,这是learning rate的变化。我们跑一下,你可以看到差不多在500步的时候,learning rate开始下降。
下面这个是loss的变化,也就损失函数。当损失函数越大,表示我们的模型效果越不好,损失函数越小,表示我们的模型效果越好。
可以看到我们的模型是一直在收敛的,甚至我们的模型还没有完全收敛,没有完全到平的值,或者没有没有开始lost,没有开始上升。这意味着如果增加训练的epoch through,你可能可以获得这种更好的模型。在训练完成后的第三步,我们可以来尝试体验一下我们已经翻译用好的模型,首先是输入,我们尝试两个输入。今天我买了瓶洗发水,可以夸夸我吗?今天我有点沮丧,可以夸夸我吗?
我们使用的基础模型就是我们刚刚所说的这个模型。在这里因为pipeline使用的是分布式推理,需要打开一个端口,默认它的pipeline端口都是29500。为了不冲突,我们将每一个推理过程用了不同的端口,501和502。这里我们的任务是文本生成,所以用text generation 第一个推移使用的模型是我们的基础模型,也就是没有预训练没有翻译用过后的模型。第二个推理过程,我们使用的是我们自己翻译的模型,在这个地方model 你将要填文件夹中的output,这个文件夹路径这里面是你最终训练好的模型,我们来跑一下。
这一步是让系统先在后台搭建这个退役过程,他可能会浪费一点点的时间。
接下来来体验一下预训练的模型,这是没有翻译通过的,第一个参数传入的是input,第二个你可以不填是它的限制它的最大的长度。我们可以看到第一个在训练,在翻译team 之前,我们的模型其实输出的是一些看上去不那么make sense 的一些文本。我们再来试一下,经过我们翻译过后,这两条对话分别会输出什么。
今天我买了瓶洗发水,可以夸夸我吗?洗发水是个很有趣的事情。今天我有点沮丧,可以夸夸我们努力生活的你最棒。可以看得出来,它其实已经有一些语意在里面,同时也是符合上下文的环境的。当然因为局限于我们的模型是一个比较小的模型,还有我们训练的数据量以及我们训练的一些超参的配置,可能效果并不是最好。你可以尝试在model scope 上找到其他的一些模型,试试看它们的效果。
最后一步是上传翻译听用好的模型到model scope。这里是我临时创建的一个token。
你的token 可以在这个地方找到,首先是model scope 的主页首页。然后在访问令牌处新建SDK 令牌。
我们这边来新建一个已经限定好了。这是我们新建的这个令牌,把它复制到那边去。
接下来就是一样的一些配置,然后这个地方则是你要上传到model scope 后,希望它展示的名字,前面是你的账号名,后面是你的模型名。因为我已经上传过一个了,这里我们上传2这个地方则是我们像上面推理过程中配置的一样,是模型最后输出的这个文件夹,也就是临时文件夹的这个output。我们来上传一下,开始运行了,这边的报错,你不用管,这个过程中可能会花费一点点时间,也需要你等待一下。等到这个标志变成为运行标志,意味着它已经运行完成了,可以看一看我们的模型。
这里我就不等待了,来看一下我用之前的这个来生成的模型,回到你的首页创建这是我们之前刚刚创建的模型,模型文件。
可以看到,这就是我们刚刚训练好的模型。整个如何使用model scope 来翻译,用模型的课程已经结束了。