本方案使用阿里云DSW对Llama-2-7B-Chat模型进行全参数微调。DSW是一款交互式建模平台,适合需要定制化微调模型并追求优化效果的开发者。
准备环境和资源
创建工作空间,详情请参见创建工作空间。
创建DSW实例,其中关键参数配置如下。具体操作,请参见创建DSW实例。
资源规格:推荐使用GU100。本方案选择:ecs.gn7e-c16g1.4xlarge。
镜像:建议使用Python3.9及以上版本。本方案在官方镜像中选择
pytorch-develop: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
系统输出结果示例如下。
--2024-06-17 15:45:05-- https://atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com/release/tutorials/llama2/llama2-7b.tar.gz Resolving atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com (atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com)... 100.118.58.7, 100.118.58.8, 100.118.58.9, ... Connecting to atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com (atp-modelzoo-bj.oss-cn-beijing-internal.aliyuncs.com)|100.118.58.7|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 12621474981 (12G) [application/gzip] Saving to: ‘llama2-7b.tar.gz’ llama2-7b.tar.gz 100%[===================>] 11.75G 103MB/s in 1m 54s 2024-06-17 15:47:00 (105 MB/s) - ‘llama2-7b.tar.gz’ saved [12621474981/12621474981] llama2-7b/ llama2-7b/generation_config.json llama2-7b/gitattributes.txt llama2-7b/config.json llama2-7b/pytorch_model.bin.index.json llama2-7b/USE_POLICY.md llama2-7b/README.md llama2-7b/LICENSE.txt llama2-7b/pytorch_model-00003-of-00003.bin llama2-7b/special_tokens_map.json llama2-7b/Responsible-Use-Guide.pdf llama2-7b/tokenizer.model llama2-7b/pytorch_model-00001-of-00003.bin llama2-7b/tokenizer_config.json llama2-7b/pytorch_model-00002-of-00003.bin llama2-7b/tokenizer.json llama2-7b/added_tokens.json
此外,您也可以在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=50)
res = pipe(text)
parts = res[0]['generated_text'].split('<|endoftext|>', 1)
return parts[0][len(text):]
demo = gr.Blocks()
with demo:
input_prompt = gr.Textbox(label="请输入问题", value="That game hurt.The emotion expressed in the above sentence is anger or not, answer yes or no.", 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=False)
其中:tokenizer和model中的路径需要替换为步骤四中训练获得的模型路径。
系统返回结果示例如下:
如果在回显结果中出现错误
ImportError: cannot import name 'TypeAliasType' from 'typing_extensions'
,您可以尝试执行以下命令并重启Notebook,然后重新执行上述命令即可。pip install --upgrade typing_extensions
如果在回显结果中出现
TypeError: __init__() got an unexpected keyword argument 'socket_options'
,您可以尝试执行以下命令并重启Notebook,然后重新执行上述命令即可。pip install --upgrade httpx httpcore
Loading widget...
Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
由于http://127.0.0.1:7860
为内网访问地址,仅支持在当前的DSW实例内部通过单击链接来访问WebUI页面,不支持通过外部浏览器直接访问。
在返回结果中,单击local 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。
单击部署服务,然后在自定义模型部署区域,单击自定义部署。
在自定义部署页面,配置以下关键参数。
参数
描述
服务名称
自定义服务名称。本案例使用的示例值为:chatllm_llama2_7b。
部署方式
选择镜像部署,并选中开启Web应用。
镜像配置
在官方镜像列表中选择chat-llm-webui>chat-llm-webui:3.0。
说明由于版本迭代迅速,部署时镜像版本选择最高版本即可。
模型配置
选择OSS类型的挂载方式,并配置以下参数:
OSS:配置为模型文件所在的OSS存储路径。
挂载路径:配置为
/llama2-finetune
。
运行命令
服务运行命令配置如下,本方案选择使用自定义模型配置。
使用自定义模型配置为:
python webui/webui_server.py --port=8000 --model-path=/llama2-finetune
如果使用7B的模型进行部署:
python webui/webui_server.py --port=8000 --model-path=meta-llama/Llama-2-7b-chat-hf
如果使用13B的模型进行部署:
python webui/webui_server.py --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,即可输出结果。