文档

部署及微调Qwen-72B-Chat模型

更新时间:

通义千问-72B(Qwen-72B)是阿里云研发的通义千问大模型系列的720亿参数规模模型,它的预训练数据类型多样、覆盖广泛,包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上,使用对齐机制打造的基于大语言模型的AI助手。本文介绍如何通过PAI-快速开始(PAI-QuickStart)部署和微调Qwen-72B-Chat大模型。

前提条件

已开通灵骏智算资源,详情请参见新建资源组并购买灵骏智算资源

使用限制

  • 由于模型本身较大,本示例目前仅支持在华北6(乌兰察布)使用PAI灵骏集群环境运行。

  • 资源配置要求:GPU推荐使用GU108(80 GB显存),推理需要4卡及以上资源,微调需要4机共32卡及以上资源。

通过PAI控制台使用模型

模型部署和调用

  1. 进入快速开始页面。

    1. 登录PAI控制台

    2. 选择目标地域为华北6(乌兰察布)

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

    4. 在左侧导航栏单击快速开始,进入快速开始页面。

  2. 在快速开始首页,在右侧的模型列表中,单击Qwen-72B-Chat模型卡片,进入模型详情页面。

  3. 单击部署,配置灵骏计算资源,即可将模型部署到EAS推理服务平台。

    image

  4. 调用推理服务。

    通过HTTP API调用

    部署的推理服务支持OpenAI的API风格进行调用,通过部署的在线服务的详情页,您可以获得服务访问地址(Endpoint)和访问凭证(Token)。使用CURL调用推理服务的示例如下:

    说明

    由于模型较大,加载时间较长,您可以在服务启动后通过下面的“查看模型列表”API查看服务当前加载完成的模型。

    # 请注意替换为使用服务的Endpoint和Token
    export API_ENDPOINT="<ENDPOINT>"
    export API_TOKEN="<TOKEN>"
    
    # 查看模型list
    curl $API_ENDPOINT/v1/models \
    	-H "Content-Type: application/json" \
    	-H "Authorization: Bearer $API_TOKEN"
    
    # 调用通用的文本生成API
    curl $API_ENDPOINT/v1/completions \
    	-H "Content-Type: application/json" \
    	-H "Authorization: Bearer $API_TOKEN" \
    	-d '{
          "model": "qwen-72b-chat",
          "prompt": "San Francisco is a",
          "max_tokens": 256,
          "temperature": 0,
          "stop": ["<|im_end|>", "<|im_start|>"]
    }'
    
    # 调用对话API
    curl $API_ENDPOINT/v1/chat/completions \
    	-H "Authorization: Bearer $API_TOKEN" \
    	-H "Content-Type: application/json" \
    	-d '{
          "model": "qwen-72b-chat",
          "messages": [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "介绍一下上海的历史"}
          ],
          "stop": ["<|im_end|>", "<|im_start|>"]
          }'

    通过SDK调用

    通过OpenAI的SDK进行调用时,首先需要安装SDK:

    # 安装服务调用SDK
    python -m pip install openai

    通过SDK调用推理服务的示例代码如下:

    import openai
    
    # 请使用服务详情页获取的访问地址(ENDPOINT)和访问凭证(TOKEN)替换以下代码的配置。
    openai.api_key = "<TOKEN>"
    openai.base_url = "<ENDPOINT>" + "/v1"
    
    
    # 调用对话API
    completion = openai.chat.completions.create(
        model="qwen-72b-chat",
        temperature=0.0,
        top_p=0.8,
        frequency_penalty=0.0,
        messages=[{"role": "user", "content": "请介绍下你自己。"}],
        stop=["<|im_end|>", "<|im_start|>"],
        # stream=True,
    )
    # 打印输出内容
    print(completion.choices[0].message.content)

模型微调训练

PAI-QuickStart中的Qwen-72B-Chat全量参数微调基于Megatron-LM的训练流程,支持数据并行、算子拆分、流水并行、序列并行、选择性激活重算、ZeRO显存优化等技术,大幅提升大模型分布式训练效率。在这一算法组件中,我们提前对模型Checkpoint进行了切分,适配多机多卡环境训练,开发者只需根据格式要求准备训练集和验证集,配置任务超参数或使用模型预置的默认超参,就可以一键拉起微调训练任务。

训练算法支持使用JSON格式输入,每条数据由问题、答案组成,分别用"instruction"、"output"字段表示,例如:

[
    {
        "instruction": "写一首以“寓居夜感”为题的诗:",
        "output": "独坐晚凉侵,客窗秋意深。风沙疑化雾,夜气欲成霖。家务劳人倦,浓茶代酒斟。哀鸿鸣四野,一并助长吟。"    
     },
    {
        "instruction": "写一首以“次答友人思乡诗”为题的诗:",
        "output": "阅尽沧桑万事空,何如归卧夕阳中。并州最是伤心地,四十馀年噩梦同。"    
     }
]

  1. 模型详情页单击右上角微调训练。关键配置如下:

    • 数据集配置:当完成数据的准备,您可以将数据上传到对象存储OSS Bucket中,或是通过指定一个数据集对象,选择NAS或CPFS存储上的数据集。您也可以使用PAI预置的公共数据集,直接提交任务测试算法。

    • 计算资源配置:算法需要使用4张GU108(80 GB显存)的GPU资源,请确保选择使用的资源配额内有充足的计算资源。

    • 超参数配置:训练算法支持的超参信息如下,您可以根据使用的数据,计算资源等调整超参,或是使用算法默认配置的超参。

      超参数

      类型

      默认值

      是否必须

      描述

      learning_rate

      Float

      1e-05

      用于控制模型权重更新的步长。

      min_learning_rate

      Float

      1e-05

      最小学习速率,即在使用动态调整学习速率策略时设置的下限。

      sequence_length

      Int

      2048

      序列长度,指模型在一次训练中处理的输入数据的长度。

      save_interval

      Int

      1000

      保存间隔,指模型在训练过程中每隔多少迭代次数保存一次模型状态。

      train_iters

      Int

      2000

      训练迭代次数,指模型在整个训练过程中将完成的总迭代次数。

      learning_rate_warmup_iters

      Int

      0

      True

      学习速率预热迭代次数,指在训练开始的一段时间内,学习速率将逐渐从较低值增加到预设的学习速率的过程中所经过的迭代次数。

  2. 单击训练,PAI-QuickStart自动跳转到模型训练页面,并开始进行训练,您可以查看训练任务状态和训练日志。

    image

    在训练结束后,可以在输出路径的OSS Bucket中查看每次保存的Checkpoint模型切片,如下所示:

    image

    您可以根据实际情况选择最合适的Checkpoint进行部署和推理。具体流程,请参见通义千问Qwen全托管灵骏最佳实践

通过PAI Python SDK使用模型

PAI-QuickStart提供的预训练模型也支持通过PAI Python SDK进行调用,首先需要安装和配置PAI Python SDK,您可以在命令行执行以下代码:

# 安装PAI Python SDK
python -m pip install alipai --upgrade

# 交互式得配置访问凭证、PAI工作空间等信息
python -m pai.toolkit.config

如何获取SDK配置所需的访问凭证(AccessKey)、PAI工作空间等信息请参考安装和配置

模型部署和调用

通过PAI-QuickStart在模型上预置的推理服务配置,您只需提供使用的资源信息以及服务名称,即可轻松的将Qwen-72B-Chat模型部署到PAI-EAS推理平台。

from pai.session import get_default_session
from pai.model import RegisteredModel

session = get_default_session()

# 获取快速开始提供的qwen-72b-chat模型
m = RegisteredModel(
    model_name="qwen-72b-chat",
    model_provider="pai",
)

# 部署推理服务
predictor = m.deploy(
    service_name="qwen_72b_chat_{}".format(random_str(6)),
    options={
        # 资源配额ID
        "metadata.quota_id": "<LingJunResourceQuotaId>",
        "metadata.quota_type": "Lingjun",
        "metadata.workspace_id": session.workspace_id,
    }
)

# 查看服务的Endpoint和Token
endpoint = predictor.internet_endpoint
token = predictor.access_token

模型微调训练

通过SDK获取PAI-QuickStart提供的预训练模型之后,您可以查看模型配置的微调算法,包括算法支持的超参配置以及输入输出数据。

from pai.model import RegisteredModel

# 获取快速开始提供的Qwen-72b-Chat模型
m = RegisteredModel(
    model_name="qwen-72b-chat",
    model_provider="pai",
)

# 获取模型配置的微调算法
est = m.get_estimator()

# 查看算法支持的超参,以及算法输入输出信息
print(est.hyperparameter_definitions)
print(est.input_channel_definitions)

目前,Qwen-72B-Chat提供的微调算法仅支持灵骏资源,您需要通过PAI的控制台页面查看当前的资源配额ID,设置训练任务使用的资源信息。同时在提交训练作业之前,您可以根据算法的超参支持,配置合适的训练任务超参。

# 配置训练作业使用的灵骏资源配额ID
est.resource_id = "<LingjunResourceQuotaId>"

# 配置训练作业超参
hps = {
    "learning_rate": 1e-5,
    "save_interval": 500,
}
est.set_hyperparameters(**hps)

微调算法支持3个输入,分别为:

  • model:预训练模型Qwen-72b-Chat。

  • train:微调使用的训练数据集。

  • validation:微调使用的验证数据集。

# 查看模型微调算法的使用的输入信息
print(m.get_estimator_inputs())

# {
#     "model": "oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/models/qwen-72b-chat/megatron/",
#     "train": "oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/datasets/llm_instruct/ch_poetry_train.json",
#     "validation": "oss://pai-quickstart-cn-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/huggingface/datasets/llm_instruct/ch_poetry_test.json",
# }

您可以参考以上的训练数据格式准备数据,然后将train和validation输入替换为自己的训练和验证数据集,即可轻松得提交模型微调训练作业。通过SDK打印的训练作业链接,您可以在PAI的控制台上查看训练任务状态以及日志信息。

from pai.common.oss_utils import download

# 获取算法的输入数据,包括具体的模型和供测试的公共读数据集.
training_inputs = m.get_estimator_inputs()

# 替换使用开发者自己的训练数据
# training_inputs["train"] = "oss://<BucketName>/path/to/train/data.json"
# training_inputs["validation"] = "oss://<BucketName>/path/to/validation/data.json"

# 提交训练作业,并等待到训练作业结束
est.fit(
    inputs=training_inputs
)

# 查看保存在OSS Bucket上的模型路径
print(est.model_data())


# 用户可以通过ossutils,或是SDK提供的便利方法下载相应的模型到本地
download(est.model_data())

更多关于如何通过SDK使用PAI-QuickStart提供的预训练模型,请参见使用预训练模型 — PAI Python SDK

相关文档