首页 > 其他分享 >Mixtral 8X7B MoE模型基于阿里云人工智能平台PAI实践合集

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

时间:2024-01-12 15:33:59浏览次数:35  
标签:8x7B -- root 模型 8X7B PAI model Mixtral

作者:熊兮、贺弘、临在

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大模型的示例,参见下图:

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

上述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 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, 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 os
from transformers import AutoModelForCausalLM, AutoTokenizer
import 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 pai
from pai.session import get_default_session
from pai.common.oss_utils import upload

print(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="/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和Token
endpoint = predictor.internet_endpoint
token = predictor.access_token

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

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

# 请注意替换为使用服务的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": "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的模型卡片如下图所示:

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

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

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

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

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

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

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


标签:8x7B,--,root,模型,8X7B,PAI,model,Mixtral
From: https://blog.51cto.com/u_15316473/9217926

相关文章

  • 2024-01-10:用go语言,给你一个下标从 0 开始的二维整数数组 pairs 其中 pairs[i] = [sta
    2024-01-10:用go语言,给你一个下标从0开始的二维整数数组pairs其中pairs[i]=[starti,endi]如果pairs的一个重新排列满足对每一个下标i(1<=i<pairs.length)都有endi-1==starti,那么我们就认为这个重新排列是pairs的一个合法重新排列。请你返回任意一个pairs的......
  • 欢迎 Mixtral - 当前 Hugging Face 上最先进的 MoE 模型
    最近,Mistral发布了一个激动人心的大语言模型:Mixtral8x7b,该模型把开放模型的性能带到了一个新高度,并在许多基准测试上表现优于GPT-3.5。我们很高兴能够在HuggingFace生态系统中全面集成Mixtral以对其提供全方位的支持......
  • 【C++】STL 容器 - set 集合容器 ⑥ ( pair 对组简介 | pair 对组元素访问 | set 集合
    文章目录一、pair对组1、pair对组简介2、pair对组元素访问3、代码示例-pair对组4、set集合容器存储pair对组元素二、set集合容器insert插入结果类型-pair对组1、std::set#insert函数原型分析2、代码示例-std::set#insert函数插入元素结果分析一、pair对组1......
  • mixtral 1
    usetext-generation-inferencetosetupruncommandclicktoviewcommanddockerrun--gpusall--shm-size1g-p3000:80-v/data:/dataghcr.io/huggingface/text-generation-inference:1.3.3\--model-idmistralai/Mixtral-8x7B-Instruct-v0.1\--nu......
  • 聊聊流式数据湖Paimon(五)
    从Demo入手,了解Paimon/Flink项目搭建的全过程。记录下采坑之旅。创建Flink项目在IDEA中创建Flink项目,由于没有Flink的archetype,因此需要手动创建一下。参考:idea快速创建flink项目,至此Flink的项目框架就搭建起来了。注意:必须注释掉pom文件中的provided;否则运行时会报错:Error:......
  • 聊聊流式数据湖Paimon(四)
    PartialUpdate数据打宽通过不同的流写不同的字段,打宽了数据的维度,填充了数据内容;如下所示:--FlinkSQL参数设置set`table.dynamic-table-options.enabled`=`true`;SET`env.state.backend`=`rocksdb`;SET`execution.checkpointing.interval`=`60000`;......
  • 聊聊流式数据湖Paimon(三)
    概述如果表没有定义主键,则默认情况下它是仅追加表类型(AppendOnlyTable)。根据桶(Bucket)的定义,我们有两种不同的仅追加模式:"AppendForScalableTable"和"AppendForQueue";两种模式支持不同的场景,提供不同的功能。只能向表中插入一条完整的记录。不支持删除或更新,并且不......
  • 聊聊流式数据湖Paimon(二)
    当前的问题ApachePaimon最典型的场景是解决了CDC(ChangeDataCapture)数据的入湖;CDC数据来自数据库。一般来说,分析需求是不会直接查询数据库的。容易对业务造成影响,一般分析需求会查询全表,这可能导致数据库负载过高,影响业务分析性能不太好,业务数据库一般不是列存,查询部......
  • 聊聊流式数据湖Paimon(一)
    翻译自ApachePaimon官方文档概览概述ApachePaimon(incubating)是一项流式数据湖存储技术,可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力。简单来说,Paimon的上游是各个CDC,即changlog数据流;而其自身支持实时sink与search(下沉与查询)changlog数据流......
  • 基于 Flink SQL 和 Paimon 构建流式湖仓新方案
    本文整理自阿里云智能开源表存储负责人,FounderofPaimon,FlinkPMC成员李劲松在云栖大会开源大数据专场的分享。本篇内容主要分为三部分:数据分析架构演进介绍ApachePaimonFlink+Paimon流式湖仓一、数据分析架构演进目前,数据分析架构正在从Hive到Lakehouse的演变。传统数......