写点什么

Mixtral 8X7B MoE 模型基于阿里云人工智能平台 PAI 实践合集

  • 2024-01-12
    陕西
  • 本文字数:5218 字

    阅读完需:约 17 分钟

作者:熊兮、贺弘、临在

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,为用户提供交互式编程环境,同时提供了丰富的计算资源。我们在智码实验室(https://gallery.pai-ml.com/)Notebook Gallery 中上线了两个微调 Mixtral 8x7B MOE 大模型的示例,参见下图:


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

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

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

!apt-get update!echo y | apt-get install aria2
def 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-ModelScope
import osos.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, AutoTokenizer
model_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 张 GU108(80G)及以上资源。我们首先下载模型至本地:

!apt-get update!echo y | apt-get install aria2
def 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 osfrom transformers import AutoModelForCausalLM, AutoTokenizerimport torch
model_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 paifrom pai.session import get_default_sessionfrom pai.common.oss_utils import upload
print(pai.__version__)sess = get_default_session()
# 上传模型到默认的Bucketmodel_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 RegisteredModelfrom 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="/ml/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 })
# 查看服务的Endpoint和Tokenendpoint = predictor.internet_endpointtoken = predictor.access_token

复制代码

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

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

# 请注意替换为使用服务的Endpoint和Tokenexport API_ENDPOINT="<ENDPOINT>"export API_TOKEN="<TOKEN>"
# 查看模型listcurl $API_ENDPOINT/v1/models \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $API_TOKEN"
# 调用通用的文本生成APIcurl $API_ENDPOINT/v1/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $API_TOKEN" \ -d '{ "model": "Mixtral-8x7B-Instruct-v0.1", "prompt": "San Francisco is a", "max_tokens": 256, "temperature": 0 }'
curl $API_ENDPOINT/v1/chat/completions \ -H "Authorization: Bearer $API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "Mixtral-8x7B-Instruct-v0.1", "messages": [ {"role": "user", "content": "介绍一下上海的历史"} ] }'
复制代码

使用 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:

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

交互式建模 PAI-DSW:

https://www.aliyun.com/activity/bigdata/pai/dsw

模型在线服务 PAI-EAS:

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

PAI 快速开始:

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

PAI Python SDK:

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

阿里云 PAI 灵骏智算服务:

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

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2020-10-15 加入

分享阿里云计算平台的大数据和AI方向的技术创新和趋势、实战案例、经验总结。

评论

发布
暂无评论
Mixtral 8X7B MoE模型基于阿里云人工智能平台PAI实践合集_阿里云大数据AI技术_InfoQ写作社区