Llama2-7B基于DSW的全参数微调训练

本方案使用阿里云DSWLlama-2-7B-Chat模型进行全参数微调。DSW是一款交互式建模平台,适合需要定制化微调模型并追求优化效果的开发者。

准备环境和资源

  • 创建工作空间,详情请参见创建工作空间

  • 创建DSW实例,其中关键参数配置如下。具体操作,请参见创建DSW实例

    • 实例规格选择:推荐使用GU100。本方案选择:ecs.gn7e-c16g1.4xlarge。

    • 镜像选择:建议使用Python3.9及以上版本。本方案在官方镜像中选择pytorch:1.12-gpu-py39-cu113-ubuntu20.04

  • 创建OSS Bucket存储空间和目录,用来存放训练获得的模型文件。具体操作,请参见控制台创建存储空间管理目录

步骤一:准备Llama-2-7B-Chat模型

  1. 进入DSW开发环境。

    1. 登录PAI控制台

    2. 在页面左上方,选择DSW实例所在的地域。

    3. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击默认工作空间名称,进入对应工作空间内。

    4. 在左侧导航栏,选择模型开发与训练>交互式建模(DSW)

    5. 单击需要打开的实例操作列下的打开,进入DSW实例开发环境。

  2. Launcher页面中,单击快速开始区域Notebook下的Python3

  3. 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

    系统输出如下结果。image.png

此外,您也可以在ModelScope下载Llama-2-7B-Chat模型文件,然后将其上传到DSW开发环境中。具体操作,请参见上传与下载数据文件

步骤二:下载和安装环境

DSWNotebook中执行以下命令,即可下载并安装微调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展示页面的开源库。

步骤三:下载训练数据

DSWNotebook中执行以下命令下载模型训练所需的数据。在本方案中,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

步骤四:微调模型

DSWNotebook中执行以下命令进行模型微调训练。命令执行成功后,系统将会把训练得到的模型文件输出到当前目录下的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]

步骤五:离线推理模型

模型训练完成后,您可以在DSWNotebook中执行以下命令启动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)

其中:tokenizermodel中的路径需要替换为步骤四中训练获得的模型路径。

系统返回结果如下:

说明

如果在回显结果中出现错误ImportError: cannot import name 'TypeAliasType' from 'typing_extensions',您可以尝试重新启动Notebook并重新执行上述命令。

image.png

说明

由于http://127.0.0.1:7860为内网访问地址,仅支持在当前的DSW实例内部通过单击链接来访问WebUI页面,不支持通过外部浏览器直接访问。

在返回结果中,单击local URL后面的链接可以打开WebUI页面。您也可以将截图中的public URL分享于他人(您的public URL以实际为准),与他人共同在WebUI页面测试模型效果。在WebUI页面进行离线推理的效果示例如下:image.png

步骤六:部署模型服务

您可以参照以下操作步骤将上述训练获得的模型部署至EAS

  1. 步骤四中训练获得的模型文件上传至OSS Bucket存储目录中。

    1. DSW中安装ossutil并完成配置,详情请参见安装ossutil

    2. DSWTerminal中,在sft_llama2-7b目录同级的目录中执行以下命令,将模型文件上传到OSS Bucket存储空间。更多详细内容,请参见命令行工具ossutil命令参考

      ossutil64 cp -r sft_llama2-7b/ oss://examplebucket/exampledirectory/
  2. 进入模型在线服务页面。

    1. 登录PAI控制台

    2. 在左侧导航栏单击工作空间列表,在工作空间列表页面中单击待操作的工作空间名称,进入对应工作空间内。

    3. 在工作空间页面的左侧导航栏选择模型部署>模型在线服务(EAS),进入模型在线服务(EAS)页面。image

  3. 模型在线服务(EAS)页面,单击部署服务,在自定义模型部署区域,单击自定义部署

  4. 新建服务页面,配置以下关键参数。

    参数

    描述

    服务名称

    自定义服务名称。本案例使用的示例值为: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的模型可以使用A10GU30机型。

    额外系统盘

    选择50 GB。

    69a8e321feedb633a1d3d7ccf56bef43.png

  5. 单击部署,大约等待5分钟后即可完成模型部署。

步骤七:启动WebUI进行模型推理

  1. 单击目标服务的服务方式列下的查看Web应用image.png

  2. WebUI页面进行模型推理验证。

    在输入文本框中输入请求内容,例如:请以软件工程师的身份,写一篇入职的发言稿。,单击Send,即可输出结果。image.png