快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践

本文主要是介绍快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:熊兮、贺弘、临在

Mixtral 8x7B大模型是Mixtral AI推出的基于decoder-only架构的稀疏专家混合网络(Mixture-Of-Experts,MOE)开源大语言模型。这一模型具有46.7B的总参数量,对于每个token,路由器网络选择八组专家网络中的两组进行处理,并且将其输出累加组合,在增加模型参数总量的同时,优化了模型推理的成本。在大多数基准测试中,Mixtral 8x7B模型与Llama2 70B和GPT-3.5表现相当,因此具有很高的使用性价比。

阿里云人工智能平台PAI是面向开发者和企业的机器学习/深度学习平台,提供包含数据标注、模型构建、模型训练、模型部署、推理优化在内的AI开发全链路服务。

本文介绍如何在PAI平台针对Mixtral 8x7B大模型的微调和推理服务的最佳实践,助力AI开发者快速开箱。以下我们将分别展示具体使用步骤。

使用PAI-DSW轻量化微调Mixtral 8x7B MOE大模型

PAI-DSW是云端机器学习开发IDE,为用户提供交互式编程环境,同时提供了丰富的计算资源。我们在智码实验室(智码实验室)Notebook Gallery中上线了两个微调Mixtral 8x7B MOE大模型的示例,参见下图:

上述Notebook可以使用阿里云PAI-DSW的实例打开,并且需要选择对应的计算资源和镜像。

使用Swift轻量化微调Mixtral 8x7B MOE大模型

Swift是魔搭ModelScope开源社区推出的轻量级训练推理工具开源库,使用Swift进行这一大模型LoRA轻量化微调需要使用2张A800(80G)及以上资源。在安装完对应依赖后,我们首先下载模型至本地:

!apt-get update
!echo y | apt-get install aria2def aria2(url, filename, d):!aria2c --console-log-level=error -c -x 16 -s 16 {url} -o {filename} -d {d}mixtral_url = "http://pai-vision-data-inner-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/mixtral/Mixtral-8x7B-Instruct-v0.1.tar"
aria2(mixtral_url, mixtral_url.split("/")[-1], "/root/")
!cd /root && mkdir -p AI-ModelScope 
!cd /root && tar -xf Mixtral-8x7B-Instruct-v0.1.tar -C /root/AI-ModelScopeimport os
os.environ['MODELSCOPE_CACHE']='/root'

当模型下载完毕后,我们使用Swift一键拉起训练任务:

!cd swift/examples/pytorch/llm && PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0,1 \
python llm_sft.py \--model_id_or_path AI-ModelScope/Mixtral-8x7B-Instruct-v0.1 \--model_revision master \--sft_type lora \--tuner_backend swift \--dtype AUTO \--output_dir /root/output \--ddp_backend nccl \--dataset alpaca-zh \--train_dataset_sample 100 \--num_train_epochs 2 \--max_length 2048 \--check_dataset_strategy warning \--lora_rank 8 \--lora_alpha 32 \--lora_dropout_p 0.05 \--lora_target_modules ALL \--batch_size 1 \--weight_decay 0.01 \--learning_rate 1e-4 \--gradient_accumulation_steps 16 \--max_grad_norm 0.5 \--warmup_ratio 0.03 \--eval_steps 300 \--save_steps 300 \--save_total_limit 2 \--logging_steps 10 \--only_save_model true \--gradient_checkpointing false

模型训练完成后,我们将学习到的LoRA权重合并到模型Checkpoint中:

!swift merge-lora --ckpt_dir '/root/output/mistral-7b-moe-instruct/v3-20231215-111107/checkpoint-12'

其中,ckpt_dir参数的值需要替换成模型LoRA权重保存路径。为了测试模型训练的正确性,我们可以使用transformers库进行离线推理测试:

from transformers import AutoModelForCausalLM, AutoTokenizermodel_id = "/root/output/mistral-7b-moe-instruct/v3-20231215-111107/checkpoint-12-merged"
tokenizer = AutoTokenizer.from_pretrained(model_id, device_map='auto')model = AutoModelForCausalLM.from_pretrained(model_id, device_map='auto')text = """[INST] <<SYS>>
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
<</SYS>>写一首歌的过程从开始到结束。 [/INST]"""
inputs = tokenizer(text, return_tensors="pt")outputs = model.generate(**inputs, max_new_tokens=512)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

使用Deepspeed轻量化微调Mixtral 8x7B MOE大模型

我们也可以使用Deepspeed对Mixtral 8x7B MOE大模型进行LoRA轻量化微调。同样的,我们需要使用2张A800(80G)及以上资源。我们首先下载模型至本地:

!apt-get update
!echo y | apt-get install aria2def aria2(url, filename, d):!aria2c --console-log-level=error -c -x 16 -s 16 {url} -o {filename} -d {d}mixtral_url = "http://pai-vision-data-inner-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/mixtral/Mixtral-8x7B-Instruct-v0.1.tar"
aria2(mixtral_url, mixtral_url.split("/")[-1], "/root/")
!cd /root && tar -xf Mixtral-8x7B-Instruct-v0.1.tar

第二步,我们下载一个示例古诗生成数据集,用户可以根据下述数据格式准备自己的数据集。

!wget -c https://pai-quickstart-predeploy-hangzhou.oss-cn-hangzhou.aliyuncs.com/huggingface/datasets/llm_instruct/en_poetry_train_mixtral.json
!wget -c https://pai-quickstart-predeploy-hangzhou.oss-cn-hangzhou.aliyuncs.com/huggingface/datasets/llm_instruct/en_poetry_test_mixtral.json

第三步,我们可以修改示例命令的超参数,并且拉起训练任务。

!mkdir -p /root/output
!deepspeed /ml/code/train_sft.py \
--model_name_or_path /root/Mixtral-8x7B-Instruct-v0.1/ \
--train_path en_poetry_train_mixtral.json \
--valid_path en_poetry_test_mixtral.json \
--learning_rate 1e-5 \
--lora_dim 32 \
--max_seq_len 256 \
--model mixtral \
--num_train_epochs 1 \
--per_device_train_batch_size 8 \
--zero_stage 3 \
--gradient_checkpointing \
--print_loss \
--deepspeed \
--output_dir /root/output/ \
--offload

当训练结束后,我们拷贝额外配置文件至输出文件夹:

!cp /root/Mixtral-8x7B-Instruct-v0.1/generation_config.json /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/special_tokens_map.json /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/tokenizer.json /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/tokenizer.model /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/tokenizer_config.json /root/output

我们同样可以使用transformers库进行离线推理测试:

import os
from transformers import AutoModelForCausalLM, AutoTokenizer
import torchmodel_id = "/root/output/"
tokenizer = AutoTokenizer.from_pretrained(model_id)model = AutoModelForCausalLM.from_pretrained(model_id,device_map='auto',torch_dtype=torch.float16)text = """[INST] Write a poem on a topic 'Care for Thy Soul as Thing of Greatest Price': [/INST]"""
inputs = tokenizer(text, return_tensors="pt").to('cuda')outputs = model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

如果用户需要将上述模型部署为EAS服务,需要将格式转换成safetensors格式:

state_dict = model.state_dict()
model.save_pretrained(model_id,state_dict=state_dict,safe_serialization=True)

使用PAI-EAS在线部署Mixtral 8x7B MOE大模型

PAI-EAS是PAI平台推出的弹性推理服务,可以将各种大模型部署为在线服务。当Mixtral 8x7B MOE大模型微调完毕后,我们可以将其部署为PAI-EAS服务。这里,我们介绍使用PAI-SDK将上述模型进行部署。首先,我们在PAI-DSW环境安装PAI-SDK:

!python -m pip install alipai --upgrade

在安装完成后,在在命令行终端上执行以下命令,按照引导完成配置AccessKey、PAI工作空间以及 OSS Bucket:

python -m pai.toolkit.config

我们将训练好的模型上传至OSS Bucket。在下述命令中,source_path为模型Checkpoint保存的本地路径,oss_path为上传至OSS的目标路径:

import pai
from pai.session import get_default_session
from pai.common.oss_utils import uploadprint(pai.__version__)
sess = get_default_session()# 上传模型到默认的Bucket
model_uri = upload(source_path="/root/output", oss_path="mixtral-7b-moe-instruct-sft-ds"
)print(model_uri)

PAI 提供了Mixtral 8X7B MOE 模型部署镜像和部署代码,用户可以通过相应的部署配置,将微调后的模型部署到PAI-EAS。

from pai.model import RegisteredModel
from pai.predictor import Predictor# 获取PAI提供的Mixtral模型服务配置(目前仅支持乌兰察布)
inference_spec = RegisteredModel("Mixtral-8x7B-Instruct-v0.1",model_provider="pai",
).inference_spec# 修改部署配置,使用微调后的模型
infer_spec.mount(model_uri, model_path="/model")# 部署推理服务服务
m = Model(inference_spec=infer_spec)predictor: Predictor = m.deploy(service_name = 'mixtral_sdk_example_ds',options={"metadata.quota_id": "<ResourceGroupQuotaId>","metadata.quota_type": "Lingjun","metadata.workspace_id": session.workspace_id}
)

以上配置项中,metadata.quota_id是用户购买的灵骏资源配额ID,在购买了灵骏资源之后,用户可以从PAI控制台页面的资源配额入口获取相应的信息。

部署的模型可以通过deploy方法返回的Predictor对象进行调用。模型使用的Prompt模版如下,其中[INST][/INST]之间的是用户输入,Prompt输入需要按相应的格式准备,避免模型生成低质量的结果。

<s> [INST] User Instruction 1 [/INST] Model answer 1</s> [INST] User instruction 2 [/INST]

调用部署服务的示例代码如下:


# 格式化输入Prompt
def prompt_format(instructions: List[Dict[str, str]]):prompt = ["<s>"]for user, assistant in zip(instructions[::2], instructions[1::2]):inst = user["content"].strip()resp = assistant["content"]prompt.append(f"[INST] {inst} [/INST] {resp}</s>")prompt.append(f"[INST] {instructions[-1]['content']} [/INST]")return "".join(prompt)# 获取模型产生的实际内容
def extract_output(text, prompt):if prompt and text.startswith(prompt):return text[len(prompt) :]return textprompt = prompt_format([{"role": "user","content": "Who are you?",},]
)res = predictor.raw_predict(path="/generate",data=json.dumps({"prompt": prompt,"use_beam_search": False,"stream": False,"n": 1,"temperature": 0.0,"max_tokens": 860,}),
)print(extract_output(res.json()["text"][0], prompt))# Hello! I am a large language model trained by Mistral AI. I am designed to generate human-like text based on the input I receive. I do not have personal experiences or emotions, but I can provide information, answer questions, and engage in conversation to the best of my abilities. How can I assist you today?

流式推理能够提高大语言模型推理服务的响应效率,处理长文本的问题。通过配置参数stream:True,可以使服务以流式响应推理结果:


# API 请求路径
url = predictor.internet_endpoint + "/generate"
# 推理服务的Token
access_token = predictor.access_tokenprompt = prompt_format([{"role": "user","content": "Explain the meaning of life.",},]
)
res = requests.post(url=url,headers={"Authorization": access_token,},json={"prompt": prompt,"use_beam_search": False,# 服务端:以流式返回推理结果"stream": True,"n": 1,"temperature": 0.0,"max_tokens": 860,},# 客户端:以流式处理响应结果stream=True,
)
for chunk in res.iter_lines(chunk_size=8192, delimiter=b"\0"):if not chunk:continueprint(extract_output(json.loads(chunk)["text"][0], prompt))# Hello
# Hello!
# Hello! I
# Hello! I am
# Hello! I am a
# Hello! I am a large
# Hello! I am a large language
# Hello! I am a large language model
# Hello! I am a large language model trained
# Hello! I am a large language model trained by
# Hello! I am a large language model trained by Mist
# Hello! I am a large language model trained by Mistral
# Hello! I am a large language model trained by Mistral AI
# Hello! I am a large language model trained by Mistral AI.

使用PAI-QuickStart微调和部署Mixtral 8x7B MOE大模型

快速开始(PAI-QuickStart)集成了国内外AI开源社区中优质的预训练模型,支持零代码或是SDK的方式实现微调和部署Mixtral 8x7B MOE大模型,用户只需要格式准备训练集和验证集,填写训练时候使用的超参数就可以一键拉起训练任务。Mixtral的模型卡片如下图所示:

通过控制台使用

我们可以根据实际需求上传训练集和验证集,调整超参数,例如learning_rate、sequence_length、train_iters等,如下所示:

点击“训练”按钮,PAI-QuickStart开始进行训练,用户可以查看训练任务状态和训练日志,如下所示:

如果需要将模型部署至PAI-EAS,可以在同一页面的模型部署卡面选择资源组,并且点击“部署”按钮实现一键部署。模型调用方式和上文PAI-EAS调用方式相同。

通过PAI Python SDK使用

开发者也可以通过PAI Python SDK调用PAI提供的预训练模型。通过模型上配置的微调训练算法,开发者可以轻松得提交一个微调训练任务。

from pai.model import RegisteredModel# 获取PAI提供的预训练模型
m = RegisteredModel("Mixtral-8x7B-Instruct-v0.1",model_provider="pai",
)# 获取模型的微调训练算法
est = m.get_estimator(# 灵骏资源组资源配额IDresource_id="<LingjunResourceQuotaId>",# 训练超参hyperparameters={"learning_rate": 1e-5,"num_train_epochs": 1,"per_device_train_batch_size": 4,},
)# 获取训练输入数据:包括模型,以及测试使用的公共数据集
inputs = m.get_estimator_inputs()# 提交训练作业,等待作业完成
est.fit(inputs=inputs
)# 查看模型的输出路径
print(est.model_data())

通过模型上预置的推理服务配置,开发者仅需指定机器资源配置,即可部署一个推理服务。推理服务的调用请参考以上的 PAI-EAS 部署推理的章节。

from pai.session import  get_default_session
from pai.model import RegisteredModelsession = get_default_session()m = RegisteredModel("Mixtral-8x7B-Instruct-v0.1",model_provider="pai",
)# 部署推理服务
predictor = m.deploy(service_name="mixtral_example_{}".format(random_str(6)),options={# 资源配额ID"metadata.quota_id": "<ResourceGroupQuotaId>","metadata.quota_type": "Lingjun","metadata.workspace_id": session.workspace_id,}
)print(predictor.internet_endpoint)

用户可以查看文档,了解更多如何通过SDK使用PAI提供的预训练模型:使用预训练模型 — PAI Python SDK。

当测试完成,需要删除服务释放资源,用户可以通过控制台或是SDK完成:

# 删除服务
predictor.delete_service()

这篇关于快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627332

相关文章

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引