通义千问Qwen-72B-Chat基于PAI的低代码微调部署实践

2024-01-12 18:34   来源: 互联网    阅读次数:3045

作者:熊兮、求伯、一耘

引言

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

阿里云人工智能平台PAI是面向开发者和企业的机器学习/深度学习平台,提供AI开发全链路服务。快速开始(PAI-QuickStart)是阿里云人工智能平台PAI的产品组件,它集成了国内外 AI 开源社区中优质的预训练模型,支持零代码和 SDK 的方式实现从训练到部署再到推理的全过程,大大简化了模型的开发和部署,为开发者和企业用户带来了更快、更高效、更便捷的 AI 开发和应用体验。

本文将以 Qwen-72B-Chat 为例,介绍如何通过PAI平台的快速开始(PAI-QuickStart)部署和微调千问大模型。

运行环境要求

本示例目前仅支持在阿里云乌兰察布地域,使用灵骏集群环境运行。

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

阿里云 PAI 灵骏智算服务资源开通和管理请参考官网文档:

灵骏智算资源的开通购买

通过PAI控制台使用模型

开发者可以在 PAI 控制台的“快速开始”入口,找到 Qwen-72B-Chat 的模型,Qwen-72B-Chat 的模型卡片如下图所示:

模型部署和调用

通过“模型部署”入口,用户选择使用的灵骏资源信息,点击部署按钮,即可将模型部署到 PAI-EAS 推理服务平台。

通过部署的在线服务的详情页,用户可以查看服务访问地址(Endpoint)和访问凭证(Token),然后用于调用推理HTTP API。使用 cURL 调用推理服务的示例如下。

注意,因为模型较大,加载时间较长,用户可以在服务启动之后,通过以下的“查看模型列表”API查看服务当前加载完成的模型。

# 请注意替换为使用服务的Endpoint和Token

export API_ENDPOINT=''

export API_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|>']

     }'

用户也可以通过 openai SDK 的方式进行调用,首先需要安装调用SDK:

# 安装服务调用SDK

python -m pip install openai

通过 SDK 调用服务的示例如下,请注意替换代码中使用的访问地址和访问凭证。

import openai

# 请使用服务详情页获取的访问地址(ENDPOINT)和访问凭证(TOKEN)替换以下代码的配置。

openai.api_key = ''

openai.base_url = '' + '/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进行了切分,适配多机多卡环境训练,开发者只需根据格式要求准备训练集和验证集,配置任务超参数或是使用模型预置的默认超参,就可以一键拉起训练任务。

微调算法的超参支持如下:88.jpg

通过模型详情的“微调训练”入口,我们可以根据实际需求调整超参数,例如learning_rate、sequence_length、train_iters等,如下所示:

算法的训练和验证数据集接受Json格式输入,每条数据由问题、答案组成,分别用'instruction'和'output'字段表示,例如:

[

   {

       'instruction': '写一首以“寓居夜感”为题的诗:',

       'output': '独坐晚凉侵,客窗秋意深。风沙化雾,夜气欲成霖。家务人倦,浓茶代酒。哀鸿鸣四野,一并助长吟。'    

    },

   {

       'instruction': '写一首以“次答友人思乡诗”为题的诗:',

       'output': '阅尽沧桑万事空,何如归卧夕阳中。并州最是伤心地,四十年噩梦同。'    

    }

]

用户可以通过将数据准备到到OSS Bucket上,然后在“数据集”配置中选择使用。

当前算法仅支持使用灵骏资源进行训练,在提交训练作业之前,用户需要配置使用的灵骏资源ID。

在完成以上配置之后,点击“训练”按钮,PAI-QuickStart自动跳转到模型训练页面,并且开始进行训练,用户可以查看训练任务状态和训练日志,如下所示:

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

用户可以根据实际情况,选择最合适的Checkpoint进行推理和部署,具体流程参见这里,本文不再赘述。

通过PAI Python SDK使用模型

PAI-QuickStart 提供的预训练模型,也支持通过PAI Python SDK进行调用,详细流程可以参考文档:使用预训练模型 — 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 Python SDK。

模型部署和调用

通过 PAI Python SDK 提供的便利方法,开发者通过数行代码,即可将 Qwen-72B-Chat 模型部署到 PAI-EAS,创建一个在线推理服务。

from pai.session import  get_default_session

from pai.model import RegisteredModel

session = get_default_session()

# 获取PAI QuickStart 提供的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

# 获取PAI QuickStart 提供的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())

结论

阿里云 PAI-QuickStart 提供了对 Qwen-72B-Chat 模型微调训练和部署开箱即用的体验,简化了 AI 开发流程,帮助开发者和企业用户使用大语言模型加速创新,创造更多的价值。

相关资料

PAI 快速开始:

https://help.aliyun.com/zh/pai/user-guide/quick-start-overview

通义千问系列模型:

https://modelscope.cn/organization/qwen

PAI Python SDK:

https://github.com/aliyun/pai-python-sdk

阿里云PAI灵骏智算服务:

https://www.aliyun.com/product/bigdata/learn/pailingjun


责任编辑:郭林林
分享到:
0
【慎重声明】凡本站未注明来源为"中关村热线"的所有作品,均转载、编译或摘编自其它媒体,转载、编译或摘编的目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如因作品内容、版权和其他问题需要同本网联系的,请在30日内进行!
关于我们| 免责声明| 投诉建议| 网站地图| sitemap|