手册下载
H3C傲飞算力平台
基于国产GPU自定义大模型最佳实践
Copyright © 2024 新华三技术有限公司 版权所有,保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
除新华三技术有限公司的商标外,本手册中出现的其它公司的商标、产品标识及商品名称,由各自权利人拥有。
本文档中的信息可能变动,恕不另行通知。
大模型是指具有大规模参数和复杂计算结构的机器学习模型,它可以处理大规模的数据并进行复杂的推理和预测任务。大模型通常通过深度学习技术进行训练,利用大量的数据来学习并提取数据之间的复杂关系。相比于小模型,大模型通常参数较多、层数较深,具备更强的表达能力和更高的准确度,但也需要更多的计算资源和时间来训练和推理,适用于数据量较大、计算资源充足的场景,比如高性能计算、云端计算、人工智能等。此外,大模型需要充足的训练数据来实现有效的学习,因为更多的参数需要更多的训练样本进行训练。
大模型在自然语言处理、计算机视觉、语音识别等领域得到了广泛的应用,可以帮助我们更准确地理解和处理各种复杂的信息。然而,大模型也面临一些挑战,包括训练成本高昂、部署和推理的复杂,计算资源要求高等。
各种原始大模型、开源大模型,由于其自身的局限性,在使用的过程中,普遍会遇到效果不好、无法应对用户特定任务需求的困境。主要有以下原因:
· 数据适配问题:开源模型通常是在特定的数据集上进行训练和优化的。当用户的数据与这些模型被训练的数据有差异时,模型的性能可能会下降。用户可能需要对模型进行微调或迁移学习,以适应用户的数据。
· 超参数调整:原始模型中的超参数可能需要根据用户的任务和数据进行调整。这些超参数包括学习率、批大小、正则化参数等。通过尝试不同的超参数组合,用户可以改善模型的性能。
· 数据质量问题:如果用户的数据质量较差,包含噪声或标签不准确,即使使用了优秀的模型,效果也可能不理想。确保数据质量和标注的准确性非常重要。
· 模型的局限性:原始模型可能有其自身的局限性,无法应对用户特定任务中的挑战。在这种情况下,用户可能需要考虑使用其他模型或进行定制开发,以满足用户的需求。
· 模型的更新和改进:开源模型通常会不断更新和改进,因此,确保用户使用的是最新版本的模型非常重要。这些更新可能包括性能改进、bug修复等,有助于提高模型的质量。
根据用户特定的需求和数据进行模型调优和改进,可以解决上述的问题。
大模型调优是指对深度学习模型进行优化和调整,以达到更好的训练性能和预测结果的过程。由于大型模型具有庞大的参数数量,因此它们的训练和优化过程可能需要更多细致的调整和优化。
大模型调优的主要目标包括但不限于以下几个方面:
· 训练速度优化:调整模型结构、使用更高效的优化算法、分布式训练以及硬件加速等方法,以提高训练速度。
· 性能提升:通过调整超参数(如学习率、批大小、正则化等)、选择更合适的损失函数、改进数据预处理等手段,提高模型在验证集或测试集上的性能表现。
· 泛化能力提升:通过增加数据多样性、引入数据增强技术、改进模型结构等方式,提高模型在未见过的数据上的泛化能力,减少过拟合风险。
· 模型压缩:对大型模型进行压缩,以减少模型的参数量和计算量,以提高模型的部署效率和在边缘设备上的运行速度。
· 硬件优化:针对特定硬件设备(如GPU、TPU等)进行优化,利用硬件的特定功能和加速器来提高模型的计算效率。
· 解释性优化:对模型进行解释性模型的调整,以提高模型的可解释性和可理解性,适应特定的应用场景需求。
大模型调优需要深入理解深度学习模型的原理和优化方法,对模型训练过程中的各种超参数、损失函数等进行精细调整,以获得更优的性能和效果。这是深度学习工程师和研究人员在实际项目中必须面对的关键任务之一。
傲飞算力平台为用户提供了多种调优方式,包括微调、预训练、强化学习和直接偏好优化等。同时,平台内置了多款开源大模型,用户可以直接使用这些模型进行训练优化,并且结合自身行业内的数据集进行训练。
大模型评估是对大规模的深度学习模型进行性能评估和验证的过程。在大模型评估中,通常会针对模型的准确性、鲁棒性、泛化能力等方面进行深入的分析和测试。这包括在验证集或测试集上对模型进行评估,了解其在未见过的数据上的表现,以及对模型的训练效果进行全面评估。大模型评估是确保模型在实际应用中能够可靠运行和有效解决问题的重要环节。
傲飞算力平台为常见的通用开源大模型内置了大模型评估策略,用户可自定义评估数据集,对调优后的模型进行评估,选择最适合其需求的模型进行部署,确保模型在实际应用中能够可靠运行并有效解决问题。
大模型推理是指在深度学习中,将经过训练和优化的大型模型应用到实际数据上,利用模型对输入数据进行预测、分类或生成结果的过程。在推理阶段,模型不再进行参数的更新和优化,而是专注于使用已经训练好的参数来处理输入数据,以生成相应的输出。大模型推理通常会利用各种优化技术以及专门的硬件加速器(如GPU、TPU等)来提高推理效率,确保在实际应用中能够快速而准确地处理大规模的数据。
傲飞算力平台提供了fschat和RAG知识库推理框架,并能根据底层资源的使用情况及服务并发程度进行动态扩缩容。综上,傲飞算力平台是一款内置多款开源大模型,并提供给用户大模型调优、评估到提供推理服务的大模型全生命周期支撑平台。
傲飞算力平台(AMPHA,Advanced Management Platform for HPC and AI)是H3C自主研发的全方位的高性能计算与人工智能融合的交互开发平台,提供了如下功能:
· 平台为用户提供HPC作业的调度、AI传统模型和AIGC大模型全流程生命周期管理,包括模型开发、训练、评估、部署以及在线推理服务。
· 为了辅助用户管理开发资源,平台提供了文件存储、资源监控、资源申请、工单管理以及可视化等功能。
· 为解决部署难的问题,平台提供基础软硬件集群环境的快速部署的功能。通过傲飞算力平台,用户可以实现资源统一监管、作业调度与监控、训练数据可视化、工程化的模型开发管理,满足不同业务场景的开发需求。
傲飞算力平台的产品架构示意图,如图2-1所示。
本案例在AI大模型场景下,根据昆仑芯厂商提供的demo文档,对大模型算法进行脚本改造,在国产GPU卡(昆仑芯P800)上进行自定义大模型的预训练、微调、强化学习,在训练完的大模型上进行推理的过程。
· 本实践中主要以自定义模型预训练脚本和推理脚本改造作为示例介绍,微调和强化学习阶段的可采用类似的方法根据厂商提供的demo文件进行改造。
· 其中预训练阶段使用的模型为Qwen-7B,推理阶段使用的模型为Qwen1.5-32B。
傲飞LLMOps(Large Language Model Operations,大型语言模型运维)流程,如图3-1所示。
确保在普通用户使用傲飞以自定义方式进行Qwen模型预训练和推理之前,基础环境和数据资产的完整性得到保证。
(1) 完成傲飞算力平台部署,详细的部署过程请参考《H3C傲飞算力平台 安装部署手册(集群模式)》或《H3C傲飞算力平台 安装部署手册(一体机模式)》。
(2) 如图4-1所示,系统管理员登录傲飞算力平台,在系统中创建租户用户组,租户用户组中包含租户管理员A和普通用户B。
(3) 如图4-2所示,系统管理员创建租户AI专属资源池,在资源池中添加一个国产GPU节点(此处以昆仑芯P800为例),供本案例后续的训练推理使用。
(4) 如图4-3所示,租户管理员单击[集群配置/资源组管理]菜单,进入资源组管理页面。单击“AI资源组”页签,可以创建AI资源组。
(5) 如图4-4所示,单击<创建资源组>按钮,在弹出的“创建资源组”页面中,填写资源组信息。
(6) 如图4-5所示,创建成功后,租户管理员可在资源组管理页面,查看已创建的AI资源组,确保用户B所在的用户组可用。
根据厂商提供demo文档完成训练和推理docker镜像制作,并保存为tar包(或使用厂商提供的可以直接使用的镜像文件)。
本文中以通义千问模型为例,需要将如下镜像注册至AI资产:
· 训练镜像文件:p800_qwen_train_image.tar
· 推理镜像文件:p800_qwen_infer_image.tar
(1) 普通用户登录傲飞算力平台,单击[资产管理/AI资产/镜像],进入镜像列表页面,如图4-6所示。
(2) 单击<创建>按钮,进入镜像创建页面,如图4-7所示。
(3) 单击已创建的镜像卡片,进入镜像详情页面。单击“数据文件”页签,进入数据文件管理页面,如图4-8所示。
(4) 单击“上传文件”或者“从我的文件导入”按钮,将“p800_qwen_train_image.tar”文件上传,如图4-9所示。
(5) 单击“置为当前版本镜像”,可将该镜像包上传至本地镜像仓库,如图4-10所示。
(1) 普通用户登录傲飞算力平台,单击[资产管理/AI资产/镜像],进入镜像列表页面,如图4-11所示。
(2) 单击<创建>按钮,进入镜像创建页面,如图4-7所示。
图4-12 创建镜像
(3) 单击已创建的镜像卡片,进入镜像详情页面。单击“数据文件”页签,进入数据文件管理页面,如图4-8所示。
图4-13 镜像详情页面
(4) 单击“上传文件”或者“从我的文件导入”按钮,将“p800_qwen_train_image.tar”文件上传,如图4-9所示。
图4-14 上传镜像文件
(5) 单击“置为当前版本镜像”,可将该镜像包上传至本地镜像仓库,如图4-15所示。
(1) 根据厂商提供的预训练指导文档《Qwen-7B PreTrain训练》,将qwen_model模型下载到本地。
(2) 如图4-16所示,使用普通用户角色登录傲飞算力平台,将下载的模型文件上传到私有文件目录中。
(1) 根据厂商提供的预训练指导文档《Qwen-7B PreTrain训练》,将p800_qwen_train_code算法下载到本地。
(2) 如图4-17所示,使用普通用户角色登录傲飞算力平台,将下载的算法上传到私有文件目录中。创建“大模型预训练”和“大模型微调”任务时,在“选择算法”步骤将此文件目录作为选择自定义所需算法脚本所在目录。
在进行自定义模型训练前,需要对厂商提供的算法脚本进行改造,以便自定义的模型能够适配傲飞算力平台,主要的改造涉及以下方面:
· 修改启动命令中的模型输入路径、训练数据输入路径、训练数据输出路径。
· 修改分布式启动命令参数。
· 在“选择算法”对应的目录中,将修改后的启动命令写入一个shell脚本作为启动文件。
在“创建预训练任务”页面中,“基础模型”选项中选择的模型资产或者私有文件中的目录会被挂载到pod中的/ampha/model路径。因此,需要将训练脚本中的模型路径替换为${MODEL_PATH}或/ampha/model(环境变量MODEL_PATH的值即为/ampha/model)。
图4-18 修改模型输入路径
在“创建预训练任务”页面中,“输入数据”选项中选择的数据集资产或者私有文件中的目录会被挂载到pod中的/ampha/dataset路径。因此,需要将训练脚本中的训练数据输入路径替换为${DATASET_PATH}或/ampha/dataset(环境变量DATASET_PATH的值即为/ampha/dataset)。
图4-19 修改训练数据输入路径
在“创建预训练任务”页面中,“输出路径”选项中选择私有文件中的目录会被挂载到pod中的/ampha/out路径,因此,需要将训练脚本中的输出路径替换为${OUTPUT_PATH}或/ampha/output(环境变量OUTPUT_PATH的值即为/ampha/output)。
图4-20 修改训练数据输出路径
在pytorch分布式训练启动命令中,可以通过如下参数有效控制PyTorch分布式训练的节点规模和通讯设置,实现高效的多节点并行训练:
· --nnodes:指定节点数。
· --nproc_per_node:指定每个节点上运行的进程数。
· --node_rank:设置节点标识。
· --master_addr:指定Master节点地址。
· --master_port:指定Master节点端口。
在傲飞任务创建时,根据用户选择的资源配置,会使用环境变量node_num和gpu_num传递实例数量和GPU数给pod。可以通过如下方式指定分布式启动的参数:
· 节点数和节点进程数设定:可以使用--nnodes ${node_num}和--nproc_per_node ${gpu_num}来指定分布式启动的节点数和节点进程数。
· 对于多实例情况(nodenum>1):每个pod会额外获得`MASTERADDR、MASTERPORT、RANK`环境变量。因此,可以使用--noderank ${RANK}、--masteraddr ${MASTERADDR}、--masterport ${MASTERPORT}来指定多节点分布式启动的参数。
在完成厂商训练demo中的算法脚本修改后,将启动训练的完整命令写入一个shell脚本作为创建任务的启动文件。
环境变量值或挂载路径详细说明,如表4-1所示。
环境变量值或挂载路径 |
说明 |
${ALGORITHM_PATH}或/ampha/algorithm |
“选择算法”选项对应的算法工作目录的路径 |
${MODEL_PATH}或/ampha/model |
“基础模型”选项对应的模型输入路径 |
${DATASET_PATH}或/ampha/dataset |
“输入数据”选项对应的训练数据输入路径 |
${OUTPUT_PATH}或/ampha/output |
“输出路径”选项对应的输出路径 |
${node_num} |
节点个数 |
${gpu_num} |
每个节点进程数 |
${RANK} |
节点标识符 |
${MASTER_ADDR} |
主节点地址 |
${MASTER_PORT} |
主节点端口 |
以昆仑芯P800适配qwen-7b的预训练demo 《Qwen-7B PreTrain训练》为例,脚本改造步骤如下:
(1) 将demo中QWen-7B_v0.0.8/QWen-7B目录下所有的算法脚本上传到私有文件路径p800_qwen_train_code文件下。
(2) 修改算法脚本目录下config.sh:
export PROJECT_NAME=QWen-7B
# 将/workspace/models修改为/ampha/model,此时“基础模型”选项选择的目录中包含tokenizer子目录。
export MODEL_PATH=/ampha/model/tokenizer/
# export MODEL_PATH=/workspace/models/tokenizer
# 将/workspace/datasets/Chinese-pretraining-dataset修改为/ampha/dataset,此时,“输入数据”选项选择的目录中包含csl.jsonl文件
export DATASET_PATH=/ampha/dataset/csl.jsonl
#export DATASET_PATH=/workspace/datasets/Chinese-pretraining-dataset/csl.jsonl
# 将/workspace/output修改为${OUTPUT_PATH}
export OUTPUT_DIR=${OUTPUT_PATH}/${PROJECT_NAME}/
#export OUTPUT_DIR=/workspace/output/${PROJECT_NAME}/
export SEQ_LEN=4096
export ITERATION_NUM=200
export GLOBAL_BATCH_SIZE=128
export XPU_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
export CUDA_VISIBLE_DEVICES=$XPU_VISIBLE_DEVICES
由于脚本中需要使用名称同为MODEL_PATH的环境变量来指定模型路径,为了避免引入错误,此处使用绝对路径/ampha/model,而非${MODEL_PATH},数据集目录同理;输出路径在脚本对应的环境变量名为OUTPUT_DIR,与OUTPUT_PATH不同,因此可以使用${OUTPUT_PATH}的方式。
(3) 由于demo中是基于megatron框架的预训练,涉及数据预处理和训练两个阶段,这里通过两个任务分别实现两个阶段:
¡ 数据预处理:在算法目录下新建shell脚本qwen_preprocess_datatset.sh,参照demo将数据预处理的启动命令写入该脚本:
bash run.sh preprocess_dataset
¡ 训练:在算法目录下新建shell脚本qwen_pretrain_start.sh,参照demo将训练的启动命令写入该脚本:
bash run.sh train_megatron
根据run.sh中的内容可知,训练调用的脚本为算法目录下的shell_scripts/train_megatron.sh文件,修改其中分布式训练启动相关参数:
......
export CUDA_VISIBLE_DEVICES=$XPU_VISIBLE_DEVICES
#GPUS_PER_NODE=`echo "$XPU_VISIBLE_DEVICES" | awk -F, '{print NF}'`
GPUS_PER_NODE=${gpu_num} # 每个节点进程数修改为${gpu_num}
echo "GPUS_PER_NODE: ${GPUS_PER_NODE}"
# Change for multinode config
MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}# master节点地址从环境变量MASTER_ADDR取值,若该环境变量不存在则赋值为"127.0.0.1
"MASTER_PORT=${MASTER_PORT:-9996}# master节点端口号从环境变量MASTER_PORT取值,若该环境变量不存在则赋值为9996
NNODES=${node_num}# 节点数从环境变量node_num取值
NODE_RANK=${RANK:-0}# 节点标识从环境变量RANK取值,若该环境变量不存在则赋值为0
#NODE_RANK=0
DISTRIBUTED_ARGS="--nproc_per_node $GPUS_PER_NODE
--nnodes $NNODES
--node_rank $NODE_RANK
--master_addr $MASTER_ADDR
--master_port $MASTER_PORT"
......
(1) 根据厂商提供的预训练指导文档《Qwen-7B PreTrain训练》,将Chinese-pretraining-dataset数据集下载到本地。
(2) 如图4-21所示,使用普通用户角色登录傲飞算力平台,将下载的数据集文件上传到私有文件目录中。
大模型训练分为预训练、微调、强化学习三个阶段,各阶段的详细说明如表5-1所示。
训练阶段(LX) |
阶段说明 |
训练方法 |
资源消耗 |
大模型预训练L0 |
包含大模型预训练和大模型增量预训练,产出Base模型,用于学习文本的表示 |
一般使用无监督的、大量的、通用的(非固定领域)的数据进行无监督训练 |
· 训练周期长(以月为单位) · 训练消耗资源大(几千张卡) |
大模型微调L1 |
包含大模型微调,通过微调,产出微调模型,模型中加入垂直领域的信息 |
一般使用有监督的、少量的、领域相关的数据进行有监督训练 |
· 训练周期短(以天为单位) · 训练消耗资源小(几张~几百张卡) |
强化学习L2 |
包含RLHF和DPO,对微调产出的模型进行进一步的使用人工反馈的数据进行优化 |
一般使用人类反馈过的、有人类偏好的数据进行训练 |
· 训练周期短(以天为单位) · 训练消耗资源小(几张~几百张卡) |
大模型训练的处理流程如图5-1所示,本案例会针对每个阶段如何在傲飞算力平台应用进行详细介绍。
· 由于厂商提供的demo是基于megatron框架的预训练,涉及数据预处理和训练两个阶段,因此需要分别通过创建两个任务来实现这两个阶段。本节以创建数据预处理任务作为示例,进行详细说明。
· 训练阶段任务,相比于数据预处理任务,差别为“创建任务名”和“启动文件”步骤,具体差异见“5.2.1 任务创建”相应步骤的说明。其余步骤均相同。
可通过如下两种方式,进入大模型调优页面:
· 如图5-2所示,在首页直接单击“大模型调优”模块,进入大模型调优页面。
· 如图5-3所示,单击[AI空间/大模型/大模型调优],进入大模型调优页面。
如图5-4所示,在大模型调优界面,单击<创建预训练任务>按钮,创建预训练任务。
如图5-5所示,填写任务名称、任务描述基本信息。
· 数据处理阶段创建的任务,如图5-5所示。
· 训练阶段创建的任务,如图5-5所示。
图5-6 填写训练阶段预训练任务基本信息
(1) 训练模式选择
训练模式分为“预置模型训练”和“自定义模型训练”,此处选择自定义模型训练方式。
图5-7 训练方式选择
(2) 选择算法
如图5-8所示,单击“选择算法”输入框,选择需要使用的算法。此处从<本地存储>中选择用户私有文件路径下的文件夹“/p800_qwen_train_code”。
(3) 选择任务类型
如图5-9所示,单击“任务类型”框,选择PyTorch。
(4) 选择启动文件
¡ 数据预处理任务中,启动文件选择“qwen_preprocess_datatset.sh”,如图5-10所示。
¡ 训练阶段任务中,启动文件选择“qqwen_pretrain_start.sh”,如图5-11所示。
(5) 选择基础模型
如图5-12所示,打开“增量训练”开关后,可以选择基础模型。从本地存储中选择私有文件目录下的“qwen_model”。
此处选择的实际是qwen模型的分词器,该目录中的文件层级为qwen_model/tokenizer/qwen.tiktoken。
(6) 选择镜像
如图5-13所示,选择已创建的镜像“p800_qwen_train”。
(7) 选择输入数据
输入数据可从资产管理中选择已经创建或已经收藏的数据集资产,也可以从本地存储选择用户私有文件路径下的数据集文件夹目录。此处以从本地存储中选择为例。
在“输入数据”第一个下拉框中,选择“本地存储”;单击“请选择输入数据”,在弹出的对话框中选择私有文件目录下的“Chinese-pretraining-dataset”文件夹,其中包含csl.jsonl数据文件。
图5-14 本地存储选择输入数据
(8) 选择输出路径
a. 输出路径可自行创建并选择,输出路径需为空文件夹。此处选择新建文件夹名为“p800-out”,如图5-15所示。
· 缺省情况下,系统会自动创建并选择默认路径,此路径为普通用户私有文件路径/output/ Pretrain/{任务名称}/model。
· 后续训练任务选择的输出路径需与此处保持一致,保证可找到数据预处理后的文件。
b. 选择输出路径为“/p800-out”,如图5-16所示。
(9) 超参配置
根据选择的算法和训练策略显示训练所需的超参数及默认值,可根据实际情况修改。
此处的超参配置无需通过界面配置,已由自定义脚本中配置。
在进行预置模型训练时,系统会提供资源需求的提示,建议按照所需资源进行配置。由于训练作业的资源消耗受多种因素影响,因此若提示显存不足,请在增加资源后重新提交作业。
用户可以根据实际可用的资源组及组网情况,选择是否开启高性能网络,填写完成后单击<提交>按钮,完成资源配置。
图5-17 资源配置
任务提交之后,大模型调优页面将会增加一条任务记录。
如图5-18所示,在大模型调优页面,可查看任务名称、任务描述、任务状态、模型名称、任务场景、创建方式、运行时间以及提交时间等任务信息。
单击任务[操作]菜单内的<详情>按钮,可跳转到任务详情页。
图5-19 查看任务详情
可查看该任务的基本信息、日志、可视化、资源监控、实例,如图5-20所示。
· 基本信息:包含作业提交时的基本信息、作业使用AI资产的配置信息以及作业提交时算法的超参等。
· 日志:算法脚本运行的日志信息,作业在运行过程中定时刷新。针对一些作业报错、运行失败可以在这里查看日志,日志可以下载。
· 可视化:运行过程的展示,体现作业训练过程的指标变化。在这里可以进行可视化组件的打开、停止、查看详情和销毁的操作。
· 资源监控:可以查看作业运行过程中资源使用情况。
· 实例:查看任务启动的实例信息,可以查看算法脚本在运行起来之前的作业状态。
图5-20 任务详情
如图5-21所示,单击任务[操作]菜单内的<日志>按钮,可直接跳转到详情中的日志页面查看日志。
单击操作栏<停止>按钮,可手动停止训练任务,任务状态会变为“被终止”,如图5-22所示。
单击操作栏<恢复>按钮,可根据一个被终止或因某些原因失败的任务重新创建一个以”resume-“前缀开头的预训练任务并默认从最新的checkpoint进行恢复训练;需保证输出路径下存在有效的checkpoint文件,如图5-23所示。
该校验通过仅说明对应目录下存在checkpoint文件夹,不能确保checkpoint文件的完整性和合法性。如果发现恢复任务报错加载checkpoint失败,可以手动删除最近的checkpoint,尝试从次新的checkpoint恢复,如图5-24所示。
仅通过目录下存在checkpoint文件夹并不能保证其中的checkpoint文件完整且合法。如果发现恢复功能失效,无法正常恢复,可以手动删除最近的checkpoint,然后尝试从次新的checkpoint进行恢复。
训练任务成功后,单击操作栏中的<注册模型>按钮,如图5-25所示。
在弹出框中填写模型名称、模型描述、任务标签后即可将预训练完成的模型注册到AI资产中,如图5-26所示。
单击<确定>按钮后,页面右上角提示注册成功。可单击[资产管理/AI资产/模型/我创建的],进入大模型页面。选择“大模型”页签,单击[调优策略/预训练],即可查看到注册的模型。
图5-27 查看注册模型
若厂商提供了微调对应的demo文档,可参考“5.2 预训练”步骤进行自定义大模型微调。
大模型推理是指在大模型训练之后,将经过训练的大规模深度学习模型应用于实际数据以进行预测、分类或其他分析的过程。在这一阶段,模型通常会被部署到生产环境中,用于处理实时数据或批量数据,并生成相应的预测结果。
以昆仑芯P800适配Qwen1.5-32B大模型推理为例,厂商提供的《Qwen1.5-32B推理》和《Llama2-70B推理》的推理demo文档中采用的推理框架为XTRT-LLM。XTRT-LLM框架采用了Uvicorn来启动Web推理服务,使得模型推理任务能够在网络环境中进行。提高了推理的灵活性和部署的便捷性。
如图6-1所示,在私有文件的“p800_qwen_infer_files”目录下,创建一个shell脚本convert.sh。将修改后的启动命令写入该脚本,主要是修改模型输入和输出路径。
脚本内容如下:
python3 /examples/qwen/build.py \
--dtype float16 \
--hf_model_dir ${MODEL_PATH} \
--output_dir ${OUTPUT_PATH} \
--model_name qwen1.5_32b \
--paged_kv_cache \
--remove_input_padding \
--tokens_per_block 64 \
--max_output_len 16384 \
--max_input_len 16384 \
-v 1.5
由于厂商提供的demo文档中,Qwen模型使用的是XTRT-LLM推理框架。因此,需要对huggingface格式模型文件进行编译,可根据厂商提供的demo文档在docker容器内完成,或者通过自定义模型训练完成,本节以大模型微调中的自定义模型训练为例进行介绍。
大模型调优页面,单击<创建微调任务>按钮创建微调任务,如图6-2所示。
如图6-3所示,填写任务名称、任务描述基本信息。
(1) 训练模式选择
如图6-4所示,训练模式分为“预置模型训练”和“自定义模型训练”,此处选择自定义模型训练方式。
(2) 选择算法
如图6-5所示,单击“选择算法”输入框,选择需要使用的算法。此处从<本地存储>中选择用户私有文件路径下的文件夹“p800_qwen_infer_files”。
(3) 选择任务类型
如图6-6所示,单击“任务类型”框,选择PyTorch。
(4) 选择启动文件
如图6-7所示,启动文件选择“convert.sh”。
(5) 选择基础模型
如图6-8所示,从本地存储中选择私有文件目录下的huggingface格式的Qwen1.5-32B模型权重文件夹。
(6) 选择镜像
如图6-9所示,选择已创建的镜像“p800_qwen_infer”。
(7) 选择输入数据
输入数据可从资产管理中选择已经创建或已经收藏的数据集资产,也可以从本地存储选择用户私有文件路径下的数据集文件夹目录。本任务不需要训练数据,此处可任意选择。
(8) 选择输出路径
输出路径选择为编译后模型的输出路径,如图6-10所示。
根据选择的算法和训练策略显示训练所需的超参数及默认值,可根据实际情况修改。
此处的超参配置无需通过界面配置,已由自定义脚本中配置。
在进行预置模型训练时,系统会提供资源需求的提示,建议按照所需资源进行配置。由于训练作业的资源消耗受多种因素影响,因此若提示显存不足,请在增加资源后重新提交作业。
如图6-11所示,用户可以根据实际可用的资源组及组网情况,选择是否开启“高性能网络”,填写完成后单击<提交>按钮,完成资源配置。
由于傲飞算力平台的大模型推理功能内置了推理组件,目前只能适配NVIDIA的GPU卡。传统模型的推理功能可以使用自定义镜像,对GPU卡的厂家和型号没有限制。因此,本最佳实践中需要在传统模型中创建推理任务,进行模型推理。
如图6-12所示,单击[AI空间/传统模型/推理服务],进入传统模型推理页面,单击<创建服务>按钮,创建推理服务。
如图6-13所示,填写服务名称、描述、选择模型来源、选择镜像、选择镜像启动方式和请求方式等。
各项配置说明如下:
· 模型来源:选择“AI资产-镜像”。
· 选择镜像:选择推理镜像资产“p800_qwen_infer”.
· 镜像启动方式:选择“自定义镜像”。
· 请求方式:选择“rest”。
· 预测路径:根据启动的推理服务中实际路径填写,本例中填写/v1/chat/completions。
· 启动命令:容器内启动推理服务的命令。若使用挂载到容器中的启动脚本,需与文件挂载中保持一致,本例为bash /mnt/infer_start.sh。
· 容器端口:根据在容器中启动的推理服务实际端口填写。本例中填写8311。
· 文件挂载:将私有文件中的模型文件或启动脚本挂载到容器中。
¡ 在本例中,左侧选择私有文件目录下的p800_qwen_infer_files,右侧填写/mnt。
¡ 在本例中,模型文件和启动脚本均在私有文件的p800_qwen_infer_files目录下,该目录下包含:
- Qwen1.5-32B-Chat/ huggingface格式模型文件
- Qwen1.5-32B-Chat-engine-fp16-tp1/ 编译后的模型文件
- infer.sh 推理服务启动脚本
其中infer.sh内容为:
export PYTORCH_NO_XPU_MEMORY_CACHING=0
export XMLIR_D_XPU_L3_SIZE=0
export XPU_VISIBLE_DEVICES=0
export CUDA_VISIBLE_DEVICES=0
export XTRTLLM_RUNNER_tokenizer_dir=/mnt/Qwen1.5-32B-Chat # 此处填写的路径需与【文件挂载】中挂载到容器中的路径一致
export XTRTLLM_RUNNER_engine_dir=/mnt/Qwen1.5-32B-Chat-engine-fp16-tp1 # 此处填写的路径需与【文件挂载】中挂载到容器中的路径一致
export XTRTLLM_RUNNER_world_size=1
uvicorn xtrtllm_runner.server.app:app --host 0.0.0.0 --port 8311 # 【容器端口】处填写的端口号需与此处一致
如图6-14所示,首先选择资源组,设置CPU核数、内存和GPU卡。配置完成后,单击<保存>按钮,即可创建推理服务。
如图6-15所示,创建完成后,可在推理界面看到对应的模型描述。
推理服务启动后,可使用postman等工具发送post请求进行测试。用户可基于推理服务提供的API,搭建属于自己的大模型应用。通过使用推理服务API,开发者可以轻松地将训练好的模型部署到应用中,并调用API来进行推理,而无需过多关注模型的细节实现。
模型较大时加载需要一定时间,启动后等待几分钟后再发送请求。
· 请求地址:大模型推理页面上对应推理任务上显示的服务地址。本例中为10.227.6.150:21478/v1/chat/completions
· 请求方式:POST
· 请求参数:
header:
Content-Type: application/json
body:
{
"model": "qwen1.5_32b",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}
参数名称 |
类型 |
备注 |
model |
string |
模型的唯一标识,用于在系统中区分和识别不同的模型服务 |
message |
jsonarray |
推理请求体,请求推理的重要信息,若需要开启多轮对话,则需要传递历史推理结果,数组内部成员必须为奇数个,其中每组历史对话成员依次为user和assistant,用来记录用户和助手之间的对话历史 |
message[i] |
jsonobject |
用户的提问或者模型推理的回复 |
message[i].role |
string |
角色: · user代表用户 · assistant代表模型 |
message[i].content |
string |
用户的问题或者模型推理的回复结果 |
推理服务测试结果,如图6-16所示。