本方案使用阿里云DSW对Llama-2-7B-Chat模型进行全参数微调。DSW是一款交互式建模平台,适合需要定制化微调模型并追求优化效果的开发者。
准备环境和资源
创建工作空间,详情请参见创建工作空间。
创建DSW实例,其中关键参数配置如下。具体操作,请参见创建DSW实例。
实例规格选择:推荐使用GU100。本方案选择:ecs.gn7e-c16g1.4xlarge。
镜像选择:建议使用Python3.9及以上版本。本方案在官方镜像中选择
pytorch:1.12-gpu-py39-cu113-ubuntu20.04
。
步骤一:准备Llama-2-7B-Chat模型
进入DSW开发环境。
登录PAI控制台。
在页面左上方,选择DSW实例所在的地域。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击默认工作空间名称,进入对应工作空间内。
在左侧导航栏,选择模型开发与训练>交互式建模(DSW)。
单击需要打开的实例操作列下的打开,进入DSW实例开发环境。
在Launcher页面中,单击快速开始区域Notebook下的Python3。
在Notebook中执行以下代码下载模型文件。代码会自动选择适当的下载地址,并将模型文件下载至当前目录。
说明如果您所在的地域不在url_link指定的可用地域范围内,您可以选择与您最近的可用地域链接进行下载。不同的地域之间不共享内网,因此您需要将链接中的-internal删除。同一个地域内的数据下载速度更快,虽然不同地域之间的数据也是可以下载的,但下载速度会相对较慢。
import os dsw_region = os.environ.get("dsw_region") url_link = { "cn-shanghai": "https://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", "cn-hangzhou": "https://atp-modelzoo.oss-cn-hangzhou-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", "cn-shenzhen": "https://atp-modelzoo-sz.oss-cn-shenzhen-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", "cn-beijing": "https://atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz", } path = url_link[dsw_region] os.environ['LINK_CHAT'] = path !wget $LINK_CHAT !tar -zxvf llama2-7b.tar.gz
系统输出如下结果。
此外,您也可以在ModelScope下载Llama-2-7B-Chat模型文件,然后将其上传到DSW开发环境中。具体操作,请参见上传与下载数据文件。
步骤二:下载和安装环境
在DSW的Notebook中执行以下命令,即可下载并安装微调Llama-2-7B-Chat模型所需的环境。
! wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/llama2/ColossalAI.tar.gz
! tar -zxvf ColossalAI.tar.gz
! pip install ColossalAI/.
! pip install ColossalAI/applications/Chat/.
! pip install transformers==4.30.0
! pip install gradio==3.11
其中:
ColossalAI是大规模并行AI训练系统。在本方案中,DSW使用该框架进行模型微调。
transformers是基于transformers模型结构的预训练语言库。
gradio是一个快速构建机器学习Web展示页面的开源库。
步骤三:下载训练数据
在DSW的Notebook中执行以下命令下载模型训练所需的数据。在本方案中,PAI提供的是一份创意生成数据,包括发言稿生成等内容。您也可以参考该数据格式自行准备训练数据。
! wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/llama2/llama_data.json
! wget https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/llama2/llama_test.json
步骤四:微调模型
在DSW的Notebook中执行以下命令进行模型微调训练。命令执行成功后,系统将会把训练得到的模型文件输出到当前目录下的sft_llama2-7b
子目录中。
! sh ColossalAI/applications/Chat/examples/train_sft.sh
命令执行成功后,系统输出如下结果:
[08/01/23 16:00:27] INFO colossalai - colossalai - INFO:
/home/pai/lib/python3.9/site-packages/colossalai/co
ntext/parallel_context.py:522 set_device
INFO colossalai - colossalai - INFO: process rank 0 is
bound to device 0
dsw-76037-687bb6c4c-plp2k:625:625 [0] NCCL INFO Bootstrap : Using eth0:10.224.160.21<0>
dsw-76037-687bb6c4c-plp2k:625:625 [0] NCCL INFO NET/Plugin : No plugin found (libnccl-net.so), using internal implementation
......
steps: 95%|██████████████████████████████▍ | 1178/1240 [11:41<00:36, 1.69it/s][08/01/23 16:14:25] INFO colossalai - colossalai - INFO:
/home/pai/lib/python3.9/site-packages/coati/trainer
/sft.py:98 _eval
INFO colossalai - colossalai - INFO: Eval Epoch 18/20
loss 0.4501953125
steps: 100%|████████████████████████████████| 1240/1240 [12:18<00:00, 1.72it/s][08/01/23 16:15:02] INFO colossalai - colossalai - INFO:
/home/pai/lib/python3.9/site-packages/coati/trainer
/sft.py:98 _eval
INFO colossalai - colossalai - INFO: Eval Epoch 19/20
loss 0.4501953125
steps: 100%|████████████████████████████████| 1240/1240 [13:30<00:00, 1.53it/s]
步骤五:离线推理模型
模型训练完成后,您可以在DSW的Notebook中执行以下命令启动WebUI应用。在WebUI页面试玩模型,并根据返回结果来评估模型推理效果。
import gradio as gr
import requests
import json
from transformers import AutoTokenizer, AutoModelForCausalLM
#模型地址替换为自己训练好的模型地址。
tokenizer = AutoTokenizer.from_pretrained("/mnt/workspace/sft_llama2-7b",trust_remote_code=True)
#模型地址替换为自己训练好的模型地址。
model = AutoModelForCausalLM.from_pretrained("/mnt/workspace/sft_llama2-7b",trust_remote_code=True).eval().half().cuda()
def inference(text):
from transformers import pipeline
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer,device='cuda:0', max_new_tokens=400)
res=pipe(text)
return res[0]['generated_text'][len(text):]
demo = gr.Blocks()
with demo:
input_prompt = gr.Textbox(label="请输入需求", value="请以软件工程师的身份,写一篇入职的发言稿。", lines=6)
generated_txt = gr.Textbox(lines=6)
b1 = gr.Button("发送")
b1.click(inference, inputs=[input_prompt], outputs=generated_txt)
demo.launch(enable_queue=True, share=True)
其中:tokenizer和model中的路径需要替换为步骤四中训练获得的模型路径。
系统返回结果如下:
如果在回显结果中出现错误ImportError: cannot import name 'TypeAliasType' from 'typing_extensions'
,您可以尝试重新启动Notebook并重新执行上述命令。
由于http://127.0.0.1:7860
为内网访问地址,仅支持在当前的DSW实例内部通过单击链接来访问WebUI页面,不支持通过外部浏览器直接访问。
在返回结果中,单击local URL后面的链接可以打开WebUI页面。您也可以将截图中的public URL分享于他人(您的public URL以实际为准),与他人共同在WebUI页面测试模型效果。在WebUI页面进行离线推理的效果示例如下:
步骤六:部署模型服务
您可以参照以下操作步骤将上述训练获得的模型部署至EAS。
将步骤四中训练获得的模型文件上传至OSS Bucket存储目录中。
在DSW中安装ossutil并完成配置,详情请参见安装ossutil。
在DSW的Terminal中,在
sft_llama2-7b
目录同级的目录中执行以下命令,将模型文件上传到OSS Bucket存储空间。更多详细内容,请参见命令行工具ossutil命令参考。ossutil64 cp -r sft_llama2-7b/ oss://examplebucket/exampledirectory/
进入模型在线服务页面。
登录PAI控制台。
在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。
在工作空间页面的左侧导航栏选择模型部署>模型在线服务(EAS),进入模型在线服务(EAS)页面。
在模型在线服务(EAS)页面,单击部署服务,在自定义模型部署区域,单击自定义部署。
在新建服务页面,配置以下关键参数。
参数
描述
服务名称
自定义服务名称。本案例使用的示例值为:chatllm_llama2_7b。
部署方式
选择镜像部署AI-Web应用。
镜像选择
在PAI平台镜像列表中选择chat-llm-webui,镜像版本选择1.0。
说明由于版本迭代迅速,部署时镜像版本选择最高版本即可。
填写模型配置
单击填写模型配置挂载训练获得的模型。
模型配置选择OSS挂载,将OSS路径配置为模型文件所在的OSS存储路径。
挂载路径:配置为
/llama2-finetune
。
运行命令
服务运行命令配置如下,本方案选择使用自定义模型配置。
使用自定义模型配置为:python webui/webui_server.py --listen --port=8000 --model-path=/llama2-finetune
如果使用7B的模型进行部署:python webui/webui_server.py --listen --port=8000 --model-path=meta-llama/Llama-2-7b-chat-hf
如果使用13B的模型进行部署:python webui/webui_server.py --listen --port=8000 --model-path=meta-llama/Llama-2-13b-chat-hf --precision=fp16
端口号输入:8000
资源组种类
选择公共资源组。
资源配置方法
选择常规资源配置。
资源配置选择
本方案选择GPU类型,实例规格推荐使用ecs.gn6e-c12g1.3xlarge。
13B的模型务必使用gn6e及更高规格的机型。
7B的模型可以使用A10或GU30机型。
额外系统盘
选择50 GB。
单击部署,大约等待5分钟后即可完成模型部署。
步骤七:启动WebUI进行模型推理
单击目标服务的服务方式列下的查看Web应用。
在WebUI页面进行模型推理验证。
在输入文本框中输入请求内容,例如:
请以软件工程师的身份,写一篇入职的发言稿。
,单击Send,即可输出结果。