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

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

准备环境和资源

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

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

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

    • 镜像:建议使用Python3.9及以上版本。本方案在官方镜像中选择pytorch-develop: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

    系统输出结果示例如下。

    --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开发环境中。具体操作,请参见上传与下载数据文件

步骤二:下载和安装环境

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=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)

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

系统返回结果示例如下:

说明
  • 如果在回显结果中出现错误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页面进行离线推理的效果示例如下: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. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  3. 单击部署服务,然后在自定义模型部署区域,单击自定义部署

  4. 自定义部署页面,配置以下关键参数。

    参数

    描述

    服务名称

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

    额外系统盘

    配置为50 GB。

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

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

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

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

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